neocomplcache + snipMate 環境に乗り換える為に準備中

徹夜作業時、あまりにも暇で前々から興味のあった neocomplcache を試してみました。
重いという噂があったので少し敬遠していたのですが、iMac 5G 環境でサクサク動いた為、一週間だけお試し期間を延長しました。
その後、いろいろ解らない所があり挫折しかけ、twitter で愚痴と疑問を垂れ流していた所を作者様に見つけて頂き、いろいろサポートを受ける事ができました。また、希望の機能(起動と同時にスニペットファイルを読み込む)も実装して頂き、常用できる所まで辿り着いたので、ここにメモを残します。
その節は、本当にお世話になりました m(_ _)m > 作者様

現在の設定

"neocomplcache
let g:NeoComplCache_EnableAtStartup = 1
let g:NeoComplCache_KeywordCompletionStartLength = 1
let g:NeoComplCache_MinKeywordLength = 3
let g:NeoComplCache_MinSyntaxLength = 3
let g:NeoComplCache_SmartCase = 1
let g:NeoComplCache_PluginCompletionLength = {
  \ 'snipMate_complete' : 1,
  \ 'keyword_complete'  : 2,
  \ 'syntax_complete'   : 2
  \ }
let g:NeoComplCache_DictionaryFileTypeLists = {
  \ 'default'    : '',
  \ 'erlang'     : $HOME . '/.vim/dict/erlang.dict',
  \ 'objc'       : $HOME . '/.vim/dict/objc.dict',
  \ 'javascript' : $HOME . '/.vim/dict/javascript.dict',
  \ 'mxml'       : $HOME . '/.vim/dict/mxml.dict',
  \ 'ruby'       : $HOME . '/.vim/dict/ruby.dict',
  \ 'perl'       : $HOME . '/.vim/dict/perl.dict',
  \ 'scheme'     : $HOME . '/.vim/dict/gauche.dict'
  \ }
let g:NeoComplCache_SameFileTypeLists = {
  \ 'perl'    : 'man',
  \ 'erlang'  : 'man',
  \ 'objc'    : 'c',
  \ 'tt2html' : 'html,perl'
  \}
let g:NeoComplCache_KeywordPatterns = {
  \ 'perl'   : '\v\<\h\w*\>?|\h\w*(::\h\w*)*|[$@%&*]\h\w*|\h\w*%(\s*\(\)?)?',
  \ 'erlang' : '\v\h\w*(:\h\w*)*'
  \}

perl, erlang では、manpageview 経由で開いた man からキーワード補完を行なう事が多々あるので、g:NeoComplCache_SameFileTypeLists に上記のような設定をしてあります。
また、perl, erlang では、パッケージ名に ':' を含むため、g:NeoComplCache_KeywordPatterns に上記のような正規表現を設定してあります。

g:NeoComplCache_AlphabeticalOrder を使用しなくても早かったので削除。(neocomplcache_snippets_expand) も snipMate と連携したので削除。

g:NeoComplCache_PluginCompletionLength を追加

スニペット編集の下準備

スニペットファイルを楽に編集するため、下記を用意しました。
/path/to/.vim/autoload/neocomplcache/snippets_complete/snippet.snip

snippet     snippet
abbr        snippet abbr prev_word <snippet code>
prev_word   '^'
    snippet     ${1:trigger}
    abbr        ${2:abbr}
    prev_word   '^'
        ${3:snippet code}

また、/path/to/.vim/snippets/snippet.snippets にも下記を追加しました。

snippet     sn
    snippet     ${1:trigger}
        ${3:snippet code}

abbr と prev_word を削除
トリガーとなるキーワードは、neocomplcache 用と snipMate 用で、あえて変えてありますが、これは neocomplcachesnipMate それぞれの使い勝手を活かすための措置です。
"sn" まで入力すると neocomplcache は、補完候補の一覧に "snippet abbr prev_word " を表示してくれるので neocomplcache 用のスニペットファイルに短く覚え難いトリガーを設定する必要はありません。(neocomplcache のスゴい所は、複数のスニペットを選択でき、かつ、トリガーを無駄に暗記しなくて済む所です)
ただ、"sn" というトリガーが登録されている事を記憶している場合は sn ですぐに補完して欲しいので snipMate 用のスニペットファイルには、短く入力しやすいトリガーを設定してあります。

neocomplcachesnipMate の同居について

snipMate_complete に乗り換えました。詳細は、こちら

snipMate 用のスニペットファイルは autoload/snipMate.vim や ftplugin/html_snip_helper.vim で定義されている関数に依存しています。
よって、snipMate 用のスニペットファイルを neocomplcache 用のスニペットファイルに単純に移植する事は出来ません。
これだけの理由であれば Filename()、Close() と言った関数を neocomplcache に移植すれば良いのですが、下記の理由により同居の道を選びました。

  • (neocomplcache_snippets_expand) をタブキーにバインドする良い方法が解らなかった
  • snipMate の方がスニペット補完に関してのみ高機能だった
  • トリガーとする文字列が短すぎると、補完候補として一覧に現れない

ちなみに、現在の所 .vim/syntax/snippet.vim のみ重複しているのですが、より文法が複雑な neocomplcacheシンタックスファイルを利用する方が良いと思います。

(neocomplcache_snippets_expand) をタブキーにバインド

私の実力不足で、snipMate のような動作に出来ませんでした。

snipMate の方がスニペット補完に関してのみ高機能だった

例えば、下記のようなスニペットがあったとします。

snippet o
    ${1:NSObject} *${2:foo} = [${3:$1 alloc}]${4};${5}

snipMate では ${1:NSObject} を編集すると、後方の $1 も同時に書き換わるのですが、neocomplcache には、この機能がありません。
とは言え、neocomplcache の補完候補一覧表示は強力すぎて手放せません。

トリガーとする文字列が短すぎると、補完候補として一覧に現れない

上記のスニペットは "o" 一文字です。
neocomplcache の補完を一文字から始めると、補完候補が多すぎて使い難くなります。
トリガーを "ob" とするくらいなら、いっその事 o で補完された方が便利です。

g:NeoComplCache_PluginCompletionLength というオプションが増え、補完開始の文字数を補完プラグインごとに設定できるため、この問題は解消されました。私は、snipMate のみ一文字から補完開始、その他は、二文字から補完開始としています。

スニペットファイルについて

snipMate_complete に乗り換えました。詳細は、こちら
http://github.com/cooldaemon/myhome/tree/master/.vim/autoload/neocomplcache/snippets_complete
よろしければ、ご参考にどうぞ。

neocomplcache と manpageview の連携について

autocomplpop では manpageview で開いたバッファ内のキーワードも補完対象でした。
しかし、neocomplcache では manpageview で開いたバッファが Readonly で開かれるため、キーワードをキャッシングしてくれず、補完対象となりません。
そこで、manpageview で開いたバッファに対して :NeoComplCacheCachingBuffer を行う事でキャッシングし、補完対象とする事ができます。

「autocmd BufFilePost Manpageview* silent execute ":NeoComplCacheCachingBuffer"」を .vimrc に追加すると、上記を行なう必要はありません