【问题标题】:Highlight matching angle-brackets in Rust syntax在 Rust 语法中突出显示匹配的尖括号
【发布时间】:2015-05-18 16:52:36
【问题描述】:

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

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

Box<Fn(A) -> B>

当光标在左括号上时,vim 会高亮箭头的&gt; 而不是右括号。

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

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

【问题讨论】:

    标签: regex vim rust vim-syntax-highlighting


    【解决方案1】:

    这实际上是由 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,以便可以将自定义语法属性添加到跳过列表中。

    【讨论】:

    • 感谢您的回答,也感谢 Chris 创建 PR。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2014-05-01
    • 2021-10-05
    • 2015-08-21
    • 2014-12-12
    • 2011-09-28
    • 2010-09-18
    • 2020-08-25
    相关资源
    最近更新 更多