This article 说“Emacs 具有重做,因为您可以在撤消时反转方向,从而撤消撤消”。
这是什么意思?用户如何使用 Emacs “重做”?
短版:通过撤消撤消。如果您撤消,然后执行 Cf 等非编辑命令,则下一个撤消将撤消撤消,从而导致重做。
更长的版本:
您可以将撤消视为对操作堆栈的操作。如果您在一系列撤消操作之后执行某个命令(甚至是诸如 Cf 之类的导航命令),则所有撤消操作都会被推送到操作堆栈中。所以下一个撤消撤消最后一个命令。假设您确实有一个如下所示的操作序列:
插入“foo”插入“bar”插入“我爱垃圾邮件”
现在,您撤消。它撤消最后一个操作,产生以下列表:
插入“foo” 插入“bar”
如果此时您执行除撤消以外的其他操作 - 比如说 Cf,操作堆栈将如下所示:
插入“foo”插入“bar”插入“我爱垃圾邮件”撤消插入“我爱垃圾邮件”
现在,当您撤消时,要撤消的第一件事就是撤消。导致您的原始堆栈(和文档状态):
插入“foo”插入“bar”插入“我爱垃圾邮件”
如果您执行修改命令来中断撤消序列,则该命令将添加到撤消之后,因此是之后要撤消的第一件事。假设您在“bar”上退格而不是点击 Cf。那么你会有
插入“foo” 插入“bar” 插入“我爱垃圾邮件” 撤消插入“我爱垃圾邮件” 删除“bar”
这种添加/重新添加会无限发生。这需要一点时间来适应,但它确实为 Emacs 提供了一种高度灵活且强大的撤消/重做机制。
撤消:C-_
撤消后重做:Cg C-_
在 C-_ 上键入多次以重做 C-_ 已撤消的内容要多次重做 emacs 命令,执行您的命令,然后键入 C-xz,然后在 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-_
,您将绕圈子,撤消您的重做...
撤消一次:C-/
要撤消两次:C-/ C-/
撤消后立即重做一次:Cg C-/
在撤消后立即重做两次:Cg C-/ C-/。请注意,Cg 没有重复。
要立即再次撤消,一次:Cg C-/
再次立即撤消,两次:Cg C-/ C-/
重做一遍,同样的……
如果您在上次撤消命令后按下了任何键(无论是键入字符还是只是移动光标),则无需在下一次撤消/重做之前键入 C-g
。 C-g
只是一个安全的键,它本身什么都不做,但算作一个非撤消键,表示撤消序列的结束。按 C-f
之类的另一个命令也可以;只是它会将光标从您拥有的位置移动。
如果您无意中按了 C-g
或其他命令,而您现在以错误的方向撤消,只需按 C-g
即可再次反转您的方向。您必须一直撤消意外重做和撤消,然后才能进行所需的撤消,但如果您一直按 C-/
,您最终将达到您想要的状态。事实上,如果您点击 C-g
一次然后按 C-/
足够多次,则缓冲区曾经处于的每个状态都是可访问的。
C-/
之外的 undo
的替代快捷方式是 C-_
、C-x u
和 M-x
undo
。
有关 Emacs 撤消系统的更多详细信息,请参阅 Emacs 手册中的 Undo。
对于那些想要拥有更常见的撤消/重做功能的人,有人编写了 undo-tree.el
。它提供了非 Emacs 撤消的外观和感觉,但提供了对撤消历史的整个“树”的访问。
我喜欢 Emacs 内置的 undo 系统,但发现这个包非常直观。
这是文件本身的评论:
Emacs 有一个强大的撤销系统。与大多数软件中的标准撤消/重做系统不同,它允许您恢复缓冲区的任何过去状态(而标准撤消/重做系统可以在您重做时立即丢失过去的状态)。然而,这种能力是有代价的:许多人发现 Emacs 的撤消系统令人困惑且难以使用,因此产生了许多包,用功能较弱但更直观的撤消/重做系统来代替它。标准撤消/重做导致的数据丢失,以及 Emacs 撤消的混乱,都源于试图将撤消历史视为更改的线性序列。它不是。这个包提供的 `undo-tree-mode' 将 Emacs 的 undo 系统替换为一个将 undo 历史视为其本质的系统:更改的分支树。这个简单的想法允许将标准撤消/重做系统的更直观的行为与永不丢失任何历史记录的功能相结合。额外的好处是在某些情况下可以更有效地存储撤消历史记录,从而允许在 Emacs 开始丢弃历史记录之前累积更多更改。
当心 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
这些很有用,因为有时您想在不打开可视化工具的情况下快速重做。
Emacs 28 adds a redo 命令(称为 undo-redo
)。
如果您想要更典型的撤消/重做,可以使用以下命令。
(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)
要访问此功能(也可以使用非线性历史记录,请参阅 undo-fu,它是内置撤消的 emacs 的精简包装器)。
我发现 redo.el
extremly handy 用于执行“正常”撤消/重做,我通常将其绑定到 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
中。
M-_
。
默认情况下,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))
Doom Emacs 用户,我希望你已经滚动到这里或者在页面上搜索了“doom”...
Doom Emacs 打破了原版 Emacs 重做快捷方式:Cg C-/ C-/ C-/ 等(或 Cg C-_ C-_ C-_ 等)...相反,它只是不断撤消。
Doom Emacs 还破坏了其他答案之一中提到的撤消树重做快捷方式,因为它对 spacemacs 等有用:SC-/ (AKA C-?) ...而是引发错误“C-? 未定义” .
你需要的是:
处于邪恶模式(Cz 切换进入和退出邪恶模式)(在邪恶模式下应该看到蓝色光标,而不是橙色光标)和
处于“命令模式”又名“正常模式”(与“插入模式”相反)(Esc 切换到命令模式)(应该看到块光标,而不是行光标),然后是
用于撤消和
重做 Cr
undo-fu-only-redo
。
如果要重做上一个操作,请执行以下操作。
ESC 执行另一个撤消 (C + /)
在 doom emacs 中,
Ctrl + Shift + -
撤消
Alt + Shift + -
重做
不定期副业成功案例分享