我正在使用两个文件,我需要从一个文件中复制几行并粘贴到另一个文件中。我知道如何在同一个文件中复制(yy)和粘贴(p)。但这不适用于不同的文件,这是怎么做的?
另外,有没有办法剪贴?我试过谷歌搜索,但大多数资源只谈复制粘贴。
答案 0 :(得分:190)
由于您已经知道如何剪切/抽取文本,以下是将其粘贴回另一个文件的一些想法:
:e /path/to/other/file
)中打开第二个文件并粘贴它在拆分窗口中一起打开两个文件,然后使用 Ctrl + w ,向上 / 向下导航它们或者:
vi -o /path/to/file1 /path/to/file2
答案 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)
这是一种方法;
您也可以同时查看这两个文件,例如将屏幕拆分为 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实例中打开两个文件取决于您的系统:
vim file1 file2
--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在这里找到了简单的答案,所以我发布了自己的答案。
目标:将一个文件保存到另一个文件中。
<强>解决方案强>:
将所选文本保存到新文件。键入: 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)
:echo has('clipboard')
应该返回1
0
(例如OSX,至少El Capitan,Mavericks和Mountain Lion - 附带Vim版本,缺少剪贴板支持),则必须安装带剪贴板支持的Vim版本,例如通过{{ 1}}(安装后不要忘记重新启动终端)P.S:
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