neocomplcacheの設定例にある…
Vim Script" <C-h>, <BS>: close popup and delete backword char.inoremap<expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"inoremap<expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
これらのマッピングはなくてもneocomplcacheは動作しますが、補完候補のポップアップが出ているときに<BS>
や<C-h>
を押したときにポップアップを確実に消してくれるもので、候補の誤爆を防いだり、表示がスッキリしたりする効用があります。
ところが、この設定を使うと、smartinputの以下のような機能が使えなくなってしまいますorz
_ をカーソルと仮定して、<BS>を使う前と後
Before: hoge(_) After: hoge_
Before: hoge()_ After: hoge_
括弧のペアを削除する機能です。まあ、ペアの括弧が入力されるだけでもかなり便利なんだけど、これはもったいない。
smartinputのローカルな関数を呼び出すために、スクリプト番号をどうやって取ろうとかなり悩んだのですが、ソースをよくよくみたらsmartinput#sid()
という関数があるじゃん。一難去った。しかし、どうやっても、マッピングの内容がそのまま文字列として入力されるな… そして、helpを見てみると、関数eval()
というのがある。これだ!eval()
で囲ってみる。よし。できあがったものを.
で結合して完成。
Vim Script
inoremap<expr><C-h>
\ neocomplcache#smart_close_popup()
\ . eval(smartinput#sid().'_trigger_or_fallback("\<BS>", "\<C-h>")')inoremap<expr><BS>
\ neocomplcache#smart_close_popup()
\ . eval(smartinput#sid().'_trigger_or_fallback("\<BS>", "\<BS>")')
2013-05-23 <CR>
の分を追加しておきます。
Vim Script
inoremap<expr><CR>
\ neocomplcache#smart_close_popup()
\ . eval(smartinput#sid().'_trigger_or_fallback("\<Enter>", "\<Enter>")')