我正在努力学习Vim。

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

line
  line
    line

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

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

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

当前回答

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

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

其他回答

自vim 8(2016年发布)以来,原生粘贴/括号粘贴是最好的、最简单的方法。它甚至可以在ssh上运行!(括号粘贴适用于Linux和Mac,但不适用于Windows Git Bash)

确保您有vim 8+(您不需要+剪贴板或+xterm_clipboard选项)。vim--版本|头-1只需在正常模式下使用OS本机粘贴命令(例如ctrl+shift+V或cmd+V)。对于插入模式,不要按i。


Test

复制(ctrl+shift+C或cmd+C)此输出(2行,带有制表符缩进)到系统剪贴板:echo-e'\ta\n\tb'使用autoindent启动一个干净的vim 8+:vim-u NONE--noplugin-c'设置自动缩进'在正常模式下从系统剪贴板粘贴(ctrl+shift+V或cmd+V)。对于插入模式,不要按i。a和b应与单个制表符缩进对齐。您甚至可以在ssh连接到远程机器时执行此操作(远程机器需要vim8+)。现在尝试旧方法,它将使用额外的选项卡自动缩进第二行:按i进入插入模式。然后使用ctrl+shift+V或cmd+V进行粘贴。a和b现在错位了。


安装Vim 8

Ubuntu 18.04-默认情况下带有Vim 8。Ubuntu 16.04-从PPA安装。sudo添加apt存储库ppa:jonathonf/vimsudo apt更新sudo apt安装vimMac:brew安装vim

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

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

类型

:set paste

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

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

:set nopaste

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

set pastetoggle=<F3>

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

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

把这个放在你的~/.vimrc里,开心起来:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

编辑:反射时,:r!cat是一种更好的方法,因为它简短、语义丰富,不需要自定义vimrc。改为使用它!

另一种粘贴方法是在插入模式下通过<C-r>并删除寄存器的内容(这里是全局寄存器)。请参见::h i_ctrl-r和h i_ctrl-r_ctrl-O。

从vim帮助文档中:

按字面意思插入寄存器的内容,不要自动缩进。与使用鼠标粘贴相同。不替换字符!“.”寄存器(最后插入的文本)仍按键入方式插入。{不在Vi中}

因此,要在不自动缩进的情况下将内容粘贴到vim中,请在大多数unix系统中使用<C-r><C-o>*。

您可以在vimrc-inoremap中添加一个映射<C-r><C-r><C-o>,这样您就可以使用<C-r>>*正常粘贴*寄存器的内容,而无需自动缩进。

注意:这只在vim是用剪贴板编译的情况下有效。