在 vim 中撤消粘贴

在 vim 中撤消粘贴

我知道有关u撤消Ctrl-r和重做的信息。但是u会让我回到上次保存的状态。我想知道如何撤消粘贴cmd-v

例如,

I am typing here bla bla bla, [link to website](here I paste a wrong http link 
with cmd-v)

然后我想回到

I am typing here bla bla bla, [link to website](

有什么方法可以在 vim 中做到这一点吗?

提前致谢。

答案1

免责声明:我完全不了解带有 cmd 而不是 ctrl 的 Apple 键盘如何与 vim 交互,因此您可能需要更改或微调其中的一些内容。

在 vim 中粘贴的正确方法是使用p命令。要从系统剪贴板粘贴,可以使用"*p。因此,标准做法是退出插入模式"*paa当然, 会重新进入插入模式)。

如果您想要在插入模式下使用键盘快捷键,那么这样做似乎很自然:

inoremap <c-v> <esc>"*pa

(即:实际输入内容而不是按下 ctrl+v 并退出)。

乍一看似乎是这样的应该提供您想要的行为——它只是自动执行我上面描述的标准粘贴过程。但事实并非如此。Vim 将命令的所有部分视为同一撤消块的一部分,并且对于 vim 来说,插入模式本身就是一种命令。

但是,您可以在插入模式下手动启动新的撤消块,方法是使用 ctrl+g 后跟u(是的,我知道,这种按键组合看起来不太像 vim,但就是这样)。因此,您可以像这样修改按键重新映射:

inoremap <c-v> <c-g>u<esc>"*pa

所有这些都可以通过 ctrl+v 操作(我刚刚在 Windows 上测试过,至少在 Windows 上可以操作),您可能需要使用其他方法(而不是<c-v>)来在 vim 中使用基于 cmd 的快捷键。如果您使用的是 Apple 键盘,则意味着 OSX —— 如果 cmd+v 是系统快捷键,我不确定哪个会优先。一些粗略的谷歌搜索表明您可能需要摆弄一些操作系统级别的配置才能使 cmd 正确与 vim 配合使用。

答案2

在 MacVim 中,您需要取消Edit > Paste映射菜单项才能覆盖快捷方式,然后您可以D-v在每个模式下将 Cmd-V(以 MacVim 的说法)重新映射到相应的命令。我将其添加到我的~/.gvimrc,现在一切都运行良好:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

仅在插入模式下才需要<C-g>u修复撤消历史记录;noremapcnoremap只是为了恢复正常和命令模式下的默认粘贴行为。

感谢 evilsoup 为我指明正确的方向。

相关内容