Vimのセッション管理プラグイン
こんにちは。 ゴリラ.vimを運営しているゴリラです。
Vimを始めたてのころにこちらの記事でセッション管理プラグインを作りましたが、最近Vimにポップアップウィンドウが入ったのでその機能を使ってアップデートしてみました。
セッションとは
Vimの日本語マニュアルより引用
セッションとは、全てのウィンドウのビューとグローバルな設定のことである。セッ ションを保存しておいて、あとからそれを復元することで、各ウィンドウのレイアウト を元に戻すことができる。
つまりセッションを保存すれば開いているファイル、ウィンドウのサイズ、vimrcの設定などがそのまま復元1できます。かなり強力な機能です。
セッションの基本
セッションの保存
:mksession {filename}
セッションの復元
:s {filename}
orvim -S {filename}
これだけです、とても簡単です。
セッション管理プラグイン
vsessionの使い方はREADMEを読んでいただければと思います。 今回は保存したセッションを読み込むときにポップアップウィンドウで選べるようにしました。
しくみとしては簡単で、vsessionはデフォルト~/.vim/sessions
配下にセッションファイルを保存する様になっています。
ディレクトリ配下のファイル一覧をreaddir
組込み数で取得してそれをポップアップウィンドウに渡します。
" ['blog', 'docker.vim']
let l:sessions = readdir(g:session_path)
ポップアップウィンドウを作成に関しては簡易ではあるがこちらの記事を書いたので軽く読んでおくと理解しやすいかもしれないです。
filter
オプションにpopup_filter_menu
コールバックを指定するとメニュー選択画面を作成できます。では選択したアイテムをどう特定するかというとcallback
オプションを使います。
こちらはウィンドウが閉じられたときに呼ばれるコールバックを指定します。popup_filter_menu
を使用した場合、コールバック関数の第2引数に選択したメニューのインデックス(1番目か2番目か。..)が渡ってくるのでそれを利用します。
let s:result = ["banana", "apple", "gorilla"]
" popup_filter_menuではxで画面を閉じ、idxが-1で渡ってくるので
" -1の場合は何もしない
function! s:cb(id, idx) abort
if a:idx !=# -1
return
endif
echo s:result[a:idx-1]
endfunction
" popup_filter_menuを使用する場合
" enter でウィンドウを閉じ選択したメニューのインデックスとウィンドウIDをcallbackで指定した関数にわたす
call popup_create(s:result, {
\ "filter": "popup_filter_menu",
\ "callback": function("s:cb"),
\ 'borderchars': ['-','|','-','|','+','+','+','+'],
\ })
基本なロジックは上記通りで、選択したファイルを取得しsource
で読み込むことでセッションを復元しています。
最後に
セッションは便利ですね。ぜひプラグイン使ってみてください。
ポップアップウィンドウを駆使すればfilter
とcallback
でカレントディレクトリのファイルをポップアップウィンドウで表示し選択して開くこともできます。
興味ある方はぜひチャレンジしてみてください。
ターミナルは状態を保存できない ↩︎