Re: NERDTreeのウィンドウを必要なときだけ見せる。 - daffy log

NERDTreeは便利なんだけど、ツリーを常に見たいわけではないので、NERDTreeのバッファにカーソルがあるときだけ、ウィンドウを開き、ないときは閉じてみた。

2009-07-31 - daffy log
# ftplugin/nerdtree.vim
2009-07-31 - daffy log

Vim スクリプトのコメントはダブルクォート (") です。

" ftplugin/nerdtree.vim
function! b:HideWindow()
2009-07-31 - daffy log

バッファローカルな関数はありません。そこに付けられるのは s: のみ。
でも動くには動いちゃうのがVimの気持ち悪いところ。

function! h:i:n:a:hinagiku()
  echo 'ハイハイ'
endfunction

こんなのも動くし。ちなみにグローバル関数の扱いになります。
でも規格外なので、決して使わないように!

autocmd BufEnter <buffer> :call b:ShowWindow()
autocmd BufLeave <buffer> :call b:HideWindow()
2009-07-31 - daffy log

これを見た感じだとnerdtreeを最初に開いたときにこのVimスクリプトを:sourceする感じだと思われるけど、それは面倒なので自動化すると便利。
幸いnerdtreeさんは自らのbufferにfiletype=nerdtreeを付けてくれる。

function! s:SetupAutoResize()
  augroup NERDTreeAutoResize
    autocmd!
    autocmd BufEnter <buffer> :call s:ShowWindow()
    autocmd BufLeave <buffer> :call s:HideWindow()
  augroup END
endfunction
autocmd FileType nerdtree call s:SetupAutoResize()

あとは b:windowWidth の初期化を遅らせれば vimrc に貼れる形になる。

function! s:HideWindow()
    let b:windowWidth = winwidth(winnr())
    execute 'vertical resize' 1
endfunction
function! s:ShowWindow()
  if !exists('b:windowWidth')
    let b:windowWidth = 0
  endif
    echo b:windowWidth
    execute 'vertical resize' b:windowWidth
endfunction
function! s:SetupAutoResize()
  augroup NERDTreeAutoResize
    autocmd!
    autocmd BufEnter <buffer> call s:ShowWindow()
    autocmd BufLeave <buffer> call s:HideWindow()
  augroup END
endfunction
autocmd FileType nerdtree call s:SetupAutoResize()

echo b:windowWidth は何に使ってるか知らないけど一応残しておいた。

追記

これは ftplugin/nerdtree.vim に書くものだった模様。というかコメントに思いっきり書いてあるし。なんで見落としたんだ私…。
というわけで autocmd FileType は無理に使う必要はないです。augroup は要るけど。