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

Ben*_*min 21 clipboard terminal vim vi vimrc

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

dra*_*788 8

这篇文章有我最喜欢的答案,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
Run Code Online (Sandbox Code Playgroud)

如果你在 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()
Run Code Online (Sandbox Code Playgroud)


gar*_*ohn 5

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

获得vimX11 功能的一种方法是gvim使用-v选项运行或创建别名,

alias vim='gvim -v'
Run Code Online (Sandbox Code Playgroud)

然后放

set mouse=a
Run Code Online (Sandbox Code Playgroud)

在你的 ~/.vimrc 中。