問題
vimで定型文の補完を行いたい。
プラグインを使え、という指摘も聞こえてきそうだが、簡便に実現する方法を考えてみた。
対処
以下を、~/.vimrcに追加する。
function! s:CompleteFrom(files)
let lines = []
for f in a:files
let inputfile = expand(f)
for line in readfile(inputfile)
call add(lines, line)
endfor
endfor
call complete(col('.'), lines)
return ''
endfunction
inoremap <F10><C-R>=<SID>CompleteFrom(["$HOME/mydict.txt"])<CR><C-P>
nnoremap <F10> i<C-R>=<SID>CompleteFrom(["$HOME/mydict.txt"])<CR><C-P>
inoremap <F11><C-R>=<SID>CompleteFrom(["$HOME/mydict2.txt", "$HOME/mydict3.txt"])<CR><C-P>
nnoremap <F11> i<C-R>=<SID>CompleteFrom(["$HOME/mydict2.txt", "$HOME/mydict3.txt"])<CR><C-P>
上記で示すvimscriptは、次の仕様になる。
利用方法
- テキストファイルに、補完候補として表示したい文字列を保存する。
- 例として、以下のようにしている。
1つ目のテキストファイルを$HOME/mydict.txt
として、適当に定型文を保存
2つ目のテキストファイルを$HOME/mydict2.txt
として、適当に定型文を保存
3つ目のテキストファイルを$HOME/mydict3.txt
として、適当に定型文を保存 - なお、完全な空行(長さ0の文字列)は候補としては無視される。(vimの候補表示機能の仕様)
- 例として、以下のようにしている。
- キーマッピングを定義し、候補リストを表示する。
- F10キーで、
$HOME/mydict.txt
の定型文を補完候補としてリストする
INSERTモードでF10を押下すると、補完候補をリストする。
NORMALモードでF10を押下すると、INSERTモードに移行して、補完候補をリストする。 - F11キーで、
$HOME/mydict2.txt
と$HOME/mydict3.txt
の定型文を補完候補としてリストする
INSERTモードでF11を押下すると、補完候補をリストする。
NORMALモードでF11を押下すると、INSERTモードに移行して、補完候補をリストする。 - 最後に
<C-p>
を付けると、ポップアップメニュー表示直後に、候補選択されない状態(バッファは変更されていない状態)となる。こうしておくことで、候補表示直後にESCキーでキャンセルしても、バッファに影響がない。 - 最後に
<C-p>
をつけない場合は、ポップアップメニュー表示直後に、一番上の候補が選択された状態(バッファも変更された状態)となってしまう。
- F10キーで、
- vimデフォルトのキー定義で操作する。
<CR>
(エンターキー)で「現在の選択した候補を挿入する」<C-E>
でキャンセルする。(バッファをもとに戻す)<ESC>
(ESCキー)でキャンセルする。(バッファをもとに戻さない)<C-N>
・<C-P>
で「次・前の補完候補」(バッファを変更する)- (邪道かもしれないが)上・下キー(カーソルキー)で「上・下の候補を選択」(バッファを変更しない)
- (邪道かもしれないが)左・右キー(カーソルキー)で候補ポップアップメニューを消す(カーソルを移動する)
- テキストファイルに、補完候補として表示したい文字列を保存する。
補足
- vimの候補表示機能の仕様として、候補を表示している状況で文字列を入力すると、候補が自動的に絞り込まれる。よって、定型文でよいなら、候補を表示してから入力し、選択するのが得策。
- vimのcomplete()関数で、候補の表示をカスタマイズできる。
参考URL vimで独自の補完を設定する(complete関数の使い方)