ホーム > vim > Vimでシステム開発 — 補完

Vimでシステム開発 — 補完

2009 年 5 月 17 日 コメントをどうぞ コメント

殆どのIDEは入力補完機能を提供しています。優れたエディタであるVimは勿論補完機能を設けています。しかも、Vimはプログラム・ソースだけではなく、ファイル名、字引、バッファによる色々な形の補完をサポートしています。
Vimの補完を大きく分けて、OMNI補完とその他補完になります。
 

  • Onmi補完

Onmi補完は幾つかのプログラミング言語を対応しています、例えばC,C++,XML/HTML,CSS,JAVASCRIPT,PHP,RUBYなどを挙げます。詳しいリストは「:help compl-omni-filetypes」で参照します。ここで、主にCとC++に関する補完を紹介します。

Vimは補完を行う時、ファイル・タイプによって補完関数が異なります。即ち、Onmi補完を利用するには、ファイル・タイプ認識機能を有効にしなければ成りません。以下の一行をvimrcに追加し、タイプ認識を有効にします。
filetype plugin indent on

Cの補完

CとC++ソースのOnmi補完は、Exuberant ctagsが作ったタグファイルを利用します。Exuberant ctagsの詳細について、シリーズの Vimでシステム開発 — tagファイルとtaglistプラグイン(その1) を参照します。
Vim 7.1のソースを例として、vim71/src にて、コマンドから「ctags -R」を実行し、タグファイルを生成します。
VimMain()関数にて、「gui」を入力し、「CTRL-X CTRL-O」を押すと、Vimの状態欄に「Omni Completeion」が表示されます。これは補完を行っていることを表します。また、マッチしたタグがプルダウンに表示され、矢印キーで選択し、Enterを押せばソースに挿入できます。

Vim Omni 補完

デフォルトでは、補完時、Vimはプルダウンで候補を表示し、画面上部にプレビュー・ウィンドを一つ開いて候補の詳細を表示します。私は「completeopt」オプションを設定し、プレビュー・ウィンドを表示しないようにしています。
set completeopt=longest,menu

C++の補完

C++の補完をサポートするには、OmniCppCompleteプラグインが必要です。http://www.vim.org/scripts/script.php?script_id=1520 からダウンロードし、$HOME/.vim に解凍します。vimrcにて、Vi互換モードを無効にし、ファイル・タイプ認識を有効にします。
set nocp
filetype plugin on

続いて、下記コマンドでC++ソースのタグ・ファイルを生成します(ソース・ファイルは src フォルダにあるとする)。
ctags -R –c++-kinds=+p –fields=+iaS –extra=+q src

最後、Vimのtagオプションを正しく設定すれば、C++の補完が利用できるようになります。

キー・バインド

以下は私のvimrcの中の補完に関するキー・バインドです。pumvisible()関数を使ってプルダウンが表示しているかどうかを判断し、その結果によってキー・バインドを変えます。

"mapping 
inoremap <expr> <C-J>      pumvisible()?"\<PageDown>\<C-N>\<C-P>":"\<C-X><C-O>" 
inoremap <expr> <C-K>      pumvisible()?"\<PageUp>\<C-P>\<C-N>":"\<C-K>" 

 

以上は全て挿入モードのバインドです。意味は下記の通りです。

  プルダウン有り プルダウン無し
CTRL-J プルダウンの次ページへ CTRL-X CTRL-O
CTRL-K プルダウンの前ページへ CTRL-K

 

  • その他の補完

Omni補完以外、よく使うのはCTRL-NとCTRL-P補完です。これらは開いたバッファと編集中のファイルのヘッダ・ファイルから、カーソル 前の文字から始まる単語を探して補完します。Omni補完とは違う、CTRL-NとCTRL-Pはローカル変数も補完できます。

CTRL-Nは下を検索するとは違う、CTRL-Pは上を検索して補完を行います。

CTRL-NとCTRL-Pを使う時、検索場所は「complete」 オプションで設定します。例えば、大きいプロジェクトの場合、ヘッダ・ファイルを探せば時間が掛かります。そこで、complete オプションから、「i」を外した場合、CTRL-NとCTRL-Pはヘッダ・ファイルから探さなくなり、補完の速度は大幅に速くなります。詳しくは「:help ’complete’」。

他にも色々な補完があります、例えば、「CTRL-X CTRL-F」は作業フォルダのファイルとフォルダを補完できます。以下のイメージです。

Vim ファイル名 補完

全ての補完方式について、「:help ins-completion」で確認できます。

 

  • SuperTabプラグイン

SuperTabプラグインは、前回使った補完方式を記録して、次回は<TAB>キーを押すだけで前回と同じタイプの補完を重複できます。例 えば、前回はCTRL-X CTRL-Fでファイル名補完を行った場合、他の補完方式を行うまで、TABでファイル名の補完ができます。

SuperTabは http://www.vim.org/scripts/script.php?script_id=1643 からダウンロードします。ダウンロードしたファイルを$HOME/.vim/pluginに配置すればインストールは完了です。

SuperTabを設定できます。
g:SuperTabRetainCompletionType:初期値は「1」です。意味は、他の補完方式を行うまで、前回の補完方式を保持します。「2」にする時は、ESCで通常モードに戻るまで、前回の補完方式を保持します。
g:SuperTabDefaultCompletionType:デフォルトの補完方式を設定します。初期値はCTRL-Pです。

私は特に設定していませんが、自分の習慣と合せて、下記のようにvimrcに設定できます。

let g:SuperTabRetainCompletionType = 2 
let g:SuperTabDefaultCompletionType = "<C-X><C-O>" 

 

SuperTabを利用することで、シェルのようにTABで補完でき、凄く便利になりました。


関連ヘルプ

:help ins-completion 
:help compl-omni 
:help ’omnifunc’ 
:help i_CTRL-X_CTRL-O 
:help ins-completion-menu 
:help popupmenu-keys 
:help ’completeopt’ 
:help compl-omni-filetypes 
:help omnicppcomplete.txt 
:help compl-generic 
:help ’complete’ 
:help ins-completion 

 

Share and Enjoy:
  • del.icio.us
  • Google Bookmarks
  • Facebook
  • FriendFeed
  • Twitter
カテゴリー: vim タグ: ,
  1. コメントはまだありません。
  1. トラックバックはまだありません。