Vim 从剪贴板粘贴并自动切换";:设置粘贴";

Vim 从剪贴板粘贴并自动切换";:设置粘贴";,vim,paste,Vim,Paste,当我从剪贴板粘贴内容时,它们通常(始终)是多行的,在这些情况下(仅在这些情况下),我希望触发:设置粘贴,否则,每行的标签都会增加(你们都看到了!) 尽管:set paste的问题在于它在set smartindent中表现不好,导致光标跳转到新行的开头,而不是正确的缩进。所以我只想在这个实例中启用它 我使用Mac,通过Vim将其粘贴到Debian机器上,从而使用cmd+v以插入模式粘贴。我不使用Mac,但我相信我这里有前缀:应该是cmd-v。对于插入模式: :imap <D-v> ^

当我从剪贴板粘贴内容时,它们通常(始终)是多行的,在这些情况下(仅在这些情况下),我希望触发
:设置粘贴
,否则,每行的标签都会增加(你们都看到了!)

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


我使用Mac,通过Vim将其粘贴到Debian机器上,从而使用cmd+v以插入模式粘贴。我不使用Mac,但我相信我这里有前缀:
应该是cmd-v。对于插入模式:

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter>
:imap ^O:设置粘贴^R+^O:设置非粘贴
或者真的,就这么做:

:imap <D-V> ^O"+p
:imap^O“+p
^O和^R是文本control-O和control-R,您可以使用^V^O(control-V control-O)和^V^R(control-V control-R)键入它们。插入模式下的control-O允许您执行一个命令,然后返回插入模式;在这里,您可以使用它从剪贴板寄存器中输入

当我测试它们映射到另一个键时,这对我来说很有效,所以你应该都准备好了


不处于插入模式时,无需映射任何内容;您只需使用
“+p

就可以了,您应该只在需要时启用
'paste'
。它不仅仅影响缩进。你可以阅读它影响到的所有内容。一个相关的选项非常有助于简化
“粘贴”
的使用

如果您使用的是X-forwarding和能够正确传递鼠标操作的终端,那么您也可以利用该选项。使用
:set mouse=a
,Vim会知道鼠标在做什么,因此在通过鼠标中键单击接收多行粘贴时不会执行自动缩进


即使没有鼠标功能,X-forwarding也会有所帮助,因为当从剪贴板或选择寄存器手动粘贴时,Vim将执行相同的操作(
“+
”*
)。

我的.vimrc中有以下内容:

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi

它插入剪贴板文本并将光标放在它的正后方。

这应该可以用Vim脚本解决。(我讨厌Vim脚本,所以要让我自己解决这个问题,它必须是一个更严重的问题。)即使使用Vim脚本,默认情况是将要粘贴的数据分解为16字节块,并每0.125秒发送一个。因此,您应该能够以编程方式检测16字节的“击键”块,并对其进行处理

在伪代码中,看起来像:

如果太快太人性化():
设置('pastemode',True)
其他的
设置('pastemode',False)
#哪一个
定义太快,太人性化
字符阈值=16
返回len(输入缓冲区)>字符阈值
#或
定义太快,太人性化
静态字节_次=[]
字符阈值=16
时间_阈值=0.125
字节\u次。追加(现在())
while(len(字节\u次)>字符\u阈值):
字节\u次。取消移位()
返回(字节乘以[-1]-字节乘以[0])<时间阈值
这有一些缺点,但它在大多数情况下都适用。

我们可以粘贴(插入模式),而不必使用

Ctrl-r Ctrl-o Register
Ctrl-r Ctrl-o +
Ctrl-r Ctrl-o *
Ctrl-r Ctrl-o 0

我认为没有任何理由迁移这个问题:不仅vim问题被接受为属于SO(),这是一个关于程序员的文本编辑器的问题,用于执行编程时常见的任务。@Jefromi:粘贴在进行任何形式的文本编辑时都很常见,但我要承认,Vim/Emacs问题被认为是可以接受的,即使它们与编程没有直接关系@乔纳坦:我强烈建议不要使用
'smartindent'
。有关原因的解释,请参阅。@jamessan:关键是,使用这种特定格式进行粘贴是一项非常非常常见的编程任务。在其他任何地方,人们都不会习惯性地将缩进变化的文本块逐行粘贴。谢谢。我确实请求帮助获得X-forwarding和Mouse以及什么不起作用(),但从未解决所有问题。我会调查的,那会解决的。Vim的文档(和功能集)非常庞大。这很好,但这只适用于Shift-Insert,对吗?除非我弄错了,否则这在我的Mac电脑上是行不通的。它可以很容易地映射到你喜欢的任何东西。例如。@Jonatan Littke:我的回答说明了如何将此映射到command-v,以及如何更有效地进行映射。关于
“+p
…根据您的操作系统,您可能需要将其更改为
”*p
。对于我的电脑(osx),我需要使用第二个版本。
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.