在终端vim中,粘贴剪贴板数据经常会弄乱代码缩进。我只知道如果我使用:set paste
缩进没有被打破。虽然在粘贴数据后,我应该再做:set nopaste
一次吗?如果我不这样做,会出现什么问题?
在终端vim中,粘贴剪贴板数据经常会弄乱代码缩进。我只知道如果我使用:set paste
缩进没有被打破。虽然在粘贴数据后,我应该再做:set nopaste
一次吗?如果我不这样做,会出现什么问题?
Answers:
正如其他人所写,你不想留下'粘贴'设置。我只想指出,通过良好的终端仿真器和正确编译和配置vim
,您不需要更改“粘贴”。你需要一个好的终端模拟器,如xterm或GNOME终端,包含X11功能的vim,以及设置为'a'的'mouse'选项。然后,vim
当您使用鼠标粘贴时,它将“知道”并将为您有效地设置和取消设置“粘贴”选项。
获得vim
X11功能的一种方法是gvim
使用该-v
选项运行或创建别名,
alias vim='gvim -v'
然后把
set mouse=a
在你的〜/ .vimrc中。
Copy
除非选择了某些文本,否则将显示为灰色或根本不可见。你是如何选择要复制的文本的?
这篇文章有我最喜欢的答案,https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode
基本上,如果你从插入模式开始并使用Ctrl + Shift + V或用鼠标右键单击粘贴,Vim会检测到它来自终端并自动设置粘贴模式,然后在完成后取消设置,这样就不会丢失重新映射的密钥(由于它写入原始数据,因此无法在粘贴模式下工作)并且在完成后您将恢复到“理智”状态。
对于vim(放入.vimrc)
let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
如果你在Tmux下使用vim(仍然在.vimrc中)
function! WrapForTmux(s)
if !exists('$TMUX')
return a:s
endif
let tmux_start = "\<Esc>Ptmux;"
let tmux_end = "\<Esc>\\"
return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction
let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
let &t_SI .= "\<Esc>[?xxxxx"
一行正在检测键盘粘贴快捷方式?鉴于不同的快捷方式,这是否适用于mac?
IIRC当你粘贴到vim时,它基本上认为你自己输入了所有这些字符。因此,如果打开自动缩进,它将为您缩进内容,但粘贴的文本通常包含缩进,因此缩进确实“搞砸了”。切换到粘贴模式会关闭自动缩进等内容。
如果你喜欢自动缩进类型,你应该在完成粘贴后将其切换回nopaste。试一试,注意如何在粘贴模式下手动完成所有缩进。