我通常会在Vim中打开几十个文件,维持长时间的会话。偶尔需要重启Vim,例如安装新插件或应用新配置。
如何在重新启动后打开所有以前的文件?
如何在重新启动后打开所有以前的文件?
:mksession mysession.vim
将当前会话保存到指定的文件中。下次启动vim时,您可以加载该会话:
vim -S mysession.vim
:source mysession.vim
你可以通过VimLeave自动命令来自动保存会话,并在VimEnter时重新加载会话,但是在恢复vim被调用的会话时要小心,例如从git中调用。
以下是我配置文件中提取的自动会话保存/加载的基本设置:
let s:session_loaded = 1
augroup autosession
" load last session on start
" Note: without 'nested' filetypes are not restored.
autocmd VimEnter * nested call s:session_vim_enter()
autocmd VimLeavePre * call s:session_vim_leave()
augroup END
function! s:session_vim_enter()
if bufnr('$') == 1 && bufname('%') == '' && !&mod && getline(1, '$') == ['']
execute 'silent source ~/.vim/lastsession.vim'
else
let s:session_loaded = 0
endif
endfunction
function! s:session_vim_leave()
if s:session_loaded == 1
let sessionoptions = &sessionoptions
try
set sessionoptions-=options
set sessionoptions+=tabpages
execute 'mksession! ~/.vim/lastsession.vim'
finally
let &sessionoptions = sessionoptions
endtry
endif
endfunction
只有在不带参数运行vim
时,它才会恢复会话,所以如果您使用vim somefile.txt
进行快速编辑,它将不会触及最后的会话。
额外加分(这也将恢复文件内的光标位置):
" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid or when inside an event
" handler.
autocmd MyAutoCmd BufReadPost *
\ if line("'\"") > 0 |
\ if line("'\"") <= line("$") |
\ exe("norm '\"") |
\ else |
\ exe "norm $" |
\ endif|
\ endif
vim() { if [ $# -gt 0 ]; then vim -O $@ elif [ -f "Session.vim" ]; then vim -S Session.vim else vim fi }
- Andrew Haust