关于配置:将文本粘贴到VIM时关闭自动缩进

Turning off auto indent when pasting text into vim

我正在努力学习维姆。

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

1
2
3
line
  line
    line

我知道你可以关闭自动缩进,但我不能让它工作,因为我有一些其他设置冲突或什么(这在我的.vimrc中看起来很明显,但当我把它们拿出来时似乎并不重要)。

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

1
2
3
4
5
6
7
set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap


更新:更好的答案:https://stackoverflow.com/a/38258720/62202

要在粘贴代码时关闭autoindent,有一种特殊的"粘贴"模式。

类型

1
:set paste

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

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

1
:set nopaste

然而,我总是觉得这很麻烦。这就是我映射的原因,这样它可以在编辑文本时在粘贴和不粘贴模式之间切换!我把这个加到.vimrc

1
set pastetoggle=<F3>


为了避免粘贴时出现不希望出现的效果,需要设置一个选项:

1
set paste

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


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

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


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

"+p

这是一个正确的VIM命令,因此无需担心进入插入模式或先关闭autoindent。

当然,如果您正在远程工作(例如,通过ssh操作控制台),那么这将不起作用,您应该按照其他地方描述的方式进入:set noai、插入模式、粘贴到控制台、离开insertmode、:set ai路由。


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

1
:r !pbpaste


虽然使用paste/nopaste/pastetoggle设置粘贴模式非常好,但在粘贴之前仍需手动启用粘贴模式,在粘贴之后禁用粘贴模式。作为一个懒惰的人,下面是迄今为止我找到的最好的解决方案,它可以在粘贴时自动切换粘贴模式。

Here's a little trick that uses terminal's bracketed paste mode to
automatically set/unset Vim's paste mode when you paste. Put following
in your .vimrc:

1
2
3
4
5
6
7
8
9
10
let &amp;t_SI .="\<Esc>[?2004h"
let &amp;t_EI .="\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return""
endfunction

Now you can paste without explicitly turning paste mode on/off - it is
handled automatically for you.

来源:coderwall

注意:此解决方案在WSL(Linux的Windows10子系统)中不起作用。如果任何人有WSL的解决方案,请更新此答案或将其添加到注释中。

tmux如果使用tmux,那么声明需要双重转义。此代码也在coderwall中


这是一篇由某人撰写的文章,他知道如何重新映射粘贴事件以自动打开粘贴模式,然后再关闭粘贴模式。在MacOSX上的tmux/iterm中为我工作。


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

1
set pastetoggle=<F2>

我刚把set clipboard=unnamed放进我的.vimrc里。这使得默认的粘贴缓冲区映射到X的剪贴板。

所以,如果我在终端中标记一点文本,我可以简单地按p将其粘贴到vim中。同样,我可以在vim中猛拉一些东西(例如YY将当前行猛拉到缓冲区中),然后在任何窗口中单击鼠标中键粘贴它。

邓诺。我觉得非常方便。


在终端内工作时,vim支架粘贴vim插件将自动处理粘贴,而不需要在粘贴之前或之后进行任何按键操作。

它通过检测括号粘贴模式来工作,括号粘贴模式是一个转义序列,由"现代"X-术语兼容终端(如ITerm2、GNOME终端和其他使用libvte的终端)发送。作为额外的奖励,它也适用于TMUX会话。我在连接到Linux服务器并使用tmux的Mac上成功地使用了ITerm2。


把这个写在你的~/.vimrc里,然后快乐:

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

编辑:反思一下,:r !cat是一种更好的方法,因为它很短,语义明确,不需要自定义vimrc。用这个来代替!


这对我很有用(例如+寄存器,我在APS之间使用的交换缓冲区):

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

虽然:pastetoggle:paste:nopaste应该工作得很好(如果实施,它们并不总是如我们从讨论中看到的那样),但我强烈建议使用直接方法"+p"*p粘贴,并与"+r"*r阅读:

VIM拥有10种类型的寄存器(:help registers,发问者对quotestarquoteplus感兴趣。

  • Selection and drop registers "*, "+ and"~
  • Use these registers for storing and retrieving the selected text for the GUI.
    See quotestar and quoteplus. When the clipboard is not available or not
    working, the unnamed register is used instead. For Unix systems the clipboard
    is only available when the +xterm_clipboard feature is present. {not in Vi}

    Note that there is only a distinction between"* and"+ for X11 systems.

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

    1
                                                      quoteplus quote+

    There are three documented X selections: PRIMARY (which is expected to
    represent the current visual selection - as in Vim's Visual mode), SECONDARY
    (which is ill-defined) and CLIPBOARD (which is expected to be used for
    cut, copy and paste operations).

    Of these three, Vim uses PRIMARY when reading and writing the"* register
    (hence when the X11 selections are available, Vim sets a default value for
    'clipboard' of"autoselect"), and CLIPBOARD when reading and writing the"+
    register. Vim does not access the SECONDARY selection.

    Examples: (assuming the default option values)

    • Select an URL in Visual mode in Vim. Go to your browser and click the
      middle mouse button in the URL text field. The selected text will be
      inserted (hopefully!). Note: in Firefox you can set the
      middlemouse.contentLoadURL preference to true in about:config, then the
      selected URL will be used when pressing middle mouse button in most places in the window.

    • Select some text in your browser by dragging with the mouse. Go to Vim and
      press the middle mouse button: The selected text is inserted.

    • Select some text in Vim and do"+y. Go to your browser, select some text in
      a textfield by dragging with the mouse. Now use the right mouse button and
      select"Paste" from the popup menu. The selected text is overwritten by the
      text from Vim.
      Note that the text in the"+ register remains available when making a Visual
      selection, which makes other text available in the"* register. That allows
      overwriting selected text.

    如果您在Mac上,MacVim似乎可以很好地处理它,而不必切换粘贴。

    BREW安装macvim—覆盖系统vim


    请阅读本文:切换代码粘贴的自动缩进

    Some people like the visual feedback shown in the status line by the following alternative for your vimrc:

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

    对于一次粘贴,我所知道的快速进入粘贴插入模式的最快方法是tpope的unpaired,它具有yoyo,大概是"打开"的助记键。它们只在他的vimdoc中记录,如:

    A toggle has not been provided for 'paste' because the typical use case of
    wrapping of a solitary insertion is so wasteful: You toggle twice, but
    you only paste once (YOPO). Instead, press yo or yO to invoke o or O with
    'paste' already set. Leaving insert mode sets 'nopaste' automatically.


    来自VIM:]p

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


    另一种粘贴方法是通过并除去寄存器的内容(这里是全局寄存器)。见::h i_ctrl-rh i_CTRL-R_CTRL-O

    从VIM帮助文档中:Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

    因此,要在不自动缩进的情况下将内容粘贴到VIM中,请在大多数UNIX系统中使用*

    注:这仅在VIM使用clipboard编译时有效。


    遗憾的是,我发现上面提到的vim插件没有与iterm2 3.0.15一起工作(公平地说,我不知道这是否在旧版本上中断了),但我发现了这个黑客。

    映射command-p以执行粘贴并使用iterm2 vim键。显然,这只适用于ITerm2。

    它是如何工作的。我使用"jk"进入退出模式,因此您还需要:

    InReMAP JK

    在你的VIMRC。

    然后它只调用p进入粘贴模式,"+p从剪贴板粘贴,然后p禁用粘贴模式。Hth.

    enter image description here