【问题标题】:Vim regex fails matching square brackets on start of lineVim 正则表达式在行首匹配方括号失败
【发布时间】:2012-12-27 16:51:10
【问题描述】:

我正在编写 Direct3D 的语法文件,但属性有问题:

[unroll]
for(int i = 0...)

这里,“展开”是一个属性。我正在使用正则表达式在方括号内查找一些关键字以将它们标识为属性。我正在使用的正则表达式有效,除非在左方括号之前没有空格:

[unroll] // does not work
 [unroll] // works

只要至少有一个,左方括号之前的空格(或制表符)的数量无关紧要。

这是我正在使用的正则表达式(简化为仅匹配展开):

syn match hlslAttribute /^\s*\[unroll\]/

如果使用同样的问题:

syn match hlslAttribute /.*\[unroll\]/

编辑: 正如评论中所述:它在搜索文件时有效,但在匹配语法高亮模式时无效。

当前语法高亮文件位于:http://pastebin.com/zr1bGLt0

要为 .fx 或 .hlsl 文件启用语法高亮,您必须将 hlsl.vim 文件(pastebin 中的那个)复制到任何 Vim 安装中的语法文件位置(/syntax: /usr/share/vim /vim73/syntax/) 并将这一行添加到您的 .vimrc 中:

autocmd BufNewFile,BufRead *.fx,*.fxc,*.fxh,*.hlsl set ft=hlsl

然后使用之前的扩展名之一创建一个文件并写入:

[unroll]
 [unroll]

第二行将是相同的颜色,而第一行不会。他们两个应该和第二个一样。

【问题讨论】:

  • /\s*\[unroll] 可在此处使用或不使用空格。
  • 它在为我搜索文件时也有效,但在匹配语法突出显示的模式时无效。 :S 我不知道为什么。
  • 如果您对文件进行 hexdump,在这样的属性之前和换行符之后,是否还有其他字符?你的两个正则表达式应该工作,这很奇怪。
  • @fge 不,因为它是语法,所以并不奇怪。 @John 当使用语法高亮显示此正则表达式不起作用时,有很多原因。很大。您应该提供足够的信息以使用vim -u NONE 在另一台机器上重现此内容。作为其中的一部分,您肯定需要发布语法脚本。对于未来,“它在为我搜索文件时也有效,但在匹配语法高亮模式时无效”应该是问题中的内容,而不是评论中的内容。
  • @ZyX 我不相信这里有语法问题,我相信开头的/ 字符是“命令”的一部分,应该从正则表达式本身中删除。只是一个想法。

标签: regex vim syntax-highlighting hlsl


【解决方案1】:

正如您在 cmets 中发现的那样,原因通常是另一个语法组的干扰(在您的情况下,由不同的插件 Rainbow Parenthesis)。如果这是相同语法的一部分,您通常可以通过更改嵌套层次结构来解决问题,但是使用外部插件,您可能不走运。

问题在于 Vim 只提供了两种高亮机制,:syntax(绑定到缓冲区)和:match/matchadd(),绑定到窗口。因此,如果您想为缓冲区自定义突出显示,则必须使用 :syntax 并冒着干扰文件类型语法的风险,或者使用 matchadd() 并且必须使用复杂的自动命令使它们仅适用于当前缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2015-04-20
    • 2018-04-06
    • 2011-08-03
    相关资源
    最近更新 更多