僕はタブが好きだ
皆さん、タブブラウザ使ってますか?使ってますよね!タブブラウザじゃないブラウザなんてほとんどないです。
現代的タブブラウザにはタブグループやセッションがありますよね!
vimにそういうのを導入したい。は?そんなの要らない?
俺がそう思うんだからそうなんだよ。俺ん中ではな。
vimのバッファ管理
vimは複数のファイルを編集する事ができます。そのいれものをバッファと呼びます。バッファ管理プラグインは色々あるそうです。
だけど、どう検索すればいいかわかりません。
「vim buffer management」これでググってもなかなか辿りつけないのです。「vimでバッファを管理するには:bを打てばいいんだよ」とか、そんなのばかり…。そこで、自作しました。
ninbufgroup
ninbufgroupというプラグインです。vimのバッファはブラウザのタブみたいなものですので、ブラウザのタブみたいに使いたかったです。
バッファをグループ化できればタブグループみたいに使えますよね。
そして、そうするとvimのタブが泣くので、こちらはブラウザのセッションのようにしようとしました。こんな感じ。
vim/nvim | Browser |
---|---|
buffer | tab |
buffer list | tab group |
tab | session |
そんなのをどうやって実現するかというと…
vim scriptの変数
vimにはいくつか変数があります。
let g:hoge = 'fuga'
vim scriptの変数は上記のように頭文字にgとかvとかsとかがついています。これはスコープをあらわします。
gはグローバル変数、sはスクリプト内変数、aは関数の引数、vはvimの定数、tはタブの中の変数です。
つまり、これでタブ内変数とか使えるわけですね。これによってタブの中でバッファグループを管理できるようになるわけです。
どんな感じなのか
ほら、このように、一つのタブの中に色々表示できるわけです。ここで、1番目のタブの中のtestという大きさ6のタブグループの中のtest2.pyというバッファを開いていますね。
タブ毎にバッファグループを管理できます。正規表現でフィルタを使って絞りこめます。絞りこんだものを元に新たなバッファグループを作ることもできます。いいですね!
これを入れると自動でそうなるのか?
んなことはない。自由が必要ですよね。なので設定例を書いておきます。
au VimEnter * call bufgroup#toggle()
noremap gN :call bufgroup#next()<CR>
noremap gP :call bufgroup#prev()<CR>
noremap gn :bn<CR>
noremap gp :bp<CR>
noremap gd :call bufgroup#remove_group()<CR>
command! -nargs=1 BufGroupNew :call bufgroup#new(<f-args>)
command! -nargs=1 -complete=customlist,_BufComp
\ BufGroupAdd :call bufgroup#add(<f-args>)
command! -nargs=1 -complete=customlist,_BufComp
\ BufGroupAddAll :call bufgroup#add_all('<args>')
command! -nargs=1 -complete=customlist,_BufComp
\ BufgroupOpen :call bufgroup#open_group('<args>')
command! -nargs=1 BufGroupFilter :call bufgroup#filter(<f-args>)
command! -nargs=1 BufGroupNewFilter :call bufgroup#new_filter(<f-args>)
うん。説明面倒くさいのでpluginのdocでも見て下さい。
感想
いや…これ、本当は誰かが書いたものを使うのが一番なんでしょうけれど、このくらいのは自分で書く方が楽じゃないですか?みんな自分で書けばいいと思います!
みんな、vim scriptを書きましょう!
vimはいいぞ!
現場からは以上です。