Vi/Vim恢复已打开的文件

51

我想知道这个常见的IDE功能是否可用。

假设我使用Vim打开许多文件,使用 vsplitsplit。然后,我关闭了所有文件。

第二天,我想恢复这些文件。也就是说,恢复它们被打开的方式,而不必重新打开每一个文件(使用 splitvsplit)。

这可能吗?

更新:

使用 mksession!source 命令,在 .vimrc 文件中映射命令,是否有一种方法来对映射进行参数化以写入特定的文件?

例如:

map <F2> :mksession! ~/vim_session @INSERT_HERE<cr> "Save session to @INSERTHERE file

提前感谢

9个回答

107

你可以使用 :mksession 和 :source 命令将键位映射为易于保存和恢复的集合。这里是我 .vimrc 中使用 F2 和 F3 的示例:

map <F2> :mksession! ~/vim_session <cr> " Quick write session with F2
map <F3> :source ~/vim_session <cr>     " And load session with F3

12
考虑将文件命名为 ~/.vim_session,这样它就不会妨碍其他文件了。这也更符合其功能。 - Peter
4
哇靠,这些信息真是太棒了。似乎每年我都能学到更多 VIM 的技巧。我还建议将其自动化,这样按下一个键就可以保存并退出会话(像传统的 IDE 一样),并且您的 .vimrc 文件自动读取 ~/.vimsession。 - Nerdmaster
5
重新载入会话后,我的语法高亮功能消失了? - xji
如果您正在进行软件开发,最好按照集成开发环境的工作方式,为每个项目拥有一个单独的会话文件,在这些文件之间进行切换。 - Tom Russell

11
看看 :mksession 命令,创建一个 session

会话(Session)包含所有窗口的视图和全局设置。可以保存会话,稍后恢复会话时,窗口布局看起来相同。您可以使用会话快速在不同项目之间切换,自动加载您在该项目上一次工作的文件。


4

我发现最好的方法是使用vim-session插件,http://github.com/xolox/vim-session可以通过添加以下内容进行安装:

Plugin 'xolox/vim-session'

将以下代码添加到您的.vimrc文件中:
:PluginInstall

这个插件支持多个会话:您可以通过名称标识一个会话,然后使用该名称进行管理。会话可以添加、删除、更新、列出等操作...

我已经使用它几个月了,强烈推荐。


2
您可以考虑使用 GNU Screen。简而言之,它是一个命令行窗口管理器,允许用户在单个终端会话中访问多个独立的终端会话。我认为其主要优势在于您可以分离会话、关闭终端窗口,并稍后重新连接会话,然后继续工作。

对于大多数终端模拟器而言,仅需关闭终端窗口,screen 通常会处理好退出。我在我的 zshrc 中添加了一个条件来防止在 screen 中启动 screen,代码如下:exec screen -m zsh - ZyX
或者他可能使用tmux...它有更多的功能。screen的功能是tmux的子集。 - Adam Miller

1

我的解决方案如下,将它们放在 .vimrc 文件中。希望对你有所帮助。

" session related.
" Default session is located `~/.session_'. The suffix `_' is a dirty
" solution, just like the one-element tuple `(tuple_eliment,)' in Python..
cnoremap <C-O> source ~/.session_
cnoremap <C-S> mksession! ~/.session_
nnoremap <silent> <C-S><C-S> :mksession! ~/.session_ <CR>

看起来更复杂,但如果您需要保存和加载多个会话,则非常有用。

P.S.
在这里,我采用了熟悉的<Ctrl-S><Ctrl-O>快捷键来保存和加载会话。在我看来,这比伸手去按<Fn>键更舒适。;-)


1

1

谢谢,问完大约10秒后意识到了<cr>的问题:p - Tom

0

基于hgmnz的答案并进行扩展更新。

您可以从映射中删除<cr>,这将使您进入命令模式以完成命令。

map <F2> :mksession! ~/<will stop here and you can type>

进入命令模式后,您可以键入 % 然后按 Tab 键,它将扩展为当前文件的绝对路径,您还可以键入 %:p:h 并按 Tab 键扩展到当前文件的目录。

您还可以将每个会话保存到工作目录,并使用本地缓冲区目录来拥有多个工作目录的会话。

map <F2> :mksession! ./.vim_sessions <cr> " Will save session to current buffers directory.
map <F3> :source ./.vim_sessions <cr>
:lcd " Changes the current's buffer directory

同时要小心重新加载会话,因为它会卸载所有当前加载的缓冲区(http://vimdoc.sourceforge.net/htmldoc/starting.html#%3Amksession)

  1. 卸载所有当前加载的缓冲区。

0

我建议使用vim-obsession。它比默认的mksession更好,因为它不会干扰你,同时仍然能够完成你想要的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接