标题非常具有描述性。以防万一,我举一个例子:
START BLOCK1
something
END BLOCK1
START BLOCK2
something
somenthing...
END BLOCK2
- 我选择
BLOCK1
视觉模式 - 我按一下 y
- 我如何将被拉的
BLOCK1
文件保存到其他文件?
标题非常具有描述性。以防万一,我举一个例子:
START BLOCK1
something
END BLOCK1
START BLOCK2
something
somenthing...
END BLOCK2
BLOCK1
视觉模式BLOCK1
文件保存到其他文件?Answers:
选择要保存的文本,以线条图或块图模式显示,然后
:w new.txt
那是您输入的内容,但实际上您看不到上面的内容。当您按时:
,您将转到命令行,该命令行将自动填充选择信息。它看起来像这样:
:'<,'>
只需输入其余的(w new.txt
)即可
:'<,'>w new.txt
...然后按Enter。
:w
仍会写出所选范围所触及的全行,但不会写出行内开始或结束的确切范围。例如,如果在块选择模式下选择窄列,或者在可视选择模式下选择一行的一部分:w
,则即使y
复制正确的部分,整行也将由写入。
可能有一种更简单的方法来执行此操作,但是我要做的是创建一个新的缓冲区(或选项卡),然后将其粘贴到中p
。您可以使用创建新的缓冲区,也可以使用创建:new
新的标签:tabnew
。您可以使用正常将缓冲区/标签写入文件:w filename
。
P
底部创建多余的一行。)
与@songz的解决方案类似,我更喜欢使用“:new”这样
vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>
基于@chenkaie的变体,对我来说效果很好:
let mapleader = ","
let g:mapleader = ","
vmap <leader>y y: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)时,
以及只想部分复制行(2)时仅复制@dronus注释中提到的整行的问题:
(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窗口托管到我的“客户')...