vim-users.jp

Hack #158: ユーザコマンドを定義する

Posted at 2010/06/29
このエントリーをはてなブックマークに追加

: でコマンドラインモードに入ると使えるコマンドは、ユーザが自由に定義することができます。

定義方法

:command コマンドを使用します。書式は以下のようになります。

:command[!] [{属性}...] {コマンド名} {実行するコマンド}

これを見てわかるように、コマンドを定義すると言うことは誤解を恐れずに言うと別のコマンドに対するショートカットを定義しているに過ぎません。 複雑なことをしたい場合、ここは大抵関数の呼び出しになります。 :command 自体に ! を付けた場合、同名のコマンドが定義済みだった場合に上書きします。通常はエラーになります。

コマンド名

コマンド名は、組み込みコマンドと区別が付くように大文字で始めなくてはいけません。また、コマンド名には英数字のみ使用できます。

属性

属性は、-{属性名} もしくは -{属性名}={引数} の形式で指定します。詳細な説明は :help に譲るとして、ここでは概要を紹介します。

-nargs
コマンドの引数の数を指定します。
-nargs=00 個
-nargs=11 個
-nargs=*0 個以上
-nargs=?0 個もしくは 1 個
-nargs=+1 個以上
記号は正規表現と同じと考えれば覚えやすいでしょう。この属性を指定しなかった場合、0 (引数なし) を指定したことになります。
-complete
コマンドの補完方法を指定します。
-complete=augroupオートコマンドのグループ
-complete=bufferバッファ
-complete=commandEx コマンド(と、引数)
-complete=dirディレクトリ
-complete=environment環境変数
-complete=eventオートコマンドのイベント
-complete=expressionVimの式
-complete=fileファイルとディレクトリ
-complete=shellcmdシェルコマンド
-complete=function関数
-complete=helpヘルプの主題
-complete=highlight強調グループ
-complete=mappingマップ
-complete=menuメニュー
-complete=optionオプション
-complete=tagタグ
-complete=tag_listfilesCTRL-D を押した時にタグ、ファイル名を表示
-complete=varユーザ変数
-complete=custom,{func}{func}によるユーザ定義の補完
-complete=customlist,{func}{func}によるユーザ定義の補完
custom や customlist では関数を指定できますが、ここでは割愛します。
-range
コマンドに範囲(:[range]Command)を指定できるようにします。この属性がない場合、範囲の指定はできません。属性の引数で無指定時の初期値を指定します。
-range範囲指定。無指定時は現在行
-range=%範囲指定。無指定時はファイル全体(1,$)
-range=N範囲指定。無指定時は任意の数字 N
-count
コマンドにカウント(:[N]Command [N]) を指定できるようにします。この属性がない場合、カウントの指定はできません。属性の引数で無指定時の初期値を指定します。
-countカウント指定。無指定時は 0
-count=Nカウント指定。無指定時は任意の数字 N
コマンドにカウントを両方(コマンドの前と後)に指定した場合、後に指定したものが有効になります。
-bang
コマンドに ! を付けられるようになります。
-bar
コマンドの後ろに | を付けることで別のコマンドを実行することができます。また、" はコメントの開始になります。 コマンドの引数に | や " を含めたい場合は、| や " とします。 別の言い方をすると、普通に定義したコマンドの引数は :map 系のコマンドのように扱われますが、-bar を付けることでその他のコマンドのような扱いになります。
-register
:delete:yank のように、1つ目の引数にレジスタ名を指定できます。
-buffer
バッファローカルなコマンドになります。

{実行するコマンド}で使える書式

実行するコマンドを指定する箇所では、以下の <…> の形式の特別な文字列を使用できます。

<line1>
指定された範囲の最初の行
<line2>
指定された範囲の最後の行
<count>
与えられたカウント
<bang>
-bang がある場合で、コマンドが ! 付きで実行された場合は ‘!’ と言う 1 文字に、それ以外は空文字列になります。
<reg> <register>
レジスタ名に置換されます。指定なしの場合は空文字列になります。
<args>
与えられた通りのコマンド引数。カウントやレジスタは含まれません。
<lt>
‘<’文字。特別な文字列をそのままの意味で使用したい場合に使います。

特別な文字列の最初に q- を加えると、式の文字列として扱えるようにクォートされます。 例えば、<args> の代わりに <q-args> を指定すると abc は "abc" に、a"bc は "a\"bc" に置き換えられます。引数がない場合は空文字列になります。

<f-args> を使うと、引数を空白で区切ったものを関数の引数として渡せるようにそれぞれをクォートしてカンマで区切ったものに展開します。 実際のルールはもう少し複雑です。詳細は :help <f-args> を参照してください。

thinca

もどる
blog comments powered by Disqus