neocomplcache#smart_close_popup()とsmartinputの機能を両立させる


設定方法を改めて、新たに投稿しました→http://qiita.com/items/bdad8e28843bfb3cd8bf


neocomplcacheの設定例にある…

" <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()で囲ってみる。よし。できあがったものを.で結合して完成。

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> の分を追加しておきます。

inoremap <expr> <CR>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<Enter>", "\<Enter>")')