我正在努力学习Vim。

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

line
  line
    line

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

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

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

当前回答

虽然使用paste/nopaste/pastetoggle设置粘贴模式非常好,但在粘贴之前仍必须手动启用粘贴模式,在粘贴之后禁用粘贴模式。作为一个懒惰的人,下面是我迄今为止找到的最佳解决方案,当你粘贴时,它会自动切换粘贴模式。

这里有一个小技巧,使用终端的括号粘贴模式粘贴时自动设置/取消设置Vim的粘贴模式。放入以下内容在.vimrc中:设&t_SI.=“\<Esc>[?2004h”设&t_EI.=“\<Esc>[?2004l”inoremap<special><expr><Esc>[200~XTermPasteBegin()作用XTermPasteBegin()设置pastetoggle=<Esc>[201~凝固膏return“”端函数现在,您可以在不显式打开/关闭粘贴模式的情况下进行粘贴-这是自动为您处理。

来源:Coderwall

注意:此解决方案不适用于WSL(Windows 10 Subsystem for Linux)。如果任何人有WSL的解决方案,请更新此答案或将其添加到评论中。

如果使用Tmux,则需要对声明进行双转义。代码也在Coderwall中

其他回答

Mac用户可以通过以下方式直接从粘贴板读取来避免自动格式化:

:r !pbpaste

如果您使用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中,您只需在粘贴前后按F2即可:

set pastetoggle=<F2>

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

:se paste noai

虽然: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选择,使“*寄存器”中的其他文本可用。这允许覆盖所选文本。