突出显示 Rust 语法中匹配的尖括号

Highlight matching angle-brackets in Rust syntax

试图在 Rust 的 vim 插件中修复 a bug,我认为可能值得就此获得一些建议。

Rust 具有使用尖括号 (<...>) 表示的泛型,类似于 C++ 或 Java。但是,内部可能会出现箭头 (->)。例如考虑表达式

Box<Fn(A) -> B>

当光标位于左括号上时,vim 突出显示箭头的 > 而不是右括号。

现在我认为这是因为语法区域匹配没有特殊情况下可能存在箭头。我试图通过在其定义中将 end=/>/ 更改为 end=/-\@<!>/ 来解决这个问题。但显然这对括号突出显示没有影响。现在我开始认为语法区域与此无关。

总而言之,我的问题是:如何更改括号匹配突出显示的方式?

这实际上是由 MatchParen 插件处理的(所有 vim 安装都附带)。

MatchParen 插件使用固定的语法属性列表在搜索匹配括号时忽略(来自 $VIMRUNTIME/plugin/matchparen.vim 中的第 96 行左右)

  " When not in a string or comment ignore matches inside them.
  " We match "escape" for special items, such as lispEscapeSpecial.
  let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' .
    \ '=~?  "string\|character\|singlequote\|escape\|comment"'
  execute 'if' s_skip '| let s_skip = 0 | endif'

s_skip 稍后传递给 searchpairpos。看来无论如何都无法从插件外部修改 s_skip

因此,如果您将 rustArrow 的所有实例更改为 rustArrowCharacter,括号突出显示将是正确的。 (有 3 个实例要更改两个 syntax/rust.vim 和一个 ftplugin/rust.vim)检查只是检查字符串、字符、单引号、转义或注释是否出现在语法属性中的任何位置(不区分大小写)。如果在搜索匹配的括号时跳过它。

我建议在 vim-dev 上询问是否可以修补 matchparen,以便可以将自定义语法属性添加到跳过列表中。