忽略语法匹配中的特定字符

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'))

请注意上面的函数只适用于普通单词,但它会破坏任何包含特殊模式字符的模式。您可能需要为此类需求编写更好的函数。