我正在尝试为我正在编写的 Vim 插件编写语法规则,但在编写 Vim 正则表达式来匹配符号@后跟标识符时遇到问题,标识符定义为两个字母后跟任意数量的接受的人物。这是我到目前为止所拥有的:
syntax match aldaAtMarker "\v@[a-zA-Z]{2,}[\w[:digit:]\-+'()]*"
Run Code Online (Sandbox Code Playgroud)
我知道之后的所有内容都@有效(至少据我所知),因为我从aldaIdentifier似乎可以正常工作的规则中复制粘贴了它。但是,我在插入前面的文字符号时遇到了麻烦@,因为 Vim 正则表达式系统显然赋予了特殊含义@(see:help syntax和 grep for @)。
根据我上面写的语法规则,尝试加载插件会导致以下错误:
Error detected while processing /home/dave/.vim/bundle/vim-alda/syntax/alda.vim:
line 21:
E866: (NFA regexp) Misplaced @
Press ENTER or type command to continue
Error detected while processing /home/dave/.vim/bundle/vim-alda/syntax/alda.vim:
line 21:
E64: @ follows nothing
Press ENTER or type command to continue
Error detected while processing /home/dave/.vim/bundle/vim-alda/syntax/alda.vim:
line 21:
E475: Invalid argument: aldaAtMarker "\v@[a-zA-Z]{2,}[\w[:digit:]\-+'()]*"
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)
如果我替换@为\@,则不会有错误,但会突出显示错误的内容,这使我认为正则\@表达式中的 正在以特殊方式解释,而不是被视为文字@字符。
我显然错过了一些东西,而我的 Google-fu 让我失望了。如何@在“非常神奇”( ) 模式下在 Vim 正则表达式中包含文字符号\v?
从这里:
推荐的是\mmagic,这是默认设置。
否则,文字 @ 可以始终与字符集匹配[@]。
3.魔法*/魔法*
模式中的某些字符按字面意思理解。他们搭配相同的
文本中的字符。然而,当前面有反斜杠时,这些
字符具有特殊的含义。
其他没有反斜杠的字符都有特殊含义。他们需要成为
前面加一个反斜杠以进行字面匹配。
字符是否按字面意思取取决于 'magic' 选项和
接下来提到的项目。
*/\毫米*
使用“\m”会使模式被解释为设置了“magic”,
忽略“magic”选项的实际值。
使用“\M”会使后面的模式被解释为好像使用了“nomagic”。
*/\v* */\V*
使用“\v”意味着在模式中它后面的所有 ASCII 字符除了
'0'-'9'、'a'-'z'、'A'-'Z' 和 '_' 具有特殊含义。“非常神奇”
使用“\V”意味着在它后面的模式中只有反斜杠有一个
特殊意义。“非常游牧”
例子:
之后: \v \m \M \V 匹配
'魔法' '游魔法'
$ $ $ \$ 匹配行尾
。。\. \. 匹配任何字符
* * \* \* 任意数量的前一个原子
() \(\) \(\) \(\) 分组为原子
| \| \| \| 分离替代方案
\a \a \a \a 字母字符
\\ \\ \\ 文字反斜杠
\. \. 。。文字点
\{ { { { 文字 '{'
aaaa 文字“a”
{只有 Vim 支持 \m、\M、\v 和 \V}
建议始终将“magic”选项保留为默认设置,
这就是“魔法”。这避免了可移植性问题。使模式免疫
要设置或不设置“magic”选项,请在开头添加“\m”或“\M”
图案。