1. uplus_e10

    Posted

    uplus_e10
Changes in title
+vimのコマンドライン補完を自作する。
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,68 @@
+vimのコマンドライン補完関数の基本的な作り方まとめ。
+
+
+#書式
+
+コマンドに独自の補完関数を指定するときは、コマンド定義時に引数に`-complete=customlist,{func}`を指定する。
+
+```vim
+command! -nargs=1 -complete=customlist,{func} {cmd} {rep}
+```
+
+
+補完関数は補完候補のリストを返せばいい。
+
+```vim
+function {func}(lead, line, pos)
+ return ['abc', 'efg']
+endfunction
+```
+
+###引数の意味
+
+|仮引数名|説明|
+|:----|:-----------------|
+|lead |カーソル下の引数文字列|
+|line |コマンド名を含めたコマンドライン全体の文字列|
+|pos |lineの先頭文字を0とした時のカーソル位置|
+
+
+
+#サンプル
+`:edit`をラップしただけの`:Edit`コマンドと補完候補を3つ返すだけの補完関数。
+
+```vim
+" コマンドを定義
+command! -nargs=1 -complete=customlist,CompSamp Edit :edit <args>
+
+" 補完関数を定義
+function! CompSamp(lead, line, pos)
+ return ['~/.bashrc', '~/.zshrc', '~/vimrc']
+endfunction
+```
+
+#デバッグ
+補完関数中では出力ができないようなので、`:echomsg {str}`でメッセージ領域に出力して、`:message`コマンドで確認する。
+
+#デバッグ (vimconsole)
+毎回`:message`を呼ぶのが面倒なら[rbtnn/vimconsole](https://github.com/rbtnn/vimconsole.vim/)を使う手もある。
+プラグインを導入したら以下の設定をするといい。
+
+```vim
+let g:vimconsole#auto_redraw = 1
+```
+
+最低限の使い方説明(詳細は[doc](https://github.com/rbtnn/vimconsole.vim/blob/master/doc/vimconsole.txt)を参照)。
+
+```vim
+:VimConsoleOpen # 出力用ウィンドを開く。
+:VimConsoleLog 'message' # メッセージを出力する。
+```
+
+
+#参考資料
+
+`:h :command-completion-customlist`
+
+複雑な補完を書きやすくするためのプラグインもあるらしい(使ったこと無い)。
+[LeafCage/lim.vim](https://github.com/LeafCage/lim.vim/blob/master/doc/lim-cmddef.jax)