basyura's blog

あしたになったらほんきだす。

Vim7.4 にして neocomplete に移行した

理由

7.3 の patch が 1000 を越えても、7.4 が正式リリースされても乗り換えなかった理由。

neocomplcache で g:neocomplcache_enable_auto_select = 1 にしても選択状態が維持されない

僕としては結構深刻な理由。自動補完に便りっぱなしな上に、該当する候補に絞られたら Enter で楽ちんぽんだったのが、<C-n> で選択しなおして Enter というのはテンポが悪い。非常に悪い (Enterはいらないけど、慣れで押してしまう)。

なんで選択されなくなったのかはよく分からなくないのだけど、

パッチバージョンがいつの頃からかはわかりませんが、補完候補の絞り込みを行った時に、第一候補の選択状態が継続されません。

補完候補の絞り込み時、第一候補の選択状態が継続されない

と issue が上がってる通り、何かしらの変更が影響されているのだろう。ここで patch が書けるとカッコイイのだけど、なにぶんスキル不足なので当分 7.4 に乗り換えるのはとうぶんやめようと思っていた。

でも、

Vim 7.4 released!
[2013-08-10] Finally, after more than a thousand patches, there is a new version of Vim. This is mostly a bug-fix release. Also, many runtime files have been improved, syntax highlighting and indenting works better. To find out the details, do ":help version7.4" after installing it. Direct link to the MS-Windows installer. For Linux you probably want to use Mercurial for convenient building. For MacVim look here. Otherwise see the download page. (Bram Moolenaar)

http://www.vim.org/

を見ると使いたいし、kaoriya さんや splhack さんがせっかく対応してくれた if_lua とか、if_lua とか試したいじゃない!

考えた

inoremap <expr><CR>   pumvisible() ? "\<C-n>" . neocomplcache#close_popup()  : "<CR>"

でいいじゃない!( ゚∀゚)o彡゚
ポップアップが出てる時に Enter を押したら、1つ目を選択して確定する動き。

実際、選択しないといけないケースがたまにあって Enter して、アー!!となることはあるのだけど。まぁ、あまりないし。ほとんどは Enter 一発で終わるし。

7.4 に乗り換えた

となると話は早い。 7.4 に乗り換えて neocomplete に移行。先ほどの補完選択の設定は以下に変更

inoremap <expr><CR>   pumvisible() ? "\<C-n>" . neocomplete#close_popup()  : "<CR>"

7.3 と何か変わったかと言われると、実感は特になかったり・・・ if_lua が使えるようになったことか。

neocomplete

neocomplcache からの移行は基本的には名前を変える感じでいいのだけど、まだまだ分からないところがある。削られてる設定もあるようだけど、あまり困ってはない。あと、動きが正しいのかよく分からないところも。設定は今のところ以下だけ。

if !exists('g:neocomplete#keyword_patterns')
    let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns._ = '\h\w*'

if !exists('g:neocomplete#sources#dictionary#dictionaries')
  let g:neocomplete#sources#dictionary#dictionaries = {}
endif
let dict = g:neocomplete#sources#dictionary#dictionaries

let g:neocomplete#sources#buffer#disabled_pattern = '\.log\|\.log\.\|\.jax\|Log.txt'
let g:neocomplete#enable_ignore_case = 0
let g:neocomplete#enable_smart_case  = 1
let g:neocomplete#enable_fuzzy_completion = 0

call neocomplete#custom_source('_', 'sorters',  ['sorter_length'])
call neocomplete#custom_source('_', 'matchers', ['matcher_head'])

inoremap <expr><C-n>  pumvisible() ? "\<C-n>" : "\<C-x>\<C-u>\<C-p>"
inoremap <expr><CR>   pumvisible() ? "\<C-n>" . neocomplete#close_popup()  : "<CR>"
inoremap <expr><C-e>  pumvisible() ? neocomplete#close_popup() : "<End>"
inoremap <expr><C-c>  neocomplete#cancel_popup()
inoremap <expr><C-u>  neocomplete#undo_completion()
inoremap <expr><C-h>  neocomplete#smart_close_popup()."\<C-h>"

補完時のメッセージがちょっとうざい

f:id:basyura:20130817153423p:plain

Valloric/YouCompleteMe#39

ここで挙げられていた要望です。

確かに、自動補完をしていると Ctrl-x modeのメッセージ領域はうるさく感じられます。
現在は補完がキャンセルされた時のみメッセージを出さないことはできますが、メッセージを出さずにポップアップのみを出すことはできません。

Ctrl-x modeのメッセージを出さずにポップアップメニューのみ表示したい

これに関しては

hi WarningMsg guifg=bg

で非表示にしてみた。いまのところ良い感じ。
tweetvim とか J6uil.vim で画面の下に 2 行程度のウインドウを出して入力ということが多いから視界に入りやすいので気になるだけなのだろうけど。気になるものは仕方がない。