将文本粘贴到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禁用粘贴模式。