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

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

#この2つのプラグインについて
~~文字数稼ぎのために~~プラグインの紹介等を示します。

##2つに共通すること
これらに限らず、Vim でプラグインを使用する場合は管理プラグインNeoBundle が必要です。~/.vimrc に以下を記述しましょう。

```vim:.vimrc
if has('vim_starting')
  set nocompatible
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install neobundle..."
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/.vim/bundle'))
let g:neobundle_default_git_protocol='https'
NeoBundleFetch 'Shougo/neobundle.vim'

" ここらへんにインストールしたいプラグインを書く

NeoBundleCheck
call neobundle#end()
filetype plugin indent on

```

これで`vim`を起動すればインストールが行われます。
この記述はどこかからコピペしたものです。引用元は分かりませんが、このコードを打ってくれた方に感謝です！！

##NeoComplete
このプラグインは入力補完を行ってくれます。
同ファイル中に過去に入力した語を補完してくれる、という機能です。スニペット挿入は NeoSnippet の仕事ですね。
![vim.png](https://qiita-image-store.s3.amazonaws.com/0/74946/4dd1efe9-bf1e-31f1-7194-13b8447b6d3a.png)

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

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

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

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

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

.vimrc の、`" ここらへんにインストールしたいプラグインを書く`　へ書く記述は以下のとおりです。

```vim:.vimrc
NeoBundle "Shougo/neocomplete.vim"
    let g:neocomplete#enable_at_startup = 1
    let g:neocomplete#enable_ignore_case = 1
    let g:neocomplete#enable_smart_case = 1
	let g:neocomplete#enable_auto_select = 1
	let g:neocomplete#enable_enable_camel_case_completion = 0
    if !exists('g:neocomplete#keyword_patterns')
        let g:neocomplete#keyword_patterns = {}
    endif
    let g:neocomplete#keyword_patterns._ = '\h\w*'
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
```

これも引用元は不明。
TAB で補完項目を選んでいくというスタイルです。

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

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

```vim:.vimrc
inoremap { {}<Left>
```

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

さっきの場所に、

```vim:.vimrc
NeoBundle 'Townk/vim-autoclose'
```

とでも書いておいてください。

#そしてコンフリクトへ・・・
##キーバインドコンフリクトまでの経緯
NeoComplete は補完候補の選択・確定のキー設定が面倒でした。なので、僕は Enter キーに候補決定を、Delete キー( Windows で言うところの BackSpace キー )にパレットクローズ＆文字削除を、C-h にパレットクローズのみを割り当てました。
すると、なんということでしょう。SmartInput で入力後、インデントが効いてません。
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/74946/b7149b67-7bc8-8b6e-4346-7d9d994d61eb.gif)
注・コードがやけに見苦しいですがご了承ください。

##どういう設定をしてたか

```vim:.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 に以下の内容を`NeoBundle`の`call neobundle#end()`**の下に**記述してください。

```vim:.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 用の設定です。
ほんで、さっきの記述を次のように置き換える。

```vim:.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](https://qiita-image-store.s3.amazonaws.com/0/74946/cc22ed3f-318c-968f-7193-7e97a9720bb5.gif)

#参考にしたサイト
http://d.hatena.ne.jp/tacahiroy/20110927/1326981522
http://qiita.com/todashuta/items/bdad8e28843bfb3cd8bf