我正在尝试编写一个插入模式映射,用于从系统剪贴板粘贴。我有这个:
imap <c-p> <c-o>:set paste<cr><c-r><c-r>+<c-o>:set nopaste<cr>
(请注意,这应该按照这)
但是,当调用键映射时,它不起作用,它会在设置的粘贴部分停止,所以我最终只能启用粘贴模式。
但如果我手动操作所有这些键,我就能得到我想要的...那么当命令在键映射下时有什么不同?我缺少什么才能使它工作?
我也尝试过这个:
imap <c-p> <esc>"+gP
这会引发一系列关于 gP 是未知变量的错误,但在正常模式下相同的映射可以按预期工作......那么插入模式映射有什么不同?
答案1
:set paste
在使用 插入剪贴板内容时不需要这样做i_CTRL-R
。因为有该命令,Vim 已经知道这是来自剪贴板的内容。:set paste
是用于直接从终端粘贴(例如通过鼠标中键)的情况;此时,Vim 无法区分键入的字符或粘贴的字符,因此需要这个提示。
为了避免自动缩进,请使用i_CTRL-R_CTRL-O
。
答案2
我仍然不知道我尝试的第一个映射有什么问题,因为我相信它应该可以工作,但查看 vim 文档(特别是:help i_CTRL-R)我想出了一个更好的解决方案:
inoremap <c-p> <c-r><c-o>+
来自文档:
CTRL-R CTRL-O {0-9a-z"%#*+/:.-=} Ctrl-R_Ctrl-O 按字面意思插入寄存器的内容,不自动缩进。与使用鼠标 || 粘贴相同。不替换字符!'.' 寄存器(最后插入的文本)仍按输入插入。{Vi 中没有}
答案3
第二个 imap 命令应该可以正常工作。据我了解,它应该退出插入模式,从系统剪贴板之一粘贴 (+),然后将光标留在粘贴的文本后面。
我怀疑你运行的是 vi 而不是 vim,或者你的 vim 处于兼容模式。["x]gP 的文档(:help gP)
说“不在 vi 中”,所以这可能是你的问题。