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

332

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

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


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

278

既然你已经知道如何剪切/拷贝文本,下面是一些将其粘贴回另一个文件的方法:

  • 编辑第一个文件,剪切所需的文本。然后在 vi 中打开第二个文件(:e /path/to/other/file),并将其粘贴进去。
  • 在拆分窗口中同时打开两个文件,并使用 Ctrl + w上方向键/下方向键 在它们之间进行导航,可以通过以下方式实现:

    • vi -o /path/to/file1 /path/to/file2
    • 从第一个文件中,使用Ctrl + w, s

1
我打开了两个Putty窗口,首先进入“v”可视模式,然后选择所有行并执行“y”复制操作。现在我按下alt+tab键切换到另一个文件,在该文件中按下“p”粘贴时,只会打印出一个引号。 - macha
14
如果您正在使用两个 Putty 窗口,需要使用 Putty/Windows 的复制/粘贴方式。操作很简单:用鼠标选择要复制的内容(不需要做其他任何事情,该标记文本现在已经复制到剪贴板)。切换到另一个 Putty 窗口,在 Vim 中进入插入模式(按 i 键)。点击鼠标右键 - 在 Putty 窗口中点击鼠标右键将粘贴剪贴板中的内容。 - nos
5
你现在所做的方式行不通:在 vi 中使用 yank 命令并不能将文本复制到 Windows 剪贴板中,而且 yank 缓存器也不会在打开的 vim 实例之间共享。 - Adam Batkin
1
我不明白最后一点的作用是什么:
  • 在第一个文件中,按下Ctrl + ws
- svassr
1
对我来说,它将窗口分成了两部分,但打开的是完全相同的文件。那么你如何选择要打开哪个文件呢?我见过命令 :sp myfile,它水平分割并打开指定的文件,但如果我希望垂直分割窗口,该怎么办呢? - svassr
显示剩余7条评论

62
如果你在Windows上使用Vim,可以使用以下命令访问剪贴板(MS复制/粘贴): "*dd -- 剪切一行(或3dd剪切三行) "*yy -- 复制一行(或3yy复制三行) "*p -- 在光标后的行上粘贴行 "*P -- 在光标前的行上粘贴行
这使您可以在不同的Vim窗口之间或在Vim和PC应用程序(NotepadMicrosoft Word等)之间进行粘贴。

21
+ 作为跨平台系统剪贴板注册表(适用于Windows和Linux),而 * 则仅适用于Windows(在Windows中,+ 的功能与 * 相同)。 - Stephen Swensen
截至2021年,在Linux(pop_os 20.04)中,对于本答案提到的应用程序而言,*+的效果相同,即在vim实例之间以及从vim复制/粘贴到系统应用程序之间进行复制/粘贴(vim 8.2,带有剪贴板支持)。 - calocedrus

53

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

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

:<n>,<m> w filename

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

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


要使用书签将文本写入文件,请创建两个标记(例如a和b):移动到第一行,输入ma,移动到最后一行,输入mb。然后在使用上述命令时,在标记字母前加上 ':'a,'b w filename - EchoLynx
宽行范围的绝佳解决方案! - Yasin Okumuş

38

以下是一种实现方法:

  • 打开正在编辑的文件file1,启动Vim。
  • :e file2,打开想要复制行的文件file2。
  • 定位需要复制的行,如果是三行,按3yy
  • :b1,切换到文件file1所在的buffer 1。
  • 找到你想插入粘贴内容的位置,按下p

你也可以同时查看两个文件。可以使用Ctrl + w s等快捷键来分屏。

至于剪切,d可以剪切并将被剪切内容放进yank缓冲区。dd将会“剪切”一整行。


2
离题:我该如何获得那些像键盘按钮一样的东西? - eckes
1
@eckes http://meta.stackexchange.com/questions/26207/how-can-i-format-as-keyboard-keys - nos
如果两个文件位于两个不同的ssh服务器上,而客户端在Linux/MacOS中的两个不同终端中ssh连接到这两个服务器,该怎么办呢?我的意思是,没有putty可用,并且两个文件不能在同一个终端的同一个vi会话中打开。 - Qiang Xu
1
如果客户端能够通过ssh登录到两台服务器,则它也可以使用scp或sftp连接这两台服务器。因此,最快的方法是将文件从一台服务器复制到另一台服务器,使它们驻留在同一台服务器上,按照所述进行编辑,完成后将文件复制回另一台服务器(如果需要)。 - nos
我已经解决了我的问题。感谢你简明扼要的回答。 - Tinashe Chinyanga

34
您可以打开其他文件并输入:r file_to_be_copied_from。或者您可以使用缓冲区。或者进入第一个文件,转到要复制的行,输入"qY,然后进入要粘贴的文件并输入"qP"buffer_name将内容复制到缓冲区,Y是复制命令,P是粘贴命令。希望这有所帮助!

在本地vi上通过ssh工作,仍需要使用:r scp://<host>/<relativepath>来读取文件。否则它会尝试从本地存储中读取文件。 - mazunki

18

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


很奇怪,我在 macOS 上运行这个程序时,却收到了退出码 1,不确定原因。 - jayunit100
1
感谢您的建议!我使用head而不是sed,因为我想要前两行::r!head -n2 file.py - Federico Ponzi

11

2017年5月更新:

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

set clipboard=unnamed

那么Vim将使用系统剪贴板。


我刚刚发现将内容从一个Vim实例窗口复制到另一个窗口时,复制方法不起作用。(至少在我的Vim知识范围内它不起作用。我不知道是否有另一种方法可以使其起作用)。

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

如果您想这样做,最好使用操作系统的剪切-复制-粘贴方式,例如在Windows下按 Ctrl +xCtrl + c


8
  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 - 粘贴已复制内容

P.S:

  • 如果您需要复制并粘贴单行代码,您可以使用答案JayG的说明替换步骤2-5。
  • 为了方便选择代码行,您可以在.vimrc文件中添加set mouse+=a - 这将允许您使用鼠标在Vim中选择代码行,同时不选择其他元素(如行号等)。注意:这会阻止从Vim复制鼠标选定的文本到系统剪贴板的功能。

7

这些重新映射对我非常有效:

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复制文本到剪贴板也很有用。
来源:使用临时文件在会话之间复制和粘贴

7

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

解决方案:

  1. 选择您要保存的文本:
    • 将光标定位在您要开始选择的位置
    • 按下 v 选择字符或按下大写字母 V 选择整行
    • 将光标移动到您想要选择的末尾
  2. 将所选文本保存到新文件。输入 :w空格 和新文件的名称。实际上,您会看到

    :'<,'>w new.txt

    然后按下 Enter


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

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