在vi编辑器中将内容从一个文件复制并粘贴到另一个文件

332

我正在处理两个文件,需要将一个文件的几行复制并粘贴到另一个文件中。我知道如何在同一文件中复制(yy)和粘贴(p)。但是对于不同的文件,这样做无法实现。该如何操作?

此外,是否有剪切-粘贴的方法?我尝试过搜索,但大多数资源只讨论复制-粘贴。


你确定这不起作用吗?我经常使用它在文件之间复制行。 - sjngm
当我这样做时,我只得到一个引号? - macha
6
dd 命令的作用类似于 cut 命令。 - Martin Stålberg
19个回答

7

在编辑文件时,使用

ma - 设置a标记

mb - 设置b标记

在需要复制到另一个文件中的位置,只需使用w命令:

:'a,'bw /name/of/output/file.txt

5

在同一实例的Vim中打开的两个缓冲区(==文件)之间复制文本没有问题:

只需在一个缓冲区中使用y(假设您在可视模式下标记了要复制的区域),然后在另一个缓冲区中使用p粘贴即可。只要它们在同一个Vim实例中,不同的选项卡也可以工作。

如何在同一Vim实例中打开两个文件取决于您的系统:

  • 在Win32上,如果选择两个或多个文件,则右键单击菜单中有一个选项“使用一个vim进行编辑
  • 当您在控制台上时,可以使用vim file1 file2来实现
  • 如果您将Vim用作另一个工具的编辑器,请务必指定--remote-silent选项,以确保所有文件都在同一实例中打开

如果您在两个不同的Vim实例中打开了两个文件,则必须使用系统剪贴板:在第一个Vim实例中,使用"+y将文本复制到系统剪贴板中(同样,在可视模式下标记要复制的区域),然后转到第二个Vim并在那里粘贴剪贴板:"+p


可以使用_:tabedit_ 文件名打开目标文件,然后只需使用 p 粘贴您的代码行。我认为这样更快。 - jabalv

3
我的情境是需要将文件1中未知数量的n行文本复制到文件2的中间位置。
:'a,'bw /name/of/output/file.txt

2

如果你想复制文件的一部分,并将该内容粘贴在另一个文件的中间,你可以采用以下方法。

:linenumber,linenumber write newfile

例子:

:2,34 write temp1

或者

:'mark, 'mark write newfile

例子:

:'a,'b write temp1

现在将这些行复制到另一个文件中。 如果你想在复制后删除这些行,可以执行以下操作:

:linenumber1,linenumber2 d

或者
:'mark1,'mark2 d

现在,前往其他文件。 然后将光标停留在您想要粘贴的行上。
输入。
:r!cat temp1

现在,临时文件的内容已经复制到这里。粘贴完内容后,您可以从命令行中删除临时文件。请注意保留HTML标签。
:!rm temp1

这会在你需要复制和粘贴多次的情况下有所帮助。

这是最简单的方法! - Mitu Vinci

1
以下选项大多数情况下都有效,也适用于稍后粘贴。
 "xnyy
x - buffer name
n - number of line to Yank - optional

被取走的行将会被存储在缓冲区 'x' 中。它可以在编辑器的任何地方使用。
要粘贴行到其他文件中,
:e filename&location

示例: 在当前编辑器中输入以下命令

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

完成操作

打开文件1:

vi Test1.sh

a10yy

-Yanked 10 lines

现在打开当前编辑的第二个文件。
*:e /u/test/Test2.sh*

将光标移动到需要粘贴的行。
*"ap*

--缓冲区中的行'*a*'将在当前光标位置之后复制


对于像我这样的新手,你必须在要使用的寄存器前面加上引号:将内容复制到x寄存器中:"xy",然后在新文件中从正确的寄存器(x)中粘贴它:"xp"。 - mortenlund

1

示例:fileA 和 fileB - 从 fileA 的第 25 行开始复制 50 行,并粘贴到 fileB

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

0

进入命令模式并运行

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

例如,从文件名中提取20-30行到当前打开的文件中

:r! sed -n '20, 30p' filename

0

在你的.vimrc中设置viminfo

set viminfo=%,<1000,'10,/50,:100,h,f0,n~/.viminfo

这将在退出 Vim 时将最多 1,000 行已复制的内容(即“寄存器”)持久化到 ~/.viminfo 文件中。当您启动 Vim 时,它会被恢复,因此您可以将其粘贴到另一个文件中。

请参阅 viminfo 文档 以了解它可以在会话之间持久化的所有其他内容。


0
另一种方法可以是在两个分割缓冲区中打开两个文件,并在选择感兴趣的行后使用以下“代码片段”。
:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接