总是使用:设置粘贴,这是一个好主意吗?


18

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


为自己尝试怎么样?或者阅读文档
罗曼

1
另请参阅“将代码粘贴到终端窗口到vim”的回答中的“括号粘贴模式” stackoverflow.com/a/7053522/754997。如果您的终端仿真器支持它,您可以安排它告诉Vim每当您将文本粘贴到终端时自动切换到粘贴模式。
Chris Page

1
@romainl我觉得这两者都很合理1)尝试并等待总是使用set paste(+ - nopaste)和2)rtfm-ing(作为像OP这样的低级或中级用户)的负面后果,比询问那些有选项经验的人没那么有用。在这里询问似乎是一种更聪明的方法,并记录这将有助于其他人。
belacqua 2016年

Answers:


5

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

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

alias vim='gvim -v'

然后把

set mouse=a

在你的〜/ .vimrc中。


当我设置mouse = a时,我无法复制文本。“复制”在右键单击菜单和应用程序菜单中显示为灰色。
Lee Daniel Crocker 2015年

@LeeDanielCrocker:Copy除非选择了某些文本,否则将显示为灰色或根本不可见。你是如何选择要复制的文本的?
garyjohn 2015年

只是用鼠标。仅供参考,“y”工作正常...将文本拉出并将其复制到系统键盘。这只是菜单不起作用。如果鼠标设置为“r”,则菜单有效,但鼠标包含行号。所以总而言之,我可以忍受鼠标= a,我只需要记住猛拉而不是复制。
Lee Daniel Crocker 2015年

7

这篇文章有我最喜欢的答案,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?
doub1ejack 2016年

@ doub1ejack这些实际上是检测Xterm转义序列,而不是它们的调用方式(即2004h是一个粘贴开始),所以只要你的终端支持Xterm键码并将它们传递给Vim它就可以在Mac上正常工作。
dragon788 2016年

我的天啊。你是我的英雄。我输入的是:设置nopaste这么多g次。
麦克斯韦

3

正如romainl建议的那样,文档解释说设置该'paste'选项会禁用其他几个选项,您肯定会发现它会更快而不是更晚,这会给您带来麻烦。因此,有'pastetoggle'选择权。看到:

:help 'paste'
:help 'pastetoggle'

1

如果存在某种东西,它必须具有其含义。你应该好好看看非常有用的vim文档。

  :help 'paste'
  :help 'pastetoggle'

阅读后,您可能需要这样:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

我希望你发现这篇文章很有用:)


1

IIRC当你粘贴到vim时,它基本上认为你自己输入了所有这些字符。因此,如果打开自动缩进,它将为您缩进内容,但粘贴的文本通常包含缩进,因此缩进确实“搞砸了”。切换到粘贴模式会关闭自动缩进等内容。

如果你喜欢自动缩进类型,你应该在完成粘贴后将其切换回nopaste。试一试,注意如何在粘贴模式下手动完成所有缩进。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.