题 将文本粘贴到vim时关闭自动缩进


我正在努力学习Vim。

当我从剪贴板将代码粘贴到我的文档中时,我会在每个新行的开头添加额外的空格:

line
  line
    line

我知道你可以关闭自动缩进,但我无法让它工作,因为我有一些其他设置冲突或某事(在我的.vimrc中看起来非常明显,但是当我把它们取出时似乎并不重要)。

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

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

959
2018-03-25 09:52


起源


FWIW,vim 8.0.210 为括号粘贴添加本机支持,因此它将避免缩进粘贴的文本。 - sh1


答案:


要在粘贴代码时关闭自动注册,需要使用特殊的“粘贴”模式。

类型

:set paste

然后粘贴您的代码。请注意,工具提示中的文字现在说明了 -- INSERT (paste) --

粘贴代码后,请关闭粘贴模式,以便在键入时自动缩进再次正常工作。

:set nopaste

但是,我总觉得那很累赘。这就是我绘制地图的原因 <F3> 这样它就可以在粘贴和nopaste模式之间切换 在编辑文本的同时!  我加上这个 .vimrc

set pastetoggle=<F3>

1692
2018-03-25 10:02



这并不容易 :set noai其次是 :set ai。的建议 :r! cat 更短。 - Leopd
我认为 set paste 肯定会更容易。它比语义更具语义 noai 甚至 noautoindent在输入“noai”时更为重要,而“粘贴”在你作为触摸打字员足够熟练的时候会花费相同的微不足道的时间。 - Victor Zamanian
:set noai 并不总是有效,具体取决于根据OP配置其他与缩进相关的设置的方式。 :set paste 似乎是一次性的几个设置的简写。 - MarkHu
迟到了,但是 set copyindent 将无缝地为您服务。 - Matt Ryan
:set paste 还禁用其他功能,如大括号完成,粘贴代码时也不需要。 - Manuel Faux


为了避免在粘贴时产生不良影响,需要设置一个选项:

set paste

在你的.vimrc中有一个有用的命令 set pastetoggle=<F10> 或其他一些按钮,可以轻松地在粘贴和nopaste之间切换。


247
2018-03-25 10:15



最后!我一直打字:设置粘贴/:设置nopaste,多么愚蠢!谢谢。 - imwilsonxu
从实际的角度来看,你的答案比接受的答案更有用 - Lynob
另一个选择是为你的vimrc添加一个宏: nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR> - Chris
不错的建议@Chris - 粘贴没有缩进问题的单键序列! - RichVel
如果我从不想进入粘贴模式怎么办?有没有办法永久禁用? - maxwell


我经常使用 :r! cat 然后粘贴 ( shift + insert ) 内容,和 CTRL+D

无需启用和禁用,直接使用。


120
2018-03-30 12:50



这也很适合SSH! - Brian
在默认的Linux Mint环境中运行良好,谢谢。 - Fedir RYKHTIK
我喜欢这个直接使用选项。不过,我还在学习如何阅读网页上的vim语法。你的步骤是什么意思?特别是,假设我在系统剪贴板上有一些东西,我应该按什么将其粘贴到vim中的文档中? - jvriesem
这个答案对于有关原因和方式的信息会更有帮助 :r! cat 作品。 - K Erlandsson
@KErlandsson, :r 将文件的内容插入当前文档。 !cat 说,运行cat本质上打开stdin(* nix shell) (shift + insert) 或者对于某些终端,单击鼠标右键会将剪贴板的内容粘贴到终端 CTRL+D 是文件的结尾,所以它关闭了 :r !cat 会话。 - Daniel


如果您在本地工作,则可以使用键序列从系统剪贴板粘贴:

"+p

这是一个正确的vim命令,因此无需担心首先进入插入模式或关闭自动注册。

当然,如果你是远程工作(例如通过SSH控制台),那么这将无法工作,你应该去 :set noai,插入模式,粘贴到控制台,离开insertmode, :set ai 其他地方描述的路线。


77
2017-11-05 07:45



我很久以前就写过这个答案。现在我用 :set paste 和 :set nopaste 相反,因为尽管时间更长,但更容易记住,我不必每次都查找它! - thomasrutter
在一些嵌入式系统中(主要基于busybox) :set paste 没有实现,所以 :set noai 应该用来代替。 - jcarballo
当您要复制大文本时,使用+寄存器不是更快吗? - pedromanoel
@pedromanoel只在本地工作时才有效。它无法通过SSH访问vim,例如,如果您在本地复制某些内容并希望将其粘贴到SSH会话中的vim中。 - thomasrutter
@thomasrutter但我把它映射到了 <leader>p.. 很有用! - Dane


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

:r !pbpaste

35
2017-08-28 12:58



BTW在Linux上,等效命令就是 :r !xsel -p - Nik Reiman
这是一个很棒的回应。但是,当我这样做时,它隐藏了文档(看起来我回到了命令行),但是我的剪贴板上有文本。它提示我按Enter键,所以我这样做,它会将我返回到我的文档而不做任何更改。发生了什么事,我怎么做你说的话? - jvriesem
优秀的解决方在mac上工作得很好。谢谢 - Stryker


这是一篇文章 由某人弄明白如何重新映射粘贴事件以自动打开粘贴模式然后再关闭。适用于MacOSX上的tmux / iTerm。


18
2018-02-08 20:30



谢谢你的提示。我还追踪了一个插件,其中该人捆绑了类似的功能 - stackoverflow.com/a/36512548/255961。 - studgeek


将此添加到您的 ~/.vimrc 你只需要按 F2 粘贴之前和之后:

set pastetoggle=<F2>

12
2018-03-22 17:27





使用时设置粘贴模式 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


12
2017-07-08 04:00