在vi中从一个文件复制粘贴内容到另一个文件

我正在处理两个文件,我需要从一个文件复制几行并粘贴到另一个文件。我知道如何复制(yy)和粘贴(p)在同一个文件。但这对不同的文件不起作用。这是怎么做到的?

还有,是否有一种方法可以剪切粘贴?我试着在谷歌上搜索过,但大多数资源只讨论复制粘贴。

437249 次浏览

既然你已经知道如何剪切/拉出文本,下面是一些粘贴到另一个文件的想法:

  • 编辑第一个文件,截取你想要的文本。然后从vi (:e /path/to/other/file)中打开第二个文件并粘贴它
  • 在分割窗口中打开两个文件,并使用Ctrl + w向上/下来在它们之间导航:

    • vi -o /path/to/file1 /path/to/file2
    • 在第一个文件中,Ctrl + w年代
    • 李< / ul > < / >

使用d的变体,如dd来切割。

要将一段行写入另一个文件,您可以使用:

:<n>,<m> w filename

其中<n><m>是数字(或符号),表示一行的范围。

要使用桌面剪贴板,请查看+g命令。

您可以打开另一个文件并键入:r file_to_be_copied_from。或者你可以缓冲。或者转到第一个文件,在你想要复制的行,键入"qY,转到你想要粘贴的文件,键入"qP

"buffer_name,复制到缓冲区。Y是yank, P是put。希望有帮助!

这里有一种方法;

  • 启动Vim并打开正在处理的文件file1。
  • e file2,它会弹出file2,即你想要从其中复制行的文件。
  • 找到要复制的行。如果是三行,则按3.yy
  • b1将切换到缓冲区1,file1所在的位置
  • 找出你想插入的行,并点击p

您也可以让两个文件都可见。用例如Ctrl + w 年代分割屏幕。

至于切割,d切割并将切割的东西放在yank缓冲区中。dd将“切割”一行。

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

简单地用y插入一个缓冲区(假设你之前在可视模式下标记了一个要复制的区域),然后用p粘贴到另一个缓冲区。它也适用于不同的选项卡,只要它们在同一个Vim实例中。

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

  • 在Win32上,如果你选择两个或多个文件,上下文菜单中有一个选项说用一个vim编辑
  • 当你在控制台上时,你可以用vim file1 file2来实现它
  • 如果你使用Vim作为其他工具的编辑器,一定要指定--remote-silent选项,以确保所有文件都在同一个实例中打开

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

如果你在Windows上使用Vim,你可以使用以下方法访问剪贴板(MS复制/粘贴):

dd—切一行(或3dd切三行)

yy—复制一行(或3yy复制三行)

p——在游标后的行上粘贴行

P——在光标前面的行上粘贴行

它允许你在不同的Vim窗口之间或Vim和PC应用程序之间粘贴(记事本微软文字处理软件等)。

2017 - 05年更新:

我刚刚发现,如果你在vimrc文件中添加以下一行,

设置剪贴板=不知名的

那么Vim正在使用系统剪贴板。


我刚刚发现yank的方式不会工作在我复制内容之间不同的Vim实例窗口的方式。(至少,根据我的Vim知识,它不能工作。我不知道是否有其他方法使其工作)。

根据我的测试,yank方法只适用于在同一个窗口中打开多个文件的情况。

如果你想这样做,你最好使用操作系统切割复制过去的方式,如Ctrl + xCtrl + c(在Windows下)。

在编辑文件时,在希望使用的开始和结束处做标记

ma -设置a标记

mb -设置b标记

然后,要将其复制到另一个文件中,只需使用w命令:

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

这些都是很好的建议,但如果您知道文本在另一个文件中的位置,则可以轻松使用sed。:r! sed -n '1,10 p' < input_file.txt这将在一个已经打开的文件中插入10行光标当前位置。

我的场景是,我需要拷贝中间n行,n未知,从文件1到文件2。

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

例如: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

下面的选项在大多数时候都适用,也适用于以后的粘贴。

 "xnyy
x - buffer name
n - number of line to Yank - optional
插入的行将存储在缓冲区'x'中。 它可以在编辑的任何地方使用

要将行粘贴到另一个文件中,

:e filename&location
< p >的例子: 在当前编辑

中键入以下命令
: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*'中的行将在当前游标pos后复制

目标:保存一个文件的一部分到另一个文件。

解决方案:

  1. 选择你想保存的文本:
    • 将光标定位到要开始选择的位置
    • v选择字符或按大写V选择整行
    • 将光标移动到要选择的内容的末尾
    • 李< / ul > < / >
    • 将所选文本保存到新文件。输入w空间和新文件的名称。实际上你会看到

      :'<,'>w new.txt

      然后按输入

这些地图对我来说很有吸引力:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

因此,当我处于可视模式时,我选择我想要的行,并按Ctrl + c,然后按Ctrl + v,将文本插入到接收文件中。你也可以用“*y”,但我认为有时候这个很难记住。

这也是有用的复制文本从Vim到剪贴板。

来源:使用临时文件在会话之间复制和粘贴

如果您想复制文件的一部分并将该内容粘贴到另一个文件的中间,可以使用这种方法。

: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
现在,临时文件的内容被粘贴到这里。 您可以在粘贴内容后从命令行本身删除临时文件
:!rm temp1

如果您想多次复制和粘贴,这将有所帮助。

另一种方法是在两个分割缓冲区中打开两个文件,并在可视化选择感兴趣的行后使用下面的“snippet”。

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p
  1. 确保你有Vim版本编译与剪贴板支持
    • :echo has('clipboard')应该返回1
    • 如果它返回0(例如Mac OS X,至少v10.11 (El Capitan), v10.9 (Mavericks)和v10.8 (Mountain Lion) -附带一个缺乏剪贴板支持的Vim版本),你必须安装一个具有剪贴板支持的Vim版本,例如通过brew install vim(安装后不要忘记重新启动你的终端)
    • 李< / ul > < / >
    • 进入一个可视模式(V - multiline, v - plain,或Ctrlv - block-visual)
    • 选择要复制的行
    • y -复制选定
    • p -粘贴复制

注:

  • 如果你需要复制粘贴一行,你可以将步骤2-5替换为这个问题的答案 by JayG的指令
  • 为了方便选择行,你可以将set mouse+=a添加到你的.vimrc -它将允许你在Vim中使用鼠标选择行,而不选择无关的元素(如行号等)。

进入命令模式并运行

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

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

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

在你的.vimrc中设置viminfo:

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

当你退出Vim时,这将在~/.viminfo文件中保留多达1,000行被删除的东西(你的“registers")。当您启动Vim时,它会恢复,因此您可以将它粘贴到另一个文件中。

查看viminfo文档以了解它可以跨会话持久化的所有其他内容。