Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

NeoCompleteとSmartInputのキーバインドのコンフリクトを解消する

$
0
0

Vim を未だに使いこなせていない初心者 Vimmer です。
色々プラグインは入れているのですが、使いやすくしようとキーバインドを追加した所、2つのプラグインの設定がコンフリクトしてたので解決方法です。
まあ、今は Sublime Text 3 をprprしてるわけですが。

この2つのプラグインについて

文字数稼ぎのためにプラグインの紹介等を示します。

NeoComplete

このプラグインは入力補完を行ってくれます。
同ファイル中に過去に入力した語を補完してくれる、という機能です。スニペット挿入は NeoSnippet の仕事ですね。
vim.png

このプラグインはこのように Lua & 新しいバージョンが必要なので、Mac の人は brew とかでやっちゃいましょう。

$ brew install vim --with-lua # Macにバンドルされている物とは別にVimをインストール$ brew reinstall vim --with-lua # 既に上のコマンドを実行済みの人はこれで再インストール

インストール後は PATH の設定もお忘れなく。例えば、brew の人は、

.bash_profile
export PATH="/usr/local/bin":$PATH

をシェルの設定ファイルに書いておきましょう。

前身である NeoComplcache の設定も、neoomplcacheneocompleteに変えるだけでほとんどそのまま引き継げるのでいいですよね〜

SmartInput

これは、閉じ括弧の自動挿入及びインデント挿入を行ってくれるプラグインです。

.vimrc
inoremap { {}<Left>

とかやっている人は多いと思いますが(僕もこのプラグインを見つけるまではそうでした)、この設定じゃある条件下では望む動作をしてくれませんよね〜
これをいい感じにやってくれるのが本プラグインです。

そしてコンフリクトへ・・・

キーバインドコンフリクトまでの経緯

NeoComplete は補完候補の選択・確定のキー設定が面倒でした。なので、僕は Enter キーに候補決定を、Delete キー( Windows で言うところの BackSpace キー )にパレットクローズ&文字削除を、C-h にパレットクローズのみを割り当てました。
すると、なんということでしょう。SmartInput で入力後、インデントが効いてません。
1.gif
注・コードがやけに見苦しいですがご了承ください。

どういう設定をしてたか

.vimrc
" <BS>で閉じて文字削除
imap <expr><BS> pumvisible() ?
      \ neocomplete#smart_close_popup() . "\<BS>"
      \ : "\<BS>"" <C-h> で閉じる
imap <expr><C-h>
      \ neocomplete#smart_close_popup()" <CR> で候補選択、改行する" ポップアップがないときには改行する
imap <expr><CR> pumvisible() ?
      \ neocomplete#close_popup()
      \ : "\<CR>"

と言った設定です。コード的には(条件式) ? (条件式が真の時の動作) : (条件式が偽の時の動作)で全く問題ないように思えますが、どうやら偽の時の動作<\CR><\BS>が上手く言っていない模様。

解決策

SmartInput にmap_to_triggerという関数を発見。これを使って、.vimrcに以下の内容をNeoBundlecall neobundle#end()の下に記述してください。

.vimrc
call smartinput#map_to_trigger('i','<Plug>(smartinput_BS)',
      \                        '<BS>',
      \                        '<BS>')call smartinput#map_to_trigger('i','<Plug>(smartinput_C-h)',
      \                        '<BS>',
      \                        '<C-h>')call smartinput#map_to_trigger('i','<Plug>(smartinput_CR)',
      \                        '<Enter>',
      \                        '<Enter>')

上から、delete、C-h、Enter 用の設定です。
ほんで、さっきの記述を次のように置き換える。

.vimrc
" <BS> で閉じて文字削除
imap <expr><BS>
      \ neocomplete#smart_close_popup() . "\<Plug>(smartinput_BS)"" <C-h> で閉じる
imap <expr><C-h>
      \ neocomplete#smart_close_popup()" <CR> で候補を選択し改行する" ポップアップがないときには改行する
imap <expr><CR> pumvisible() ?
      \ neocomplete#close_popup() : "\<Plug>(smartinput_CR)"

するとあら不思議。共存して効くようになりました。
2.gif

参考にしたサイト

http://d.hatena.ne.jp/tacahiroy/20110927/1326981522
http://qiita.com/todashuta/items/bdad8e28843bfb3cd8bf


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>