VIM 編號行為不一致

VIM 編號行為不一致

VIM 中的指令可以使用數字作為前綴,但某些操作的編號方案並不一致。

在左、下、上、右移動指令(H、J、K、L)前加上數字會導致遊標跳到預期位置,例如1L將向右移動一個字元。

當前行可以使用 或 向上或向下移動,:m+N但是:m-N,您必須使用:m-2才能獲得相反的效果:m+1

我還在 Visual Studio 2019 中使用 VSVim,並使用gtgT命令在選項卡之間切換。如果我打開了三個選項卡並且目前位於第一個選項卡(最左側),則使用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”),而只使用兩個命令gtgT,並且較少的命令有些重要,因為Vim 已經有太多的他們讓我們記得!

相關內容