VimLeave
でmksession
を発動させるセッションの自動保存は結構前からやっていたけど、自動復帰はやってなかった(必要な時だけ:source
してた)のでちょろっと書いた。ライフ・チェンジング……という程ではなかった。でもまぁそこそこ必要そう。
augroup SessionAutocommands
autocmd!
autocmd VimEnter * nested call <SID>RestoreSessionWithConfirm()
autocmd VimLeave * execute 'SaveSession'
augroup END
command! RestoreSession :source ~/.vim/.session
command! SaveSession :mksession! ~/.vim/.session
" Restore session with confirm
function! s:RestoreSessionWithConfirm()
let msg = 'Do you want to restore previous session?'
if !argc() && confirm(msg, "&Yes\n&No", 1, 'Question') == 1
execute 'RestoreSession'
endif
endfunction
最初autocmd
のnested
フラグの存在を知らなくて、セッション復活で開かれたファイルのシンタックス・ハイライトがされないという壁にあたったけどヘルプ読んだらちゃんと書いてありました。autocmd
で発動させたコマンドで開かれたりしたバッファーではBufRead
等が発動しないので、自然filetype
の設定等それらのイベントに依存する処理が行われないということだった。
セッション保存/復活は「ちょっとここで保存したい」とか「起動時にキャンセルしたけどやっぱ復帰したい」とか思った時にあると便利そうなので、別にコマンドとして定義しておいた。セッションの自動保存/復帰以上の機能を求める場合(ワークスペースの切り替え的に使ったりとか)ならセッション管理プラグインを探した(作った)方が良さそう。
確認するための関数では確認と同時にargc()
でVim起動時に引数でファイルが指定されているかどうかをチェックしているので、ファイルを渡して起動した時はセッション復活の確認はされない。