大括号内部内容的范围在Vim中如何工作?
从Drew Neil的精彩著作《实用Vim》中,我了解了如何使用大括号内部内容的范围在Vim中如何工作?,vim,Vim,从Drew Neil的精彩著作《实用Vim》中,我了解了如何使用:g命令。然而,有一个表达我不明白 :g/{/+1,/}/-1排序 这将按字母顺序对文件中大括号之间的所有行进行排序。此命令的一般形式为 :全局/{pattern}/[cmd] ,由[range][cmd]组成。我得到搜索模式是起点,因此:g/{/是清晰的。然后跟随范围+1,/}/-1,其中是当前行(即与模式{匹配的每行),+1添加一行偏移量,,将范围的起点与终点分开,/}/说“直到结束大括号”,然后减去一行,只匹配大括号的内部内容
:g
命令。然而,有一个表达我不明白
:g/{/+1,/}/-1排序
这将按字母顺序对文件中大括号之间的所有行进行排序。此命令的一般形式为
:全局/{pattern}/[cmd]
,由[range][cmd]
组成。我得到搜索模式是起点,因此:g/{/
是清晰的。然后跟随范围+1,/}/-1
,其中
是当前行(即与模式{
匹配的每行),+1
添加一行偏移量,,
将范围的起点与终点分开,/}/
说“直到结束大括号”,然后减去一行,只匹配大括号的内部内容。
我没有得到的是/}/
部分。为什么要用斜杠?为什么不能只写}
编辑:
从Vimhelp 10.3中,我现在知道
/}/
是用于上限范围边界的搜索模式。这让我仍然对这里的第二个/
感到困惑。因此,更新后的问题是:为什么在-1
之前需要第二个/
?对于范围,始终需要/…/
来告诉Vim:这是一个模式,搜索下一个匹配项并将光标定位在那里;这就是我想开始/结束这个范围的地方。如果您查看,那里不允许使用文字}
;Vim需要一个行号或一个表示这样的符号、一个标记或一个搜索模式。唯一允许的变化是向上搜索的?…?
当您尝试建议的变体时,您将得到
E492: Not an editor command: .+1,}-1 sort
另一种方法是从具体的
{
..}
分隔符中抽象出来。想象一下,如果你想在foo
中找到一个范围,那么这个范围会是什么样子<代码>条形图。如果范围是000
<代码>999;Vim将无法区分文字数字范围(第999行)和搜索(下一行包含999
)。我有点惊讶,在您成功地通过复杂的命令解析(属于:全局的内容与包含:排序范围的内容)后,你被相当简单的范围语法弄糊涂了。我一直认为ex命令中的搜索模式固定在命令中的第二个位置。例如,在中:s/search/replace
。(现在)这显然不是真的,这让我心烦意乱——我能用它做些什么。谢谢你,这是有道理的。但是我仍然对/
后面的/
感到困惑。这只是为了告诉vim“搜索模式是从这里到这里的吗?”如果后面没有其他内容,那么第二个/
是可选的。但是这里有-1
偏移量,还有排序
命令(不,空格不会结束模式,因为模式中也可能有空格)。所以这将起作用(打印范围)::.+1,/}