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

时间:2018-11-30 03:22:09

标签: vim

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

我在.vimrc中有一些命令,当我使用vim -S时,会引起问题,因为这些命令只能运行一次,而不是运行两次。

非常感谢。

我在mksession中出现问题的vimrc块:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

会话存储的内容

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

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

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

您可能还希望删除buffersresize。所做的更改不仅减少了已保存会话的大小,还防止了旧会话覆盖同时在~/.vimrc中更改的任何配置。

vimrc重新加载

因此,您的~/.vimrc不会直接重新加载,但是(默认为'sessionoptions')会还原很多选项和变量。

通过使用:augroup后跟:autocmd!,您还避免了常见的初学者错误:如果没有此错误,将在每次重新加载~/.vimrc时重新定义autocmds。 :autocmd!可以防止这种情况,而:augroup则可以使它仅适用于您自己的组。

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

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

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

通常的建议是在保存会话之前关闭所有插件缓冲区,方法是手动完成,或者编写自定义:Mksession包装器来自动执行。在会话重载时,您的配置可能会再次创建一个新的功能性插件窗口。 (或者您必须手动触发。)