-
Notifications
You must be signed in to change notification settings - Fork 123
/
Copy pathubiquity.js
147 lines (140 loc) · 4.73 KB
/
ubiquity.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
* ==VimperatorPlugin==
* @name Ubiquity Glue
* @description Vimperator-plugin for Ubiquity
* @depend Ubiquity ([email protected])
* @version 0.1.1a
* ==/VimperatorPlugin==
*
* USAGE:
*
* :ubi[quity] {ubiquityCommand}
* {ubiquityCommand}をUbiquityに渡して実行
*
* :ubi[quity]
* ランチャを起動
*
* - ランチャ起動キーでコマンドラインに":ubiquity "がでます(ランチャはポップアップしない)
* 気に入らない場合は、XXX:の辺りのコードをコメントアウトしてください
* - Ubiquityコマンド名の補完が効きます。
* - Ubiquityコマンド入力後、引数を入力してのタブ補完をするとUbiquityのプレビューがでる(はず)
*
* FIXME:
* - プレビュー時の選択範囲の取得がイマイチ出来てない
* - プレビュー後の操作はマウス必須になってしまう(これはどうしようもない?)
*
*/
liberator.plugins.ubiquity = (function(){
var ubiquityID = '[email protected]';
if (!Application.extensions.has(ubiquityID) || !Application.extensions.get(ubiquityID).enabled){
Components.utils.reportError('Vimperator: UbiquityGlue: Ubiquity is not installed');
return null;
}
function preExec(target, name, func){
var original = target[name];
target[name] = function(){
var result = func.apply(this, arguments);
var tmp = null;
if (result != false) tmp = original.apply(target, arguments);
return tmp;
};
}
preExec(events, 'onEscape', function(){
if (ubiquityManager.panel.state == 'open') gUbiquity.closeWindow();
});
var focusedWindow = null;
var focusedElement = null;
preExec(commandline, 'open', function(){
focusedWindow = document.commandDispatcher.focusedWindow;
focusedElement = document.commandDispatcher.focusedElement;
});
// XXX:選択範囲が必要な操作が現状上手く動かない.不便であればコメントアウトしてください.
preExec(gUbiquity, 'openWindow', function(anchor, flag){
if(!flag) {
commandline.open(':', 'ubiquity ', modes.EX);
return false;
}
});
// -------------------------------------------------
// Command
// -------------------------------------------------
commands.addUserCommand(['ubi[quity]'], 'Vimperator Ubiquity Glue',
function(args){
if (!args){
gUbiquity.openWindow(getBrowser(), true);
return;
}
ubiquityManager.execute(args);
}, {
completer: function(context, arg){
ubiquityManager.completer(context, arg.string)
}
},
true
);
// -------------------------------------------------
// Public Section
// -------------------------------------------------
var ubiquityManager = {
get panel(){
return gUbiquity.__msgPanel;
},
get cmdManager(){
return gUbiquity.__cmdManager;
},
get nlParser(){
return this.cmdManager.__nlParser;
},
get commands(){
return this.cmdManager.__cmdSource.getAllCommands();
},
execute: function(cmds){
var context = this.getContext();
this.nlParser.updateSuggestionList(cmds, context);
if (this.nlParser.getNumSuggestions() == 0){
liberator.echoerr('No such command');
return false;
}
var parsedSentence = this.nlParser.getSentence(0);
try {
parsedSentence.execute(context);
} catch (e) {
liberator.echoerr(e);
}
},
completer: function(context, args){
var matches = args.match(/(\S+)(?:\s+(.+)$)?/);
var suggestions = [];
for (let cmd in this.commands){
suggestions.push([cmd, this.commands[cmd].description]);
}
context.title = ['Command','Description'];
if (!matches){
context.completions = suggestions;
return;
}
var [cmd, arg] = [matches[1], matches[2]];
if (arg || (cmd && cmd in this.commands) ){
if ( (cmd in this.commands) && this.commands[cmd].preview){
this.getContext();
gUbiquity.__textBox.value = args;
if (this.panel.state == 'closed') {
gUbiquity.openWindow(getBrowser(), true);
}
gUbiquity.__updatePreview();
}
} else if (cmd){
context.completions = suggestions.filter(function(command){return command[0].indexOf(cmd) == 0;});
return;
}
return [0, []];
},
getContext: function(){
gUbiquity.__focusedWindow = focusedWindow;
gUbiquity.__focusedElement = focusedElement;
return gUbiquity.__makeContext();
}
};
return ubiquityManager;
})();
// vim:ts=4 sw=4 et: