我正在努力学习Vim。

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

line
  line
    line

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

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

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

当前回答

我是一个Python用户,有时会复制并粘贴到Vim中。(我从Mac切换到Windows WSL),这是困扰我的一个小故障。

如果你触摸script.py然后触摸vi script.py,vi会检测到它是一个Python脚本,并尝试提供帮助,自动缩进,使用额外缩进粘贴等。如果你不告诉它是Python脚本,这不会发生。

然而,如果这种情况已经发生在您身上,那么当您粘贴已经完全缩进的代码时,默认的自动缩进可能是一场噩梦(请参见下面的倾斜梯形图)。

我尝试了三种选择,结果如下

set paste        # works perfect 
set noai         # still introduced extra whitespace
set noautoindent # still introduced extra whitespace

其他回答

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

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

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

我是一个Python用户,有时会复制并粘贴到Vim中。(我从Mac切换到Windows WSL),这是困扰我的一个小故障。

如果你触摸script.py然后触摸vi script.py,vi会检测到它是一个Python脚本,并尝试提供帮助,自动缩进,使用额外缩进粘贴等。如果你不告诉它是Python脚本,这不会发生。

然而,如果这种情况已经发生在您身上,那么当您粘贴已经完全缩进的代码时,默认的自动缩进可能是一场噩梦(请参见下面的倾斜梯形图)。

我尝试了三种选择,结果如下

set paste        # works perfect 
set noai         # still introduced extra whitespace
set noautoindent # still introduced extra whitespace

请阅读本文:切换代码粘贴的自动缩进

一些人喜欢状态行中显示的vimrc的以下替代方案的视觉反馈:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

这是一篇文章,作者想出了如何重新映射粘贴事件以自动打开粘贴模式,然后关闭粘贴模式。适用于MacOSX上的tmux/iTerm。

如果您在本地工作,可以使用以下键序列从系统剪贴板粘贴:

"+p

这是一个正确的vim命令,因此无需担心先进入插入模式或关闭自动缩进。

当然,如果您正在远程工作(例如,通过SSH的控制台),那么这将不起作用,您应该按照其他地方的描述执行:set noai,insert mode,paste into console,leave insertmode,:set ai路由。