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 を使用しなくても早かったので削除。
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 用で、あえて変えてありますが、これは neocomplcache と snipMate それぞれの使い勝手を活かすための措置です。
"sn" まで入力すると neocomplcache は、補完候補の一覧に "snippet abbr prev_word
ただ、"sn" というトリガーが登録されている事を記憶している場合は sn
neocomplcache と snipMate の同居について
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 に追加すると、上記を行なう必要はありません