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

我正在努力学习Vim。

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

line line line 

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

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

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

要粘贴代码时closuresautoindent,有一个特殊的“粘贴”模式。

types

 :set paste 

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

粘贴代码后,closures粘贴模式,以便在再次正确input时自动缩进。

 :set nopaste 

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

 set pastetoggle=<F3> 

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

 set paste 

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

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

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

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

"+p

这是一个正确的vim命令,所以不必担心进入插入模式或首先closures自动缩进。

当然,如果你正在远程工作(例如通过SSH进行控制台),那么这将不起作用,你应该去:set noai ,插入模式,粘贴到控制台,离开insertmode :set noai :set ai路由如其他地方所述。

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

 :r !pbpaste 

这是一个由谁想出了如何重新映射粘贴事件自动打开粘贴模式,然后退出的职位 。 适用于Mac OS X上的tmux / iTerm。

把它添加到你的~/.vimrc ,你只需要在粘贴之前和之后按F2

 set pastetoggle=<F2> 

在terminal内部工作时, vim-bracketed-paste vim插件会自动处理粘贴,而不需要在粘贴之前或之后进行任何按键操作。

它通过检测括号内的粘贴模式 ,这是一个由“现代”x-term兼容terminal,如iTerm2,gnome-terminal,和其他terminal使用libvte发送的转义序列。 作为额外的好处,它也适用于三合一会议。 我正在使用iTerm2在Mac上连接到Linux服务器并使用tmux成功使用它。

paste/nopaste/pastetoggle设置粘贴模式是非常好的,但粘贴之前您仍然必须手动启用粘贴模式,粘贴后禁用粘贴模式。 作为我这个懒惰的人,下面是我迄今为止发现的最好的解决scheme,它在粘贴时自动切换粘贴模式。

这里有一个小技巧,使用terminal的括号内的粘贴模式来粘贴时自动设置/取消设置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 

现在,您可以粘贴而无需明确地打开/closures粘贴模式 – 它会自动为您处理。

来源: Coderwall

坚持这个在你的〜/ .vimrc中,并很高兴:

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

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

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

所以,如果我在terminal上标记一些文本,我可以简单地按p将它粘贴到vim中。 同样,我可以在vim中抽取一些东西(例如, YY将当前行拖入缓冲区),然后在任意窗口中点击以将其粘贴。

不知道。 我觉得这很方便。

这适用于我(例如+寄存器,我使用像AP之间的交换缓冲区):

 imap <silent> <S-Insert> <CO>:set noai<CR><CR>+<CO>:set ai<CR> 

如果你在Mac上,macvim似乎处理得很好,而不必切换粘贴。

brew安装macvim –override-system-vim

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

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

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

我知道最快的方式来快速进入粘贴插入模式的一次性粘贴是tpope的未受损 ,其特点yoyo ,大概是“你打开”的助记符。 他们只logging在他的vimdoc中,如:

没有为“粘贴”提供切换,因为单独插入的典型使用情况非常浪费:您切换两次,但只粘贴一次(YOPO)。 相反,按yo或yO调用o或者o'paste'已经设置。 离开插入模式自动设置“nopaste”。

虽然:pastetoggle:paste:nopaste应该工作正常(如果实施 – 他们并不总是我们可以从讨论中看到)我强烈推荐粘贴使用直接的方法"+p"*p和阅读"+r"*r

Vim有十种types的寄存器( :help registers ),提问者对quotestar中的quotestarquoteplus感兴趣

  1. select和放置寄存器"*"+和“〜”

使用这些寄存器来存储和检索GUI的选定文本。 请参阅quotestarquoteplus 。 剪贴板不可用或不可用时,将使用未命名的寄存器。 对于Unix系统,剪贴板仅在+ xterm_clipboardfunction存在时才可用。 {Vi无此function}

请注意,X11系统只有“*和”+之间的区别。

:help x11-selection进一步阐明了*+的区别:

  quoteplus quote+ 

有三个logging的Xselect:PRIMARY(预计代表当前的视觉select – 如Vim的Visual模式),SECONDARY(不明确)和CLIPBOARD(预计将用于剪切,复制和粘贴操作)。

在这三个中,Vim在读取和写入“*”寄存器(因此,当X11select可用时,Vim为“自动select”的“剪贴板”设置默认值)时使用PRIMARY,而在读取和写入“+寄存器时使用CLIPBOARD。 Vim不访问SECONDARY选项。

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

  • 在Vim中以Visual模式select一个URL。 转到浏览器并在URL文本字段中单击鼠标中键。 所选的文本将被插入(希望!)。 注意:在Firefox中,您可以在about:config中将middlemouse.contentLoadURL首选项设置为true,然后在窗口的大部分地方按下鼠标中键时将使用所选的URL。

  • 通过拖动鼠标在浏览器中select一些文本。 转到Vim并按下鼠标中键:插入选定的文本。

  • 在Vim中select一些文本,然后执行“+ y”,进入浏览器,用鼠标拖动select文本框中的一些文本,然后用鼠标右键从popup菜单中select“粘贴”。请注意,“+”寄存器中的文本在进行可视化select时仍然可用,这使得“*”寄存器中的其他文本可用,这将允许覆盖选定的文本。

另一种粘贴方式是通过<CR>并删除寄存器的内容(这里是全局寄存器)。 请参阅:: :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<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

因此,要将内容粘贴到vim而没有自动缩进,请在大多数unix系统中使用<CR><CO>*

注意:这只有在使用clipboard编译vim时才有效。

可悲的是我发现vim插件提到不与iTerm2 3.0.15(公平我不知道这是否破旧) – 但我发现这个黑客。

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

怎么运行的。 我使用“jk”进入转义模式,所以你也需要:

:inoremap jk

在你的.vimrc中。

然后它只是调用P进入粘贴模式,“+ p从剪贴板粘贴,然后P禁用粘贴模式。

在这里输入图像描述