1

对于我已经在 Vim 中打开过一次的文件,似乎有一些奇怪的类似缓存的行为。我打开了一个文件foo.txt,然后我更改了 中的一些设置~/.vim/after/ftplugin/text.vim,但这些新设置没有出现在foo.txt. 我可以退出 vim 并重新打开foo.txt,或重新加载:e,甚至:so ~/.vim/after/ftplugin/text.vim,但这些似乎都不会影响foo.txt的设置。如果 I mv foo.txt bar.txt,设置显示bar.txt没有问题。

编辑

看来我可以foo.txt按照以下顺序强制重新加载设置:

  1. :so ~/.vimrc
  2. :so ~/.vim/after/ftplugin/text.vim

问题:

  1. 为什么这是必要的/为什么没有选择其他设置?
  2. 为什么采购~/.vimrc不够?它应用了直接在 中指定的设置~/.vimrc,但不应该在该行加载 ftpluginsfiletype plugin indent on吗?为什么text.vim需要事后采购?
4

2 回答 2

2

Vim运行时由几百个文件组成,我不确定你为什么希望 Vim 持续监控它们。它没有。这些文件是在一些定义明确(并记录在案)的点上加载的,仅此而已。

特别是没有安全的方法来重新加载您的配置。你可以做类似的事情:so ~/.vimrc,但除非你特别写你vimrc的考虑到这一点,否则会有缺点(比如autocmds堆积)。如果您想安全起见,您必须退出 Vim 并重新启动它。这就是 Vim 的工作原理。

现在,对于ftplugins 你可能会逃脱这样的事情:

:setf text

(使用实际的文件类型而不是text)。这适用于简单的set fubar选项。它之所以有效,是因为在引擎盖setf下实际上是一个精心编写的autocmd. 对于更复杂的构造(例如autocmds 或文件范围的变量),它仍然会中断,因为同样的原因:so ~/.vimrc也有缺点。

于 2017-02-27T17:51:37.733 回答
1

更多精度:

  • .vimrc加载一次 -> 用于定义全局内容
  • 与 相同.gvimrc,仅在 gvim 之后加载.vimrc
  • 插件也被加载一次,在 vimrc 文件之后 -> 对于全局的东西也是如此
  • 每当调用它们定义的函数时,自动加载的插件会按需加载一次
  • ftplugins 每个缓冲区加载一次(可能多次!因为可能有多个缓冲区需要它们的来源)-> 用于仅适用于触发其加载的当前缓冲区的定义
  • 还有 langmap 脚本、语法脚本、缩进脚本,甚至是旧macros/脚本(显式/手动加载)
  • 一些插件提供本地 vimrcs(与 ftplugins 基本相同,但加载取决于缓冲区的当前目录,而不是其文件类型)。

如您所见,所有内容都只加载一次。如果您想多次加载它们,则必须手动且明确地进行。这就是为什么我们中的一些人有一个:Reload命令可以简化重新加载任何类型的脚本 - 我的隐藏在我的脚本集合中:lh-misc -> plugin/vim-maintain.vim

于 2017-02-27T23:01:40.167 回答