2010-11-19 47 views
20

很多時候,我似乎有一個項目列表,我需要在它們前面添加數字。例如:用於在vim中編號列表的宏?

Item one 
Item two 
Item three 

這應該是:

1. Item one 
2. Item two 
3. Item three 

在vim的,我可以在編輯模式下按I,插入 「1」,命中逃跑。然後我轉到下一行,按.,然後按^A增加數字。這看起來效率很低......我如何製作一個宏,以便我可以進入下一行,並在開始時插入一個比以前更大的數字?

回答

18

你可以很容易地記錄一個宏來做它。

第一次插入1.在第一行的開始處(在1.之後有幾個空格,但你看不到它們)。

轉到第二行的開頭並使用qa進入記錄模式。

按下列鍵序列:

i       # insert mode 
<ctrl-Y><ctrl-Y><ctrl-Y> # copy the first few characters from the line above 
<ESC>      # back to normal mode 
|       # go back to the start of the line 
<ctrl-A>     # increment the number 
j       # down to the next line 
q       # stop recording 

現在,您可以播放錄音與@a(第一次;對於隨後的時間,你可以做@@重複最後執行的宏),它會在每行的開頭添加一個新增的數字。

+7

使用'3 @ a'來執行宏3次 – 2010-11-19 11:40:02

+8

我會代替'k^yWjP^ j'。文本可能不在行的開頭,更重要的是你的宏在第十行之後不起作用。 – 2010-11-19 11:46:09

+0

Spot on,@Luc - 我自己是怎麼做的,除了我在最後加上^以便它在完成時將光標定位在行的開頭。由於^在開始時沒有功能差異,只是感覺有點整齊。 – 2010-11-19 12:06:21

10

選擇與視覺模式臺詞:V,然後鍵入:

:'<,'>s/^\s*\zs/\=(line('.') - line("'<")+1).'. ' 

這是很容易放在一個命令:

command! -nargs=0 -range=% Number <line1>,<line2>s/^\s*\zs/\=(line('.') - <line1>+1).'. ' 
+0

我喜歡這種可重複性。對於單線來說很棒。不幸的是,爲了* my *的目的,當插入數字時,我傾向於在reStructuredText中進行操作,因此基本上需要''''功能 - 但由於它的行計數方式,僅僅用'\ n \ n'替換'^'不會削減它。可惜,否則它會進入我的'.vimrc'。好的代碼,無論如何,我不知道'\ =()' - 我無法在vim幫助中找到它! – 2010-11-19 12:13:51

+0

你可以使用任何你喜歡的函數,例如一個函數爲自己保留一個計數。在這種情況下,你可能必須玩一個封裝「循環」的命令,例如http://stackoverflow.com/questions/1809571/how-do-i-substitute-from-a-list-of-strings-in-vim/1809780#1809780。否則,請參閱':h sub-replace - \ =' – 2010-11-19 13:09:29

+0

美麗的線()技巧 - 我還沒有找到! – egbutter 2013-02-05 00:32:16

2

您可以使用 '記錄' 功能。 這是一種在Vim中記錄宏的簡單方法。

見:幫助記錄

在正常模式「QA」開始記錄你在輸入「A」註冊 類型所需的命令插入數在一行的開頭,將其複製到下一行並使用CTRL-A來增加其值。 'q'結束記錄 然後'@a'重放存儲在寄存器'a'中的宏 ('@@'重複上一個宏)。

你可以做'20 @a'這樣的事情連續做20次。

重複文本修改非常方便。

根據情況,使用比正則表達式更容易或更難。

2

也許這不是一個宏觀的解決方案,但至少它很容易。

號碼添加到所有線路

它可以使用:%!nl -ba:%!cat -n命令,這將增加行號的所有行。

在Windows上,您必須安裝Cygwin/MSYS/SUA

號碼添加到選定的行

要只對選定的行添加號碼,請在視覺模式(v和遊標)選擇它們,然後在完成時 - 執行命令::%!nl(忽略空白行)或:%!cat -n(包括空白行)。

格式化

爲了除去多餘的空格,在視覺塊選擇它們(Ctrl鍵 + v)和除去它們(X)。

向該數字之後加一些字符(.:)),在視覺塊選擇它們(Ctrl鍵 + v),然後附加的字符(,鍵入的字符,然後與完成Esc)。

+0

要添加一些字符('.'),您可以在選定的行上使用':'<,'> normal a.'。當選擇完成之前,用'gv'重複它。 – wryrych 2016-12-05 15:38:27

0

在文本塊的起始位置插入一個數字,例如:

1. Item One

進入VIM正常模式下的命令如下:

qb^yW+P^<Ctrl-A>q 

這意味着:

qb  # start recording macro 'b' 
^  # move to start of text on the line 
yW  # 'yank' or copy a word including the ending whitespace. 
+  # move one line down to the start of the next line 
P  # place text ahead of the cursor 
^  # move to start of text 
<Ctrl-A> # increment text 
q  # Finish recording macro 

這是什麼讓你做的是重播跨越的最後一行宏根據需要多次編號列表。