当我从剪贴板中粘贴内容时,它们通常(总是)是多行的,在这些情况下(仅限这些情况),我希望触发:set paste
,否则标签会增加每一行(你们都看过了!)。
尽管:set paste
的问题在于它与set smartindent
的表现不佳,导致光标跳转到新行的开头而不是正确的缩进。所以我只想为这个实例启用它。
我正在使用Mac,使用Vim sshing到Debian机器,然后使用 cmd + v 在插入模式下粘贴。
答案 0 :(得分:7)
我不使用mac,但我相信我在这里有前缀:<D-v>
应该是cmd-v。对于插入模式:
:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter>
或者真的,只需这样做:
:imap <D-V> ^O"+p
^ O和^ R是文字控制-O和控制-R,您可以使用^ V ^ O(control-v control-o)和^ V ^ R(control-v control-r)键入。插入模式下的Control-O允许您执行一个命令然后返回插入模式;在这里你可以用它从剪贴板寄存器中放入。
当我测试它们映射到不同的键时,这对我有用,所以你应该全部设置。
不处于插入模式时无需映射任何内容;你可以使用"+p
。
答案 1 :(得分:3)
我的.vimrc中有以下内容:
inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi
gi
是在上次在当前缓冲区中停止插入模式的位置开始插入模式。
<强>更新强>
Jefromi发布了一个更好的解决方案。我已经修改了一下
inoremap <S-Insert> <ESC>"+p`]a
它插入剪贴板文本并将光标放在其后面。
答案 2 :(得分:1)
你说得对,你应该只在需要时启用'paste'
。它不仅仅影响缩进。您可以在其documentation中阅读它所影响的所有内容。对于简化'paste'
的使用非常有用的相关选项是'pastetoggle'。
如果您使用X-forwarding和可以正确传达鼠标操作的终端,您还可以利用'mouse'选项。使用:set mouse=a
,Vim可以识别鼠标正在做什么,因此当通过鼠标中键单击接收多行粘贴时,它不会执行自动缩进。
即使没有鼠标功能,X-forwarding也可以提供帮助,因为当从剪贴板或选择寄存器(分别为"+
和"*
)手动粘贴时,Vim会做同样的事情。
答案 3 :(得分:0)
这应该可以用Vim脚本解决。 (我讨厌Vim脚本,所以它必须是一个更严重的施加才能让我自己解决它。)即使使用iTerm2's "paste slowly" mode,默认情况下是将要粘贴的数据分成16个字节的块并发送每0.125秒一个。因此,您应该能够以编程方式检测一个16字节的&#34;键击&#34;并做点什么。
在伪代码中看起来像:
if too_fast_too_be_human():
set('pastemode', True)
else
set('pastemode', False)
# where either
def too_fast_too_be_human
char_threshold = 16
return len(input_buffer) > char_threshold
# or
def too_fast_too_be_human
static byte_times = []
char_threshold = 16
time_threshold = 0.125
byte_times.append(now())
while(len(byte_times) > char_threshold):
byte_times.unshift()
return (byte_times[-1] - byte_times[0]) < time_threshold
这有一些缺点,但它适用于大多数情况。
答案 4 :(得分:0)
我们可以使用
粘贴(插入模式)而不会弄乱缩进Ctrl-r Ctrl-o Register
Ctrl-r Ctrl-o +
Ctrl-r Ctrl-o *
Ctrl-r Ctrl-o 0
CTRL-R CTRL-O {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-O*
Insert the contents of a register literally and don't
auto-indent. Does the same as pasting with the mouse
"MiddleMouse". When the register is linewise this will
insert the text above the current line, like with `P`.
Does not replace characters!
The '.' register (last inserted text) is still inserted as
typed.