有人可以告诉我如何复制特定行,例如文件中的第 10-20、22、24-30 行,以便我可以将其粘贴到另一个文件中吗?正如有人指出的那样,我看到了这个stackoverflow帖子,但是,我在哪里问了一个不同的问题
4 回答
这是一个有趣的小想法。将此粘贴到您的 ~/.vimrc 中:
command! -nargs=* Y :call YankList(<f-args>)
fun! YankList(...)
let yanklist = []
for i in a:000
if match(i, "-") != -1
let split = split(i, "-")
let yanklist = yanklist + range(split[0], split[1])
else
let yanklist = yanklist + i
endif
endfor
call setreg('"', "")
for i in yanklist
call setreg('"', getline(i), "al")
endfor
endfun
现在您可以指定要拉到未命名寄存器的行。这样做:
:Y 10-20 22 24-30
并用于p
将它们粘贴到您想要的任何位置。(包括的)
我想编辑这篇文章,即使建议更“vimmy”的方式来做这件事已经很老了。见:help usr_10 | 131
。
你可以这样做:
10GV20G"ay
22G"AY
24GV30G"Ay
G"ap
此外,如果这些行中的每一个都包含一些特定的模式,那么您可以通过所述模式来获取它们。例如说我想拉出所有包含单词“foo”的行,然后我可以这样做
:g/foo/y "
使用可视模式,或直接:
:10,20yank
复制到新文件:
:new | put | 0d
通常,您要么有一个标准,例如将所有包含pattern
的行移到末尾:
:g/pattern/m$
复制(:copy 或 :t)
:g/pattern/t$
拉到一个寄存器:
:let @a="" | g/pattern/y A
现在,您可以在任何您喜欢的地方使用它,例如"aP粘贴它。
如果您没有这样的模式可以使用,只需使用文本动作,例如}:y A
将一行行附加到下一个空行以进行注册a
等。
编辑PS。我想我会多解释一下为什么我提到m$
移动到最后(我个人最喜欢的):
如果您选择将行移动/复制到文件末尾 ( m$
),您可以立即将它们写入另一个文件。例如
:$mark a
:g/pattern/t$
:'a,$w newfile.txt
将匹配的行复制到 file newfile.txt
。现在从源文件中删除副本:
:'a,$d
让这两个文件都打开 - 直接从命令行调用 asvim fileone filetwo
或打开 vim 然后:e file
。然后,您可以使用缓冲区命令在它们之间切换,两个文件:bn
是:bp
等效的(下一个缓冲区,上一个缓冲区)。然后只需复制行。
这可以很容易地完成:10G
转到第 10 行,y10y
复制接下来的 10 行,然后:bn
将p
其粘贴到另一个文件中。