总是使用:set paste,这是一个好主意吗?

总是使用:set paste,这是一个好主意吗?

在终端 vim 中,粘贴剪贴板数据经常会弄乱代码缩进。我只知道如果我使用:set paste缩进就不会损坏。但是,粘贴数据后,我应该再做:set nopaste一次吗?如果我不这样做,会出现什么问题?

答案1

正如其他人所写,您不想保留“粘贴”设置。我只是想指出,有了好的终端仿真器和正确编译和配置的vim,您就不需要更改“粘贴”。您需要一个好的终端仿真器,如 xterm 或 GNOME Terminal、包含 X11 功能的 vim,并将“鼠标”选项设置为“a”。然后vim会“知道”您何时使用鼠标粘贴,并有效地为您设置和取消设置“粘贴”选项。

获取vimX11 特性的一种方法是使用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。尝试一下,并注意您必须在粘贴模式下手动完成所有缩进。

相关内容