Vim Advent Calendar 2018 14日目 代打記事です。
みなさん、vimにセッション機能があるのはご存知でしょうか?
便利そうなので使ってみようと思っていますが、せっかくなのでVim scriptの勉強も兼ねてコマンド作ってみました。
以下のコードをvimrcに貼ればそのまま使えるとおもいます。
[2018-12-22] 追記
プラグイン化しました。
また、記事中のソース若干変更は入っています。
https://github.com/skanehira/vsession
セッションファイル保存先
~/.vim/sessions/
配下にセッションファイルを保存します。
ディレクトリがなければ作るようにしています。
" session path
let s:session_path = expand('~/.vim/sessions')
if !isdirectory(s:session_path)
call mkdir(s:session_path, "p")
endif
セッションの保存
:SaveSession test1.vim
という感じで、セッションファイル名を指定して保存します。
同じファイル名を指定すると上書きされるのでご注意。
" save session
command! -nargs=1 SaveSession call s:saveSession(<f-args>)
function! s:saveSession(file)
execute 'silent mksession!' s:session_path . '/' . a:file
endfunction
セッションの復元
:LoadSession ~/.vim/sessions/test1.vim
という感じで、セッションファイルのパスを指定して読み込みます。
" load session
command! -nargs=1 LoadSession call s:loadSession(<f-args>)
function! s:loadSession(file)
execute 'silent source' a:file
endfunction
fzf.vim版はこちらです。
command! FloadSession call fzf#run({
\ 'source': split(glob(s:session_path . "/*"), "\n"),
\ 'sink': function('s:loadSession'),
\ 'options': '-m -x +s',
\ 'down': '40%'})
セッションの削除
:DeleteSession ~/.vim/sessions/test1.vim
という感じで、削除します。
" delete session
command! -nargs=1 DeleteSession call s:deleteSession(<f-args>)
function! s:deleteSession(file)
call delete(expand(a:file))
endfunction
fzf.vim版はこちらです。
command! FdeleteSession call fzf#run({
\ 'source': split(glob(s:session_path . "/*"), "\n"),
\ 'sink': function('s:deleteSession'),
\ 'options': '-m -x +s',
\ 'down': '40%'})
キーマッピング
こんな感じでマッピングしたら楽です。
nnoremap <Leader>se :SaveSession
nnoremap <Leader>lse :FloadSession<CR>
参考記事
https://thinca.hatenablog.com/entry/20100201/1265009821
https://qiita.com/shinshin86/items/6e6cbdb77cb59b87d21f
http://nanasi.jp/articles/code/io/file-path.html
最後に
初めてVim script書いたので、おかしなところがありましたら教えて頂けると助かります。
ちなみに、vimのセッションプラグインはありました。
使ってないのですが、良さげなので興味ある方はどうぞー
https://github.com/Shougo/unite-session
https://github.com/xolox/vim-session