我发现
.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
:help 'sessionoptions'
选项控制。它的默认设置非常保守,旨在不丢失任何临时映射或更改的选项。
但是,大多数用户将其设置放在
~/.vimrc
中,使用插件和文件类型插件,并且通常不会即时构建映射或更改设置。如果这种工作流程也适用于您,我建议删除以下值:
:set sessionoptions-=globals
:set sessionoptions-=localoptions
:set sessionoptions-=options
您可能还想删除
buffers
和 resize
。这一更改不仅减少了已保存会话的大小,还可以防止旧会话覆盖您同时在 ~/.vimrc
中更改的任何配置。
所以,你的
~/.vimrc
并没有直接重新加载,但是(默认的'sessionoptions'
),很多选项和变量都被恢复了。
通过使用
:augroup
和 :autocmd!
,您还避免了初学者经常犯的错误:否则,每次重新加载 ~/.vimrc
时都会重新定义自动命令。 :autocmd!
可以防止这种情况发生,而 :augroup
则可以使其仅适用于您自己的组。
会话应存储所有当前打开的缓冲区。常规缓冲区包含文件内容,当再次打开会话时可以轻松重新加载这些内容。不幸的是,插件(错误)将缓冲区用于其用户界面(例如侧边栏,如 netrw 插件),并且 Vim 的会话处理不够聪明,无法区分两者。但那些插件缓冲区没有对应的文件;相反,插件使用命令直接构建和修改其内容,通常借助插件变量(见上文)保存和恢复或不保存和恢复。
插件必须显式处理会话恢复;不过,我不记得有任何插件可以做到这一点。通常,您会看到恢复的“空”窗口,并且插件可能会也可能不会识别或重用它。 (我认为这就是您要问的问题。)
一般建议是在保存会话之前关闭所有插件缓冲区,可以手动关闭,也可以通过编写自定义的
:Mksession
包装器来自动执行此操作。在会话重新加载时,您的配置可能会再次创建一个新的、功能齐全的插件窗口。 (或者您必须手动触发。)
并非 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