用vim复制文件中的特定行

时间:2012-07-13 15:45:55

标签: vim

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

4 个答案:

答案 0 :(得分:3)

这是一个有趣的小主意。将其粘贴到〜/ .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将它们粘贴到您想要的任何位置。 (含)

我想编辑这篇文章,即使它已经过时了,建议采用更“吵闹”的方式。请参阅:help usr_10 | 131

你可以这样做:

10GV20G"ay
22G"AY
24GV30G"Ay
G"ap

此外,如果某些特定模式包含这些行中的每一行,那么您可以通过所述模式获取它们。比方说,我想把所有包含单词“foo”的行拉出来,然后我就可以了

:g/foo/y "

答案 1 :(得分:1)

使用视觉模式,或直接使用:

:10,20yank

复制到新文件:

:new | put | 0d

通常,您要么有一个标准,例如将包含pattern的所有行移到末尾:

:g/pattern/m$

复制(:复制或:t)

:g/pattern/t$

要抓到注册表:

:let @a="" | g/pattern/y A

现在,您可以随时随地使用它,例如 a P 将其粘贴。

如果您没有这样的图案,请使用文字动作,例如} y A附加一行直到下一个空行以注册a等。


修改 PS。我想我会解释一下 为什么 我提到m$移到最后(我个人最喜欢的):

如果您选择将行移动/复制到文件的末尾(m$),则可以立即将它们写入另一个文件。 E.g。

 :$mark a
 :g/pattern/t$
 :'a,$w newfile.txt

复制与文件newfile.txt匹配的行。现在从源文件中删除副本:

 :'a,$d

答案 2 :(得分:1)

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

使用您提供的方案,需要抽取10-20,22,24-30行

用“A”猛击每个小组。

  

:10,20y A

     

:22y A

     

:24,30y A

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

详细了解注册HereHere

答案 3 :(得分:0)

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

这可以非常轻松地完成:10G转到第10行,y10y复制下十行,然后:bnp将其粘贴到第10行其他档案。