我有一个文件,我想做到以下几点。唬弄行号在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';试验一下,你会看到。 –