この記事は、自作Vimプラグインの公開エントリであると同時に、 「Vim Advent Calendar 2013」 の68日目の記事でもある。68日目……また去年同様365日続いたりするんだろうか……
なお、昨日(67日目)は、termoshttさんの「vimでひかえめな自動保存」だった。
INTRODUCTION
closesomewindow.vimは条件に合うウィンドウを閉じる Ex command を提供します。
最新版
https://github.com/AmaiSaeta/closesomewindow.vim
USAGE
以下の5つのウィンドウを開いているとします。
ウィンドウ番号 | 表示されているバッファ |
---|---|
1 | "foo.txt" |
2 | "bar.txt" |
3 | ヘルプ |
4 | Quickfixリスト |
5 | "hoge.vim" |
6 | "fuga.vim" |
以下のコマンドは、2番のウィンドウを閉じます。
:CloseSomeWindow v:val == 2
以下のコマンドは、ヘルプを開いている(3番の)ウィンドウを閉じます。
:CloseSomeWindow getwinvar(v:val, '&filetype') ==# 'help'
以下のコマンドでは、閉じるべきウィンドウ番号を貴方に問い合わせます。
:CloseSomeWindow! getwinvar(v:val, '&filetype') ==# 'vim'
例えば、以下のようにして利用する事を薦めます。
" Quickfixリスト或いはヘルプを表示しているウィンドウを閉じます。
nnoremap <C-h> :<C-u>CloseSomeWindow
\ (index(['qf','unite','vimtest'], getwinvar(v:val,'&filetype')) != -1)
\ \|\| (getwinvar(v:val, '&filetype') ==# 'help'
\ && !getwinvar(v:val, '&modifiable'))<CR>
2014年2月7日追記
当初、上記例にて、「:map
は長いRHSを受け付けない」とし、故にそれを回避するコードとなっておりましたが、それは誤認でしたので修正しました。
INTERFACE
:CloseSomeWindow[!] [-s | -script | -f | -function] {filter}
現在のタブページ内のウィンドを閉じます。
対象となるウィンドウは、{filter}に拠って決定されます。
「-script
」或いは「-s
」が指定された場合、{filter}はfilter()
の第2引数と同様の式として解釈されます。{filter}内のv:valは、各ウィンドウ番号に置き換えられます。
「-function
」或いは「-f
」が指定された場合は、{filter}
は関数名として解釈されます。その関数は、現在開いているウィンドウ番号のリストを引数とし、閉じる候補となるウィンドウの番号のリストを返さなければなりません。
「-script
」「-s
」「-function
」「-f
」を省略した場合、{filter}は式として解釈されます(つまり、「-script
」と同じです)。
もし、{filter}の条件に合うウィンドウが複数存在する場合は、一番若い番号のウィンドウを閉じます。[!]が指定されていた場合は、どのウィンドウを閉じるかユーザーに問い合わせます。
開発動機的な話
要は、 Vim script 書いてる最中に:help
で開いたウィンドウを閉じるのがめんどかった訳ですよ。ヘルプ開いて、それ参照しながらscript書いて、再びヘルプのウィンドウに移動して、<C-w>cで閉じるのが。
最初は直接.vimrcに書いていってたんだけど、ちょっと汎用性持たせた結果、思ったより長くなってしまったので独立させた。ここら辺は前日のtermoshttさんと対照的。
出自がそんなんなので、現状テストコード無いです。その内書かなければ……
これで「Vim Advent Calendar 2013」 の68日目の記事を終える。
なお69日目は、osyo-manga(@manga-osyo)さんの「Vim Advent Calendar 2013 : Vim で Haml を書くときに quickrun.vim を利用したらちょー捗った話」である。