自動補完を使う_その2

neocomplcache

前回の続きでneocomplcache偏です。
まず、自分の環境はばっさり書くとこんな感じになります。

  • OS
  • VIM
    • Insertモードでもカーソルキーで移動し始めることもしばしば。
    • mswin.vimから必要なキーバインドだけ.vimrcに取り込んでる。(C-X,C-C,C-Vは手放せない。)

前回のあらすじ

  • neocomplcacheを使うと暴走して置換されて大変な事になった。
  • AutoComplPopがお手軽だったので、一瞬で乗り換えた。
  • コメントでneocomplcacheについての助言をもらったので再挑戦。
  • せっかくなので高機能なものを使いたいから頑張ってみた←今ココ

neocomplcacheの設定

let NeoComplCache_EnableAtStartup = 1
let NeoComplCache_ManualCompletionStartLength = 3
let NeoComplCache_MaxList = 20
let NeoComplCache_EnableCursorHoldI = 0 "値を1にしてキー操作時に音が鳴る場合は set visualbell t_vb=

Shougo 2010/04/16 14:40
neocomplcacheの最新版で、CursorHoldIを使って補完できるようになりました。
let g:NeoComplCache_EnableCursorHoldI = 1
で使えます。試してみてください。
こちらでやってみたところ、カーソル移動では補完されないことを確認しました。

試してみました。
補完はされませんでしたが、拒否音?ピープ音がキー操作のたびに鳴っていました。

そこで、何とかならないかなーと思いつつ考えた結果、
s:skip_next_completeという変数を見つけたのでこれを利用してみることにしてみました。
更に補完ポップアップのタイミングを以下のように、ごにょごにょ。

  1. ポップアップ表示時、押しても補完が継続する
  2. ポップアップ非表示時、押しても補完しない
  3. ポップアップ非表示時、カーソル移動した場合補完しない
  4. 文字入力時、カーソル移動した場合、補完PopUpが表示されなくなる

/autoload/neocomplcache.vim に以下を追記

function! neocomplcache#skipcompl()
	let s:skip_next_complete = 1
endfunction

.vimrc に以下を追記

function! NeoComplCacheWrapper(Mapping)
	if !pumvisible()
		call neocomplcache#skipcompl()
	endif
	execute 'return "\<'.a:Mapping.'>"'
endfunction

inoremap <expr><Up> NeoComplCacheWrapper('Up')
inoremap <expr><Down> NeoComplCacheWrapper('Down')
inoremap <expr><Left> NeoComplCacheWrapper('Left')
inoremap <expr><Right> NeoComplCacheWrapper('Right')
inoremap <expr><BS> NeoComplCacheWrapper('BS')
inoremap <expr><Del> NeoComplCacheWrapper('Del')

ひとまず、これで個人的満足度は上がったかなぁ。
入力したい(してる)時だけ補完が見えるように。

Comment

  • return <引数>で上手く動作させれなかったので、if,elseif文が無駄に多いです。解決済み
  • ちょっと古いg:NeoComplCache_EnableCursorHoldIの含まれていないバージョンを触っていて、"あるぇー"とか言いつつキーバインド作ってました。
  • よく見ると、補完ポップアップのタイミングの一部間違ってる。(文字入力時、カーソル移動した場合、補完PopUpが表示されなくなる⇒PopUp非表示になるまでカーソルで移動するとその後表示されなくなるってのが正しい気がする。また今度考えよう…。)