vim - 正确的 `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
解决方案
会话存储什么
存储在已保存会话中的内容由该:help 'sessionoptions'
选项控制。它的默认值非常保守,旨在不丢失任何临时映射或更改的选项。
但是,大多数用户将他们的设置放在~/.vimrc
、使用插件和文件类型插件中,并且通常不会即时构建映射或更改设置。如果这种工作流程也适用于您,我建议删除以下值:
:set sessionoptions-=globals
:set sessionoptions-=localoptions
:set sessionoptions-=options
您可能还想删除buffers
and resize
。该更改不仅减少了已保存会话的大小,还可以防止旧会话覆盖您~/.vimrc
在此期间更改的任何配置。
vimrc 重新加载
因此,您~/.vimrc
并没有直接重新加载,而是(使用 default 'sessionoptions'
)恢复了许多选项和变量。
通过使用:augroup
其次:autocmd!
,您还避免了一个常见的初学者错误:没有它,自动命令将在每次重新加载您的~/.vimrc
. :autocmd!
防止这种情况发生,以及仅:augroup
适用于您自己的团队的品牌。
会话和特殊(插件)缓冲区
一个会话应该存储所有当前打开的缓冲区。常规缓冲区包含文件内容,并且在再次打开会话时可以轻松地重新加载这些内容。不幸的是,插件(错误)使用缓冲区作为它们的用户界面(例如边栏,如netrw插件),而且 Vim 的会话处理不够聪明,无法区分两者。但是那些插件缓冲区没有对应的文件;相反,插件使用命令直接构建和修改其内容,通常借助插件变量 - 见上文 - 要么保存和恢复,要么不保存。
插件必须明确处理会话恢复;不过,我不记得有任何插件可以做到这一点。通常,您会看到恢复的“空”窗口,并且插件可能会也可能不会识别或重用它。(我认为这就是你要问的问题。)
一般建议是在保存 session 之前关闭任何插件缓冲区,可以手动关闭,也可以编写自定义:Mksession
包装器来自动执行此操作。在会话重新加载时,您的配置可能会再次创建一个新的功能插件窗口。(或者你必须手动触发它。)
推荐阅读
- python - 使用python,如何读取文件夹中的所有CSV文件并将其内容写入一个新的单个CSV文件?
- ag-grid - ag-grid filter api:当网格没有匹配的行时,filterComponent.selectValue() 不起作用
- visual-studio - 嵌入到 NuGet 包中的图标不会出现在 VS 中
- r - Travis 使用 R 构建文件下载失败
- icons - 编程语言图标的最佳网站
- javascript - 找出文本中有多少个重复的字母
- python - 使用 Python Selenium whataspp bot 隐藏 Chrome 窗口
- azure - 适用于数据湖的 Azure 数据治理解决方案方法
- javascript - 同一组件中的多个自定义反应钩子
- php - 在mysql查询中循环仅获取第一个结果