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

Vim 将内容从vi中的一个文件复制并粘贴到另一个文件,vim,copy-paste,vi,cut,Vim,Copy Paste,Vi,Cut,我正在处理两个文件,我需要从一个文件中复制几行并粘贴到另一个文件中。我知道如何在同一个文件中复制(yy)和粘贴(p)。但这不适用于不同的文件。这是怎么做到的 还有,有没有剪贴的方法?我曾尝试过谷歌搜索,但大多数参考资料只讨论复制粘贴。既然您已经知道如何剪切/拖动文本,下面是一些将其粘贴回另一个文件的想法: 编辑第一个文件,拖动所需的文本。然后从vi中打开第二个文件(:e/path/to/other/file)并粘贴它 在拆分窗口中同时打开这两个文件,并使用Ctrl+w、上/下键在它们之间导航:

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


还有,有没有剪贴的方法?我曾尝试过谷歌搜索,但大多数参考资料只讨论复制粘贴。

既然您已经知道如何剪切/拖动文本,下面是一些将其粘贴回另一个文件的想法:

  • 编辑第一个文件,拖动所需的文本。然后从vi中打开第二个文件(
    :e/path/to/other/file
    )并粘贴它
  • 在拆分窗口中同时打开这两个文件,并使用Ctrl+w、上/下键在它们之间导航:

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

    • 使用
      d
      的变体,如
      dd
      进行切割

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

      :<n>,<m> w filename
      
      :,w文件名
      
      其中
      是表示一系列行的数字(或符号)


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

      您可以打开另一个文件并键入
      :r file\u to\u be\u copy\u from
      。或者你可以缓冲。或者转到第一个文件,转到要复制的行,键入
      “qY
      ,转到要粘贴的文件并键入
      “qP


      buffer\u name,复制到缓冲区。
      Y
      被猛拉,而
      p
      被放入。希望这有帮助!

      这里有一种方法

      • 启动Vim并打开您正在处理的文件file1
      • :e file2,它将显示file2,即您要从中复制行的文件
      • 找到要复制的行。如果是三行,则点击3yy
      • :b1这将切换到缓冲区1,其中文件1为
      • 找出你想要插入的线的位置,然后点击p
      您也可以同时查看这两个文件。使用Ctrl+w s等组合键拆分屏幕


      对于剪切,d将剪切的内容剪切并放置在yank缓冲区中。dd将“剪切”一行。

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

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

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

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

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

      如果您在Windows上使用Vim,您可以通过以下方式访问剪贴板(MS copy/paste):

      “*dd——切一条线(或3dd切三条线)

      “*yy——复制一行(或3yy复制三行)

      “*p——在光标后的行上粘贴行

      “*p——在光标前的行上粘贴行

      允许您在单独的Vim窗口之间或Vim与PC应用程序之间进行粘贴(,等等)。

      2017-05更新:

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

      设置剪贴板=未命名

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


      我刚刚发现yank方法无法在不同Vim实例窗口之间复制内容。(至少,基于我对Vim的了解,它不起作用。我不知道是否有其他方法可以让它起作用)

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


      如果要这样做,最好使用操作系统剪切复制过去的方式,如Ctrl+x、Ctrl+c(在Windows下)。

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

      ma
      -设置
      a
      标记

      mb
      -设置
      b
      标记

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

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

      这些都是很好的建议,但若您知道文本在另一个文件中的位置,那个么可以轻松地使用sed<代码>:r!sed-n'1,10 p'这将在光标当前位置的已打开文件中插入10行。

      我的场景是我需要将中间的n行数n未知从文件1复制到文件2

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

      示例: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
      

      下面的选项在大多数情况下都有效,以后也可以粘贴

       "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*
      

      --缓冲区中的行将被复制到当前光标位置后。目标:将一个文件的一部分保存到另一个文件

      解决方案

    • 选择要保存的文本:
      • 将光标放置在要开始选择的位置
      • 按v键选择字符
        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
        
        :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
        
        :vnoremap <F4> :y<CR><C-W>Wr<Esc>p
        
        :r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from
        
        :r! sed -n '20, 30p' filename