VIM 中的命令可以以数字作为前缀,但是对于某些操作来说,编号方案并不一致。
在移动命令(左、下、上、右(H、J、K、L))前面加上数字会导致光标跳转到预期位置,例如1L
向右移动一个字符。
可以使用 或 向上或向下移动当前行,:m+N
但是:m-N
,您必须使用:m-2
才能获得 与 相反的效果:m+1
。
我也在 Visual Studio 2019 中使用 VSVim,并使用gt
和gT
命令在选项卡之间切换。如果我打开了三个选项卡,并且我当前位于第一个选项卡(最左边),则使用3gt
将切换到第三个选项卡。如果我位于第三个选项卡(最右边),则将2gT
切换回第一个选项卡,而3gT
结果是停留在同一个选项卡上。
为什么必须使用不同的数字才能达到相反的效果?这可能是一个从未改变过的设计缺陷吗?
答案1
您对存在不一致之处的观察是正确的。
虽然{count}
最常用于重复某个操作,但情况并非总是如此。有时它会被视为绝对数字,例如,47G
转到第 47 行、35|
转到当前行的第 35 列或90%
转到文件的第 90% 行。
有时,它只是用来标记同一命令的不同风格。例如,CTRL-G
将打印有关当前缓冲区中打开的文件的信息。1 CTRL-G
将打印该信息,但显示文件的完整路径。2 CTRL-G
(或任何更大的计数数字)将打印相同的内容,并在输出中包含缓冲区的编号。(参见:help CTRL-G
了解详情。
解决您的具体例子:
在移动命令左、下、上、右(
hjkl
)前面加上数字会导致光标跳转到预期的位置,例如1l
向右移动一个字符。
这是的典型用法{count}
,作为命令的重复。
可以使用 或 向上或向下移动当前行,
:m +N
但是:m -N
,您必须使用:m -2
才能获得 与 相反的效果:m +1
。
首先,这不是真正的{count}
,而是一个{address}
。这个实际上是一致的(即使乍一看你可能会觉得奇怪。)该:m
命令将移动当前行以下地址指定的行。
如果你在第 47 行,你可以使用:m 48
将其移至下一行下方。由于当前行被移动,原来是第 48 行的行现在变成了第 47 行,而当前行是第 48 行。如果你现在想将其移回原始位置,你需要:m 46
,因为它会以下带有地址的行。+1
只是 48 的快捷方式(从第 47 行开始),并且-2
只是 46 的简写(现在在第 48 行)。有道理,对吧?
如果 Vim 决定移动该行多于如果地址在地址之前,那么命令的行为(例如):m 46
将取决于当前行是位于地址之上还是之下,这样就不太好。因此 Vim 认为这个因素的一致性更为重要。
我使用 gt 和 gT 命令在选项卡之间切换。如果我打开了三个选项卡,并且当前位于第一个选项卡(最左边),则使用 3gt 将切换到第三个选项卡。如果我位于第三个选项卡(最右边),则 2gT 将切换回第一个选项卡,而 3gT 则停留在同一选项卡上。
是的,这个确实不一致,但这是有原因的。
在实现制表符时,Vim 作者认为,拥有一种快速切换到“N”个制表符的方法比跳过“N”个制表符更重要。您很少需要执行后者。因此,他们决定使用{count}
作为命令的绝对制表符编号gt
。
另一方面,该gT
命令不太需要执行相同的行为(您已经有了更简单的按键),所以重复的含义{count}
留在那里,所以如果有人想跳过“N”个选项卡,该命令可能会有所帮助......
gt
请注意,通过这种方式,虽然只使用两个命令,但是却可以使用三个命令(下一个选项卡、上一个选项卡、转到选项卡“N”),gT
并且,命令数量越少越好,因为 Vim 中的命令太多了,我们记不住!