撤消粘贴而不撤消以前键入的内容

  • 本文关键字:撤消 vim paste undo
  • 更新时间 :
  • 英文 :


在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之外,还有更好的方法吗?

这不是你想要的答案,但你真的应该停止使用vim作为非模态编辑器。如果你想粘贴,那么返回正常模式并使用vim的粘贴命令。假设你有一个可以访问剪贴板的vim版本,这应该可以完成"+p的任务。您还可以通过将未命名的寄存器设置为+(或*)寄存器来实现这一点,这样从剪贴板粘贴就变成了一个简单的p

下面的问题有一个很好的答案,包括所有这些信息如何使vim从(并复制到)系统';s剪贴板?。

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

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

看看这个插件,当你使用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>

实际上,解决方案是您必须首先进入命令模式(例如Esc),然后重新进入插入模式,但只有当我手动键入时它才有效,但如果我在~/.vimrc中测试它,它似乎"随机"停止工作。谷歌根本帮不上忙。

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

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

例如,Ctrl+Shift+V将粘贴到我的Konsole终端中,但如果我在~/.vimrc中指定此键<C-S-v>,则"仅撤消单个粘贴而非多个粘贴"将不起作用。

在我的情况下,我必须使用<C-v>而不是<C-S-v>:

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

您的情况可能有所不同,但重点是相同的:不要分配与现有终端模拟器密钥冲突的相同粘贴密钥。

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

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

最新更新