如何更改默认语法组的匹配模式?

时间:2020-02-25 01:44:32

标签: vim

我想更改C ++原始字符串的语法规则,以使原始字符串像不是字符串一样突出显示,但在所有其他情况下,使字符串突出显示相同。这是this问题的反面(我喜欢7.4的行为)。对于这个问题,不需要C ++知识。我在共享计算机上,无法直接编辑默认语法文件。

syntax list cCppString列表

cCppString     xxx start=/\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="/ skip=/\\\\\|\\"\|\\$/ end=/$/ end=/"/  excludenl contains=cSpecial,cFormat,@Spell
                   links to cString

syntax list cString显示类似的内容。令人反感的模式是R\|LR\|u8R\|uR\|UR

在默认语法文件vim80/syntax/c.vim中,我看到以下几行

syn region>...cString>>.......start=+\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
syn region >..cCppString>.....start=+\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell

我需要删除这些模式,但其他所有内容保持不变。我已经尝试过在.vim/after/syntax/c.vim中用类似的东西

重新定义它们
syn region>...cString>>.......start=+\(L\|u\|u8\|U\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend

但这是串联的,而不是覆盖的。

1 个答案:

答案 0 :(得分:1)

如果要覆盖语法,请先清除之前的规则,然后添加您的规则。

syn clear cString cCppString
syn region cString
  \ start=+\(L\|u\|u8\|U\)\="+
  \ skip=+\\\\\|\\"+
  \ end=+"+
  \ contains=cSpecial,cFormat,@Spell
  \ extend
syn region cCppString
  \ start=+\(L\|u\|u8\|U\)\="+
  \ skip=+\\\\\|\\"\|\\$+
  \ excludenl
  \ end=+"+
  \ end='$'
  \ contains=cSpecial,cFormat,@Spell

还要注意,文件要覆盖这些文件的正确位置是~/.vim/after/syntax/c.vim,因为Vim希望获取名为syntax/c.vim的文件,并且目录~/.vim/after缺省包含在{{ 1}}。