尝试在Rust的vim插件中修复a bug,我认为可能值得一些建议。
Rust使用类似于C ++或Java的尖括号(<...>
)表示泛型。但是,内部可能会出现箭头(->
)。作为一个例子,考虑表达式
Box<Fn(A) -> B>
当光标位于开始括号上时,vim突出显示箭头的>
而不是右括号。
现在我认为这是因为语法区域匹配没有特殊情况可能存在箭头。我尝试通过在其定义中将end=/>/
更改为end=/-\@<!>/
来解决此问题。但显然这对括号突出显示没有影响。现在我开始认为语法区域与此无关。
总之,我的问题是:如何更改括号的匹配方式以突出显示?
答案 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,以便可以将自定义语法属性添加到跳过列表中。