Turning off auto indent when pasting text into vim
我正在努力学习维姆。
当我从剪贴板将代码粘贴到我的文档中时,在每行的开头都会有额外的空格:
1 2 3 | line line line |
我知道你可以关闭自动缩进,但我不能让它工作,因为我有一些其他设置冲突或什么(这在我的.vimrc中看起来很明显,但当我把它们拿出来时似乎并不重要)。
如何在粘贴代码时关闭自动缩进,但在编写代码时仍然有VIM自动缩进?这是我的
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 |
然后粘贴代码。注意,工具提示中的文本现在显示为
粘贴代码后,关闭粘贴模式,以便在再次正确键入时自动缩进。
1 | :set nopaste |
然而,我总是觉得这很麻烦。这就是我映射
1 | set pastetoggle=<F3> |
为了避免粘贴时出现不希望出现的效果,需要设置一个选项:
1 | set paste |
在.vimrc中有一个有用的命令是
我通常使用
无需启用和禁用,直接使用。
如果您在本地工作,则可以使用键序列从系统剪贴板粘贴:
这是一个正确的VIM命令,因此无需担心进入插入模式或先关闭autoindent。
当然,如果您正在远程工作(例如,通过ssh操作控制台),那么这将不起作用,您应该按照其他地方描述的方式进入
Mac用户可以通过以下方式直接从粘贴板读取来避免自动格式化:
1 | :r !pbpaste |
虽然使用
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 &t_SI .="\<Esc>[?2004h"
let &t_EI .="\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return""
endfunctionNow 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中为我工作。
将此项添加到您的
1 | set pastetoggle=<F2> |
我刚把
所以,如果我在终端中标记一点文本,我可以简单地按
邓诺。我觉得非常方便。
在终端内工作时,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' |
编辑:反思一下,
这对我很有用(例如+寄存器,我在APS之间使用的交换缓冲区):
1 | imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR> |
虽然
VIM拥有10种类型的寄存器(
Selection and drop registers "* ,"+ and"~Use these registers for storing and retrieving the selected text for the GUI.
Seequotestar andquoteplus . 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.
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,它具有
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:
从外部:
另一种粘贴方法是通过
从VIM帮助文档中:
因此,要在不自动缩进的情况下将内容粘贴到VIM中,请在大多数UNIX系统中使用
注:这仅在VIM使用
遗憾的是,我发现上面提到的vim插件没有与iterm2 3.0.15一起工作(公平地说,我不知道这是否在旧版本上中断了),但我发现了这个黑客。
映射command-p以执行粘贴并使用iterm2 vim键。显然,这只适用于ITerm2。
它是如何工作的。我使用"jk"进入退出模式,因此您还需要:
InReMAP JK
在你的VIMRC。
然后它只调用p进入粘贴模式,"+p从剪贴板粘贴,然后p禁用粘贴模式。Hth.