[英]How can I save a text block in visual mode to a file in Vim?
标题非常具有描述性。 以防万一,我举一个例子:
START BLOCK1
something
END BLOCK1
START BLOCK2
something
somenthing...
END BLOCK2
BLOCK1
BLOCK1
保存到其他文件? 选择要保存的文本,以线条图或块图模式显示,然后
:w new.txt
这就是您输入的内容,但实际上看不到上面的内容。 当您按:
,您将转到命令行,该命令行将自动填充选择信息。 它看起来像这样:
:'<,'>
只需继续输入其余内容( w new.txt
)即可
:'<,'>w new.txt
...然后按Enter。
选中块后,您可以:'<,'>w other-file
,这只会将所选的块写入other-file
。 击中:
在可视模式下,应该已经为命令行输入了'<,'>
,因此您实际上只需要键入:w other-file
。
可能有一种更简单的方法,但是我要做的是创建一个新的缓冲区(或制表符),然后将其粘贴到p
。 您可以使用:new
创建新的缓冲区,也可以使用:tabnew
创建新的:tabnew
。 您可以使用:w filename
将缓冲区/制表符正常写入:w filename
。
就像注释中提到的@dronus一样, :w !pbcopy
建议不能正确复制,因为它复制了整行。 如果我只想复制一行中的URL,将无法复制。 这是可以添加到.vimrc
文件中的行,以便每次您按CTRL-C时,vim中选定的行将被复制到剪贴板:
map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>
如果您想阅读有关此操作的详细信息,可以在我的博客上阅读此内容。
它与@rmeador建议的实现相同。
与@songz的解决方案类似,我更喜欢使用“:new”这样
vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>
基于@chenkaie的变体,对我来说效果很好:
let mapleader = "," let g:mapleader = "," vmap <leader>yy:new ~/.vbuf<CR>VGp:x<CR> nmap <leader>p :r ~/.vbuf<CR>
function! Get_visual_selection()
#Get the position of left start visual selection
let [line_start, column_start] = getpos("'<")[1:2]
#Get the position of right end visual selection
let [line_end, column_end] = getpos("'>")[1:2]
#gotta catch them all.
let lines = getline(line_start, line_end)
if len(lines) == 0
return ''
endif
#edge cases and cleanup.
let lines[-1] = lines[-1][: column_end - 2]
let lines[0] = lines[0][column_start - 1:]
return join(lines, "\n")
endfunction
function Save_visually_selected_text_to_file()
let selected_text = Get_visual_selection()
call writefile(split(selected_text, "\n"), "/tmp/something.txt")
endfunction
#the c-u does a union of all lines in visual selection.
#this goes in the vimrc
vnoremap <F10> :<c-u>call Save_visually_selected_text_to_file()<cr>
除了上面选择的答案之外,
当使用鼠标选择(1)时,
以及只想部分复制行时仅复制@dronus注释中提到的整行的问题(2):
(1)在基于Debian的DietPi(Raspberry PI)系统上,当在我的Ubuntu 16.04工作站上使用鼠标进入并选择“ VISUAL MODE”时,vim的行为与上述首选解决方案有些不同。 然后
但是如果我输入':'作为命令,它将不会显示
'<,'>
在这里我可以简单地添加我的
w new.txt
之后。 因此,我自己输入了它,它确实起作用了:
'<,'>w new.txt
并将整行提取的内容复制到我的文件“ new.txt”中,而“ <”似乎意味着“复制选定的行,然后将“>”重定向到写入命令的引用文件。
(2)对于不粘贴部分行的问题(如提到的@dronus 注释中的问题), 此解决方案(选择的一个,第一个替代方案)对我有效:
编辑第一个文件,按所需文本。 然后从vi(:e / path / to / other / file)中打开第二个文件并粘贴(通过键入p)。 保存它(如“:w new.txt”上方。
然后,它将只复制用鼠标或“ y”标记的行的一部分。
[编辑]在我的Ubuntu系统上:有时用鼠标选择不会在vim中输入'VISUAL MODE'。 然后可以使用上下文菜单选择正常的复制/粘贴...我还没有找到Ubuntu将其行为从“客户端行为”更改为“主机”的原因(withUbuntu将ssh bash窗口托管到我的“客户')...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.