Vim - ftplugin设置更改不会更新现有文件

时间:2017-02-27 17:14:32

标签: vim ftplugin

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

修改

我似乎可以按以下顺序强制设置为foo.txt重新加载:

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

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

2 个答案:

答案 0 :(得分:2)

Vim runtime包含几百个文件,我不确定为什么你希望Vim能够持续监控它们。它没有。这些文件是在一些明确定义的(并记录在案的)点上加载的,这些都是它的全部内容。

特别是没有安全重新加载配置的方法。您可以执行:so ~/.vimrc之类的操作,但除非您专门编写了vimrc来考虑这一点,否则成为缺点(例如autocmd堆积)。如果你想要安全,你必须退出Vim并重新开始。这就是Vim的工作原理。

现在,对于ftplugin你可能会得到这样的东西:

:setf text

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

答案 1 :(得分:1)

更精确一些:

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

如你所见,所有东西都只加载一次。如果要多次加载它们,则必须手动并明确地执行此操作。这就是为什么我们中的一些人有:Reload命令来简化重新加载任何类型的脚本 - 我的脚本隐藏在我的脚本集合中:lh-misc - >插件/ VIM-maintain.vim