来自插件的语法文件被 Vim 覆盖

Syntax file sourced from the plugin is overwritten by Vim

我正在创建一个非常简单的插件,以便在 Vim 中更好地突出显示 baan 语法(基本上是 syntax/baan.vim 的改进版本)。

这是我的插件目录。

ftdetect 文件夹中有一个文件; baan.vim。看起来像这样。

au BufRead,BufNewFile *.bc set filetype=baan

语法文件夹中的文件; baan.vim。它几乎与 Vim 中语法文件夹中的 baan.vim 相同。在语法突出显示中更改一行。

我的问题是当我打开任何带有 .bc 扩展名的文件时,又调用了两个语法文件;一个在我自己的插件语法文件之前,一个在我自己的插件语法文件之后。

bc.vim 语法文件已经从 filetyp.vim 调用了,我猜。因为我要设置语法的文件类型的扩展名为 .bc。这是第一个问题。第二个是我将文件类型设置为 'baan' 但 Vim 正在查找和采购所有 baan.vim 文件。但是一旦 baan.vim 来自 myplugin,它仍然从 Vim 本身获取那个。如何在不使用 /after 目录的情况下优雅地解决这些问题?

这是正常的。考虑以下因素。

  1. $VIMRUNTIME/filetype.vim 来源 ftdetect/*.vim 脚本接近尾声。此时 setf bc 已经执行,第一个 FileType 事件被触发并处理。顺便提一句。这就是为什么 late set ft=baan 有效但 setf baan 无效的原因。不过这应该不是问题,因为 :syn clear 会在 $VIMRUNTIME/syntax/synload.vim 中自动执行。不,除非你 patch/replace filetype.vim.

    ,否则你不能用它做任何事情
  2. synload.vim 故意获取所有匹配文件 (:runtime!)。这就是他们尊重 b:current_syntax 变量的原因。第一个设置它的人获胜,其他人通过在顶部执行 :finish 退出。尽管如此,它们都是来源并进入 :scriptnames。请注意,这也意味着使用 after/syntax 扩展现有语法(同时不遵守 b:current_syntax)通常更可取。