Hatena::Groupvim

vimまっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2009-05-11

セッション(mksession)を利用

03:30

毎日同じプロジェクトのコーディングをしているとき、朝vimを立ち上げ、

「昨日編集してたファイルが開いて、カレントディレクトリなんかも昨日と同じ状態で立ち上がったらなー」

なんて思うことがありました。

そんなことは「mksession」コマンドで簡単にできるらしいということは分かっていたのですが、今回、pluginを作る練習も兼ねて

  • 前回終了したときの状態に復帰させることができる(:LLS コマンド)
  • 任意の状態のスナップショットが簡単なコマンドで取れる(:SS コマンド)
  • スナップショットを取ったときの状態に簡単に戻せる(:LS コマンド)
  • 場合によってはスナップショットをファイル名を指定して保存&読み込みできる(:SS :LS にファイル名を引数渡しする)

という機能をもった autosession.vim というpluginを作成してみました。

ソースコードは以下のとおりです。

【autosession.vim


if exists('loaded_autosession')
  finish
endif
let loaded_autosession=1

" --------------------------------
" initialize

if !exists('g:autosession_session_filename')
  let g:autosession_session_filename = "~/lastsession_by_autosession.tmp"
endif

if !exists('g:autosession_one_session_filename')
  let g:autosession_one_session_filename = "~/onesession_by_autosession.tmp"
endif

if !exists('g:autosession_auto_save')
  let g:autosession_auto_save = 1
endif

if !exists('g:autosession_auto_load')
  let g:autosession_auto_load = 0
endif

" --------------------------------
" functions

" load the last session
command! LoadLastSession :call LoadSession(g:autosession_session_filename)
command! LLS :call LoadSession(g:autosession_session_filename)

" save a session
function! SaveSession(...)
  let l:filename = 0 < a:0 ? expand(a:1) : expand(g:autosession_one_session_filename)

  exe "mks! " . l:filename
endfunction
command! -nargs=? SaveSession :call SaveSession(<f-args>)
command! -nargs=? SS :call SaveSession(<f-args>)

" load a session
function! LoadSession(...)
  let l:filename = 0 < a:0 ? expand(a:1) : expand(g:autosession_one_session_filename)

  silent only
  silent tabonly
  if ( filereadable( l:filename ) )
    exe "source " . l:filename
  else
    echoerr "autosession.vim: " . l:filename . " is not readable"
  endif
endfunction
command! -nargs=? LoadSession :call LoadSession(<f-args>)
command! -nargs=? LS :call LoadSession(<f-args>)

" --------------------------------
" auto save

if ( 1 == g:autosession_auto_save )
  au VimLeave * call SaveSession(g:autosession_session_filename)
endif

" --------------------------------
" auto load

if ( 1 == g:autosession_auto_load )
  au VimEnter * call LoadSession(g:autosession_session_filename)
endif


ここのコードはもっとこうしたほうが良いよー

というようなご意見を頂けるとうれしいです m(_ _)m

ka-nachtka-nacht2009/05/12 13:59セッションの自動ロードを行うタイミングがおかしい。Vim起動後に行われること全てが終わってからにすべき。そのためにはautocmd VimEnter * LoadLastSessionで行う(ただこれもautocmdの定義順序如何で実行タイミングは前後するので確実に最後に行われるわけではない)。

tokoromtokorom2009/05/13 01:32なるほどー。勉強になります!
早速修正させていただきました。

XadrianXadrian2011/11/25 14:48I'm so glad that the internet aollws free info like this!

qywgqtfzzgqywgqtfzzg2011/11/27 01:303uvKJc <a href="http://luwtasufoizz.com/">luwtasufoizz</a>

xrhqkzxrhqkz2011/11/29 03:32aJKcl9 , [url=http://wkyuuixlxfal.com/]wkyuuixlxfal[/url], [link=http://wfvanilhgwgr.com/]wfvanilhgwgr[/link], http://jiungnpfwmqz.com/

anzsnlkanzsnlk2011/12/06 23:38aS10jH , [url=http://krcwsakmaqys.com/]krcwsakmaqys[/url], [link=http://cjarxvjfirjk.com/]cjarxvjfirjk[/link], http://iojwzoftzpql.com/