vim-users.jp

Hack #49: 自動補完を活用する 後編

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

自動補完の後編では、究極の自動補完環境であるneocomplcacheについて解説します。何でもできるエディタとしてはEmacsが有名ですが、スクリプトファイルで拡張すれば、Vimにも無限の可能性があるということを知ってもらいたいです。

neocomplcacheを用いた自動補完

neocomplcacheという自動補完プラグインを紹介します。このプラグインはAutoComplPopに不満が出てきたので、最強の自動補完環境を作ろうと、私Shougoが作成したプラグインです。補完処理を全て自前で実装しているので、AutoComplPopと比較して動作が重いですが、AutoComplPopにはない究極のカスタマイズ性や、文脈を読む補完、プラグインにより独自拡張が可能なことが特徴となっています。最新版はVer.4.00です(2009年12月12日現在)。

neocomplcacheのインストール

githubにある配布ファイルをVimのユーザディレクトリにインストールします。Windowsの場合は$VIM/vimfiles/、MacやLinuxの場合は$HOME/.vim/が一般的です。最近はファイルが増えてきたため、フォルダごとコピーした方がよいでしょう。vim.orgにもneocomplcacheは登録されていますが、最新版はgithubにあります。

neocomplcacheの使い方

neocomplcacheはAutoComplPopと競合するので、AutoComplPopをインストールしている場合には、まずg:acp_enableAtStartupを1に設定し、AutoComplPopの自動起動を無効にしてください。自動起動を無効にした場合も、:ACPEnableコマンドを実行すれば、AutoComplPopを使用することができます。不具合を避けるため、neocomplcacheは自動的に起動しません。let g:NeoComplCache_EnableAtStartup = 1 と設定すると、Vimの起動時に自動的に有効になります。 手動で有効にしたいときには、:NeoComplCacheEnableを実行してください。:NeoComplCacheDisableで無効になります。

neocomplcacheの代表的機能

neocomplcacheは後発なだけあって、多数の機能を統合しています。ここでは特に便利だと思われる機能に絞って紹介します。

多数の言語に対応

VimScript, Perl, Ruby, C/C++, D, Lispなど、標準的に多数の言語のキーワードに対応しています。特にVimScriptは作者が日常的に使用していることもあり、細かな補完ができます。設定すれば、他の言語に対応させることももちろん可能です。'iskeyword'には依存しないので、他のプラグインに影響を与えることもありません。

文脈を解析する補完

最近のかな漢字変換システムのように、あるワードの後に何が来るかを細かく判定して、補完候補の順番に反映させます。例えばcallの後には関数名が来やすいと言うことを判定するので、補完効率が上がります。

拡張されたオムニ補完

AutoComplPopのように、ファイルタイプに応じてオムニ補完を自動的に呼び出すことができます。AutoComplPopとは違い、C/C++, Java, PHPのオムニ補完にも対応。設定を変更することで、他のオムニ補完プラグインに対応することも可能です。

ファイル名補完

AutoComplPopのように、自動的に呼び出すファイル名補完に対応しています。しかも自前で実装しているので、連続した補完や時間がかかるときに補完をスキップするといった機能も搭載しています。
filename_completion

クイックマッチ

-記号を入力すると、補完候補の横に英数字が出てくるので、それを入力することによって、簡単に候補を選択できます。<C-n>を連打する必要がないので便利です。

ワイルドカードによる補完

“h*ge”のように、*を使って候補を絞り込むことができます。候補が多数出てくるときに便利です。

スニペット補完

snipMateライクなスニペット補完に対応しています。自動的に補完が出てくるので、他のプラグインのようにスニペットをいちいち覚える必要がありません。スニペットを追加することも簡単です。
snippet_complete

シンタックス補完

標準的に付属しているautoload/syntaxcomplete.vimのように、シンタックスキーワードを自動的に収集、補完候補として加える機能があります。辞書ファイルを用意しなくても補完ができるので便利です。
syntax_complete

ATOK X3やuimにも対応

AutoComplPopにはATOK X3やuimをGVim上で使用すると暴走するバグがありますが、neocomplcacheでは対策されているので、そのような問題は発生しません。VimをATOK X3に対応させる方法については、[Hack #79]: ATOK X3をGVimで使用するを参照してください。

ストレスにならない動作

自動補完は候補が出てくる速度が遅いと、大変なストレスになります。neocomplcacheでは自動補完に時間がかかりすぎるようなら計算をストップします。これによりストレスが軽減されます。

プラグインによる拡張

機能が分離されているので、Emacsのanything.elやauto-complete.elのように、プラグインで簡単に拡張することができます。実際にスニペット補完やシンタックス補完はプラグインで実装されています。自作プラグインによる拡張方法については、[Hack #93: ]neocomplcacheを拡張する 前編を参照してください。

VimScriptの補完

VimScriptのオムニ補完を自前で実装しています。ローカル変数を動的に解析する機能も備え、標準のVimScript補完と比べても便利です。

neocomplcacheの設定

以下に私の設定ファイルを紹介します。neocomplcacheには多数の設定オプションがあるので、ここで一つずつ解説することはしません。詳しくはヘルプを参照してください。

" Use neocomplcache.
let g:NeoComplCache_EnableAtStartup = 1
" Use smartcase.
let g:NeoComplCache_SmartCase = 1
" Use camel case completion.
let g:NeoComplCache_EnableCamelCaseCompletion = 1
" Use underbar completion.
let g:NeoComplCache_EnableUnderbarCompletion = 1
" Set minimum syntax keyword length.
let g:NeoComplCache_MinSyntaxLength = 3
" Set manual completion length.
let g:NeoComplCache_ManualCompletionStartLength = 0

" Print caching percent in statusline.
"let g:NeoComplCache_CachingPercentInStatusline = 1

" Define dictionary.
let g:NeoComplCache_DictionaryFileTypeLists = {
            \ 'default' : '',
            \ 'vimshell' : $HOME.'/.vimshell_hist',
            \ 'scheme' : $HOME.'/.gosh_completions',
            \ 'scala' : $DOTVIM.'/dict/scala.dict',
            \ 'ruby' : $DOTVIM.'/dict/ruby.dict'
            \ }

" Define keyword.
if !exists('g:NeoComplCache_KeywordPatterns')
    let g:NeoComplCache_KeywordPatterns = {}
endif
let g:NeoComplCache_KeywordPatterns['default'] = '\v\h\w*'

let g:NeoComplCache_SnippetsDir = $HOME.'/snippets'

neocomplcacheをさらに使いこなすために:

neocomplcacheには日本語のヘルプが付属しています。:help neocomplcacheをすれば設定可能なオプション等が一覧できます。体系的な解説が欲しい場合は、プレゼンテーションファイルを参照してください。新機能が追加された場合、こまめに更新しています。

Shougo

もどる
blog comments powered by Disqus