Vim
vimrc
vimscript

VimでGitのブランチ毎にセッションを簡単に保持できるようにする

More than 3 years have passed since last update.

この記事はクラウドワークス Advent Calendar 2015 10日目の記事になります。

趣味のdotfilesいじりの中で、最近使い始めたVimの設定の紹介です。


背景

Gitで管理されているディレクトリ下で作業している時、あるブランチの変更はレビュー待ちだから新しいブランチを切って別の作業を進めよう、なんて事を繰り返していたら、あれよあれよと言う間にブランチが増えて、いつの間にか複数のブランチを股にかけて作業をしているという事がありますが、そうなった時に一度でもVimを閉じようものなら、作業しやすいように積んでいたバッファとかタブの順番とかウィンドウの状態が全てまっさらになってしまうので、再度作業しやすい状態にするという作業が繰り返されて結構なストレスになっていました。こういう繰り返しの作業は撲滅したいです。


vim-sessionを使用して快適にする

Vimmksessionというコマンドを使ってVimの状態(session)を保存することはできますが、そのsessionを扱いやすくしてくれるプラグインもあるので、今回はvim-sessionを使って改善する事にしました。


インストール

NeoBundle 'xolox/vim-session', {

\ 'depends': 'xolox/vim-misc'
\ }


設定

" session保存ファイル名

let g:session_default_name = '.session'
" session保持ファイルの拡張子
let g:session_extension = '.vim'
" session保存ディレクトリを現在のディレクトリにする
let g:session_directory = getcwd()
" vim終了時に自動保存しない
let g:session_autosave = 'no'
" 引数なしでvimを起動した時にセッションを復元しない
let g:session_autoload = 'no'
" 1分間に1回自動保存をしない
let g:session_autosave_periodic = 0

上記のような設定を行ってからVimのコマンドラインモードでSaveSessionコマンドを実行すると、カレントディレクトリに.session.vimというファイルが作成されてVimの状態が保存されるようになります。復元したい場合はOpenSession .sessionです。


fugitive.vimを使用して更に快適にする

ここまでの設定でひとまず状態の保存と復元がやりやすくなったのですが、まだいまいち使い勝手が良くありません。やりたいのは複数のブランチを股にかけて作業するような時に、簡単に状態を保存・復元できるようにする事なのでVim用のgitラッパープラグインであるfugitive.vimを使って更に改善してみます。


インストール

NeoBundle 'tpope/vim-fugitive'


設定

" session保存ファイル名

let g:session_default_name = '.default.session'
" session保持ファイルの拡張子
let g:session_extension = '.vim'
" session保存ディレクトリを現在のディレクトリにする
let g:session_directory = getcwd()
" vim終了時に自動保存しない
let g:session_autosave = 'no'
" 引数なしでvimを起動した時にセッションを復元しない
let g:session_autoload = 'no'
" 1分間に1回自動保存をしない(する場合は1)
let g:session_autosave_periodic = 0

function! s:save_session(...)
if a:0
let session_name = a:1
else
" fugitive.vimの機能を使っているのはブランチ名を取得する部分のみ
" substitute(system('git rev-parse --abbrev-ref HEAD'), '\n', '', 'g')などで代替可能
let session_name = fugitive#head()
end

if strlen(session_name)
execute 'SaveSession .'.session_name.'.session'
else
SaveSession
endif
endfunction

function! s:load_session(...)
if a:0
let session_name = a:1
else
let session_name = fugitive#head()
end

if strlen(session_name)
execute 'OpenSession .'.session_name.'.session'
else
execute 'OpenSession '.g:session_default_name
endif
endfunction

command! -nargs=? SaveS call s:save_session(<f-args>)
command! -nargs=? LoadS call s:load_session(<f-args>)

この設定で新しくSaveSLoadSというコマンドが定義されます。SaveSLoadSは引数なしで実行すると.#{現在のブランチ名}.session.vimというファイル名で状態の保存と復元を行うので、ブランチ毎の状態を簡単に扱う事ができるようになります。これでやっと使いやすくなりました。


まとめ

Vimを使っている時間は長いので、小さな改善でもすぐに効果が実感できるのがいい所です。


参考URL