" Vim plugin file " Original Maintainer: " Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885 " http://jarp.does.notwork.org/diary/200604a.html#20060403 " Patch Maintainer: " G-HAL " Last Change: 2006 Aug 16 Wed - 2006 Aug 19 Sat, 22 Tue - 24 Thu, 2010 Jan 27 Wed - 29 Fri " Remark: Auto-save the Session and Auto-resume " ~/.vim/plugin/sessionsaver.vim " " Note: " If you don't want to resume from session file automatically, " let g:no_resume = 1 " And if you want to resume with override g:no_resume, " let g:force_resume_last = 1 " or " let g:force_resume_current = 1 " " If you don't want to make session file automatically, " let g:no_suspend = 1 " Example: " alias vimtmp 'vim --cmd "let g:no_resume = 1" --cmd "let g:no_suspend = 1"' " " The permission of session file would be 0644. " It's readable by other users. " # The permission of viminfo file is 0600, " # but session file is not and could not change. Why? " " Bugs: " Can't resume syntax mode in split window mode. " It's maybe bug of vim. " " For example: " You are editing ~/.vimrc and you split the file into two window. " Session file have these line: " " (skip) " if &syntax != 'vim' " setlocal syntax=vim " endif " (skip) " wincmd w " (skip) " if &syntax != 'vim' " setlocal syntax=vim " endif " (skip) " " Upper window has vim mode and lower window has vim mode too. " Vim have skipped "setlocal syntax" in lower window, " but it's applied to upper window, too. " Because two window have been linked to same file. " if exists("loaded_sessionsaver") || !has("autocmd") finish endif let loaded_sessionsaver = 1 "if exists("g:cur_session") " let s:cur_session = g:cur_session "else " let s:cur_session = expand("./Session.vim") "endif if exists("g:last_sessioninfo") let s:last_sessioninfo = g:last_sessioninfo else if exists("g:force_resume_current") && filereadable("./LastSession.viminfo") let s:last_sessioninfo = expand("./LastSession.viminfo") else let s:last_sessioninfo = expand("~/.vim/tmp/viminfo") endif endif if exists("g:last_sessionfile") let s:last_sessionfile = g:last_sessionfile else if exists("g:force_resume_current") && filereadable("./LastSession.vim") let s:last_sessionfile = expand("./LastSession.vim") let s:last_sessioninfo = expand("./LastSession.viminfo") else let s:last_sessionfile = expand("~/.vim/tmp/last_session.vim") endif endif if exists("g:force_resume_last") || exists("g:force_resume_current") unlet g:no_resume endif augroup SessionSaver augroup END if (argc() == 0) && (expand("%:p") == "") && (&viminfo != "") && !exists("g:no_resume") " RECOMMEND: " Don't use auto-resume from session file in current directory " by security reason. " if filereadable(s:cur_session) " augroup SessionSaver " au VimEnter * execute "source " . s:cur_session " augroup END " else if filereadable(s:last_sessionfile) && filereadable(s:last_sessioninfo) au SessionSaver VimEnter * if (argc() == 0) && (expand("%:p") == "") && (&viminfo != "") && !exists("g:no_resume") | execute "source " . s:last_sessionfile | execute "rviminfo " . s:last_sessioninfo | echom "Session '". s:last_sessionfile ."' and Info '". s:last_sessioninfo ."' was resumed." | endif " vim -S した場合、~/.vim/after/plugin より後、au VimEnter より前、に " 読み込まれる。 " vim -S した場合はレジュームしない様にするには、 " au VimEnter で if 判定するしかない。 elseif filereadable(s:last_sessionfile) au SessionSaver VimEnter * if (argc() == 0) && (expand("%:p") == "") && (&viminfo != "") && !exists("g:no_resume") | execute "source " . s:last_sessionfile | echom "Session '". s:last_sessionfile ."' was resumed." | endif " vim -S した場合、~/.vim/after/plugin より後、au VimEnter より前、に " 読み込まれる。 " vim -S した場合はレジュームしない様にするには、 " au VimEnter で if 判定するしかない。 elseif filereadable(s:last_sessioninfo) au SessionSaver VimEnter * if (argc() == 0) && (expand("%:p") == "") && (&viminfo != "") && !exists("g:no_resume") | execute "rviminfo " . s:last_sessioninfo | echom "Info '". s:last_sessioninfo ."' was resumed." | endif else endif endif let s:session_changed = 0 au SessionSaver InsertEnter * let s:session_changed = 1 | au! SessionSaver InsertEnter * if exists("g:force_resume_current") au SessionSaver VimLeave * if (expand("%:p") != "") && (&viminfo != "") && !exists("g:no_suspend") && (1 == s:session_changed) | execute "mksession! " . s:last_sessionfile | execute "wviminfo! " . s:last_sessioninfo | endif else au SessionSaver VimLeave * if (expand("%:p") != "") && (&viminfo != "") && !exists("g:no_suspend") && (1 == s:session_changed) | execute "mksession! " . s:last_sessionfile | endif endif " ユーザが直前に mks していた場合は、自動 mks したくないのだが、 " 判定ルーチンを書くのが面倒。 " [ End of File ]