为什么 Vim 会错误地缩进粘贴的代码?

elb*_*rna 140 vim clipboard whitespace

在 Vim 中,如果我粘贴此脚本:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"
Run Code Online (Sandbox Code Playgroud)

我得到了这些奇怪的结果:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       
Run Code Online (Sandbox Code Playgroud)

哈希符号 (#) 和制表符已出现。为什么?

cuo*_*glm 165

有两个原因:

要在vim启用自动缩进时粘贴,您必须通过键入以下内容更改为粘贴模式

:set paste
Run Code Online (Sandbox Code Playgroud)

然后您可以更改为插入模式并粘贴您的代码。粘贴完成后,输入:

:set nopaste
Run Code Online (Sandbox Code Playgroud)

关闭粘贴模式。由于这是一个常见且频繁的操作,因此vim提供切换粘贴模式:

set pastetoggle=<F2>
Run Code Online (Sandbox Code Playgroud)

您可以更改F2为您想要的任何键,现在您可以轻松打开和关闭粘贴。


要关闭自动插入注释,您可以将这些行添加到您的vimrc 中

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END
Run Code Online (Sandbox Code Playgroud)

vim还提供了一个粘贴寄存器供您从系统剪贴板粘贴文本。您可以使用"*p"+p取决于您的系统。在没有 X11 的系统上,例如 OSX 或 Windows,您必须使用*寄存器。在 X11 系统(如 Linux)上,您可以同时使用两者。

进一步阅读

  • 我通常使用 `:r!cat` 逐字粘贴。 (4认同)
  • 我一直在使用 Vim,但从来不知道这一点。非常感谢。 (2认同)
  • @MichaelDurrant `set paste` 永远不应该出现在你的 vimrc 中。它禁用或重置很多东西,包括插入模式映射、命令行映射、缩写、textwidth、wrapmargin、autoindent、smartindent、softtabstop、formatoptions、indentexpr 和其他一些。`:h paste` 有整个列表。大多数人使用部分或全部这些东西,并想知道为什么忽略了这些设置。 (2认同)

exu*_*sum 40

使用 vim 粘贴。你想要的是粘贴剪贴板缓冲区上的内容 "+p

这将选择+并将其粘贴到位。

如果您使用的是 Linux,*则是 X/middle-click 缓冲区(最后选择的文本)。

然后vim知道这是一个粘贴。

否则,vim 会认为您输入了要粘贴的键,并进行自己的自动缩进(在您复制的缩进之上)一直到粘贴结束。

作为通过 SSH 工作的注意事项,您需要设置要共享剪贴板的选项 -Y

有关man ssh更多详细信息,请参阅。

  • 这实际上是正确答案恕我直言 (4认同)
  • 还要检查 `vim --version` 看看它是否是用剪贴板支持编译的 `+xterm_clipboard` 应该在输出中 (2认同)

cas*_*sey 9

插入选项卡是因为您打开了自动缩进,您可以通过:set noai在粘贴到终端之前关闭自动缩进 ( )来禁用该行为。

注释行是由自动注释生成的,可以通过将其关闭来禁用。

替代那些您应该使用 toggles 获得所需行为的方法 :set paste,粘贴格式化的代码并:set nopaste恢复正常行为。