Vim のコマンドラインでもインサートモードと同様のリッチな補完が可能に
概要¶
mattn 氏による Vim の改善報告。インサートモードのリッチな補完(メタデータ付き)がコマンドラインモードでも使えるようになった。インサートモードの処理をそのまま移植した改善。
詳細¶
インサートモードの補完とは¶
Vim のインサートモード(i で入れるモード)では <C-n> / <C-p> などで補完が使える。
" インサートモードの補完
" <C-n>: 次の候補
" <C-p>: 前の候補
" <C-x><C-f>: ファイルパス補完
" <C-x><C-o>: Omni補完(LSP連携など)
" メタデータ付き補完(kind, menu, info フィールド)
call complete(col('.'), [
\ {'word': 'foo', 'kind': 'function', 'menu': '[mylib]', 'info': 'Foo function'},
\ {'word': 'bar', 'kind': 'variable', 'menu': '[mylib]'},
\ ])
コマンドラインモードの補完¶
コマンドラインモード(: で入れるモード)の補完は従来シンプルだった。
実装の背景¶
ユーザーへの影響¶
Vim プラグイン作者・設定上級者:
- コマンドライン補完をよりリッチにカスタマイズできる
- kind / menu / info フィールドを使った説明付き補完候補
一般ユーザー:
- 標準コマンドの補完が将来的に改善される可能性
- 今すぐ大きな変化を感じるわけではないが、プラグインエコシステムが豊かになる
Vim の補完アーキテクチャ¶
" complete() 関数のシグネチャ
complete({startcol}, {matches})
" {matches} の各要素で使えるフィールド:
" word: 実際に挿入される文字列(必須)
" abbr: 表示される短縮形
" menu: 右側に表示されるメニューテキスト
" info: プレビューウィンドウに表示される情報
" kind: 1文字の種別インジケータ(f=function, v=variableなど)
" icase: 大文字小文字を無視するか
" 今回の改善でこれらがコマンドラインでも使えるようになった
なぜ重要か / いつ使うか¶
- Vim プラグインの補完機能を開発・改善するとき
- Vim のコマンドラインを拡張するプラグインを作るとき
- Neovim ではなく Vim 本体を使い続けているユーザーにとって嬉しい改善
- mattn 氏は Vim/Go エコシステムの著名なコントリビュータ(vim-go 作者)であり、氏の報告は信頼性が高い