簡體   English   中英

Vim-在不更改列寬的情況下增加數字

[英]Vim - Increase number without changing column width

我正在處理固定寬度的文件格式,因此需要增加某些列中的所有數字。 我有一個簡單的宏,該宏將一個值添加到一個數字,移至下一行並重復(例如2aj)。但是,這些數字從1開始,通常在10000以上結束,因此列寬變得混亂,例如(下划線為空格) ,此示例僅涵蓋從9跳到10的跳動)

FOO_7_BAR
FOO_8_BAR
FOO_9_BAR

FOO_9BAR
FOO_10_BAR
FOO_11_BAR

(請注意將破壞我的程序的新文本列)

當我需要時

FOO_9_BAR
FOO10_BAR
FOO11_BAR

我一直在手動操作,並從前9列中刪除一個空格,然后從90處刪除,然后是900個,但是我正在尋找一種更可靠的方式來處理此問題,而無需使用不同的宏處理前10、100、1000等或任何手動輸入。

謝謝。

我想出了這種方式,我認為動畫說明了自己:

在此處輸入圖片說明

最終結果是:

FOO 3 BAR
FOO 4 BAR
FOO 5 BAR
FOO 6 BAR
FOO 7 BAR
FOO 8 BAR
FOO 9 BAR
FOO10 BAR
FOO11 BAR

這需要一些手動黑客手段,但比手動刪除空格要好。

不過,您可能還可以編寫一個通過Vimscript自動執行此操作的函數!

首先,找到最短線的長度。 您可以通過ex執行此操作。 :echo col("$")最短的一行。

然后,運行以下命令:

:g/.\{NUM\}/exec "norm! /[0-9]\<cr>X"

將上面命令中的NUM替換為您在上一步中獲得的原始編號。

以下是其工作原理的說明:

:g/.\{NUM\}/    Find lines that are too long
exec "norm!     A common idiom: build a string to execute in normal mode
/[0-9]<cr>      Find the first number on the line
X               Delete the space before it (equivalent to "hx")

然后簡單地重復運行同一命令(您可以通過按 Up Return來執行此操作),直到所有行的長度都相同為止–一旦出現這種情況,將會導致錯誤(因為它將找不到任何匹配的行)。

這是整個過程的簡短動畫:

動畫

可以使用:s和子替換表達式來完成。

:%s/\v([^0-9]*)(\d+)/\=strpart(submatch(1), 0, 5 - len(submatch(2))).submatch(2)

這個想法是我們捕獲數字和數字本身之前的部分。 替換通過\\=執行vim表達式,將兩個捕獲組放回一起。 但是,通過strpart()將第一個捕獲組strpart()固定寬度(在此示例中為5)減去第二個捕獲組的長度len(submatch(2))

有關更多幫助,請參見:

:h sub-replace-expression
:h strpart()
:h len()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM