Copy and paste content from one file to another file in vi
我正在处理两个文件,我需要从一个文件复制几行并粘贴到另一个文件中。 我知道如何在同一文件中复制(yy)和粘贴(p)。 但这不适用于其他文件,这是如何完成的?
另外,有没有办法剪切粘贴? 我曾尝试使用Google谷歌搜索,但大多数资源仅谈论复制粘贴。
由于您已经知道如何剪切/拖动文本,因此有一些将其粘贴回另一个文件的想法:
-
编辑第一个文件,按所需文本。然后从vi(
:e /path/to/other/file )中打开第二个文件并将其粘贴 -
在拆分窗口中一起打开两个文件,然后使用Ctrl + w,Up / Down在两个文件之间导航:
-
vi -o /path/to/file1 /path/to/file2 - 在第一个文件中,Ctrl + w,s
-
如果您在Windows中使用VIM,则可以使用以下方式访问剪贴板(MS复制/粘贴):
" * dd-剪掉一行(或3dd剪掉3行)
" * yy-复制一行(或3yy复制3行)
" * p-在光标后的行上粘贴行
" * P-在光标之前的行上粘贴行
使您可以在单独的VIM窗口之间或在VIM和PC应用程序(记事本,单词等)之间粘贴。
使用像
要将一系列行写入另一个文件,可以使用:
1 | :<n>,<m> w filename |
其中
要使用桌面剪贴板,请查看
您可以打开另一个文件,然后键入
这是一种实现方法;
- 启动vim并打开您正在处理的文件file1。
- :e file2将调出要复制行的文件file2。
- 找到要复制的行,如果是3行,则单击3yy
- :b1这将切换到缓冲区1,其中file1是
- 找出要插入被拖拽的行的位置,然后单击p
您也可以同时查看两个文件,例如使用CTRL + w s
至于裁切,d裁切,并将裁切后的东西放置在猛拉缓冲区中。 dd将"剪切"一行。
这些都是很好的建议,但是如果您知道另一个文件中文本的位置,请轻松使用sed。
编辑文件时,在要使用开始和结束的位置做标记
然后,要将其复制到另一个文件中,只需使用
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和新文件的名称。其实你会看到
然后按Enter
在同一VIM实例中打开的两个缓冲区(==文件)之间复制文本是没有问题的:只需使用y在一个缓冲区中拉动(假设您之前在可视模式下标记了要复制的区域),然后粘贴到另一个缓冲区中带有p的缓冲区。只要它们位于同一VIM实例中,它们也可以与不同的选项卡一起使用。
如何在同一VIM实例中打开两个文件取决于您的系统:
- 在Win32上,上下文菜单中有一个选项,如果您选择两个或多个文件,则用一个vim编辑
-
在控制台上时,可以使用
vim file1 file2 实现 -
如果将VIM用作其他工具的编辑器,请确保指定
--remote-silent 选项,以确保在同一实例中打开所有文件。
如果您在两个不同的VIM实例中打开了这两个文件,则必须使用系统剪贴板:在第一个VIM中,使用
我的情况是我需要从文件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 |
-
:echo has('clipboard') 应该返回1 -
如果它返回
0 (例如OSX,至少是El Capitan,Mavericks和Mountain Lion-带有Vim版本,缺少剪贴板支持),则必须安装具有剪贴板支持的Vim版本,例如通过brew install vim 来安装(不要忘记在安装后重新启动您的终端)
附言:
- 如果您需要复制并粘贴一行,则可以用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 |
例如将
1 | :r! sed -n '20, 30p' filename |
下面的选项大部分时间都可以使用,也可以在以后粘贴。
1 2 3 | "xnyy x - buffer name n - number of line to Yank - optional |
拖拽的行将存储在缓冲区
它可以在编辑中的任何地方使用。
要将行粘贴到另一个文件中,
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* |
-缓冲区
如果要复制文件的一部分并将该内容粘贴到另一个文件的中间,可以采用这种方式。
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 |