neocompleteでインテリセンスみたいなのをやりたかった

矢印キーの話。Vimなんだから矢印キーでカーソル移動するなよ、そんなにやりたきゃE○acs使えよって怒られそうですが。

初期状態だと、neocompleteは次のような場面で補完を開始しようとします。

  • インサートモードに移行したとき
  • インサートモードでカーソルが移動したとき(文字入力に由来するものも含む)

このため、インサートモード中にカーソルを移動すると、既存のコードを通り過ぎる時にも補完を開始してしまいます。おまけに上下キーは候補選択にも使うので、そこでカーソル移動できなくなってしまいます。結構うっとうしい。

で公式にもいくつかの方法が提示されています。

矢印キーをinoremapして、ポップアップ消したうえでカーソル移動するようにする
カーソル移動ができない件は解決しますが、補完自体は発生しますし、候補を上下キーで選択できなくなります。
カーソルが一定時間動かないときに発生するCursorHoldIイベントを使う
一度カーソルを止めてしまうと同じ状態になりますし、後述するバックスペース問題があります。文字入力による補完開始にもラグが発生しますが、これは好みですね。
文字入力時に発生するInsertCharPreイベントを使う
カーソル移動で補完が始まらない、候補選択も上下キーでできる、となかなかいいことづくめですが、バックスペース問題があります。

バックスペース問題と言ったのは、バックスペースを押した時に補完続行できないこと。どうやらInsertCharPreではバックスペースを取得できず、カーソルの後退を検知しているみたいで。CursorHoldIは・・・なんでだろ。

https://github.com/Shougo/neocomplete.vim/issues/106

に「文字消して再度補完」ってのを割り当てられないかなーと探ったものの、自動補完と同じ挙動を再現するのが難しいのと、neocompleteで補完してる時以外のことを考えるのが面倒になり断念。上のIssueの最後に書いてある例でも時々上下移動で補完起動することがあって、ぐぬぬ

neocompleteの補完が消えた後に行補完モードになることがあるのも気になるなあ。。
https://github.com/Shougo/neocomplete.vim/issues/333 なるほど。