我正在努力学习Vim。

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

line
  line
    line

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

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

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

当前回答

如果您使用v8.2以上的vim,可以使用:help tmux integration进行检查。

如果在tmux中运行Vim时遇到问题,这里有一些提示。如果某些部分不起作用,您可以注释掉(这可能取决于tmux正在运行的终端):

if !has('gui_running') && &term =~ '^\%(screen\|tmux\)'
    " Better mouse support, see  :help 'ttymouse'
    set ttymouse=sgr

    " Enable true colors, see  :help xterm-true-color
    let &termguicolors = v:true
    let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
    let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

    " Enable bracketed paste mode, see  :help xterm-bracketed-paste
    let &t_BE = "\<Esc>[?2004h"
    let &t_BD = "\<Esc>[?2004l"
    let &t_PS = "\<Esc>[200~"
    let &t_PE = "\<Esc>[201~"

    " Enable focus event tracking, see  :help xterm-focus-event
    let &t_fe = "\<Esc>[?1004h"
    let &t_fd = "\<Esc>[?1004l"

    " Enable modified arrow keys, see  :help xterm-modifier-keys
    execute "silent! set <xUp>=\<Esc>[@;*A"
    execute "silent! set <xDown>=\<Esc>[@;*B"
    execute "silent! set <xRight>=\<Esc>[@;*C"
    execute "silent! set <xLeft>=\<Esc>[@;*D"
endif

其他回答

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

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

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

我直到现在才看到另一个答案:

:se paste noai

这个问题已经得到了解答,但我想我也可以添加自己的解决方案:

如果您只想对每种文件类型禁用自动缩进系统(基本上,完全禁用自动缩进功能),可以执行以下操作:

备份indent.vim文件:sudo mv/usr/share/vim/vim81/index.vim/usr/share/vim/vim81/Index.vim.org创建新的空缩进.vim文件:sudo touch/usr/share/vim/vim81/index.vim

我是一个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

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

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

类型

:set paste

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

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

:set nopaste

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

set pastetoggle=<F3>