【问题标题】:How do you 'redo' changes after 'undo' with Emacs?使用 Emacs 进行“撤消”后如何“重做”更改?
【发布时间】:2011-04-01 10:13:52
【问题描述】:

This article 说“Emacs 有重做,因为您可以在撤消时反转方向,从而撤消撤消”。

这是什么意思?用户如何使用 Emacs “重做”?

【问题讨论】:

  • 接受答案下方的答案告诉您如何,如果这就是您查看此答案的原因,考虑到它的编写方式,我希望大多数人都会实际上正在寻找那个。
  • 我只是按了空格键,然后撤消,然后撤消空格并重做您所做的撤消操作,直到它结束,然后再次开始返回......我知道还有更多复杂的方法,但这又快又容易,我就是这样滚动的。
  • Emacs 28 现在支持此功能,请参阅:stackoverflow.com/a/60163018/432509

标签: emacs undo-redo


【解决方案1】:

短版:通过撤消撤消。如果撤消,然后执行非编辑命令,例如 C-f,那么下一个撤消将撤消撤消,从而导致重做。

加长版:

您可以将撤消视为对一组操作进行操作。如果您在一系列撤消操作之后执行某些命令(甚至是导航命令,例如 C-f),则所有撤消操作都会被推入操作堆栈。所以下一个撤消撤消最后一个命令。假设您确实有一个如下所示的操作序列:

  1. 插入“foo”
  2. 插入“栏”
  3. 插入“我喜欢垃圾邮件”

现在,您撤消。它撤消最后一个操作,生成以下列表:

  1. 插入“foo”
  2. 插入“栏”

如果此时您执行的操作不是撤消操作,例如 C-f,则操作堆栈如下所示:

  1. 插入“foo”
  2. 插入“栏”
  3. 插入“我喜欢垃圾邮件”
  4. 撤消插入“我喜欢垃圾邮件”

现在,当您撤消时,要撤消的第一件事就是撤消。生成您的原始堆栈(和文档状态):

  1. 插入“foo”
  2. 插入“栏”
  3. 插入“我喜欢垃圾邮件”

如果您执行修改命令来中断撤消顺序,则该命令会添加到撤消之后,因此是之后要撤消的第一件事。假设您在“bar”上退格而不是按 C-f。那你就会有

  1. 插入“foo”
  2. 插入“栏”
  3. 插入“我喜欢垃圾邮件”
  4. 撤消插入“我喜欢垃圾邮件”
  5. 删除“栏”

这种添加/重新添加会无限发生。这需要一点时间来适应,但它确实为 Emacs 提供了一种高度灵活且强大的撤消/重做机制。

【讨论】:

  • 以防这听起来很烦人,主要优点是您可以随时恢复之前的状态。在大多数编辑器中,撤消几个更改然后意外键入一个字符会使您“陷入困境”,无法重做已撤消的操作。 Emacs 使这变得微不足道。
  • 我想在你的结构中,如果一个人想在纸上做,你需要两个堆栈。因为例如,在你写“现在,你撤消。它撤消最后一个动作,产生以下列表:“你(可以理解)没有显示撤消,如果他做了很多撤消,你不会显示它们,直到做了一些事情来破坏撤消序列,然后你会添加它们。另一种显示它的方法是有一个列表,并在它们被破坏之前将撤消添加到列表中,但要注意光标在列表中的位置,所以我们知道撤消从哪里向后工作
  • @barlop 回复较晚,但至少从用户可见的角度来看,撤消仅在序列中断后才在堆栈上(否则,重复“撤消”只会切换最后一个操作)。这可能不是它的实现方式(例如,它可以使用某种指向队列或其他东西的指针),但我试图在这里解释用户可见的行为。
  • 我不知道为什么这个答案甚至没有告诉你 HOW 就被接受了。
  • 遗憾的是,这个答案没有说明重做命令是 C-g C-/。
【解决方案2】:

要撤消: C-_

撤消后重做: C-g C-_

C-_ 上多次键入以重做 C-_ 已撤消的操作 要多次重做 emacs 命令,请执行您的命令,然后键入 Cxz 然后在 z 键上键入多次以重复该命令(有趣当你想多次执行一个宏时)

【讨论】:

  • 要重复内容,您也可以使用C-u,例如C-u 8 *(在插入符号所在的位置插入八个*)。因此您可以使用C-u x C-_ 撤消x 个步骤。
  • 这与原始问题无关,但在执行键盘宏(使用C-x e)后,您可以随时按e 再次执行它。
  • 另外,C-/C-x u 是可选的撤消键绑定,等效于 C-_。我更喜欢C-/,因为它更容易被击中。
  • 警告:当这个答案说C-g C-_ 将“撤消后重做”时,这只适用于您第一次点击组合。之后,重复您的撤消键而不使用C-g。因此,要在撤消后立即重做 3 次,请键入 C-g C-_ C-_ C-_。如果您输入C-g C-_ C-g C-_ C-g C-_,您将只是绕圈子,撤消您的重做...
  • @RoryO'Kane 我对 emacs 不太了解,所以请纠正我哪里错了,但是考虑到 Cg C-_ 在重做后没有任何影响,可以吗?那是因为它只在撤消后操作(就像您的描述“撤消后重做”所暗示的那样。所以它并不是在循环重做撤消或重做等它没有做任何事情,因为撤消不仅仅是在它之前完成。所以 Cg C-_ Cg C-_ 在第一个之后不会绕圈子,它实际上什么都不做。
【解决方案3】:
  • 撤消一次:C-/
  • 要撤消两次:C-/ C-/
  • 重做一次,撤消后立即:C-g C-/
  • 在撤消后立即重做两次:C-gC-/C-/。请注意,C-g 不会重复。
  • 立即撤消再次,一次:C-gC-/
  • 再次立即撤消,两次:C-gC-/C-/
  • 再次重做,还是一样……

如果您在上一次撤消命令后按下了任何键(无论是输入字符还是只是移动光标),则无需在下一次撤消/重做之前输入C-gC-g 只是一个安全键,它本身什么都不做,但算作一个非撤消键,表示撤消序列的结束。按下另一个命令,例如 C-f 也可以;只是它会将光标从你原来的位置移动。

如果您无意中点击了C-g 或其他命令,而您现在正以错误的方向撤消,只需点击C-g 再次反转您的方向。在达到所需的撤消之前,您必须一直撤消意外重做和撤消,但如果您继续点击C-/,您最终将达到您想要的状态。事实上,如果您点击一次C-g,然后按足够多次C-/,则缓冲区曾经处于的每个状态都是可以访问的。

undo 的替代快捷方式(C-/ 除外)为 C-_C-x uM-xundo

有关 Emacs 撤消系统的更多详细信息,请参阅 Emacs 手册中的 Undo

【讨论】:

    【解决方案4】:

    对于那些想要拥有更常见的撤消/重做功能的人,有人写了undo-tree.el。它提供非 Emacs 撤消的外观和感觉,但提供对撤消历史的整个“树”的访问。

    我喜欢 Emacs 内置的 undo 系统,但发现这个包非常直观。

    这是文件本身的评论:

    Emacs 有一个强大的撤销系统。 不同于标准的撤消/重做系统 在大多数软件中,它允许您 恢复缓冲区的任何过去状态 (而标准的撤消/重做系统 只要你能失去过去的状态 重做)。然而,这种力量来自于 价格:很多人发现 Emacs 的 undo 系统混乱且难以使用, 产生许多包 将其替换为功能较弱但 更直观的撤消/重做系统。

    与标准的数据丢失 undo/redo,以及 Emacs 的混乱 撤消,源于试图处理撤消 历史是一个线性序列 变化。它不是。这 此提供的“撤消树模式” 包替换 Emacs 的撤消系统 使用处理撤消历史的系统 它是什么:一棵分支的树 变化。这个简单的想法允许 更直观的行为 标准撤消/重做系统 结合永不的力量 失去任何历史。增加的一面 好处是撤消历史可以在某些 更有效地存储案例, 允许更多的变化积累 在 Emacs 开始丢弃之前 历史。

    【讨论】:

    • 太棒了!谁说 emacs undo 深不可测? :-)
    • 太棒了!概念上合理且用户直观。这应该在默认包中。一条评论:我希望在从分支点重做时也显示一些警报消息,而不仅仅是在恢复到它时。例如,当用户调用重做时:“从分支点重做”或“使用默认重做分支” - 只是为了提醒用户有多个分支。
    • 解决这个问题的另一种方法,实现起来更简单,不需要可视化器,只保留最后一个分支点,并提供 3 个命令:撤消、重做、切换分支。当分支被击中时,撤消/重做将发出警报,并且 switch-branch 将仅在分支处切换,否则仅发出“不在分支处”消息。如果任何时候发生分支,前一个分支点就会丢失。这将相当好地解决状态丢失问题,并且以最小的复杂性。
    • 请注意,这是一个长期存在的重做错误,可能会随机失败:github.com/syl20bnr/spacemacs/issues/9903 - 自 2014 年以来已知
    • @ideasman42 显然这是一个“非错误”:dr-qubit.org/Lost_undo-tree_history.html
    【解决方案5】:

    当心undo-tree 用于重做的怪癖!

    许多流行的“入门工具包”(prelude、purcell、spacemacs)都与 undo-tree 捆绑在一起。大多数(全部?)甚至自动启用它。如前所述,撤消树是可视化和遍历撤消/重做树的便捷方式。 Prelude 甚至给它一个键和弦(uu),还有C-x u

    问题是:undo-tree 似乎破坏了 Emacs 的默认和众所周知的 redo 绑定:C-g C-/

    相反,您可以将这些对称键用于撤消/重做

    C-/     undo
    C-S-/   redo
    

    这些很有用,因为有时您想在不打开可视化工具的情况下快速重做

    【讨论】:

    • 这个。我正在使用 Spacemacs,但不知道为什么它对我不起作用。谢谢!
    【解决方案6】:

    Emacs 28 adds a redo 命令(称为undo-redo)。

    如果你想要更典型的undo/redo,可以使用以下命令。

    (global-set-key (kbd "C-z") 'undo-only)
    (global-set-key (kbd "C-S-z") 'undo-redo)
    

    要访问此功能(也可以使用非线性历史记录,请参阅undo-fu,这是对内置撤消的 emacs 的精简包装)。

    【讨论】:

      【解决方案7】:

      我发现 redo.el extremly handy 用于“正常”撤消/重做,我通常将其绑定到 C-S-z 并撤消到 C-z,如下所示:

      (when (require 'redo nil 'noerror)
          (global-set-key (kbd "C-S-z") 'redo))
      
      (global-set-key (kbd "C-z") 'undo)
      

      只需下载文件,将其放入您的 lisp-path 并将上述内容粘贴到您的.emacs

      【讨论】:

      • redo.el 标头中的 cmets 表示它是为 XEmacs 制作的。在 GNU Emacs 和其他相关的 Emacsen 中使用它有什么问题吗?
      • 我还没有遇到任何问题,而且我已经使用了至少 6 个月 :)
      • 来自emacswiki.org/emacs/RedoMode:然而,redo.el 已经过时并且经常破坏“缓冲区”的内容,因为“原始撤消”的行为与 Emacs 以来的旧行为略有不同22. RedoPlus 是 redo.el 的一个分支,在新版本的 Emacs 中可以正常工作。你可以在这里获取 RedoPlus:emacswiki.org/emacs/redo+.el
      【解决方案8】:

      默认情况下,Emacs 中的重做需要按 C-g,然后撤消。

      但是也可以使用 Emacs 内置的 undo 来实现重做命令。

      undo-fu 包使用 Emacs 内置的撤消功能来公开撤消和重做。


      编辑,undo-fu 现已集成到 evil-mode(如果您是 evil-mode 用户)。

      例子:

      (use-package undo-fu)
      (use-package evil
        :init
        (setq evil-undo-system 'undo-fu))
      

      【讨论】:

        【解决方案9】:

        Doom Emacs 用户,我希望您已经滚动到这里或在页面上搜索了“doom”...

        • Doom Emacs 打破了原版 Emacs 重做快捷方式: C-gC-/C-/C-/等(或C-gC-_C-_C-_等) ...而只是不断撤消
        • Doom Emacs also 打破了其他答案之一中提到的撤消树重做快捷方式对 spacemacs 等有用: S-C-/(又名C-?) ...而是引发错误“C-? 未定义”。

        你需要的是:

        • 处于邪恶模式(C-z 切换进入和退出邪恶模式)(在邪恶模式下应该看到蓝色光标,而不是橙色光标)和
        • 处于“命令模式”又名“正常模式”(与“插入模式”相反)(Esc 切换到命令模式)(应该看到块光标,而不是行光标),然后是李>
        • u 用于撤消
        • C-r 用于重做

        【讨论】:

          【解决方案10】:

          如果要重做上一个操作,请执行以下操作。

          1. ESC
          2. 再次撤消 (C + /)

          【讨论】:

            猜你喜欢
            • 2014-10-27
            • 2010-10-16
            • 1970-01-01
            • 1970-01-01
            • 2010-12-10
            • 2012-05-15
            • 1970-01-01
            • 2012-10-14
            • 1970-01-01
            相关资源
            最近更新 更多