标题非常具有描述性。以防万一,我举个例子:
START BLOCK1
something
END BLOCK1
START BLOCK2
something
somenthing...
END BLOCK2
- 我选择
BLOCK1
可视模式 - 我按一下y
- 如何将被拉到的文件保存
BLOCK1
到其他文件?
在线条视觉或块视觉模式下选择要保存的文本,然后
:w new.txt
这就是您键入的内容,但您实际上不会确切地看到上面的内容。当您按下 时:
,您将转到命令行,该命令行将自动填写选择信息。它看起来像这样:
:'<,'>
只需继续输入其余的 ( w new.txt
) 即可获得
:'<,'>w new.txt
...然后按 Enter。
选择块后,您可以:'<,'>w other-file
,这将只将选定的块写入other-file
。在可视:
模式下点击应该'<,'>
已经为您放入命令行,因此您实际上只需键入:w other-file
.
可能有一种更简单的方法可以做到这一点,但我要做的是创建一个新缓冲区(或选项卡),然后将其粘贴到p
. 您可以使用 . 创建新缓冲区:new
或使用:tabnew
. 您可以使用: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>
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>
基于@chenkaie 的变体,对我来说效果很好:
let mapleader = ","
let g:mapleader = ","
vmap <leader>y y:new ~/.vbuf<CR>VGp:x<CR>
nmap <leader>p :r ~/.vbuf<CR>
除了上面选择的答案,
使用鼠标选择 (1) 时,
当只想部分复制行(2)时,只复制@dronus的评论提到的整行的问题:
(1) 在我的基于 Debian 的 DietPi (Raspberry PI) 系统中,当在我的 Ubuntu 16.04 工作站上使用鼠标进入并选择“视觉模式”时,vim 的行为与上述首选解决方案略有不同。然后
但如果我输入 ':' 作为命令,它不会与
'<,'>
我可以简单地添加我的
w new.txt
在它之后。所以我只是自己输入了它,它确实有效:
'<,'>w new.txt
并将整行复制内容复制到我的文件“new.txt”中,而“<,”似乎意味着“复制选定的行并“>”将其重定向到写入命令的引用文件。
(2)对于不粘贴部分行的问题,就像在@dronus评论中提到的那样,这个解决方案(选择的一个,第一个替代方案)对我有用:
编辑第一个文件,拉出你想要的文本。然后在 vi (:e /path/to/other/file) 中打开第二个文件并粘贴它(通过键入 p)。保存它(如上面的':w new.txt'。
然后它将只复制用鼠标或“y”标记的部分行。
[编辑] 在我的 Ubuntu 系统上:有时通过鼠标选择不会在 vim 中进入“视觉模式”。然后可以使用上下文菜单选择正常的复制/粘贴...我还没有找到 Ubuntu 将其行为从“客户端代理行为”更改为“主机”行为的原因(Ubuntu 将 ssh bash 窗口托管到我的“客户')...