这篇文章说“Emacs 具有重做,因为您可以在撤消时反转方向,从而撤消撤消”。
这是什么意思?用户如何使用 Emacs “重做”?
短版:通过撤消撤消。如果撤消,然后执行非编辑命令,例如C-f,则下一个撤消将撤消撤消,从而导致重做。
更长的版本:
您可以将撤消视为对操作堆栈的操作。如果C-f在一系列撤消操作之后执行某些命令(甚至是导航命令,例如 ),所有撤消操作都会被推送到操作堆栈。所以下一个撤消撤消最后一个命令。假设您确实有一个如下所示的操作序列:
现在,您撤消。它撤消最后一个操作,产生以下列表:
如果此时您执行除撤消以外的操作 - 比如说 ,C-f操作堆栈如下所示:
现在,当您撤消时,要撤消的第一件事就是撤消。导致您的原始堆栈(和文档状态):
如果您执行修改命令来中断撤消序列,则该命令将添加到撤消之后,因此是之后要撤消的第一件事。假设您在“bar”上退格而不是点击C-f. 那么你会有
这种添加/重新添加会无限发生。这需要一点时间来适应,但它确实为 Emacs 提供了一种高度灵活且强大的撤消/重做机制。
撤销: C-_
撤消后重做: C-g C-_
多次键入 C-_ 以重做已被撤消的内容 C-_ 要多次重做 emacs 命令,请执行您的命令,然后键入C-xz,然后在键上多次z键入以重复该命令(当您想多次执行宏时很有趣)
C-/
C-/
C-/
C-g
C-/
C-g
C-/
C-/
. 注意C-g
不重复。C-g
C-/
C-g
C-/
C-/
如果您在上次撤消命令后按下了任何键(无论是键入字符还是只是移动光标),则无需C-g
在下一次撤消/重做之前键入。C-g
只是一个安全的键,它本身什么都不做,但算作一个非撤消键,表示撤消序列的结束。按下另一个命令C-f
也可以;只是它会将光标从您拥有的位置移动。
如果您在C-g
无意中按了或其他命令,而您现在正在以错误的方向撤消,只需C-g
再次按即可反转您的方向。在达到你想要的撤销之前,你将不得不通过你的意外重做和撤销一路撤销,但是如果你只是继续点击C-/
,你最终会达到你想要的状态。C-g
事实上,如果你点击一次然后按下C-/
足够多的次数,缓冲区曾经处于的每个状态都是可以访问的。
undo
除了 ,之外的替代快捷键C-/
是C-_
,C-x u
和M-x
undo
.
有关Emacs撤消系统的更多详细信息,请参阅 Emacs 手册中的撤消。
对于那些想要拥有更常见的撤消/重做功能的人,有人编写了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
这些很有用,因为有时您想在不打开可视化工具的情况下快速重做。
我发现执行“正常”撤消/重做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
.
默认情况下,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”...
C-g
C-/
C-/
C-/
等(或C-g
C-_
C-_
C-_
等)......相反,它只是继续 undoing。S-C-/
(AKA C-?
) ...而是引发错误“C-? 未定义”。你需要的是:
C-z
切换进入和退出邪恶模式)(在邪恶模式下应该看到蓝色光标,而不是橙色光标)和Esc
切换到命令模式)(应该看到块光标,而不是行光标),然后是u
撤消和C-r
重做如果要重做上一个操作,请执行以下操作。
ESC
C + /
)