在vi中将内容从一个文件复制并粘贴到另一个文件
我正在处理两个文件,我需要从一个文件复制几行并粘贴到另一个文件。 我知道如何复制(yy)并粘贴(p)在同一个文件中。 但是,这不适用于不同的文件,这是怎么做的?
另外,有没有办法剪贴? 我试过Googlesearch,但大部分资源只是谈论复制粘贴。
既然你已经知道如何剪切/抽出文本,下面是将其粘贴回另一个文件的一些想法:
- 编辑第一个文件,拉开你想要的文字。 然后从vi(
:e /path/to/other/file
)中打开第二个文件并粘贴 -
在分割窗口中将两个文件一起打开,然后使用Ctrl + w , 向上 / 向下导航它们之间的方法:
-
vi -o /path/to/file1 /path/to/file2
- 从第一个文件中, Ctrl + w , s
-
如果您在Windows中使用VIM,则可以使用以下命令访问剪贴板(MS复制/粘贴):
“ * d d – 剪切一条线(或者3dd剪切3条线)
“ * y y – 复制一行(或3yy复制3行)
“ * p – 粘贴光标后面的行
“ * P – 粘贴在光标前面的行
可以在不同的VIM窗口之间或在VIM和PC应用程序(记事本,单词等)之间进行粘贴。
使用像dd
这样的变化来切割。
要将一系列行写入另一个文件,您可以使用:
:<n>,<m> w filename
其中<n>
和<m>
是指定一系列行的数字(或符号)。
要使用桌面剪贴板,请查看+g
命令。
您可以打开另一个文件并键入:r file_to_be_copied_from
。 或者你可以缓冲。 或者转到第一个文件,select要复制的行,input"qY
,转到要粘贴的文件并input"qP
。
"
buffer_name,拷贝到缓冲区, Y
被抽出, P
被放入,希望有帮助!
这是一个办法。
- 启动VIM并打开您正在处理的文件file1。
- : E文件2,这将调出文件2,您要复制行的文件。
- find你想要复制的行,如果是3行,那么你打3行
- : b 1这将切换到缓冲区1,其中file1是
- 找出你要插入你所抽出的线条,然后点击p
你可以同时看到两个文件,例如按CTRL + W s分割屏幕
至于切割,切割,并将切割的东西放在扬克缓冲区。 d d将“切断”一条线。
这些都是很好的build议,但如果你知道在另一个文件中的文本的位置使用sed很容易。 :r! sed -n '1,10 p' < input_file.txt
:r! sed -n '1,10 p' < input_file.txt
这将在光标当前位置的已经打开的文件中插入10行。
在编辑文件的同时,在要开始和结束的地方使用标记
ma
– 设置a
标志
mb
– 设置b
标志
然后,将其复制到另一个文件中,只需使用w
命令:
:'a,'bw /name/of/output/file.txt
在VIM的同一个实例中打开的两个缓冲区(==文件)之间复制文本是没有问题的:只需在y中插入一个缓冲区(假设之前在可视模式中标记了一个复制区域),然后粘贴到另一个缓冲区与p 。 也可以使用不同的选项卡,只要它们在VIM的同一个实例中即可。
如何在VIM的同一实例中打开两个文件取决于您的系统:
- 在Win32上,如果select两个或多个文件,则在上下文菜单中有一个选项, 用一个vim编辑
- 当你在控制台上,你可以用
vim file1 file2
来实现它 - 如果您使用VIM作为另一个工具的编辑器,请务必指定
--remote-silent
选项以确保所有文件都在相同的实例中打开
如果您在两个不同的VIM实例中打开这两个文件,那么您必须使用系统剪贴板:在第一个VIM中,使用"+y
将文本拖放到系统剪贴板中(同样,将区域标记为可视化模式),然后进入第二个VIM并粘贴剪贴板: "+p
。
我的场景是我需要复制中间n行,从未知文件1到文件2。
:'a,'bw /name/of/output/file.txt
这些重映像对我来说就像一个魅力:
vmap <Cc> "*y " Yank current selection into system clipboard nmap <Cc> "*Y " Yank current line into system clipboard (if nothing is selected) nmap <Cv> "*p " Paste from system clipboard
因此,当我处于可视模式时,我select我想要的行,然后按Ctrl + c,然后按Ctrl + v将文本插入到接收器文件中。 你也可以使用“* y”,但是我觉得有时候这很难记住。
这对从vim复制文本到剪贴板也很有用。
来源: http : //vim.wikia.com/wiki/Copy_and_paste_between_sessions_using_a_temporary_file
在这里没有find简单的答案,所以我张贴我自己的。
目标 :将一个文件保存到另一个文件。
解答 :
- select您要保存的文本:
- 将光标定位在要开始select的位置
- 按vselect字符或大写字母Vselect整行
- 将光标移到要select的内容的末尾
-
将选定的文本保存到新文件。 键入: w 空格和新文件的名称。 其实你会看到的
:'<,'>w new.txt
然后按Enter键
201705更新:
我刚刚发现,如果你添加以下行到你的vimrc文件中,
设置剪贴板=未命名
那么VIM正在使用系统剪贴板
我刚刚发现,在不同的VIM实例窗口之间复制内容的方式不能工作。 (至less,不能基于我的VIM知识工作,我不知道是否有另一种方法来使其工作)。
只有在根据我的testing在同一个窗口中打开多个文件的方式下才能使用这种方式。
如果你想这样做,你最好使用操作系统剪切复制过去的方式,如CTRL + X,CTRL + C(在Windows下)。
例如:fileA和fileB – 从第25行的fileA开始,复制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
示例:在当前编辑中input以下命令
: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*'
会在当前光标位置后被复制
另一种方法是在两个拆分缓冲区中打开这两个文件,并在可视化select感兴趣的行之后使用以下“代码段”。
:vnoremap <F4> :y<CR><CW>Wr<Esc>p
- 确保你有剪贴板支持编译的Vim版本
-
:echo has('clipboard')
应该返回1
- 如果它返回
0
(例如OSX,至lessEl Capitan,Mavericks和Mountain Lion–带有Vim版本,缺less对剪贴板的支持),则必须安装带有剪贴板支持的Vim版本,例如通过brew install vim
(请不要忘记安装后重新启动您的terminal)
-
- 进入一个视觉模式( V – 多行, V – 平原,或Ctrl V – 块视觉)
- select您想要复制的行
- “ * y – 复制选中
- “ * p – 粘贴复制
PS:
- 如果您需要复制并粘贴一行 ,您可以用JayG 的答案replace第2-5步
- 为了简化select,你可以在你的
.vimrc
添加set mouse+=a
,它允许你使用鼠标在vim中select行,而不是select无关的元素(如行号等)。 注意:从Vim中select文本到系统剪贴板
如果要复制文件的一部分并将该内容粘贴到另一个文件的中间,可以这样做。
:linenumber,linenumber write newfile
例:
:2,34 write temp1
要么
:'mark, 'mark write newfile
例:
:'a,'b write temp1
现在行被复制到另一个文件。 如果你想在复制后删除这些行,你可以这样做
:linenumber1,linenumber2 d
要么
:'mark1,'mark2 d
现在,转到其他文件。 然后将光标保持在要粘贴的行上。
types
:r!cat temp1
现在,临时文件的内容被粘贴在这里。 粘贴内容后,可以从命令行中删除临时文件。
:!rm temp1
这将有助于如果你想复制和粘贴多次。