关于vi:VIM:无法完全理解这种替代

VIM: can't fully understand this substitution

我从一本书中获取了这行代码,将html代码格式化为字符串连接形式,以便在vim中使用javascript。 我似乎无法理解数字'1'和'2代表什么,以及在正则表达式结束时问号是什么。 我习惯于看到像%s / foo / bar / g这样的替换,所以没有正斜线会让我感到困惑。 总结一下,我不理解'1'和'2',美元符号之后和回车之前的问号,以及为什么不使用正斜杠。

1
vmap <silent> ;q :s?^\(\s*\)\(.*\)\s*$? \1 + '\2'?<CR>


正斜杠通常用作分隔符,但替换命令使用's'之后的第一个字符作为分隔符,允许将其更改为任何东西。似乎作者认为所有斜杠都可能令人困惑,因此将其改为"?"。这是命令与更传统的正斜杠一起出现的方式:

1
:s/^\(\s*\)\(.*\)\s*$/ \1 + '\2'/<CR>

所以上面的意思是,向前搜索,找到以任意数量的空格开头的行,后跟任意数量的任何字符,以及任何数量的空格,然后将其替换为+''。我认为它打算剥离任何尾随空格,但在我的测试中它没有这样做,因为。*将匹配所有行到行尾。


正如在其他答案中所说的那样,/分隔符可以被其他一些char替换:当命令中使用了很多斜杠时,它可能会更清楚;看到有关它的问题,https://stackoverflow.com/a/36568901/3271687。

\1\2
...
匹配模式中使用的第n个子表达式。子表达式用\(\)定义。所以在你的例子中:

1
2
:s?^\(\s*\)\(.*\)\s*$? \1 + '\2'?
                 \s*   -->  note that this part can't be reached, it's useless

\1\(\s*\)中的空格所取代,\2\(.*\)中的所有字符(整个行的其余部分)替换。