コンテンツにスキップ

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]'},
  \ ])

コマンドラインモードの補完

コマンドラインモード(: で入れるモード)の補完は従来シンプルだった。

" 従来: コマンド名の単純な補完のみ
:e <Tab>      " ファイル名補完
:help <Tab>   " ヘルプタグ補完

" 今回の改善: メタデータ(説明文・種別)付きの補完候補が表示できるように

実装の背景

インサートモードの補完コード
  → そのままコマンドラインモードにも適用

「インサートモードの処理を持ってきただけなので簡単な改善」
  → コードの再利用性の良い設計が活きた改善

ユーザーへの影響

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 作者)であり、氏の報告は信頼性が高い