正确的 `vim -S session` 会再次加载 `.vimrc` 吗?

问题描述 投票:0回答:2

我发现

.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
2个回答
4
投票

会话存储什么

保存会话中存储的内容由

:help 'sessionoptions'
选项控制。它的默认设置非常保守,旨在不丢失任何临时映射或更改的选项。

但是,大多数用户将其设置放在

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

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

您可能还想删除

buffers
resize
。这一更改不仅减少了已保存会话的大小,还可以防止旧会话覆盖您同时在
~/.vimrc
中更改的任何配置。

vimrc 重新加载

所以,你的

~/.vimrc
并没有直接重新加载,但是(默认的
'sessionoptions'
),很多选项和变量都被恢复了。

通过使用

:augroup
:autocmd!
,您还避免了初学者经常犯的错误:否则,每次重新加载
~/.vimrc
时都会重新定义自动命令。
:autocmd!
可以防止这种情况发生,而
:augroup
则可以使其仅适用于您自己的组。

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

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

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

一般建议是在保存会话之前关闭所有插件缓冲区,可以手动关闭,也可以通过编写自定义的

:Mksession
包装器来自动执行此操作。在会话重新加载时,您的配置可能会再次创建一个新的、功能齐全的插件窗口。 (或者您必须手动触发。)


2
投票

并非 vimrc 中的所有设置都存储在会话文件中(参见

:h mksession
)。您看到的设置在
:h sessionoptions
选项中指定。

您可以使用

vim -u NORC -S
加载会话而不加载 vimrc;但是,您很快就会发现缺少所需的基线设置。

哪些命令只能运行一次?在获取 vimrc 时,有一些特定的方法可以防止命令不必要地运行两次。

例如,如果只应运行一次的命令是

autocmd
,则应使用
augroup
,如下所示:

augroup vimrc
  autocmd!  " Remove all vimrc autocommands
  au BufNewFile,BufRead *.html so <sfile>:h/html.vim
augroup END
© www.soinside.com 2019 - 2024. All rights reserved.