我正在努力学习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 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

其他回答

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

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

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

不幸的是,我发现上面提到的vim插件不适用于iTerm2 3.0.15(公平地说,我不知道这是否在旧版本上发生了)-但我发现了这个黑客。

使用iTerm2 vim键映射命令-p以进行粘贴。显然,这只适用于iTerm2。

它的工作原理。我使用“jk”进入逃生模式,因此您还需要:

:inoremap jk

在你的.virc中。

然后它只调用P进入粘贴模式,“+P从剪贴板粘贴,然后P禁用粘贴模式。

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

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

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

如果您使用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

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

:r !pbpaste