3

有人可以告诉我如何复制特定行,例如文件中的第 10-20、22、24-30 行,以便我可以将其粘贴到另一个文件中吗?正如有人指出的那样,我看到了这个stackoverflow帖子,但是,我在哪里问了一个不同的问题

4

4 回答 4

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 "
于 2012-07-13T18:03:00.923 回答
2

使用可视模式,或直接:

: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
于 2012-07-13T15:54:47.093 回答
2

这是一个使用寄存器的简单解决方案。

使用您提供的场景,需要拉出第 10-20、22、24-30 行

只需用“A”拉出每个组。

:10,20 年

:22 年

:24,30 年

此时,您已将每组行复制到“A”寄存器。现在您可以p像往常一样使用粘贴,或者您可以使用"Ap(双引号,注册信,然后p将您使用的那些粘贴到 A 注册。

在此处此处阅读有关寄存器的更多信息

于 2013-12-21T12:43:20.887 回答
1

让这两个文件都打开 - 直接从命令行调用 asvim fileone filetwo或打开 vim 然后:e file。然后,您可以使用缓冲区命令在它们之间切换,两个文件:bn:bp等效的(下一个缓冲区,上一个缓冲区)。然后只需复制行。

这可以很容易地完成:10G转到第 10 行,y10y复制接下来的 10 行,然后:bnp其粘贴到另一个文件中。

于 2012-07-13T15:55:22.083 回答