neocomplcache.vimを改良しようとしたら既にされてた件

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

neocomplcache.vimを改良しようとしたら既にされてた件

ちょっと前に、Vimの自動補完プラグインをAutoComplPopからneocomplcacheに乗り換えた。

何で乗り換えたのかは忘れた。確かAutoComplPopはUbuntuのscim+gvim環境と相性がよくなかったからだったと思うけど、実際のところUbuntuではgvim使ってないからあまり意味ない。ついでに言うと、neocomplcacheはキーワード補完にちょっと癖があってまだ慣れてない。

ただ、neocomplcacheは機能追加が著しいから、将来の可能性を信じて使ってる。

で、今日はneocomplcacheの補完開始時のカーソル位置が気に食わなかったので、AutoComplPopのスタイルに改造してみましたという話。

結論から言うと、マニュアル読んだりソース読んだりしてがんばってやってみたけど、本家の最新ソースコードを読んだら既にその機能が実装されていて、ちょっと切なかったという話。詳細は続きで。

neocomplcacheとAutoComplPopの違い

neocomplcacheとAutoComplPopの補完開始時の状態を比較するのが↓の画像。左がneocomplcacheで右がAutoComplPop。

neocomplcache vs AutoComplPop

色々と違うけど、ここで重要なのはAutoComplPopでは最初の補完候補がグレーで選択されているのに対して、neocomplcacheでは選択されていないこと。

些細な違いに見えるけど、補完候補があらかじめ選択されていると、Enterを押すだけで自然に補完候補を入力することができたりしてとても便利。

neocomplcacheでもkey mappingを工夫すれば似たような挙動ができるけど、AutoComplPop方式の方が自然で使いやすい。

ということで、

neocomplcacheでもAutoComplPop方式が使えるように、neocomplcacheを改造してみることにした。

AutoComplPopのソースを読んだり、neocomplcacheのソースを読んだり、Vimのマニュアル(|ins-completion-menu|)を読んだりしてみたけど、結局は一行書き換えるだけでそれなりに動くことがわかった。

パッチにすると↓のような感じ。

diff --git a/autoload/neocomplcache.vim b/autoload/neocomplcache.vim
index 2c075ff..405b32c 100644
--- a/autoload/neocomplcache.vim
+++ b/autoload/neocomplcache.vim
@@ -1072,7 +1072,7 @@ function! s:complete()"{{{
   let [s:cur_keyword_pos, s:cur_keyword_str, s:complete_words] = 
         \[l:cur_keyword_pos, l:cur_keyword_str, filter(l:complete_words, 'len(v:val.word) > '.len(l:cur_keyword_str))]
 
-  call feedkeys("\<C-x>\<C-u>\<C-p>", 'n')
+  call feedkeys("\<C-x>\<C-u>\<C-p>\<Down>", 'n')
 endfunction"}}}
 function! s:integrate_completion(complete_result)"{{{
   if empty(a:complete_result)

要は、autoload/neocomplcache.vimの1075行目の

call feedkeys("\<C-x>\<C-u>\<C-p>", 'n')

を、

call feedkeys("\<C-x>\<C-u>\<C-p>\<Down>", 'n')

に書き換えるだけ。

これだけでそこそこAutoComplPopっぽい挙動になった。わーい。

と思ってたら、

GitHubで公開されている本家のGitレポジトリから最新版のソースコードを読んでたら、↓のようなコードを見つけた。

if g:NeoComplCache_EnableAutoSelect
  call feedkeys("\<C-x>\<C-u>\<C-p>\<Down>", 'n')
else
  call feedkeys("\<C-x>\<C-u>\<C-p>", 'n')
endif

全く同じことやってるじゃん\(^o^)/しかもオプションで挙動変えられるようになってるじゃん\(^o^)/

g:NeoComplCache_EnableAutoSelect                        *g:NeoComplCache_EnableAutoSelect*
                補完候補を出すときに、自動的に一番上の候補を選択するかどうか
                を制御する。 このオプションを有効化すると、|AutoComplPop|と
                似た補完動作となる。

                初期値は0である。

しかもドキュメントまで用意されてるじゃん\(^o^)/AutoComplPopと似た動作とかまで書かれてるじゃん\(^o^)/

結論

GitHubの最新版がちゃんと動くのかどうかはわからないので、とりあえず自前のパッチを当てたneocomplcacheでしばらくは行くことにした。

ついでに、今後のアップデートに期待して、.vimrcには↓の一行を追加しておいた。

let g:NeoComplCache_EnableAutoSelect = 1
スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/196-ff707d94

トラックバック

コメント

こんにちは。neocomplcacheの作者です。

> AutoComplPopのソースを読んだり、neocomplcacheのソースを読んだり、Vimのマニュアル(|ins-completion-menu|)を読んだりしてみたけど、結局は一行書き換えるだけでそれなりに動くことがわかった。

残念ながら、問題はそう単純ではないのです。neocomplcacheには多数のオプションがあるため、それらにきちんと対応するのは結構大変だったりします。

> GitHubの最新版がちゃんと動くのかどうかはわからないので、とりあえず自前のパッチを当てたneocomplcacheでしばらくは行くことにした。
きちんと動作します。なぜなら私自身が
let g:NeoComplCache_EnableAutoSelect = 1
で毎日使っているからです。ただ、この設定はプラグインによって相性が発生したりするので注意。最近追加した機能で言うと、遅延補完もなかなか便利。
let g:NeoComplCache_EnableCursorHoldI = 1

> ついでに言うと、neocomplcacheはキーワード補完にちょっと癖があってまだ慣れてない。
問題等があれば教えてください。改善できそうなら実装してみます。
  • 2010-05-29
  • by Shougo
  • id:-

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。