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

时间:2011-01-06 22:30:58

标签: vim copy-paste vi cut

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

另外,有没有办法剪贴?我试过谷歌搜索,但大多数资源只谈复制粘贴。

18 个答案:

答案 0 :(得分:190)

由于您已经知道如何剪切/抽取文本,以下是将其粘贴回另一个文件的一些想法:

  • 编辑第一个文件,取消所需的文字。然后从vi(:e /path/to/other/file)中打开第二个文件并粘贴它
  • 在拆分窗口中一起打开两个文件,然后使用 Ctrl + w 向上 / 向下导航它们或者:

    • vi -o /path/to/file1 /path/to/file2
    • 在第一个档案中, Ctrl + w s

答案 1 :(得分:46)

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

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

* y y - 复制一行(或3yy复制3行)

* p - 在光标后粘贴行

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

可以粘贴在单独的VIM窗口之间或VIM和PC应用程序之间(记事本,文字等)。

答案 2 :(得分:36)

使用d的变体dd来剪切。

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

:<n>,<m> w filename

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

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

答案 3 :(得分:25)

这是一种方法;

  • 启动vim并打开file1,这是您正在处理的文件。
  • e file2将调出file2,即要复制行的文件。
  • 找到要复制的行,如果是3行,则按 3 y y
  • b 1 这将切换到缓冲区1,其中file1为
  • 弄清楚你想要插入你拉线的位置,然后点击 p

您也可以同时查看这两个文件,例如将屏幕拆分为 CTRL + w s

至于切割, d 切割,并将切割的东西放入抽屉缓冲区。 d d 会“切断”一条线。

答案 4 :(得分:21)

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

" buffer_name,复制到缓冲区。 Y是猛烈的,P被放置。希望有所帮助!

答案 5 :(得分:14)

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

答案 6 :(得分:7)

编辑文件时,请在开始和结束位置使用

ma - 设置a标记

mb - 设置b标记

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

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

答案 7 :(得分: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将文本插入接收器文件中。您也可以使用&#34; * y,但我认为有时候很难记住。

这对于将文本从vim复制到剪贴板也很有用。

来源:http://vim.wikia.com/wiki/Copy_and_paste_between_sessions_using_a_temporary_file

答案 8 :(得分:4)

在同一个VIM实例中打开的两个缓冲区(==文件)之间复制文本没问题:只需在一个缓冲区中用 y 进行扫描(假设您在一个缓冲区中标记了一个复制区域)之前的视觉模式),然后用 p 粘贴到另一个缓冲区。只要它们位于VIM的同一个实例中,也适用于不同的选项卡。

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

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

如果您在两个不同的VIM实例中打开了两个文件,那么您必须使用系统剪贴板:在第一个VIM中,使用"+y将文本拖入系统剪贴板(再次标记该区域要在之前以视觉模式猛拉,然后转到第二个VIM并将剪贴板粘贴到那里:"+p

答案 9 :(得分:4)

201705更新:

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

  

设置clipboard = unnamed

然后VIM正在使用系统剪贴板


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

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

如果你想这样做,你最好使用OS剪切复制过去的方式,如ctrl + x,ctrl + c(在Windows下)。

答案 10 :(得分:4)

Haven在这里找到了简单的答案,所以我发布了自己的答案。

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

<强>解决方案

  1. 选择要保存的文字:
    • 将光标定位在您要开始选择的位置
    • v 选择字符或大写 V 以选择整行
    • 将光标移动到想要选择的内容
  2. 将所选文本保存到新文件。键入 w Space 以及新文件的名称。其实你会看到

    :'<,'>w new.txt

    然后按 Enter

答案 11 :(得分:3)

我的方案是我需要在文件1到文件2的中间,n个未知的行中复制n行。

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

答案 12 :(得分:1)

示例:fileS和file - 从第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

答案 13 :(得分:0)

以下选项适用于大部分时间,也可用于稍后粘贴。

 "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

之后复制

答案 14 :(得分:0)

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

: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

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

答案 15 :(得分:0)

另一种方法是在两个分割缓冲区中打开这两个文件并使用以下&#34; snippet&#34;在视觉选择感兴趣的线之后。

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

答案 16 :(得分:0)

  1. 确保您已使用剪贴板支持编译Vim版本
    • :echo has('clipboard')应该返回1
    • 如果它返回0(例如OSX,至少El Capitan,Mavericks和Mountain Lion - 附带Vim版本,缺少剪贴板支持),则必须安装带剪贴板支持的Vim版本,例如通过{{ 1}}(安装后不要忘记重新启动终端)
  2. 进入视觉模式( V - 多行, v - 普通或 Ctrl v - 阻止 - 视觉)
  3. 选择您要复制的行
  4. * y - 复制所选
  5. * p - 要复制粘贴
  6. P.S:

    • 如果您需要复制并粘贴一行,则可以使用the answer JayG中的说明替换步骤2-5
    • 可以轻松选择可以brew install vim添加set mouse+=a的行 - 它允许您使用鼠标选择vim中的行,而不选择无关元素(如行号等)注意:它将阻止从Vim
    • 将鼠标选择的文本复制到系统剪贴板的功能

答案 17 :(得分: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