LoginSignup
7
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-05-19

設定方法を改めて、新たに投稿しました→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>")')
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7