括号内内容的范围在Vim中如何工作?

时间:2018-09-25 07:35:08

标签: vim

从Drew Neil的精彩著作《 Practical Vim》中,我了解了可以使用:g命令执行的操作。但是,我没有一个表情。

:g/{/ .+1,/}/-1 sort

这将按字母顺序对文件中括号之间的所有行进行排序。该命令的一般形式是

:global/{pattern}/[cmd]

,其中[cmd][range] [cmd]组成。我知道搜索模式是起点,因此:g/{/很清楚。然后跟随范围.+1,/}/-1,其中.是当前行(即与模式{匹配的每一行),+1添加一行偏移量{{1} }将范围的开头与结尾分开,,说“直到右括号”,/}/减去一行仅匹配括号的内部内容。 我没有得到的是-1部分。需要什么斜线?为什么不能只写/}/

编辑: 从Vimhelp 10.3开始,我现在知道}是用于范围上限的搜索模式。这让我仍然对这里的第二个/}/感到困惑。因此更新后的问题是:为什么在/之前需要第二个/

1 个答案:

答案 0 :(得分:3)

对于范围,总是需要/.../来告诉Vim:这是一种模式,搜索下一个匹配项并将光标定位在该位置;那就是我要开始/结束范围的地方。如果您查看:help :range,则不允许使用文字}; Vim需要行号或代表该符号的符号,标记或搜索模式。向上搜索只能使用?...?

当您尝试建议的变体时,您会得到

E492: Not an editor command: .+1,}-1 sort

另一种激励方式是从具体的{ ... }分隔符中抽象出来。想象一下,如果您想在foo ... bar内找到一个范围,该范围将如何。如果范围是000 ... 999,该怎么办? Vim将无法区分文字数范围(第999行)和搜索(包含999的下一行)。