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

时间:2010-03-25 09:52:48

标签: vim configuration editor indentation auto-indent

我正在努力学习Vim。

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

line
  line
    line

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

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

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

24 个答案:

答案 0 :(得分:1861)

更新:更好地回答:https://stackoverflow.com/a/38258720/62202

要在粘贴代码时关闭自动注册,会有一种特殊的“粘贴”模式。

输入

:set paste

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

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

:set nopaste
但是,我总觉得那很累赘。这就是为什么我映射<F3>以便在编辑文本时可以在粘贴和nopaste模式之间切换我将其添加到.vimrc

set pastetoggle=<F3>

答案 1 :(得分:253)

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

set paste

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

答案 2 :(得分:123)

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

无需启用&amp;禁用,直接使用。

答案 3 :(得分:83)

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

"+p

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

当然,如果您正在远程工作(例如通过SSH控制台),那么这将无效,您应该转到:set noai,插入模式,粘贴到控制台,保留插入模式,:set ai路线如其他地方所述。

答案 4 :(得分:37)

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

:r !pbpaste

答案 5 :(得分:31)

使用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(Windows 10 Subsystem for Linux)中不起作用。如果有人有WSL解决方案,请更新此答案或将其添加到评论中。

Tmux 如果使用tmux,则声明需要进行双重转义。此代码也在Coderwall

答案 6 :(得分:19)

Here is a post由某人了解如何重新映射粘贴事件以自动打开粘贴模式然后退回。适用于MacOSX上的tmux / iTerm。

答案 7 :(得分:12)

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

set pastetoggle=<F2>

答案 8 :(得分:9)

在终端内部工作时,vim-bracketed-paste vim插件会自动处理粘贴,而无需在粘贴之前或之后进行任何击键。

它的工作原理是检测bracketed paste mode,它是&#34;现代&#34; x-term兼容终端,如iTerm2,gnome-terminal和其他使用libvte的终端。作为额外奖励,它也适用于tmux会话。我在连接Linux服务器并使用tmux的Mac上成功使用iTerm2。

答案 9 :(得分:9)

我只是将set clipboard=unnamed放在我的.vimrc中。这使得默认的粘贴缓冲区映射到X的剪贴板。

所以,如果我在终端中标记了一些文字,我只需按p即可将其粘贴到vim中。同样,我可以在vim中抓取内容(例如YY将当前行拉入缓冲区)并在任何窗口中单击以粘贴它。

说不上。我发现它非常方便。

答案 10 :(得分:7)

坚持你的〜/ .vimrc并开心:

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

编辑:在反思中,:r !cat是一个更好的方法,因为它很短,语义,并且不需要自定义vimrc。请改用它!

答案 11 :(得分:3)

虽然:pastetoggle:paste:nopaste应该正常工作(如果已实施 - 它们并非总是我们从讨论中看到的那样),我强烈建议使用直接方法粘贴{ {1}}或"+p并使用"*p"+r阅读:

Vim有十种类型的寄存器("*r),提问者对:help registersquotestar部分感兴趣

  
      
  1. 选择和删除寄存器quoteplus"*和&#34;〜
  2.         

    使用这些寄存器存储和检索GUI的选定文本。    请参阅"+quotestar。当剪贴板不可用时    工作时,使用未命名的寄存器。对于Unix系统的剪贴板    仅在存在+ xterm_clipboard功能时可用。 {不在Vi}

         

    请注意,对于X11系统,&#34; *和&#34; +之间只有区别。

quoteplus进一步澄清了:help x11-selection*的区别:

+
     

有三个记录在案的X选择:PRIMARY(预计会有    表示当前的视觉选择 - 如在Vim的可视模式中),SECONDARY    (这是不明确的)和CLIPBOARD(预计将用于    剪切,复制和粘贴操作)。

     

在这三个中,Vim在读取&#34; *寄存器时使用PRIMARY    (因此,当X11选项可用时,Vim会为其设置默认值    &#39;剪贴板&#39; &#34; autoselect&#34;)和CLIPBOARD在读写&#34; +时    寄存器。 Vim不访问SECONDARY选择。

     

示例:(假设默认选项值)

     
      
  • 在Vim中以可视模式选择一个URL。转到您的浏览器并单击   URL文本字段中的鼠标中键。选定的文本将是   插入(希望!)。注意:在Firefox中你可以设置   middle:config中的middlemouse.contentLoadURL首选项为true,然后是   在窗口中的大多数位置按鼠标中键时将使用所选的URL。

  •   
  • 通过拖动鼠标在浏览器中选择一些文本。去Vim和   按鼠标中键:插入所选文本。

  •   
  • 在Vim中选择一些文字并执行&#34; + y。转到您的浏览器,选择一些文本   通过鼠标拖动文本字段。现在使用鼠标右键和   选择&#34;粘贴&#34;从弹出菜单中。所选文本被覆盖   来自Vim的文字。   请注意,制作Visual时,&#34; +寄存器中的文本仍然可用   选择,使其他文本在&#34; *注册中可用。这允许   覆盖选定的文字。
  •   

答案 12 :(得分:3)

这对我有用(+寄存器的情况,我用的是aps之间的交换缓冲区):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

答案 13 :(得分:2)

vim 8(2016年发布)以来,本地粘贴/方括号粘贴是最好和最简单的方法。它甚至可以在ssh上运行! (括号内的粘贴在Linux和Mac上有效,但在Windows Git Bash上无效)

  1. 确保您的vim为8+(不需要+clipboard+xterm_clipboard选项)。

    vim --version | head -1

  2. 在正常模式下仅使用OS本机粘贴命令(例如ctrl+shift+Vcmd+V)。请勿按i进入插入模式。


测试

  1. 将此输出(带有标签缩进的2行)复制(ctrl+shift+Ccmd+C)到系统剪贴板:

    echo -e '\ta\n\tb'

  2. 使用autoindent启动干净的vim 8 +:

    vim -u NONE --noplugin -c 'set autoindent'

  3. 在普通模式下从系统剪贴板(ctrl+shift+Vcmd+V)粘贴。请勿按i进入插入模式。 ab应该与单个制表符缩进对齐。您甚至可以在ssh-ing到远程计算机时执行此操作(远程计算机将需要vim 8 +)。

  4. 现在尝试旧方法,该方法将使用额外的选项卡自动缩进第二行:按i进入插入模式。然后使用ctrl+shift+Vcmd+V粘贴。 ab现在未对齐。


安装Vim 8

答案 14 :(得分:2)

如果您使用的是mac,macvim似乎可以很好地处理它,而无需切换粘贴。

brew install macvim --override-system-vim

答案 15 :(得分:1)

从vim:]p

从外部:"*]p"+]p

答案 16 :(得分:1)

这个问题已经得到解决,但是我也可以添加自己的解决方案:

如果只想禁用系统自动缩进,则对于每种文件类型(基本上完全禁用自动缩进功能),可以执行以下操作:

  1. 备份indent.vim文件:
    sudo mv /usr/share/vim/vim81/indent.vim /usr/share/vim/vim81/indent.vim.orig
  2. 创建一个新的空indent.vim文件:
    sudo touch /usr/share/vim/vim81/indent.vim

答案 17 :(得分:1)

我知道快速进入一次性粘贴的粘贴插入模式的最快方式是tpope的unimpaired,其功能为 yo yO ,大​​概是“你打开”的助记符。他们只记录在他的vimdoc中,如:

  

未提供“粘贴”功能的切换功能。因为典型的用例   单独插入的包装是如此浪费:你切换两次,但是   你只粘贴一次(YOPO)。相反,按y或yO调用o或O with   &#39;粘贴&#39;已经设定。离开插入模式设置&#39; nopaste&#39;自动。

答案 18 :(得分:1)

请阅读这篇文章:Toggle auto-indenting for code paste

  

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

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

答案 19 :(得分:0)

可悲的是,我发现提到的vim插件不适用于iTerm2 3.0.15(公平地说我不知道​​旧版本是否破坏了) - 但我找到了这个黑客。

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

工作原理。我用&#34; jk&#34;进入逃生模式所以你还需要:

:inoremap jk

你的.vimrc中的

然后它只调用P进入粘贴模式,&#34; + p从剪贴板粘贴,然后P调用以禁用粘贴模式。第h

enter image description here

答案 20 :(得分:0)

粘贴的另一种方法是通过.css.js并删除寄存器的内容(这里是全局寄存器)。请参阅:<CR>:h i_ctrl-r

从vim帮助文档:
h i_CTRL-R_CTRL-O

因此,要在没有自动缩进的情况下将内容粘贴到vim中,请在大多数unix系统中使用Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

注意:这仅适用于使用<CR><CO>*编译vim的情况。

答案 21 :(得分:0)

直到现在我还没有看到的另一个答案:

:se paste noai

答案 22 :(得分:0)

我是Python用户,有时会复制并粘贴到Vim中。 (我从Mac切换到Windows WSL),这是困扰我的故障之一。

如果依次触摸script.pyvi script.py,Vi会检测到它是Python脚本并试图提供帮助,自动缩进,粘贴额外的缩进等,如果您这样做,则不会发生不要说这是Python脚本。

但是,如果您已经发生了这种情况,则在粘贴已经完全缩进的代码时,默认的自动缩进可能是一场噩梦(请参见下面的倾斜梯形)。

我尝试了三个选项,这是结果

set paste        # works perfect 
set noai         # still introduced extra whitespace
set noautoindent # still introduced extra whitespace

enter image description here enter image description here

答案 23 :(得分:0)

以下vim插件通过其“括号粘贴”模式自动处理该问题:https://github.com/wincent/terminus

设置“括号内粘贴”模式,这意味着您可以省去手动设置“粘贴”选项的麻烦,而只需继续以任何模式粘贴即可。