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

Copy and paste content from one file to another file in vi

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

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


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

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

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


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

" * dd-剪掉一行(或3dd剪掉3行)

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

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

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

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


使用像dd这样的d变体进行剪切。

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

1
:<n>,<m> w filename

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

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


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

" buffer_name,复制到缓冲区。 Y是猛拉,而P是放置。希望有帮助!


这是一种实现方法;

  • 启动vim并打开您正在处理的文件file1。
  • e file2将调出要复制行的文件file2。
  • 找到要复制的行,如果是3行,则单击3yy
  • b1这将切换到缓冲区1,其中file1是
  • 找出要插入被拖拽的行的位置,然后单击p

您也可以同时查看两个文件,例如使用CTRL + w s

至于裁切,d裁切,并将裁切后的东西放置在猛拉缓冲区中。 dd将"剪切"一行。


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


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

ma-设置a标记

mb-设置b标记

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

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

201705更新:

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

set clipboard=unnamed

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

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

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

如果您想这样做,则最好使用OS cut-copy-past方式,例如ctrl + x,ctrl + c(在Windows下)。


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

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

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


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

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

解:

  • 选择要保存的文本:

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

    :'<,'>w new.txt

    然后按Enter


  • 在同一VIM实例中打开的两个缓冲区(==文件)之间复制文本是没有问题的:只需使用y在一个缓冲区中拉动(假设您之前在可视模式下标记了要复制的区域),然后粘贴到另一个缓冲区中带有p的缓冲区。只要它们位于同一VIM实例中,它们也可以与不同的选项卡一起使用。

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

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

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


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

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

    示例:fileA和fileB-从fileA在第25行开始,复制50行,然后粘贴到fileB

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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

  • 确保您已编译了带有剪贴板支持的Vim版本

    • :echo has('clipboard')应该返回1
    • 如果它返回0(例如OSX,至少是El Capitan,Mavericks和Mountain Lion-带有Vim版本,缺少剪贴板支持),则必须安装具有剪贴板支持的Vim版本,例如通过brew install vim来安装(不要忘记在安装后重新启动您的终端)
  • 进入可视模式(V-多行,v-纯或Ctrlv-可视块)
  • 选择您要复制的行
  • " * y-复制所选内容
  • " * p-复制粘贴
  • 附言:

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

    进入命令模式并运行

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

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

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

    下面的选项大部分时间都可以使用,也可以在以后粘贴。

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

    拖拽的行将存储在缓冲区'x'中。
    它可以在编辑中的任何地方使用。

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

    1
    :e filename&location

    例:
    在当前编辑中键入以下命令

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

    完成操作

    打开文件1:

    1
    2
    3
    4
    5
    vi Test1.sh

    a10yy

    -Yanked 10 lines

    -现在从当前编辑中打开第二个文件

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

    -将光标移动到必须粘贴的行

    1
    *"ap*

    -缓冲区'*a*'中的行将在当前光标pos之后复制


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

    1
    :linenumber,linenumber write newfile

    例:

    1
    :2,34 write temp1

    要么

    1
    :'mark, 'mark write newfile

    例:

    1
    :'a,'b write temp1

    现在,将这些行复制到另一个文件。
    如果要在复制后删除这些行,可以执行

    1
    :linenumber1,linenumber2 d

    要么

    1
    :'mark1,'mark2 d

    现在,转到其他文件。
    然后将光标停留在要粘贴的行上。

    类型

    1
    :r!cat temp1

    现在,将临时文件的内容粘贴到此处。
    粘贴内容后,可以从命令行本身删除临时文件。

    1
    :!rm temp1

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


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

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