我有一個文件,我想做到以下幾點。唬弄行號在vim
- copy every n lines starting from m (m,m+n,m+2n, ...)
- copy line number 2, 5, 27, ... by specifying line numbers.
感謝
我有一個文件,我想做到以下幾點。唬弄行號在vim
- copy every n lines starting from m (m,m+n,m+2n, ...)
- copy line number 2, 5, 27, ... by specifying line numbers.
感謝
若要在每N行復制,可以使用:global
與選擇線的表達式:
:let @a = ''
:g/^/if line('.') % 3 == 0 | yank A | endif
對於顯式線,我會依次調用:yank
命令:
2yank a | 5yank A | 27yank A
它使用唬弄入大寫REG ister追加到它。
除了: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
根據不同的情況下,我會選擇使用此方法或 - 一個通過英戈指出。
非常感謝!但是1.第一個代碼中的n和m在哪裏? 2。第二個代碼中a和A有什麼區別? – eli
我想在你的例子中n = 3。 – eli
是的,我選擇了n = 3,你可以添加一個偏移量:'(line('。')+ 1)%3';試驗一下,你會看到。 –