首页 > 解决方案 > 正确的 `vim -S session` 会再次加载 `.vimrc` 吗?

问题描述

我发现.vimrc实际上所有设置都存储在session文件中。如果是这样,为什么要再次vim -S session加载.vimrc?vim为什么会这样设计?

我有一些命令.vimrc,当我使用时vim -S,它会导致问题,因为这些命令应该只运行一次,而不是两次。

非常感谢。

我有问题的 vimrc 块在mksession

let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 4
let g:netrw_altv = 1
let g:netrw_winsize = 25
augroup ProjectDrawer
  autocmd!
  autocmd VimEnter * :Vexplore
  autocmd TabNew * call feedkeys(":Vexplore\<CR>", 'n')
augroup END

标签: vim

解决方案


会话存储什么

存储在已保存会话中的内容由该:help 'sessionoptions'选项控制。它的默认值非常保守,旨在不丢失任何临时映射或更改的选项。

但是,大多数用户将他们的设置放在~/.vimrc、使用插件和文件类型插件中,并且通常不会即时构建映射或更改设置。如果这种工作流程也适用于您,我建议删除以下值:

:set sessionoptions-=globals
:set sessionoptions-=localoptions
:set sessionoptions-=options

您可能还想删除buffersand resize。该更改不仅减少了已保存会话的大小,还可以防止旧会话覆盖您~/.vimrc在此期间更改的任何配置。

vimrc 重新加载

因此,您~/.vimrc并没有直接重新加载,而是(使用 default 'sessionoptions')恢复了许多选项和变量。

通过使用:augroup其次:autocmd!,您还避免了一个常见的初学者错误:没有它,自动命令将在每次重新加载您的~/.vimrc. :autocmd!防止这种情况发生,以及仅:augroup适用于您自己的团队的品牌。

会话和特殊(插件)缓冲区

一个会话应该存储所有当前打开的缓冲区。常规缓冲区包含文件内容,并且在再次打开会话时可以轻松地重新加载这些内容。不幸的是,插件(错误)使用缓冲区作为它们的用户界面(例如边栏,如netrw插件),而且 Vim 的会话处理不够聪明,无法区分两者。但是那些插件缓冲区没有对应的文件;相反,插件使用命令直接构建和修改其内容,通常借助插件变量 - 见上文 - 要么保存和恢复,要么不保存。

插件必须明确处理会话恢复;不过,我不记得有任何插件可以做到这一点。通常,您会看到恢复的“空”窗口,并且插件可能会也可能不会识别或重用它。(我认为这就是你要问的问题。)

一般建议是在保存 session 之前关闭任何插件缓冲区,可以手动关闭,也可以编写自定义:Mksession包装器来自动执行此操作。在会话重新加载时,您的配置可能会再次创建一个新的功能插件窗口。(或者你必须手动触发它。)


推荐阅读