为什么Nvim默认设置会覆盖我的ftplugin设置?(Neovim)

5
当我打开一个PHP文件时,Neovim会设置nosmartindentindentexpr=GetPhpIndent()
这很糟糕,因为GetPhpIndent()完全失效了,使得编辑体验成为一场噩梦,我必须不断修复每行的缩进。
我创建了一个文件$RUNTIME/after/ftplugin/php.lua,其中包含以下内容:
vim.bo.indentexpr = nil
vim.bo.smartindent = true
print("I APPLIED SOME SETTINGS!")

我添加了打印语句只是为了确认它被加载了,而且它确实被加载了。每次打开我的PHP文件时,我都会看到这段文本被打印。

然而,我的设置没有改变。设置仍然由运行时设置:

Screenshot 1 Screenshot 2

那么问题是因为我的lua文件不起作用吗?不是的,如果我在打开文件后源代码,在此之后,我的设置会被正确更新。

所以看起来Nvim的默认设置是在我的ftplugin文件之后应用的,在这种情况下,ftplugin的作用是什么呢?

救命啊!

1个回答

9

缩进脚本在所有文件类型插件后被引用,包括after/目录下的插件。语法脚本在所有缩进脚本后被引用,包括after/目录下的脚本。

换言之,引用顺序不是根据“位置”而定:

" first wave: root of user runtime
ftplugin/foo.vim
indent/foo.vim
syntax/foo.vim

" second wave: Vim runtime
$VIMRUNTIME/ftplugin/foo.vim
$VIMRUNTIME/indent/foo.vim
$VIMRUNTIME/syntax/foo.vim

" third wave: after in user runtime
after/ftplugin/foo.vim
after/indent/foo.vim
after/syntax/foo.vim

但是“per-function”:

" first wave: filetype plugins
ftplugin/foo.vim
$VIMRUNTIME/ftplugin/foo.vim
after/ftplugin/foo.vim

" second wave: indent scripts
indent/foo.vim
$VIMRUNTIME/indent/foo.vim
after/indent/foo.vim

" third wave: syntax scripts
syntax/foo.vim
$VIMRUNTIME/syntax/foo.vim
after/syntax/foo.vim

第一波(ftplugin)的设置被第二波(indent)覆盖了。

由于你尝试覆盖的设置来自缩进脚本,所以你必须把你的覆盖放在 after/indent/php.vim

ftplugin 的作用是什么?

  • 缩进脚本的作用是处理特定文件类型的缩进问题。
  • 语法脚本的作用是处理特定文件类型的语法高亮问题。
  • 文件类型插件的作用是处理除此之外的所有特定文件类型的问题。

哎呀,这很奇怪...为什么配置加载要分成几个阶段呢?这是出于实际原因还是只是遗留原因?无论如何,这完美地解释了我的问题,非常感谢! - Hubro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接