vim-users.jp

Hack #4: Insert mode補完 導入編

Posted at 2009/05/01
このエントリーをはてなブックマークに追加

Vimが他のエディタと比較して優れている点の一つとして、豊富な補完機能が挙げられます。本Hackでは特にInsert modeで使用できる補完について解説します。ほとんどの補完機能は<C-x>で始まるキーに割り当てられています。よく使う補完機能には、各々が押し易いキーに割り当てると良いでしょう。Insert mode補完についての詳しい解説は:help ins-completionを参照してください。

<C-n>または<C-p>: 様々なソースからのキーワード補完
<C-x><C-n>と似ていますが、オプション'complete'で指定された場所からキーワードを検索する点が異なります。プログラミングでは同じ単語を何度も使用することが多いうえ、キーバインドが押し易いこともあって、一番便利な補完です。'complete'を調整することで、辞書補完などの他の補完をも同時に行うことができますが、その分補完処理に時間がかかります。
<C-x><C-p>または<C-x><C-n>: カレントバッファからのキーワード補完
カーソルより前の文字列と一致するキーワードを補完候補とします。ここで「キーワード」とはオプション'iskeyword'で指定された文字が2個以上連続する文字列です。EmacsにおけるDynamic Abbrev Expansion (動的略語展開)と同等の機能です。
'iskeyword'の値はバッファ毎にカスタマイズでき、編集するファイルの種類に応じて適宜設定されます。例えばLisp系言語では多くの文字が識別子として利用可能なため、'iskeyword'には-+?!なども含まれています。
他の補完と比較しても高速ですが、補完候補が大量にある場合、補完候補の表示に時間がかかります。
<C-x><C-f>: ファイル名補完
カーソル前にある文字列をパスとして、ファイル名を補完します。ファイル名を指定するときに便利です。環境変数やホームディレクトリも認識します。
<C-x><C-v>: Vimコマンド補完
Command-line modeと同様にVimのコマンドを補完します。組み込みの関数やコマンドだけでなく、現在読み込まれているユーザー定義の関数やコマンド、変数なども補完することができます。
<C-x><C-u>: ユーザー定義補完
オプション'completefunc'に設定された関数を用いて補完を行います。補完関数の作成についてはHack #?で詳しく解説します。
<C-x><C-o>: オムニ補完
いわゆるintellisenseのような賢い補完を行います。オプション'omnifunc'に設定された関数を用いて補完を行います。
オムニ補完とユーザー定義補完は機構としては全く同じですが使用目的が異なります。オムニ補完は'filetype'に応じた賢い補完を提供するためにある一方、ユーザー定義補完はユーザーが任意の補完を行うことができるよう提供されています。
標準ではC、C++、Python、XMLなどに対応しています。内部で構文解析をしているのである程度賢いですが、完璧ではありません。'omnifunc'によっては事前にタグファイルを作成する必要があったり、構文解析にRuby interfaceなどを利用するためVimを適切にコンパイルしておく必要があります。
<C-x><C-k>: 辞書補完
オプション'dictionary'で指定された辞書ファイルから単語を補完します。よく使う言語の予約語や標準ライブラリ関数名などをまとめた辞書ファイルを作成しておくと便利でしょう。またwww.vim.orgを始めとして、インターネット上で配布されている辞書ファイルを利用させてもらうのも良いでしょう。
<C-x><C-]>: タグ補完
オプション'tags'で指定された場所にあるタグファイルからキーワードを検索し、補完を行います。この補完を利用するためには予めctagsなどのツールを用いてタグファイルを作成しておく必要があります。
<C-x><C-i>: インクルードファイルからのキーワード補完
カレントバッファに加えインクルードファイルからもキーワードを検索し、補完を行います。例えばC言語では#includeで他のファイルの内容を取り込むことができますが、「インクルードファイル」とはそのような記述により参照されている外部ファイルのことです。Perlではuserequire、Rubyではrequireloadなどを認識します。インクルードファイルについては'include'で指定することができます。
<C-x><C-d>: 定義/マクロ名補完
カレントバッファとインクルードファイルからマクロ名などの各種定義を補完します。例えばC言語では#defineによりマクロを定義することができますが、そのような記述で定義されたものを補完することができます。
<C-x><C-t>: シソーラス補完
オプション'thesaurus'で指定された辞書ファイルから単語を補完します。辞書補完とは異なり、カーソル付近の文字列にマッチする単語だけではなく、その類義語も補完することができます。
<C-x><C-s>または<C-x>s: スペルチェック
カーソル付近の単語に対して正しいであろう単語の候補を補完します。英文を書く際に有用でしょう。オプション'spell'をセットしていないと動作しません。
<C-x><C-l>: 行補完
カーソルより前の文字列と一致する行を検索し、該当する行全体を補完します。検索するバッファの種類はオプション'complete'で指定することができます。Normal modeに戻る必要がないため、行をコピーする際に便利です。
補完中のキー操作
補完中では以下のキーで補完操作を行うことができます。
<C-n>
次の候補を選択し、カーソル位置に挿入します。
<C-p>
前の候補を選択し、カーソル位置に挿入します。
<C-y>
現在選択している補完候補を挿入し、補完を終了します。
<C-e>
補完をキャンセルします。
また、補完のポップアップメニューが表示されている場合は以下のキー操作が有効になります。
<BS>または<C-h>
一文字削除して、候補を再検索します。
<PageDown>
ポップアップメニューを順方向に改ページします。
<PageUp>
ポップアップメニューを逆方向に改ページします。
<Down>
次の候補を選択しますが、<C-p>とは違って候補を挿入しません。
<Up>
前の候補を選択しますが、<C-n>とは違って候補を挿入しません。
<C-l>
マッチするものから一文字追加し、補完を絞り込みます。
<Space>または<Tab>
候補選択を終了し、タイプした文字を挿入します。
<Enter>だけは少々特殊です。候補を選択している場合はその候補を挿入し、それ以外の場合は改行します。この動作が煩わしい場合は、:inoremapでキーをカスタマイズするべきです。補完時のkey mappingを設定する方法は[Hack #9: Insert mode補完 設定編]を参照してください。
Shougo

もどる
blog comments powered by Disqus