用途
以下のような便利なキーマップを設定したいとします。
nnoremap ]b :bn<CR>
nnoremap [b :bp<CR>
nnoremap ]B :bl<CR>
nnoremap [B :bf<CR>
このキーマップは簡単にバッファを切り替えられて便利ですが、NERDTreeのウインドウ内でも使えてしまうので、嫌な気持ちになるときがあります。
NERDTreeのウインドウ内ではこの機能を無効化したいです。
解決策
function IsInNERDTreeBuf()
return exists('t:NERDTreeBufName') && bufname("%") == t:NERDTreeBufName
endfunction
nnoremap <expr> ]b IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bn<CR>'
nnoremap <expr> [b IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bp<CR>'
nnoremap <expr> ]B IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bl<CR>'
nnoremap <expr> [B IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bf<CR>'
IsInNERDTreeという関数を作りました。これは、NERDTreeのウインドウにフォーカスしているかどうかを判定するための関数です。キーマップを設定するときに<expr>
とこの関数を使えば、NERDTreeのウインドウ内にいるときとそうでないときで機能を切り替えられます。この例では、NERDTreeのウインドウ内にいるときは:echoerr "You are in NERDTree."<CR>
が有効になり、エラーメッセージが表示されます。外にいるときは、:bn<CR>
が有効になり、バッファを切り替えられます。
解決策(改良版)
エラーメッセージでは繰り返し表示してしまったときにストレスを感じさせる恐れがあるので、以下のように改良します。
nnoremap <expr> ]b IsInNERDTreeBuf() ? '<C-w>l:bn<CR>' : ':bn<CR>'
nnoremap <expr> [b IsInNERDTreeBuf() ? '<C-w>l:bp<CR>' : ':bp<CR>'
nnoremap <expr> ]B IsInNERDTreeBuf() ? '<C-w>l:bl<CR>' : ':bl<CR>'
nnoremap <expr> [B IsInNERDTreeBuf() ? '<C-w>l:bf<CR>' : ':bf<CR>'
この例では、NERDTreeのウインドウ内にいた場合、先に右側のウインドウに移動するように設定しています。このようにすることで、NERDTreeのウインドウ内かどうかを意識することなくバッファを切り替えることができます。