忽略语法匹配中的特定字符
Ignore specific characters in syntax matching
我正在为特定语言编写 vim 语法高亮文件。对于某些关键字,特定字符将被忽略(,
和 -
以及 _
)。换句话说,这些是完全相同的:
foo
f_oo
f-o,o
有没有一种方法可以在使用例如时忽略这些字符。 syn match
?
对此没有特殊的选择;您有一个模式,可以选择允许每个字符之间的特定字符;例如 foo
:
f[,_-]*o[,_-]*o
请注意 -
必须将 放在 []
块的末尾(参见 :h /[]
)。
写起来比较讲究,你可以自己创建一个函数来实现:
func! CreatePattern(word)
let l:s = ''
let l:first = 1
for i in range(len(a:word))
if !l:first
let l:s .= '[,_-]*'
else
let l:first = 0
endif
let l:s .= a:word[i]
endfor
return l:s
endf
在此之后,我们有:
:echo CreatePattern('bar')
b[,_-]*a[,_-]*r
然后,您可以在 :execute
的帮助下使用 :syn match
:
:exe 'syn match MyHighlightGroup /'.CreatePattern('foo').'/'
或使用 matchadd()
:
:call matchadd('MyHighlightGroup', CreatePattern('foo'))
请注意上面的函数只适用于普通单词,但它会破坏任何包含特殊模式字符的模式。您可能需要为此类需求编写更好的函数。
我正在为特定语言编写 vim 语法高亮文件。对于某些关键字,特定字符将被忽略(,
和 -
以及 _
)。换句话说,这些是完全相同的:
foo
f_oo
f-o,o
有没有一种方法可以在使用例如时忽略这些字符。 syn match
?
对此没有特殊的选择;您有一个模式,可以选择允许每个字符之间的特定字符;例如 foo
:
f[,_-]*o[,_-]*o
请注意 -
必须将 放在 []
块的末尾(参见 :h /[]
)。
写起来比较讲究,你可以自己创建一个函数来实现:
func! CreatePattern(word)
let l:s = ''
let l:first = 1
for i in range(len(a:word))
if !l:first
let l:s .= '[,_-]*'
else
let l:first = 0
endif
let l:s .= a:word[i]
endfor
return l:s
endf
在此之后,我们有:
:echo CreatePattern('bar')
b[,_-]*a[,_-]*r
然后,您可以在 :execute
的帮助下使用 :syn match
:
:exe 'syn match MyHighlightGroup /'.CreatePattern('foo').'/'
或使用 matchadd()
:
:call matchadd('MyHighlightGroup', CreatePattern('foo'))
请注意上面的函数只适用于普通单词,但它会破坏任何包含特殊模式字符的模式。您可能需要为此类需求编写更好的函数。