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

时间:2015-05-18 16:52:36

标签: regex vim rust vim-syntax-highlighting

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

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

Box<Fn(A) -> B>

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

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

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

1 个答案:

答案 0 :(得分:3)

这实际上是由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,则括号突出显示将是正确的。 (在syntax/rust.vim和一个ftplugin/rust.vim中有三个实例可以更改两个实例。检查只是检查字符串,字符,单引号,转义或注释是否出现在语法属性中的任何位置(不区分大小写)。如果它在搜索匹配的括号时跳过它。

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