Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

NERDTreeのウインドウにフォーカスしているかどうかを判定する関数を作る

用途

以下のような便利なキーマップを設定したいとします。

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のウインドウ内かどうかを意識することなくバッファを切り替えることができます。

matoruru
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away