4

我正在为 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]

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

4

1 回答 1

2

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

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

于 2012-12-28T00:34:28.270 回答