我正在为Direct3D编写语法文件,我有一个属性问题:
[unroll]
for(int i = 0...)
这里,"unroll"是一个属性。我使用正则表达式找到一些关键字内方括号,以确定它们的属性。我使用的正则表达式有效,除非在开始方括号之前没有空格:
[unroll] // does not work
[unroll] // works
只要至少有一个空格(或制表符),在开始方括号前有多少个空格(或制表符)并不重要。
这是我使用的正则表达式(简化为只匹配unroll):
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]
第二行都是相同的颜色,而第一行则不是。
正如您在评论中发现的那样,通常原因是另一个语法组的干扰(在您的情况下,由不同的插件Rainbow Parenthesis)。如果这是同一语法的一部分,您通常可以通过更改嵌套层次结构来修复问题,但使用外部插件,您可能会不走运。
问题是Vim只提供了两种突出显示机制,:syntax
(绑定到缓冲区)和:match
/matchadd()
(绑定到窗口)。因此,如果您希望为缓冲区定制高亮显示,则必须使用:syntax
并冒着干扰文件类型语法的风险,或者使用matchadd()
并必须使用复杂的自动命令使它们仅应用于当前缓冲区。