VIM:不能完全理解这种替代

时间:2016-04-12 06:35:53

标签: vim vi

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

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

2 个答案:

答案 0 :(得分:1)

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

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

所以上面的意思是,向前搜索,找到以任意数量的空格开头的行,后跟任意数量的任何字符,以及任何数量的空格,然后将其替换为<space><the first whitespace><space>+<space>'<the other characters>'。我认为它打算删除任何尾随空格,但在我的测试中它没有那样做,因为。*会将所有内容都匹配到行尾。

答案 1 :(得分:0)

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

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

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

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