305

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

另外,有没有什么方法可以剪切?我试过谷歌搜索,但大多数资源只谈论复制粘贴。

4

19 回答 19

257

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

  • 编辑第一个文件,拉出你想要的文本。然后从 vi ( :e /path/to/other/file) 中打开第二个文件并粘贴
  • 在拆分窗口中同时打开这两个文件,并使用Ctrl+ wUp/在它们之间导航Down

    • vi -o /path/to/file1 /path/to/file2
    • 从第一个文件中,Ctrl+ ws
于 2011-01-06T22:34:13.823 回答
59

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

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

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

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

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

允许您在单独的 Vim 窗口之间或在 Vim 和 PC 应用程序(记事本Microsoft Word等)之间粘贴。

于 2011-01-07T15:41:48.040 回答
51

使用dlike的变体dd来切割。

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

:<n>,<m> w filename

其中<n><m>是指定一系列行的数字(或符号)。

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

于 2011-01-06T22:35:46.507 回答
32

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

"buffer_name,复制到缓冲区。Y被拉出并被P放置。希望有帮助!

于 2011-01-06T22:36:16.200 回答
30

这是一种方法;

  • 启动 Vim 并打开你正在处理的文件 file1。
  • :efile2 将调出 file2,即您要从中复制行的文件。
  • 找到要复制的行。如果是三行,你打3yy
  • :b1这将切换到缓冲区 1,其中 file1 是
  • 找出你想在哪里插入你拉的线,然后点击p

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

至于切割,d切割并将切割的东西放在拉动缓冲区中。dd将“切”一条线。

于 2011-01-06T22:37:57.020 回答
18

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

于 2012-03-10T06:46:56.443 回答
11

2017 年 5 月更新:

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

设置剪贴板=未命名

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


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

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

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

于 2011-08-09T23:29:50.267 回答
7

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

ma- 设置a标记

mb- 设置b标记

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

:'a,'bw /name/of/output/file.txt
于 2011-10-11T21:08:01.263 回答
7
  1. 确保你有使用剪贴板支持编译的 Vim 版本
    • :echo has('clipboard')应该返回1
    • 如果它返回0(例如 Mac OS X、至少v10.11 (El Capitan)、v10.9 (Mavericks) 和v10.8 (Mountain Lion) - 带有缺少剪贴板支持的 Vim 版本),您必须安装支持剪贴板的 Vim 版本,比如 via brew install vim(安装后不要忘记重新启动终端)
  2. 输入视觉模式(V- 多行、v- 普通或Ctrlv- 块视觉)
  3. 选择要复制的行
  4. "*y- 复制选定的
  5. "*p- 粘贴复制

PS:

  • 如果您需要复制和粘贴一行,您可以将步骤 2-5 替换为JayG答案中的说明
  • 为了方便选择行,您可以添加- 它允许set mouse+=a.vimrc在 Vim 中使用鼠标选择行,而不选择无关元素(如行号等)注意:它将阻止复制鼠标选择的文本的能力从 Vim 到系统剪贴板
于 2017-11-03T08:17:29.503 回答
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 复制到剪贴板也很有用。

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

于 2015-12-03T19:39:29.390 回答
6

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

解决方案

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

    :'<,'>w new.txt

    然后按Enter

于 2015-10-26T12:45:36.570 回答
5

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

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

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

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

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

于 2011-01-06T22:42:57.427 回答
3

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

:'a,'bw /name/of/output/file.txt
于 2012-06-06T21:59:02.713 回答
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
于 2014-08-19T22:32:28.323 回答
1

The below option works most of time and also for pasting later.

 "xnyy
x - buffer name
n - number of line to Yank - optional

The lines yanked will be stored in the buffer 'x'. It can be used anywhere in the edit.

To paste line(s) in the other file,

:e filename&location

Example: Type the below command in the current edit

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

Complete operation

open file 1 :

vi Test1.sh

a10yy

-Yanked 10 lines

-now open the second file from the current edit

*:e /u/test/Test2.sh*

-move the cursor to the line where you have to paste

*"ap*

--Lines from the buffer '*a*' will be copied after the current cursor pos

于 2015-02-11T06:32:13.563 回答
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

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

于 2016-05-03T06:21:57.987 回答
0

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

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p
于 2016-05-04T12:35:13.350 回答
0

进入命令模式并运行

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

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

:r! sed -n '20, 30p' filename
于 2018-04-18T21:10:42.657 回答
0

设置viminfo在你的.vimrc

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

~/.viminfo当您退出 Vim 时,这将在文件中保留多达 1,000 行被拉取的内容(您的“寄存器”) 。当你启动 Vim 时它会恢复,所以你可以将它粘贴到不同的文件中。

有关它可以跨会话持续存在的所有其他内容,请参阅viminfo文档

于 2021-11-19T10:06:08.867 回答