Vimで特定ファイルタイプでだけキーマップを無効化
Vimのノーマルモードの改行(<CR>
)には,挿入モードと同じようにその場で改行できるように~/.vimrc
に以下のキーマップを割り当てている。
nnoremap <CR> i<CR><ESC>
しかし,quickfix-windowやロケーションウィンドウ(ファイルタイプ:qf)やでは改行で対象箇所にジャンプする機能がある。上記キーマップがあるため,<CR>
を入力すると以下のエラーが出てうまくジャンプできない。
E21: Cannot make changes, 'modifiable' is off
オプションmodifiable
がoffになっているのにファイルを修正しようとしてエラーになってしまっている。
このジャンプの機能は残しておきたいので,quickfix-windowでは自分で定義した上記のキーマップを無効化したい。
以下のサイトで特定ファイルタイプでキーマップを無効化する方法が記されている。
参考:特定のファイル種別の時だけキーマップを無効化する方法 – かせいさんとこ
これによると,特定ファイルタイプでだけバッファーローカルの設定でグローバルな設定を上書きすればよいとのことだ。つまり,以下の内容のファイルタイプごとの設定ファイル~/.vim/after/ftplugin/qf.vim
を作ればよい。
" \file qf.vim
if exists("b:did_ftplugin_qf") | finish | endif
let b:did_ftplugin_qf = 1
"" Disable line break
nnoremap <buffer> <CR> <CR>
ここでは,自分で定義した<CR>
をもともとの<CR>
に割り当て直している。
これで特定ファイルでだけキーマップを無効化できた。
2016-09-24追記:実際のところ,今回実現したいことは上記のように個別のファイルでの設定は不要で簡単にできた。以下の内容を~/.vimrc
に記入すればいい。
"" Insert line break by Enter
autocmd BufEnter * if &modifiable | nnoremap <buffer> <CR> i<CR><ESC> | endif
autocmd
でバッファーを開くたびに,modifiable
が有効かどうか判定し,有効であるときだけそのバッファーでキーマップを有効にしている。これにより,QuickFixだけでなく,VimのHelpなどでもキーマップを無効(厳密には未設定なだけ)にでき,Enterでタグジャンプできる。