在不撤消先前键入的情况下撤消粘贴

时间:2015-11-11 02:52:10

标签: vim paste undo

在vim中,我经常在从系统剪贴板中搞砸了一些搞砸后,最终撤消了比我想要的更多的内容。还有更好的方法吗?

重现:

<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
  <meta content="UTF-8">
  <title>live data example</title>
  <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.js"></script>
  <script type="text/javascript" src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
  <ul>
    <li ng-repeat="item in arr">{{item}}</li>
  </ul>
</body>

粘贴是一团糟,因为我没有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 还有更好的方法可以做到这一点吗?

5 个答案:

答案 0 :(得分:4)

这不是您正在寻找的答案,但您真的应该停止使用vim作为非模态编辑器。如果要粘贴,则返回正常模式并使用vim的粘贴命令。 假设你有一个带剪贴板访问权限的vim版本,这应该可以做到catch。您还可以通过将未命名的寄存器设置为"+p(或+)寄存器来实现此目的,这样从剪贴板粘贴变为简单的*

以下问题包含所有这些信息How to make vim paste from (and copy to) system's clipboard?

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

看看这个plugin,当您使用 Cmd-V (或 Ctrl-V )时,它可以自动运行:set paste!粘贴一些文字。完成后请保留粘贴模式。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

实际上解决方案是你必须首先进入命令模式(例如 Esc )并重新进入插入模式,但只有在我手动输入但它似乎“随机”停止工作时它才有效如果我在~/.vimrc测试它。谷歌根本没有帮助。

我花了很多时间尝试解决这个问题,我只是想出了我的理由:

请勿将粘贴密钥与终端现有粘贴密钥相同

e.g。 Ctrl + Shift + V 将粘贴到我的Konsole终端,但是如果我在<C-S-v>中分配此密钥~/.vimrc,则“仅撤消单个粘贴而不是多个粘贴”将不工作。

就我而言,我必须使用<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个右键使其在正确的光标位置工作,这意味着我必须在i中放置~/.vimrc和2个右键太。您的情况可能有所不同,但重点是相同的,确保〜/ .vimrc中的键+顺序100%与您手动输入的内容匹配。