为什么我需要这个vim错误格式的额外转义?

为什么我需要这个vim错误格式的额外转义?,vim,Vim,我正在为python编写一个编译器脚本。我有一个正确解析回溯的错误格式: CompilerSet errorformat= \%A\ \ File\ \"%f\"\\,\ line\ %l%.%#, \%Z\ \ \ \ %m 我不明白为什么我在逗号前需要额外的转义:为什么不能\%f\“\\,是\%f\\,?我知道逗号需要转义,因为它用于分隔errorformat的部分,但是为什么要用两个反斜杠呢 下面是一个回溯示例,其中单个转义不起作用,而双转义起作用

我正在为python编写一个编译器脚本。我有一个正确解析回溯的错误格式:

CompilerSet errorformat=
          \%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,
          \%Z\ \ \ \ %m
我不明白为什么我在逗号前需要额外的转义:为什么不能
\%f\“\\,
\%f\\,
?我知道逗号需要转义,因为它用于分隔errorformat的部分,但是为什么要用两个反斜杠呢

下面是一个回溯示例,其中单个转义不起作用,而双转义起作用:

Traceback (most recent call last):
File "test.py", line 9, in <module>
    g()
File "test.py", line 7, in g
    f()
File "test.py", line 4, in f
    raise IndexError()
IndexError
回溯(最近一次呼叫最后一次):
文件“test.py”,第9行,在
g()
文件“test.py”,第7行,g中
f()
文件“test.py”,第4行,在f中
提升索引器()
索引器
另一个类似的例子是使用三个反斜杠


(我这样问是希望理解为什么会使编写更多的
efm
设置更容易。)

来自
:帮助efm条目

要在模式中包含逗号,请在其前面加反斜杠(必须键入 一个“:set”命令中有两个。要包含反斜杠,请给出两个反斜杠 (您必须在“:set”命令中键入四)。你还需要加一个反斜杠 在“:set”的空格之前

'errorformat'
中,逗号是特殊的,即条目分隔符。要匹配文字逗号,必须对其进行转义(一次):
\,
。好的,但是在
:set
中有另一轮转义(例如,处理值中的空格),因此
\
将在另一次转义:
\,
。通常,您可以通过使用
:let
(但不在此处的
:CompilerSet
命令中)来避免第二轮转义