我正在努力学习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
虽然使用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中
更新:更好的答案在这里:https://stackoverflow.com/a/38258720/62202
要在粘贴代码时关闭自动缩进,有一种特殊的“粘贴”模式。
类型
:set paste
然后粘贴代码。注意,工具提示中的文本现在显示--INSERT(粘贴)--。
粘贴代码后,请关闭粘贴模式,以便键入时自动缩进再次正常工作。
:set nopaste
然而,我总是觉得这很麻烦。这就是为什么我映射<F3>,这样它可以在编辑文本时在粘贴和非粘贴模式之间切换!我将此添加到.vimrc
set pastetoggle=<F3>