撤消粘贴而不撤消之前的键入

Undo a paste without undoing previous typing

在 vim 中,我经常在从系统剪贴板中粘贴一团糟后撤消比我想撤消的更多的内容。有没有更好的方法?

重现:

Open iTerm      # or terminal
vi              # open vim
i               # enter insert mode
type some stuff
Cmd-V           # paste the contents of the OS X clipboard

因为我没有:set paste,所以粘贴得一塌糊涂。所以

Esc # enter command mode
u   # undo

但这会撤消我的输入和粘贴。

我可以使用不同的撤销吗?除了在粘贴之前记住 :set paste 之外,一般来说还有更好的方法吗?

我不确定事后您能做些什么,但一种解决方案是在粘贴之前以插入模式点击 Ctrl-G u。这会将撤消块分成两个单独的块 - 因此粘贴将被记住为一个单独的可撤消操作。

当然,如果您必须记住这样做,您不妨使用 :set paste 代替 - 但从好的方面来说,它的击键次数更少,而且您不必先进入命令模式。

看看这个plugin,当你使用Cmd-V(或Ctrl-V) 粘贴一些文本。完成后离开粘贴模式。

以下映射在以插入模式粘贴之前创建一个额外的撤消点(通过:help i_CTRL-G_u)。这样就可以单独撤消粘贴了。

inoremap <C-r> <C-g>u<C-r>
inoremap <C-v> <C-g>u<C-v>

这不是您要找的答案,但您真的应该停止使用 vim 作为非模态编辑器。如果你想粘贴然后 return 到正常模式并使用 vim 的粘贴命令。 假设您的 vim 版本具有剪贴板访问权限,这应该可以解决问题 "+p。您还可以通过将未命名寄存器设置为 +(或 *)寄存器来实现这一点,这样从剪贴板粘贴就变成了简单的 p.

以下问题有一个很好的答案,其中包含所有这些信息How to make vim paste from (and copy to) system's clipboard?

其实解决办法是先进入命令模式(例如Esc)再重新进入插入模式,不过只有手动输入才有效"randomly" 如果我在 ~/.vimrc 测试它就停止工作。 Google 一点用都没有。

我花了很多时间尝试解决这个问题,我只是找出我的原因:

不要映射与终端现有粘贴键相同的粘贴键

例如Ctrl+Shift+V 将粘贴到我的 Konsole 终端,但如果我在 ~/.vimrc 中分配此键 <C-S-v>,"undo for only single paste instead of multiple pastes" 将不起作用。

在我的例子中,我必须使用 <C-v> 而不是 <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

您的情况可能有所不同,但要点是相同的:不要分配与现有终端仿真器键冲突的相同粘贴键。

我通过将我的终端粘贴键设置为 Ctrl+V 100% 证明了这个结论,现在 <C-v> 停止工作但 <C-S-v>工作。

另请注意,vim 过于敏感和奇怪。我发现我必须使用 i 然后手动使用 2 个右键才能使其在正确的光标位置工作,这意味着我必须将 i 和 2 个右键放在 ~/.vimrc也。您的情况可能有所不同,但重点是相同的,请确保 ~/.vimrc 中的键+顺序与您手动键入的内容 100% 匹配。