我发现.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
答案 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
您可能还希望删除buffers
和resize
。所做的更改不仅减少了已保存会话的大小,还防止了旧会话覆盖同时在~/.vimrc
中更改的任何配置。
因此,您的~/.vimrc
不会直接重新加载,但是(默认为'sessionoptions'
)会还原很多选项和变量。
通过使用:augroup
后跟:autocmd!
,您还避免了常见的初学者错误:如果没有此错误,将在每次重新加载~/.vimrc
时重新定义autocmds。 :autocmd!
可以防止这种情况,而:augroup
则可以使它仅适用于您自己的组。
会话应存储所有当前打开的缓冲区。常规缓冲区包含文件内容,当再次打开会话时,可以轻松地重新加载这些文件内容。不幸的是,插件(mis-)在其用户界面中使用了缓冲区(例如, netrw 插件的侧边栏),并且Vim的会话处理不够聪明,无法区分两者。但是这些插件缓冲区没有相应的文件;取而代之的是,该插件通常使用命令来直接构建和修改其内容,通常借助插件变量(请参见上文)进行保存或恢复。
插件必须明确处理会话恢复;不过,我不记得有任何插件可以做到这一点。通常,您会看到还原了一个“空”窗口,并且该插件可能会也可能不会识别或重复使用该窗口。 (我想这就是您要问的问题。)
通常的建议是在保存会话之前关闭所有插件缓冲区,方法是手动完成,或者编写自定义:Mksession
包装器来自动执行。在会话重载时,您的配置可能会再次创建一个新的功能性插件窗口。 (或者您必须手动触发。)