将文本粘贴到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的未受损 ,其特点yo和yo ,大概是“你打开”的助记符。 他们只logging在他的vimdoc中,如: 
没有为“粘贴”提供切换,因为单独插入的典型使用情况非常浪费:您切换两次,但只粘贴一次(YOPO)。 相反,按yo或yO调用o或者o'paste'已经设置。 离开插入模式自动设置“nopaste”。
 虽然:pastetoggle或:paste和:nopaste应该工作正常(如果实施 – 他们并不总是我们可以从讨论中看到)我强烈推荐粘贴使用直接的方法"+p或"*p和阅读"+r或"*r : 
  Vim有十种types的寄存器( :help registers ),提问者对quotestar中的quotestar和quoteplus感兴趣 
- select和放置寄存器
"*,"+和“〜”使用这些寄存器来存储和检索GUI的选定文本。 请参阅
quotestar和quoteplus。 剪贴板不可用或不可用时,将使用未命名的寄存器。 对于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-r和h 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禁用粘贴模式。
 