Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大括号内部内容的范围在Vim中如何工作?_Vim - Fatal编程技术网

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

大括号内部内容的范围在Vim中如何工作?,vim,Vim,从Drew Neil的精彩著作《实用Vim》中,我了解了如何使用:g命令。然而,有一个表达我不明白 :g/{/+1,/}/-1排序 这将按字母顺序对文件中大括号之间的所有行进行排序。此命令的一般形式为 :全局/{pattern}/[cmd] ,由[range][cmd]组成。我得到搜索模式是起点,因此:g/{/是清晰的。然后跟随范围+1,/}/-1,其中是当前行(即与模式{匹配的每行),+1添加一行偏移量,,将范围的起点与终点分开,/}/说“直到结束大括号”,然后减去一行,只匹配大括号的内部内容

从Drew Neil的精彩著作《实用Vim》中,我了解了如何使用
: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,/}