vim-users.jp

Hack #44: 自動補完を活用する 前編

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

[Hack #4: Insert mode補完 導入編]では、手動で行うInsert mode補完について解説しました。ここでは補完を自動的に行う方法について解説します。手動の補完だけでも十分に便利ですが、補完を自動で行うことで世界は劇的に変化します。

自動補完とは

まず、自動補完について定義しましょう。自動補完は「ユーザーのキー入力によって、自動的に補完を呼び出すこと」です。通常の補完ではユーザーが明示的に補完のためのキーを押す必要がありました。つまり、「頭が補完をする」と考えなければ補完ができないのです。これにより、作業効率が落ちてしまいます。それならばシステムが自動的に判断して、補完のためのキーを押したらどうでしょうか。これでユーザーはやらなければならない作業のみに集中することができます。Vim7よりオムニ補完が実装されたので、Visual Studioのように「関数やメンバを補完」は実現できるようになりました。しかし、そこには「自動的に」が欠けているのです。自動的に補完が行えてこそ、VimはVisual Studioと同じ土俵にたてるわけです。ただし自動補完を自分で実装すると、非常に手間がかかります。現在ではVimで自動補完を実現するプラグインがいくつか存在しますので、ありがたく利用させてもらいましょう。

AutoComplPopを用いた自動補完

まず紹介する自動補完プラグインは、AutoComplPopです。バッファやファイル検索プラグインとして有名なfuzzyfinderの作者でもあるns9tksさんが作ったプラグインなので、知っている方も多いでしょう。このプラグインはInsert modeでのキー入力を監視し、入力に応じて自動的にキーワード補完やファイル名補完、オムニ補完を行ってくれます。Vimの補完機能を呼び出すだけなので非常に高速ですが、カスタマイズ性に少々難があります。最新版は2.13です(2009年12月12日現在)。

インストール方法は簡単で、vim.orgのページからプラグインファイルを入手して、$HOME/.vim/にコピーするだけです。特に設定しなくても、自動補完は有効になります。

AutoComplPopをインストールしている場合、g:acp_behaviorKeywordLength文字以上の文字を入力するとキーワード補完を呼び出します。デフォルトは2文字です。補完が重いと感じたら、g:acp_behaviorKeywordLengthの値を増やしてください。

“..”や”./”、といったg:acp_behaviorFileLength文字以上のパス名を入力すると、ファイル名補完を呼び出します。特にシェル関係のプラグインでは、明示的に補完キーを押さなければならない普通のシェルより格段に楽ができます。

Ruby, Python, HTML, CSSのファイルでは、Omni補完を自動的に呼び出すことができます。例えばRubyのスクリプトファイルを編集している場合、.を入力するだけで補完ができます。ある程度変数の型を判別してから候補を出すので、メンバを参照するのに便利です。HTMLでは<や>を入力することで補完が働きます。タグを閉じることもできます。ただし、候補が多い場合には処理が重くなる可能性があります。オムニ補完によってはエラーが出ることもあり、注意が必要です。

AutoComplPopのカスタマイズでは、基本的にVimのキーワード補完の設定をすることになるでしょう。詳しい設定方法については、[Hack #9: Insert mode補完 設定編]を参照してください。例えば、rubyでは!も補完するためにsetlocal iskeyword+=!とすることなどが考えられます。

自動補完のデメリット

すごく便利に思える自動補完にも欠点があります。それは補完候補が多いと処理が重くなり、ユーザーにストレスが溜まるということです。これは当たり前のことですが、ユーザーが非明示的に呼び出す自動補完の場合、処理の遅さが致命的です。これは自動補完する文字数を増やすことでも軽減ができます。

neocomplcacheとの違い

私はneocomplcacheという自動補完プラグインを作成しているので、AutoComplPopとの違いについて、簡単に解説しておきます。 AutoComplPopは基本的にVim標準の補完関数を自動呼び出しします。これはC言語で記述されているため、高速ですがカスタマイズの余地が少なく、他の補完を同時に呼び出すこともできません。逆にneocomplcacheでは、一切通常の補完を呼び出さず、自前で補完リストを作成しています。この方が実装に手間もかかり、動作も遅いですが、カスタマイズの余地が大きいので、無限の可能性があります。現にneocomplcacheでは頻度解析や補完の統合を行うなど、他の補完システムにも例を見ない補完環境を実現しました。補完処理の遅さは内部でキャッシュすることで、ある程度軽減しています。逆にAutoComplPopでは一切キャッシュがないので、補完候補が多い場合、neocomplcacheよりも遅いということがあり得ます。どちらも一長一短なので、好きなように使い分けてください。

Shougo

もどる
blog comments powered by Disqus