在终端 vim 中,粘贴剪贴板数据经常会弄乱代码缩进。我只知道如果我使用:set paste
缩进就不会损坏。但是,粘贴数据后,我应该再做:set nopaste
一次吗?如果我不这样做,会出现什么问题?
答案1
正如其他人所写,您不想保留“粘贴”设置。我只是想指出,有了好的终端仿真器和正确编译和配置的vim
,您就不需要更改“粘贴”。您需要一个好的终端仿真器,如 xterm 或 GNOME Terminal、包含 X11 功能的 vim,并将“鼠标”选项设置为“a”。然后vim
会“知道”您何时使用鼠标粘贴,并有效地为您设置和取消设置“粘贴”选项。
获取vim
X11 特性的一种方法是使用gvim
选项运行-v
或创建别名,
alias vim='gvim -v'
然后放
set mouse=a
在你的 ~/.vimrc 中。
答案2
这篇文章有我最喜欢的答案,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()
答案3
正如 romainl 所建议的,文档解释说,设置该'paste'
选项会禁用其他几个选项,你肯定会发现,它很快就会给你带来麻烦。因此,有一个'pastetoggle'
选项。请参阅:
:help 'paste'
:help 'pastetoggle'
答案4
我记得当你粘贴到 vim 中时,它实际上认为你亲自输入了所有这些字符。因此,如果自动缩进已打开,它会为你缩进内容,但粘贴的文本通常已包含缩进,因此缩进确实会“混乱”。切换到粘贴模式会关闭自动缩进之类的功能。
如果您喜欢在输入时自动缩进,则应在粘贴完成后将其切换回 nopaste。尝试一下,并注意您必须在粘贴模式下手动完成所有缩进。