
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
。
首先,這並不是真正的 a {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”選項卡,該命令可能會有所幫助...
請注意,這樣,可以擁有三個命令(下一個選項卡、上一個選項卡、轉到選項卡“N”),而只使用兩個命令gt
和gT
,並且較少的命令有些重要,因為Vim 已經有太多的他們讓我們記得!