我正在努力学习 Vim。
当我从剪贴板将代码粘贴到文档中时,在每一行的开头都有多余的空格:
line
line
line
我知道您可以关闭自动缩进,但是由于其他一些设置有冲突或其他原因(在我的. vimrc 中看起来很明显,但是取出它们似乎并不重要),我无法使其正常工作。
如何在粘贴代码时关闭自动缩进功能,但是在编写代码时仍然具有 vim 自动缩进功能?这是我的.vimrc
文件:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
更新:更好的答案在这里: https : //stackoverflow.com/a/38258720/62202
要在粘贴代码时关闭自动缩进,有一种特殊的 “粘贴” 模式。
类型
:set paste
然后粘贴您的代码。请注意,工具提示中的文本现在显示为-- INSERT (paste) --
。
粘贴代码后,请关闭粘贴模式,以使键入时的自动缩进可以再次正常使用。
:set nopaste
但是,我总是觉得很麻烦。这就是为什么我要映射<F3>
以便它在编辑文本时可以在粘贴和 nopaste 模式之间切换!我将此添加到.vimrc
set pastetoggle=<F3>
为避免粘贴时出现不良效果,需要设置一个选项:
set paste
在. vimrc 中有用的命令是set pastetoggle=<F10>
或其他按钮,以方便地在粘贴和 nopaste 之间切换。
我通常使用:r! cat
,然后粘贴( shift + insert )
内容,然后按CTRL+D
无需启用和禁用,直接使用。
如果您在本地工作,则可以使用以下按键序列从系统剪贴板粘贴:
"+p
这是一个正确的 vim 命令,因此无需担心进入插入模式或先关闭自动缩进功能。
当然,如果您正在远程工作(例如,通过 SSH 进行控制台),则此方法将不起作用,您应该按照其他地方的说明使用:set noai
,插入模式,粘贴到控制台,保留 insertmode 和:set ai
路由。
虽然使用paste/nopaste/pastetoggle
设置粘贴模式非常好,但是您仍必须在粘贴之前手动启用粘贴模式,并在粘贴之后禁用粘贴模式。作为我的懒人,以下是到目前为止我发现的最佳解决方案,它可以在粘贴时自动切换粘贴模式。
这是一个小技巧,可在粘贴时使用终端的方括号粘贴模式自动设置 / 取消 Vim 的粘贴模式。在您的. vimrc 文件中添加以下内容:
let &t_SI .= "\<Esc>[?2004h" let &t_EI .= "\<Esc>[?2004l" inoremap <special> <expr> <Esc>[200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=<Esc>[201~ set paste return "" endfunction
现在,您可以粘贴而无需显式打开 / 关闭粘贴模式 - 它会自动为您处理。
资料来源: Coderwall
注意:此解决方案在 WSL(Linux 的 Windows 10 子系统)中不起作用。如果有人对 WSL 有解决方案,请更新此答案或将其添加到注释中。
Tmux如果使用 tmux,则需要对声明进行两次转义。此代码也在Coderwall 中
Mac 用户可以通过直接从粘贴板读取以下内容来避免自动格式化:
:r !pbpaste
将其添加到~/.vimrc
,只需在粘贴前后按F2键:
set pastetoggle=<F2>
我只是在我的. vimrc 文件中放置了set clipboard=unnamed
。这使得默认的粘贴缓冲区映射到 X 的剪贴板。
因此,如果我在终端中标记了一些文本,则只需按p
即可将其粘贴到 vim 中。同样,我可以在 vim 中拉动东西(例如,将当前行拉到YY
),然后在任何窗口中单击鼠标中键将其粘贴。
不知道。我觉得这很方便。