从剪贴板粘贴并自动切换“:set paste”

时间:2010-03-31 18:41:23

标签: vim paste

当我从剪贴板中粘贴内容时,它们通常(总是)是多行的,在这些情况下(仅限这些情况),我希望触发:set paste,否则标签会增加每一行(你们都看过了!)。

尽管:set paste的问题在于它与set smartindent的表现不佳,导致光标跳转到新行的开头而不是正确的缩进。所以我只想为这个实例启用它。

我正在使用Mac,使用Vim sshing到Debian机器,然后使用 cmd + v 在插入模式下粘贴。

5 个答案:

答案 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.