根据我在Vim中的任务,我会打开几个选项卡。
如何保存不同的会话以供以后使用?
根据我在Vim中的任务,我会打开几个选项卡。
如何保存不同的会话以供以后使用?
Answers:
你想要类似的东西
:mksession ~/mysession.vim
然后,稍后您可以获取该vim文件,并返回原来的会话:
:source ~/mysession.vim
或使用-S选项打开vim:
$ vim -S ~/mysession.vim
Session.vim
。因此,如果您只想在当前目录中保存一个会话,则可以使用vim :mksession
或:mks
从vim中保存当前会话,然后仅vim -S
打开它进行备份。
您可能需要在vimrc中设置这些会话选项。保存会话后更改vimrc时,尤其令人讨厌的选项。
set ssop-=options " do not store global and local values in a session
set ssop-=folds " do not store folds
注意::mksession不会将更改保存到您所做的任何文件中。假设我将从那里开始,那么在保存会话后我就犯了关闭vim的错误。但是,下次我打开会话时,对文件所做的更改就消失了。
:mksession
。
:wqa
:xa
少一击。好极了!
.vimrc
: vimrc au FocusLost * silent! wa
这将在缓冲区失去焦点时自动保存。
如果您想在不使用任何插件的情况下自动化该过程,则可以使用Goaway并从Vim Tips Wiki返回。
每次退出Vim都会将当前会话保存在 ~/.vim/sessions
并在Vim打开后再次加载。它也基于您当前的路径,因此,如果从不同目录打开Vim,您将拥有不同的会话,这在处理不同项目时非常有用。
只需编辑~/.vimrc
文件并添加以下内容:
function! MakeSession()
let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
if (filewritable(b:sessiondir) != 2)
exe 'silent !mkdir -p ' b:sessiondir
redraw!
endif
let b:filename = b:sessiondir . '/session.vim'
exe "mksession! " . b:filename
endfunction
function! LoadSession()
let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
let b:sessionfile = b:sessiondir . "/session.vim"
if (filereadable(b:sessionfile))
exe 'source ' b:sessionfile
else
echo "No session loaded."
endif
endfunction
" Adding automatons for when entering or leaving Vim
au VimEnter * nested :call LoadSession()
au VimLeave * :call MakeSession()
即使是初学者这个脚本是有点容易理解和定制。
请注意,该脚本仅适用于Unix系统(MacOS / Linux),需要对其进行调整以在Windows上运行。
更新:添加0xc0de的建议,VimEnter
如果希望Vim 仅在不提供任何参数的情况下加载会话,则可以将这些行替换为:
if(argc() == 0)
au VimEnter * nested :call LoadSession()
endif
if argc() == 0 au VimEnter * nested :call LoadSession() end
pwd
),如何将其设置为退出vim之前的最后一个工作目录?这样它可以加载上一个工作会话,而不是加载下一个会话~/
?
这个任务有一个非常有用的插件vim-startify,它可以处理许多其他事情,例如最近打开的文件等,它也具有非常简单的界面。
我从几天开始一直在使用它,直到现在为止,它一直运行良好。希望对您有帮助。
由于这是我(可能还有其他人)在Google上的第一本关于如何在Vim中进行会话的工具,因此我决定在@mathielo的答案中添加一些有关使其自动实现的内容。
我喜欢他的代码,但是似乎缺少“仅当没有args时”解决方案。这是我的修改版本:
function! MakeSession(overwrite)
let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
if (filewritable(b:sessiondir) != 2)
exe 'silent !mkdir -p ' b:sessiondir
redraw!
endif
let b:filename = b:sessiondir . '/session.vim'
if a:overwrite == 0 && !empty(glob(b:filename))
return
endif
exe "mksession! " . b:filename
endfunction
function! LoadSession()
let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
let b:sessionfile = b:sessiondir . "/session.vim"
if (filereadable(b:sessionfile))
exe 'source ' b:sessionfile
else
echo "No session loaded."
endif
endfunction
" Adding automatons for when entering or leaving Vim
if(argc() == 0)
au VimEnter * nested :call LoadSession()
au VimLeave * :call MakeSession(1)
else
au VimLeave * :call MakeSession(0)
endif
这里值得注意的更改是可选的替代。如果您打开不带选项的Vim,它将打开任何现有会话并覆盖您离开时所做的更改。如果使用选项打开Vim,它将仅在不存在新会话的情况下创建新会话,这意味着您可以在具有会话的目录中打开单个文件而不会覆盖该文件。然后,您可以打开不带选项的Vim来运行会话。如果不存在会话,那么它将创建一个新会话。
$HOME/.vim/plugin/sessions.vim
但它没有保存会话文件。¯\ _(ツ)_ /¯
有一个很棒的插件调用vim-session。非常强大。要安装它:
cd ~/.vim/bundle
git clone https://github.com/xolox/vim-session.git
我已将其功能映射到我的.vimrc
文件中,如下所示:
nnoremap <leader>so :OpenSession
nnoremap <leader>ss :SaveSession
nnoremap <leader>sd :DeleteSession<CR>
nnoremap <leader>sc :CloseSession<CR>
现在,在普通模式下,只需键入<leader>ss
,您将看到类似这样的命令
:SaveSession
现在添加您的会话名称
:SaveSession namesession
就这样。
当您关闭Vim并重新打开它时,只需执行
:OpenSession
您将看到会话打开。
您的.vimrc
文件中还有很多其他配置要添加,请参见文档中的示例:
let g:session_directory = "~/.vim/tmp/session" // the directory must be created before the sessions will be saved there
let g:session_autoload = "no" // automatic reload sessions
let g:session_autosave = "no" // autosave
let g:session_command_aliases = 1
YouTube上有一个很好的教程。
我个人只是包装了Tim Pope的Obsession插件,以允许定义a sessiondir
并避免键入路径:
let g:sessiondir = $HOME . ".vim/sessions"
command! -nargs=1 MkSession call MkSession(<f-args>)
function! MkSession(sessionfile)
if !isdirectory(g:sessiondir)
call mkdir(g:sessiondir, "p")
endif
exe 'Obsession' g:sessiondir . '/' . a:sessionfile
endfunction
command! -nargs=1 LoadSession call LoadSession(<f-args>)
function! LoadSession(sessionfile)
let a:sessionpath = g:sessiondir . a:sessionfile
if (filereadable(a:sessionpath))
exe 'source ' a:sessionpath
else
echo "No session loaded."
endif
endfunction
感谢@mathielo以下是@mathielo的示例,我在.vimrc中添加了以下代码以保存活动会话(如果有):
au VimLeave * if this_session != "" | exe "mksession! ".this_session
如果要添加更多行,则需要使用endif:
au VimLeave * if v:this_session != ""
au VimLeave * exe "mksession! ".this_session
au VimLeave * endif
您只需要使用以下命令在vim中保存新会话:
:mks [Session filename]
然后开始
$ vim -S [Session filename]
vim将启动会话,您不必担心每次关闭vim都会保存会话。
如果您没有活动的会话,.vimrc将不执行任何操作。像以前一样。
那就是我想要的!再次感谢@mathielo!
:q
而不是:bd
...谢谢!
您可以将会话存储在任意位置。
例如:
:mksession! D:/session.ses
这会将会话存储在D驱动器中。
可以通过键入打开
:so D:/session.ses
在任何vim文件中。
以下是唯一的配置文件。真的对我有用。我从这里拿走的,在这里您还可以获取更完整/更复杂的版本。
set viewoptions+=cursor,folds,slash,unix
set viewoptions-=options
augroup vimrc
autocmd BufWritePost *
\ if expand('%') != '' && &buftype !~ 'nofile'
\| mkview
\| endif
autocmd BufRead *
\ if expand('%') != '' && &buftype !~ 'nofile'
\| silent loadview
\| endif
augroup END
为了管理多个会话(基于每个目录/存储库),我最近从vim-session插件切换到vim-workspace。它的会话管理相对简单,并且运行良好。
man