为什么 Nvim 默认设置会覆盖我的 ftplugin 设置?(尼奥维姆)

Hub*_*bro 5 vim lua neovim

当我打开 PHP 文件时,Neovim 设置nosmartindentindentexpr=GetPhpIndent().

这真是太糟糕了,因为它GetPhpIndent()完全损坏了,使编辑体验成为一场噩梦,我必须不断修复我输入的每一行的缩进。

$RUNTIME/after/ftplugin/php.lua我创建了一个包含以下内容的文件:

vim.bo.indentexpr = nil
vim.bo.smartindent = true
print("I APPLIED SOME SETTINGS!")
Run Code Online (Sandbox Code Playgroud)

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

但是,我的设置没有改变。这些设置仍然由运行时设置:

截图1 截图2

是因为我的lua文件无法工作吗?不,如果我在打开文件后获取它,我的设置会正确更新。

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

帮助!

rom*_*inl 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
Run Code Online (Sandbox Code Playgroud)

但是“每个功能”:

" 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
Run Code Online (Sandbox Code Playgroud)

因此,第一波(ftplugin)中的设置将被第二波(缩进)覆盖。

由于您尝试覆盖的设置来自缩进脚本,因此您必须将覆盖内容放入after/indent/php.vim.

ftplugin 到底有什么意义?

  • 缩进脚本的目的是处理特定于文件类型的缩进问题。
  • 语法脚本的重点是处理特定于文件类型的语法突出显示问题。
  • 文件类型插件的目的是处理其他特定于文件类型的事情。