294

这篇文章说“Emacs 具有重做,因为您可以在撤消时反转方向,从而撤消撤消”。

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

4

10 回答 10

314

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

更长的版本:

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

  1. 插入“富”
  2. 插入“条”
  3. 插入“我喜欢垃圾邮件”

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

  1. 插入“富”
  2. 插入“条”

如果此时您执行除撤消以外的操作 - 比如说 ,C-f操作堆栈如下所示:

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

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

  1. 插入“富”
  2. 插入“条”
  3. 插入“我喜欢垃圾邮件”

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

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

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

于 2010-08-19T23:50:03.090 回答
233

撤销: C-_

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

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

于 2010-08-20T08:19:48.887 回答
67
  • 撤消一次:C-/
  • 要撤消两次:C-/ C-/
  • 在撤消后立即重做一次:C-g C-/
  • 撤消后立即重做两次:C-g C-/ C-/. 注意C-g不重复。
  • 再次立即撤消,一次:C-g C-/
  • 要立即再次撤消,两次:C-g C-/ C-/
  • 重做一遍,同样的……</li>

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

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

undo除了 ,之外的替代快捷键C-/C-_,C-x uM-x undo.

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

于 2013-08-22T14:34:39.957 回答
41

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

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

这是文件本身的评论:

Emacs 有一个强大的撤销系统。与大多数软件中的标准撤消/重做系统不同,它允许您恢复缓冲区的任何过去状态(而标准撤消/重做系统可以在您重做时立即丢失过去的状态)。然而,这种能力是有代价的:许多人发现 Emacs 的撤消系统令人困惑且难以使用,因此产生了许多包,用功能较弱但更直观的撤消/重做系统来代替它。

标准撤消/重做导致的数据丢失,以及 Emacs 撤消的混乱,都源于试图将撤消历史视为更改的线性序列。它不是。这个包提供的 `undo-tree-mode' 将 Emacs 的 undo 系统替换为一个将 undo 历史视为其本质的系统:更改的分支树。这个简单的想法允许将标准撤消/重做系统的更直观的行为与永不丢失任何历史记录的功能相结合。额外的好处是在某些情况下可以更有效地存储撤消历史记录,允许在 Emacs 开始丢弃历史记录之前累积更多更改。

于 2010-08-20T15:42:36.807 回答
24

谨防redo的undo-tree怪癖!

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

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

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

C-/     undo
C-S-/   redo

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

于 2016-03-14T18:50:06.363 回答
12

Emacs 28添加了一个重做命令(称为undo-redo)。

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

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

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

于 2020-02-11T06:19:22.150 回答
11

我发现执行“正常”撤消/重做redo.el非常方便,我通常将其绑定到 CSz 并撤消到 Cz,如下所示:

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

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

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

于 2010-08-20T13:14:41.813 回答
3

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

但是,也可以使用 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))
于 2019-12-14T05:59:07.313 回答
3

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

  • Doom Emacs 打破了原版 Emacs 重做快捷方式: C-g C-/ C-/ C-/等(或C-g C-_ C-_ C-_等)......相反,它只是继续 undoing
  • Doom Emacs破坏了其他答案之一中提到的 undo-tree redo 快捷方式,因为它对 spacemacs 等有用: S-C-/(AKA C-?) ...而是引发错误“C-? 未定义”。

你需要的是:

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

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

  1. ESC
  2. 再次撤消 ( C + /)
于 2019-04-13T07:37:34.780 回答