使用Emacs“撤消”后,如何“重做”更改?

时间:2010-08-19 23:41:14

标签: emacs undo-redo

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

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

10 个答案:

答案 0 :(得分:278)

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

更长的版本:

您可以将undo视为在一堆操作上运行。如果在一系列撤消操作之后执行某些命令(甚至是诸如 C-f 之类的导航命令),则所有撤消操作都将被推送到操作堆栈。所以下一个撤消撤消最后一个命令。假设您的操作序列如下所示:

  1. 插入“foo”
  2. 插入“bar”
  3. 插入“我爱垃圾邮​​件”
  4. 现在,您撤消。它取消了最后一个动作,产生以下列表:

    1. 插入“foo”
    2. 插入“bar”
    3. 如果你在此时做了除撤消以外的事情 - 比如 C-f ,操作堆栈如下所示:

      1. 插入“foo”
      2. 插入“bar”
      3. 插入“我爱垃圾邮​​件”
      4. 撤消插入“我爱垃圾邮​​件”
      5. 现在,当您撤消时,撤消的第一件事是撤消。导致原始堆栈(和文档状态):

        1. 插入“foo”
        2. 插入“bar”
        3. 插入“我爱垃圾邮​​件”
        4. 如果执行修改命令来中断撤销序列,则在撤消后添加该命令,这是之后要撤消的第一件事。假设您在“bar”上退格,而不是按 C-f 。然后你会有

          1. 插入“foo”
          2. 插入“bar”
          3. 插入“我爱垃圾邮​​件”
          4. 撤消插入“我爱垃圾邮​​件”
          5. 删除“bar”
          6. 这种添加/重新添加无限期地发生。它需要一点点习惯,但它确实为Emacs提供了一个高度灵活和强大的撤销/重做机制。

答案 1 :(得分:202)

撤消: C-_

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

C-_ 上多次键入以重做 C-_ 撤消的内容 要多次重做emacs命令,请执行命令,然后键入 Cx z ,然后在 z 键上多次键入以重复命令(有趣的是当你想多次执行宏时)

答案 2 :(得分:46)

  • 撤消一次:C-/
  • 要撤消两次:C-/ C-/
  • 撤消后立即重做C-g C-/
  • 要在撤消后立即重做两次:C-g C-/ C-/。请注意,C-g不会重复。
  • 立即撤消 ,一次:C-g C-/
  • 要立即再次撤消,请两次:C-g C-/ C-/
  • 再次重做,同样......

如果您在上次撤消命令后按下任何键(无论是键入字符还是只是移动光标),则无需在下次撤消/重做之前键入C-gC-g只是一个安全的击键,它本身不会做任何事情,但算作一个非撤销键来表示撤消序列的结束。按下C-f等其他命令也会起作用;它只是将光标移动到你拥有它的位置。

如果您在不想要的时候点击C-g或其他命令,并且您现在正在向错误的方向撤消,只需按C-g再次反转您的指示即可。在你到达你想要的音乐之前,你必须通过偶然的重做和音乐撤消,但如果你只是按下C-/,你最终会达到你想要的状态。实际上,如果您点击C-g一次,然后按C-/足够的次数,则可以访问缓冲区所处的每个状态。

undo之外的C-/的替代快捷方式为C-_C-x uM-x undo

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

答案 3 :(得分:37)

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

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

以下是文件本身的评论:

  

Emacs有一个强大的撤销系统。   与标准的撤销/重做系统不同   在大多数软件中,它允许您   恢复缓冲区的任何过去状态   (而标准的撤销/重做系统   你可以尽快失去过去的州   重做)。然而,这种力量来自于   价格:很多人发现Emacs的撤消   系统混乱且难以使用,   产生了许多包   用不那么强大的东西代替它   更直观的撤销/重做系统。

     

标准数据丢失   撤消/重做,以及Emacs的混乱   撤消,源于试图对待撤消   历史作为线性序列   变化。不是。该   `undo-tree-mode'由此提供   package取代了Emacs的撤消系统   使用处理撤消历史记录的系统   它是什么:一个分支树   变化。这个简单的想法允许   更直观的行为   标准的撤销/重做系统   结合从不的力量   失去任何历史。另外一面   奖金是撤销历史可以在一些   案件存储更有效,   允许更多的变化积累   在Emacs开始丢弃之前   历史。

答案 4 :(得分:15)

谨防重做undo-tree怪癖!

许多流行的“入门套件”(前奏,purcell,spacemacs)与undo-tree捆绑在一起。大多数(全部?)甚至自动启用它。如上所述,undo-tree是一种可视化和遍历撤销/重做树的方便方法。 Prelude甚至为它提供了一个和弦(float: right),还有uu

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

相反,您可以使用这些对称键进行撤消/重做

C-g C-/

这些非常有用,因为有时您需要快速重做而无需打开可视化工具。

答案 5 :(得分:10)

我发现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路径并将上述内容粘贴到.emacs

答案 6 :(得分:3)

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

如果要进行更典型的撤消/重做,可以使用以下命令。

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

答案 7 :(得分:0)

如果要撤消上一个操作,请执行以下操作。

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

答案 8 :(得分:0)

默认情况下,要在emacs中重做,请先按C-g,然后再撤消。

不过,也可以使用emacs内置的undo来实现重做命令。

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

答案 9 :(得分:0)

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

  • Doom Emacs 打破了普通的 Emacs 重做快捷方式: C-g C-/ C-/ C-/ 等(或 C-g C-_ C-_ C-_ 等) ...相反,只是不断地撤消
  • Doom Emacs 打破了其他答案之一中提到的撤销树重做快捷方式,因为它对 spacemacs 等很有用: S-C-/(又名C-?) ...相反,这会引发错误“C-? 未定义”。

你需要的是:

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