我正在努力学习Vim。

当我从剪贴板将代码粘贴到文档中时,每一行的开头都会有额外的空格:

line
  line
    line

我知道你可以关闭自动缩进,但我无法让它工作,因为我有一些其他设置冲突或其他问题(在我的.vimrc中看起来很明显,但当我删除它们时似乎无关紧要)。

如何在粘贴代码时关闭自动缩进,但在编写代码时仍然有vim自动缩进?这是我的.vimrc文件:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  

当前回答

更新:更好的答案在这里:https://stackoverflow.com/a/38258720/62202

要在粘贴代码时关闭自动缩进,有一种特殊的“粘贴”模式。

类型

:set paste

然后粘贴代码。注意,工具提示中的文本现在显示--INSERT(粘贴)--。

粘贴代码后,请关闭粘贴模式,以便键入时自动缩进再次正常工作。

:set nopaste

然而,我总是觉得这很麻烦。这就是为什么我映射<F3>,这样它可以在编辑文本时在粘贴和非粘贴模式之间切换!我将此添加到.vimrc

set pastetoggle=<F3>

其他回答

更新:更好的答案在这里:https://stackoverflow.com/a/38258720/62202

要在粘贴代码时关闭自动缩进,有一种特殊的“粘贴”模式。

类型

:set paste

然后粘贴代码。注意,工具提示中的文本现在显示--INSERT(粘贴)--。

粘贴代码后,请关闭粘贴模式,以便键入时自动缩进再次正常工作。

:set nopaste

然而,我总是觉得这很麻烦。这就是为什么我映射<F3>,这样它可以在编辑文本时在粘贴和非粘贴模式之间切换!我将此添加到.vimrc

set pastetoggle=<F3>

以下vim插件通过其“括号粘贴”模式自动处理:https://github.com/wincent/terminus

设置“括号粘贴”模式,这意味着您可以忘记手动设置“粘贴”选项,只需在任何模式下继续粘贴即可。

当在终端内部工作时,vim括号内的粘贴vim插件将自动处理粘贴,而无需在粘贴之前或之后进行任何击键。

它通过检测括号内的粘贴模式来工作,这是由“现代”x术语兼容终端(如iTerm2、gnome终端和其他使用libvte的终端)发送的转义序列。作为额外的奖励,它也适用于tmux会话。我在连接到linux服务器并使用tmux的Mac上成功地使用了iTerm2。

我所知道的快速进入一次粘贴插入模式的最快方法是tpope的未损坏,它具有yo和yo,大概是“你打开”的助记符。他们只记录在他的vimdoc中,如:

尚未为“粘贴”提供切换,因为单独插入的包装非常浪费:您切换了两次,但是你只粘贴一次(YOPO)。相反,按yo或yo调用o或o“粘贴”已设置。离开插入模式会自动设置“nopaste”。

为了避免粘贴时出现不希望的效果,需要设置一个选项:

set paste

vimrc中的一个有用命令是设置pastetoggle=<F10>或其他按钮,以便在粘贴和非粘贴之间轻松切换。