Vimでセッションの自動保存と復帰

セッション復帰を確認するダイアログ(アイコン……)。

VimLeavemksessionを発動させるセッションの自動保存は結構前からやっていたけど、自動復帰はやってなかった(必要な時だけ: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

最初autocmdnestedフラグの存在を知らなくて、セッション復活で開かれたファイルのシンタックス・ハイライトがされないという壁にあたったけどヘルプ読んだらちゃんと書いてありました。autocmdで発動させたコマンドで開かれたりしたバッファーではBufRead等が発動しないので、自然filetypeの設定等それらのイベントに依存する処理が行われないということだった。

セッション保存/復活は「ちょっとここで保存したい」とか「起動時にキャンセルしたけどやっぱ復帰したい」とか思った時にあると便利そうなので、別にコマンドとして定義しておいた。セッションの自動保存/復帰以上の機能を求める場合(ワークスペースの切り替え的に使ったりとか)ならセッション管理プラグインを探した(作った)方が良さそう。

確認するための関数では確認と同時にargc()でVim起動時に引数でファイルが指定されているかどうかをチェックしているので、ファイルを渡して起動した時はセッション復活の確認はされない。