最終更新: snaka_door 2009年05月31日(日) 19:59:50履歴
FrontPage > プラグイン開発 > addUserCommand_for2.0pre
以下の関数でコマンド登録が可能
liberator.modules.commands.addUserCommand commands.addUserCommandまたは
liberator.modules.commands.add commands.addaddメソッドはVimperator自身が使用するメソッドである。また、addメソッドの場合第5引数がなく、既に存在するコマンドの置き換えは不可能である。
commands.addUseCommand( ["he[llo]","h"], // コマンド名 "description", // コマンドの説明 function(args, bang, count) {... }, // コマンド本体の処理(functionオブジェクト) { /* extras */ completer : function (context, args) { // 補完関数 context.anchor = false; // (省略可) context.ignoreCase = true; // (省略可) context.title = ["url", "title"]; context.completions = [ ["候補1URL", "候補タイトル1"], ["候補2URL", "候補タイトル2"], ]; }, options : [ [["-optionA", "-a"], OPTION_ANY, function(arg) {... }, // オプション値の正当性をチェックする関数? function(context) {... }, // ]], argCount: "*", // "0"|"1"|"+"|"?"|"*" hereDoc: false, // ヒアドキュメントとして受け取るか bang: false, // !を許可するか count: false, // 回数指定で実行可能か literal: false // リテラルとして扱うか }, replace // 既存のコマンドを置き換えるかどうか );
- names(Array):コマンド名となる文字列の配列
- description(String):コマンドの簡易説明
- action(Function):実行されるfunctionオブジェクト
- extra(Object):補完機能やコマンド引数などを格納するオブジェクト(オプション)
- replace(Boolean):既に存在するコマンドの場合、置き換えるか否か(オプション)
以下の様なコマンドを登録するとhelloworld,hello,hwの3つのコマンド名で実行可能になる。
["[hello]world"]や["hello[worl]d"]のようなものは無効。
commands.addUserCommand( ["hello[world]","hw"], "print hello world", function(){ liberator.echo("Hello World"); } );コマンド名となる文字列の後部を[]で囲むと省略可能とされてhelloworld,helloの2つに展開される。
["[hello]world"]や["hello[worl]d"]のようなものは無効。
実際のコマンドの動作を受け持つfunctionオブジェクト。
以下の引数を受け取ることが出来る
以下の引数を受け取ることが出来る
- コマンド引数をliberator.modules.commands.parseArgsでパースした結果(オブジェクト)
- コマンド後部!の有無を示す真偽値
- コマンド頭部のある数値
どれもオプションであるので無くても構わないが、気の利いたコマンドを作ろうとしたらextraオブジェクトの理解は必須となるだろう。
extraオブジェクトには以下のメンバーを持たせると意味がある。
extraオブジェクトには以下のメンバーを持たせると意味がある。
第一引数のcontext にあるcontext.titleに
contenxt.title = ["名前"];もしくは
context.title = ["名前","概要"];の様に代入する。
第一引数のcontextにあるcontext.completionsに
context.completions = [ ["候補値_1(String)","候補値_1の説明(String)"], ["候補値_2(String)","候補値_2の説明(String)"], ];の様に代入する。
completer: function(context, arg){ context.title = ["exampleplugin"]; let allSuggestions = [ ["foo","foo description"], ["bar","bar description"], ["hoge","hoge description"] ]; context.completions = allSuggestions; },Vimperator内部で自動的にフィルタリングしてくれるので、特にこちらでフィルタする必要はない。
context.completionsに代入する前に、context.ignoreCaseに真偽値を入れることで大文字/小文字の区別の制御が可能である。
trueを代入することでbAとしてもbarと補完することが可能になる。
デフォルトではcontext.ignoreCaseはfalseになっている。また、ユーザがwildcaseをignoreに設定することでも可能。
trueを代入することでbAとしてもbarと補完することが可能になる。
デフォルトではcontext.ignoreCaseはfalseになっている。また、ユーザがwildcaseをignoreに設定することでも可能。
completer: function(context, args){ context.ignoreCase = true; //大文字/小文字の区別をなくす context.completions = [ ["bar","bar desc"], //... ]; },
通常、fooを補完したい場合、先頭から入力してタブ補完する必要がある。ooからは補完できない。これを制御するのが、context.anchoredだ。
デフォルトではtrueになっていて、最初からマッチしないと補完できない。falseを代入することで、補完対象に含まれていればリストに載るようにできる。
デフォルトではtrueになっていて、最初からマッチしないと補完できない。falseを代入することで、補完対象に含まれていればリストに載るようにできる。
コマンド引数の解析時に用いられる。指定するとaction関数の第一引数が解析された結果となるので注意
パースされた結果、第一引数は文字列(String)ではなく、メンバーに
パースされた結果、第一引数は文字列(String)ではなく、メンバーに
- arguments: optionsで解析されなかった文字列の配列
- optionsで解析されたオプション名とその値
言葉で説明しても分かり難い。実際にbmarkコマンドの例を見たほうが早かろう。
bmarkコマンドはブックマークするURLとタイトルやタグ、キーワードのオプションを指定することができる。
bmarkコマンドはブックマークするURLとタイトルやタグ、キーワードのオプションを指定することができる。
:bmark http://example.com/ -title Example -T example,Tag -k keywordとすると解析された結果は
args = ["http://example.com"]; args["-title"] = "Example"; args["-tags"] = ["example","Tag"]; args["-keyword"] = "keyword";となる。bmarkコマンドのoptionsの定義は以下の様になっている。
options: [ [["-title", "-t"], commands.OPTION_STRING], [["-tags", "-T"], commands.OPTION_LIST], [["-keyword", "-k"], commands.OPTION_STRING, function(arg) { return /\w/.test(arg); }] ],
細かい説明は省略。ソースコードに書かれている説明を載せておく
@param str: something like "-x=foo -opt=bar arg1 arg2" "options" is an array [name, type, validator, completions] and could look like: options = [[["-force"], OPTION_NOARG], [["-fullscreen", "-f"], OPTION_BOOL], [["-language"], OPTION_STRING, validateFunc, ["perl", "ruby"]], [["-speed"], OPTION_INT], [["-acceleration"], OPTION_FLOAT], [["-accessories"], OPTION_LIST, null, ["foo", "bar"]], [["-other"], OPTION_ANY]];
2番目の要素に指定するタイプ
- OPTION_ANY
- 何でもOK。オプション値に文字列があればオプションの値になるし、無ければnullとなる
- OPTION_NOARG
- オプション値が指定されないことを期待するタイプ。解析結果のメンバーに入るが値はtrue
- OPTION_BOOL
- オプション値にon/offを期待し、値は真偽値となる。別の値の場合はNaNになる
- OPTION_STRING
- オプション値に任意の文字列を期待する
- OPTION_INT
- オプション値が数値であることを期待する(小数点を入れても無視される)
- OPTION_FLOAT
- オプション値が数値であることを期待する(OPTION_INTと違い、小数点OK)
- OPTION_LIST
- オプション値が","区切りのリストであることを期待すし、値は配列となる
- "0"
- arguments無し
- "1"
- argumentsの数がきっちりと1つ
- "+"
- argumentsの数が1個以上
- "*"
- argumentsの数が0個以上
- "?"
- argumentsの数が0固か1個
コマンドがrange(先頭に付ける数値)を使えるかどうかの真偽値。''true'にしないと、2commandNameなどと実行した場合にエラーとなり、E481 No range allowedというメッセージが表示される
argCountと一緒に用いられ、argCount数以降の引数を格納するかどうかの真偽値。trueにしないと、argCountが2で引数を3つ以上つけるとパースエラーとなってしまう。
autocmdコマンドの様に3つの引数を必要とするが2つ目までは固定的で3つ目からは一つの文字列として扱いたいときなどに有効(autocmdの場合はargCount: "2",literal: true となっている)
autocmdコマンドの様に3つの引数を必要とするが2つ目までは固定的で3つ目からは一つの文字列として扱いたいときなどに有効(autocmdの場合はargCount: "2",literal: true となっている)
コマンドに第一引数に渡るコマンド引数はversion 1.2preまでと異なり必ずliberator.modules.commands.parseArgsでパースされる様になり、結果objectとして渡されるので少々複雑になった。
ここではその解説。
パースされて返るオブジェクトを以降argsとする。
ここではその解説。
パースされて返るオブジェクトを以降argsとする。
argsオブジェクトはArrayである。0,1,2,,,に通常の引数が入るが、他に以下のメンバを持つ。
- literalArg(String)
- argCountに収まらない以降の引数の文字列(literal:trueの場合)
- string(String)
- 引数全体の文字列
- その他
- optionsで与えたオプション名の第一要素をメンバ名として、String,Number,Arrayが入る
シェルと同じく引用符で括ると、引用符で閉じられるまでを一つの引数として扱ってくれる。
ダブルコートとシングルコートとでエスケープ文字(\)の扱いが異なり、挙動が変わることがあるので注意(注意するのはコマンド使用者だが)
ダブルコートとシングルコートとでエスケープ文字(\)の扱いが異なり、挙動が変わることがあるので注意(注意するのはコマンド使用者だが)
- カテゴリ:
- インターネット
- Firefox拡張機能
タグ
このページへのコメント
bvlgari バッグ
bvlgari 時計 http://www.yxjcdp.com/
Aw, this was a really nice post. In idea I want to put in writing like this additionally taking time and actual effort to make a very good article but what can I say I procrastinate alot and in no way seem to get one thing done. increase height http://www.deelsonheels.com/$2099_Dual_Air_Cushioned_Shoe_Lifts/p133745_317500.aspx