在Vi中将内容从一个文件复制并粘贴到另一个文件


256

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

另外,有没有办法剪切粘贴?我曾尝试使用Google谷歌搜索,但是大多数资源都只讲复制粘贴。


您确定这行不通吗?我经常使用它在文件之间复制行。
sjngm 2011年

那么,当我这样做时,我只会得到一个引号吗?
macha

4
命令dd的工作方式类似于cut。
MartinStålberg2013年

Answers:


218

由于您已经知道如何剪切/拖动文本,因此有一些将其粘贴回另一个文件的想法:

  • 编辑第一个文件,选中所需的文本。然后从vi(:e /path/to/other/file)中打开第二个文件并将其粘贴
  • 在拆分窗口中一起打开两个文件,然后使用Ctrl+ wUp/ 在以下两个文件之间导航Down

    • vi -o /path/to/file1 /path/to/file2
    • 在第一个文件Ctrl+中ws

我有两个打开的腻子窗口,我先在视觉模式下执行“ v”,然后选择所有行,然后在“ y”下进行拉动,而不是在做alt + tab进入另一个文件,当我这样做时–“ p”放置,它只打印引号
。– macha

10
如果使用2个腻子窗口,则必须使用腻子/窗口复制/粘贴方式。这很简单。用鼠标标记要复制的内容(您无需执行其他任何操作,该标记的文本现在已复制到剪贴板。)切换到其他腻子窗口。在vim中进入插入模式(按i键)。按下鼠标右键-在腻子窗口中的鼠标右键将粘贴剪贴板中的任何内容。

3
您正在做的事情行不通:在vi中进行Yanking不会将文本放入Windows剪贴板,并且Yank缓冲区不会在打开的Vim实例之间共享。
亚当·巴特金

1
我不明白的最后一点是应该做的:*从第一个文件中,Ctrl+ ws
svassr 2013年

1
对我来说,它分割了窗口,但打开了完全相同的文件。您如何选择要在哪个文件中打开?我已经看到了:sp myfile水平分割并打开指定文件的命令,但是如果我希望垂直分割窗口怎么办?
svassr

50

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

"*dd -剪一条线(或3dd剪三条线)

"*yy -复制一行(或3yy复制三行)

"*p -在光标之后的行上粘贴行

"*P -在光标之前的行上粘贴行

使您可以在单独的Vim窗口之间或Vim与PC应用程序(记事本Microsoft Word等)之间粘贴。


17
使用+跨平台的系统剪贴板寄存器(Windows和Linux)对*,这是仅适用于Windows(+Windows中的工作方式一样*)。
斯蒂芬·斯文森

42

使用d喜欢dd剪切的变体。

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

:<n>,<m> w filename

其中,<n><m>是数字(或符号),用于指定行范围。

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


为此,请在要写入文件的文本周围创建两个标记(例如a和b):移至第一行ma,移至最后一行mb。然后,'当您使用上述命令时,在标记的字母前加上a ::'a,'b w filename
EchoLynx

宽线范围的绝佳解决方案!
YasinOkumuş17年

29

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

"buffer_name,复制到缓冲区。Y很烂,P被放。希望有帮助!


谢谢!这帮了我很多
山本淳(Atsushi Yamamoto)

28

这是一种实现方法;

  • 启动Vim并打开您正在使用的文件file1。
  • :e file2将会弹出file2,您要从中复制行的文件。
  • 找到您要复制的行。如果是三行,你打3yy
  • :b1 这将切换到缓冲区1,其中file1是
  • 找出要插入被拖拽的行的位置,然后点击 p

您也可以同时看到两个文件。用Ctrl+ 分割屏幕w s

至于切割,d将切好的东西切成薄片并将其放置在猛拉缓冲器中。dd将“剪断”一条线。


2
离题:如何获得类似键盘按钮的东西?
eckes 2011年


那么这两个文件分别位于两个不同的ssh服务器上,而这两个客户机在Linux / MacOS的两个不同的终端中都被同一个客户端ssh插入?我的意思是,没有腻子可以使用,并且不能在一个终端的同一vi会话中打开这两个文件。
徐强

1
如果客户端可以ssh进入两个服务器,则它也可以使用scp或sftp到这两个服务器。因此,最快的方法是将文件从一台服务器复制到另一台服务器,以便它们驻留在同一台服务器上,按照说明编辑这些文件,并在需要时将文件复制回另一台服务器。

16

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


奇怪的是,当我在os x上运行此代码时,退出代码为1,不知道为什么。
jayunit100

1
感谢您的建议!我使用head而不是sed,因为我想要前两行::r ! head -n2 file.py
Federico Ponzi

7

编辑文件时,在要使用开始和结束的位置做标记

ma-设置a标记

mb-设置b标记

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

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

7

2017年5月更新:

我刚刚发现,如果将以下行添加到vimrc文件中,

设置剪贴板=未命名

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


我只是发现,在不同的Vim实例窗口之间复制内容的方式上,猛拉方式行不通。(至少,根据我的Vim知识,它不起作用。我不知道是否还有其他方法可以使它起作用)。

根据我的测试,猛拉方式仅适用于在同一窗口中打开多个文件的方式。

如果要这样做,最好使用OS cut-copy-past方式,例如Ctrl+ xCtrl+ c(在Windows下)。


5

这些重映射对我来说就像是一种魅力:

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复制到剪贴板也很有用。

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


4

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

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

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

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

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


:tabedit filename可以用来打开目标文件,然后只需p即可粘贴您的行。我认为它更快。
jabalv

4

目标:将一个文件保存到另一个文件。

解决方案

  1. 选择要保存的文本:
    • 将光标定位在要开始选择的位置
    • v选择字符或大写V选择整行
    • 将光标移到要选择的内容的末尾
  2. 将选定的文本保存到新文件。键入:wSpace和新的文件的名称。其实你会看到

    :'<,'>w new.txt

    然后按 Enter


如何从临时文件粘贴回?
Vineet

3

我的情况是我需要从文件1复制到文件2的中间n行,n个未知行。

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

2
  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(不要忘了在安装后重新启动终端)
  2. 进入可视模式(V-多行,v-普通或Ctrlv-块可视)
  3. 选择您要复制的行
  4. "*y -复制所选
  5. "*p -粘贴复制

PS:

  • 如果您需要复制并粘贴一行,则可以用JayG 的答案中的说明替换步骤2-5。
  • 为了方便选择行,您可以添加set mouse+=a.vimrc-可以使用鼠标在Vim中选择行,而无需选择多余的元素(如行号等)注意:它将阻止复制鼠标选择的文本的功能从Vim到系统剪贴板

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

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*'行将在当前光标pos之后复制


1

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

: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

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


0

另一种方法是在两个拆分缓冲区中打开两个文件,并在目视选择感兴趣的行之后使用以下“代码段”。

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

进入命令模式并运行

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

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

:r! sed -n '20, 30p' filename
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.