2013-07-08 81 views
3

我有一個文件,我想做到以下幾點。唬弄行號在vim

- copy every n lines starting from m (m,m+n,m+2n, ...) 
- copy line number 2, 5, 27, ... by specifying line numbers. 

感謝

回答

7

若要在每N行復制,可以使用:global與選擇線的表達式:

:let @a = '' 
:g/^/if line('.') % 3 == 0 | yank A | endif 

對於顯式線,我會依次調用:yank命令:

2yank a | 5yank A | 27yank A 

它使用唬弄入大寫REG ister追加到它。

+0

非常感謝!但是1.第一個代碼中的n和m在哪裏? 2。第二個代碼中a和A有什麼區別? – eli

+0

我想在你的例子中n = 3。 – eli

+0

是的,我選擇了n = 3,你可以添加一個偏移量:'(line('。')+ 1)%3';試驗一下,你會看到。 –

1

除了:g解決方案,Ingo發佈後,您還可以使用:s命令。

首先你需要準備的格局。

:例如,要每隔二行, 您可以使用該模式 \%3l\|\%6l\|\%9l

那麼首先讓我們保存在變量中所生成的模式(簡化了一點,我們只考慮第100行)明確匹配

:let lines=range(3,100,3) 

這將創建所有行號的列表,從3日開始,並通過3遞增,請注意,如果你需要一些特殊的行號,不遵循任何規則arithemtic,簡單地定義列表就象這樣:

:let lines=[2,5,26,57,99] 

然後我們需要生成圖案出來的,這是我們可以在:s命令內使用:

:call map(lines, '''\%''.v:val.''l''') 

這轉換的行號插入形式\%l的圖案。因此,我們具有相匹配的所需行的模式,但首先我們需要initalize一個結果列表變量:

:let result = [] 

我們現在可以養活這對:s命令:現在

:exe ":%s/". join(lines, '.*\|'). '/\=add(result, submatch(0))/n' 

所有匹配線包含在列表result中,並且可以例如通過使用複製到剪貼板:

:let @+=join(result, "\n") 

,或者你可以將其粘貼到一個臨時緩衝區:

:new +exe\ append(0,result) 

(注意,是exe文件和追加調用之間的空間需要進行轉義)。

也請注意,這個解決方案需要至少Vim Patch 7.3.627

根據不同的情況下,我會選擇使用此方法或 - 一個通過英戈指出。