我正在努力学习Vim。

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

line
  line
    line

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

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

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

当前回答

虽然:pastetoggle或:paste和:nopaste应该可以正常工作(如果实现了-它们并不总是我们从讨论中看到的那样),但我强烈建议使用直接方法“+p或”*p进行粘贴,并使用“+r或”*r进行阅读:

Vim可以访问十种类型的寄存器(:help寄存器),提问者对部分中的quotestar和quoteplus感兴趣

选择和删除寄存器“*”、“+”和“~使用这些寄存器存储和检索GUI的选定文本。参见quotestar和quoteplus。剪贴板不可用或不可用时工作时,将使用未命名的寄存器。对于Unix系统,剪贴板仅当存在+xterm_clipboard功能时才可用。{不在Vi中}注意,X11系统只有“*”和“+”之间的区别。

:help x11选择进一步澄清了*和+的区别:

quoteplus报价+有三个记录在案的X选项:PRIMARY(主要)表示当前视觉选择(如Vim的视觉模式),SECONDARY(定义不明确)和CLIPBOARD(预期用于剪切、复制和粘贴操作)。其中,Vim在读写“*寄存器时使用PRIMARY(因此,当X11选项可用时,Vim为“autoselect”的“剪贴板”),并在读取和写入“+登记Vim无法访问SECONDARY选项。示例:(假设默认选项值)在Vim中以可视模式选择URL。转到浏览器并单击在URL文本字段中单击鼠标中键。所选文本将为插入(希望!)。注意:在Firefox中,您可以设置intermediaouse.contentLoadURL首选项在about:config中设置为true,然后在窗口中的大多数位置按下鼠标中键时,将使用选定的URL。用鼠标拖动,在浏览器中选择一些文本。转到Vim并按下鼠标中键:插入所选文本。在Vim中选择一些文本并执行“+y”。转到浏览器,在用鼠标拖动文本字段。现在使用鼠标右键从弹出菜单中选择“粘贴”。所选文本将被Vim的文本。请注意,“+寄存器中的文本在生成Visual选择,使“*寄存器”中的其他文本可用。这允许覆盖所选文本。

其他回答

另一种粘贴方法是在插入模式下通过<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是用剪贴板编译的情况下有效。

这对我来说很有用(+寄存器的情况,我使用的是aps之间的交换缓冲区):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

我通常使用:r!cat然后粘贴(shift+insert)内容,然后CTRL+D。

无需启用和禁用,直接使用。

自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

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

set paste

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