特定のファイル種別の時だけキーマップを無効化する方法

概要


よくあるこんなので、ダブルクォーテーションの補完を .vim の時だけ解除したい時どうしたらよいか?
知らなかったので纏めました

inoremap { {}<LEFT>
inoremap ( ()<LEFT>
inoremap [ []<LEFT>
inoremap < <><LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>

" ビジュアルモード
vnoremap { "zdi^V{<C-R>z}<ESC>
vnoremap [ "zdi^V[<C-R>z]<ESC>
vnoremap ( "zdi^V(<C-R>z)<ESC>
vnoremap " "zdi^V"<C-R>z^V"<ESC>
vnoremap ' "zdi'<C-R>z'<ESC>

ftplugin/vim.vim で解除してみる

silent! iunmap "
silent! vunmap "


これをやると、vim系のファイルを読んだ後、他のバッファでもダブルクォーテーションの補完が使えなくなる
他のバッファというか vim 全体に効力か及んでいるみたい

バッファローカルにする



mapの後にとつけるとそのキーマップはバッファローカルとなり、他のバッファでは適用されない
なので、.vimrcと、vim.vim それぞれにをつける
.vimrc側にもつけるのは、 unmap はバッファローカルで指定されたマップしか解除できないため


.vimrc

inoremap <buffer> { {}<LEFT>
inoremap <buffer> ( ()<LEFT>
inoremap <buffer> [ []<LEFT>
inoremap <buffer> < <><LEFT>
inoremap <buffer> " ""<LEFT>
inoremap <buffer> ' ''<LEFT>


ftplugin/vim.vim

silent! <buffer> iunmap "
silent! <buffer> vunmap "


そんな感じです
やり方として正しいのか不明


バッファローカルの設定でグローバルな設定を上書きするのが正しいようです
Kanaさんご指摘謝恩!!

アウト。<buffer>はそれを実行したときにカレントバッファにしか影響がない。

例示されているものではvimrcで定義しているものはグローバルに有効にしたいものだから、
<buffer>を付けるとVim起動時に最初に表示されるバッファのみでしか定義されず他のバッファで使えなくなる。
だからそこで<buffer>を使ってはならない。

ftplugin/vim.vimではグローバルな定義を無効化したいのだから、
下記のようにして<buffer>を付けてバッファローカルなものを定義してグローバルな定義を上書きする。

Re: 特定のファイル種別の時だけキーマップを無効化する方法 - かせいさんとこ - while ("im the true Vim master"); - vimグループ


ftplugin/vim.vim

inoremap <buffer> { {
inoremap <buffer> " "
inoremap <buffer> ' '


そんなかんじー