这篇文章说:"Emacs 有 redo 功能,因为你可以在撤销的同时反向操作,从而撤销撤销。"
这是什么意思?用户如何在 Emacs 中执行“redo”操作?
这篇文章说:"Emacs 有 redo 功能,因为你可以在撤销的同时反向操作,从而撤销撤销。"
这是什么意思?用户如何在 Emacs 中执行“redo”操作?
简短版:通过撤销撤销来实现。如果您进行了撤销操作,并执行了一个非编辑命令,比如C-f,那么下一个撤销将撤销上一个撤销,从而实现重做。
详细版:
您可以将撤销操作视为在操作堆栈上运行。如果您在一系列撤销操作之后执行某个命令(甚至是诸如C-f的导航命令),则所有撤销操作都会被推送到操作堆栈上。因此,下一个撤销将撤销最后执行的命令。假设您有以下操作序列:
现在,您撤销了上一个操作。它会撤销最后一个操作,从而使操作列表变成:
如果此时您执行的不是撤销操作,而是例如C-f,则操作堆栈将如下所示:
此时,当您撤销操作时,第一件被取消的是撤销操作本身。结果,您的原始操作堆栈(以及文档状态)恢复了:
如果您执行修改命令来打破撤销序列,则该命令将添加到撤销操作之后,因此它将是随后要撤销的第一件事情。假设您删除了"bar"而不是按下C-f,那么您将拥有:
这种添加/重新添加的过程会一直持续下去。需要花些时间适应,但它确实为Emacs提供了高度灵活和强大的撤销/重做机制。
撤销操作:C-_
在撤销后恢复操作:C-gC-_
多次按下C-_键来恢复被C-_键撤销的内容。 要多次执行emacs命令,请先执行您的命令,然后输入C-xz,接着多次按下z键来重复该命令(当您想要多次执行宏时很有用)。
C-u
,例如 C-u 8 *
(在插入符号所在位置插入八个 *)。因此,您可以使用 C-u x C-_
撤消 x 步操作。 - PatrickC-x e
),您可以按e
键多次以再次执行该宏。 - Christian BergC-/
和 C-x u
是替代的撤销快捷键,与 C-_
等效。我更喜欢使用 C-/
,因为这更容易操作。 - Rory O'KaneC-g C-_
将会 "在撤销后重做" 时,这仅适用于您第一次按下该组合键的情况。之后,只需重复您的撤销键而不需要 C-g
。因此,要在撤销后连续重做三次,请键入 C-g C-_ C-_ C-_
。如果您键入 C-g C-_ C-g C-_ C-g C-_
,则将陷入死循环,即撤消您对撤销的重做... - Rory O'KaneC-/
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-/
来到达。
除了C-/之外,撤销操作的其他备选快捷键包括C-_、C-x u和M-x undo。
有关Emacs撤销系统的更多细节,请参阅Emacs手册中的Undo。
如果你想要更常见的撤销/恢复功能,有人编写了undo-tree.el
。它提供了非Emacs中撤销的外观和感觉,但提供了对整个撤销历史'树'的访问。
我喜欢Emacs内置的撤销系统,但发现这个包非常直观。
以下是文件本身的评论:
Emacs有强大的撤销系统。 与大多数软件中标准的撤销/重做系统不同, 它允许您恢复缓冲区的任何过去状态 (而标准的撤销/重做系统可以在您 重做时丢失过去状态)。然而,这种力量 代价是: 许多人发现Emacs的撤销 系统令人困惑和难以使用,导致一些软件包 将其替换为没有这么强大但更直观的撤销/重做系统。
标准撤销/重做中数据的损失, 以及Emacs的撤销中的混乱,都源于 尝试将撤销历史视为线性序列的更改。 它不是线性的。这个包提供的 `undo-tree-mode' 将Emacs的撤销系统 替换为将撤销历史记录视为分支树形式的系统。 这个简单的想法允许标准撤销/重做系统 更直观的行为与永远不会丢失任何历史的强大相结合。 另一个附加优势是,撤销历史在某些情况下 可以存储更高效,允许Emacs在开始丢弃历史之前累积更多的更改。
警惕一个对于redo的 undo-tree 的怪癖!
许多受欢迎的“入门套件”(prelude、purcell、spacemacs)都预装了undo-tree。大多数甚至自动启用它。如前所述,undo-tree是一种方便的方式来可视化和遍历撤消/重做树。Prelude甚至给它提供了一个键触组合(uu
),同时还有C-x u
。
问题是:undo-tree似乎破坏了Emacs默认的且广为人知的绑定方式redo: C-g C-/
。
相反,你可以使用这些对称的按键进行撤销/重做操作:
C-/ undo
C-S-/ redo
这些很有用,因为有时候你想要快速地重新执行而不需要打开可视化工具。
我发现redo.el
非常方便,可以用于执行“常规”撤销/重做操作。我通常将其绑定到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
中即可。
M-_
。 - supercheetah默认情况下,Emacs 中的重做操作需要按下 C-g,然后再执行撤消操作。
但是使用 Emacs 内置的撤消功能也可以实现重做命令。
包 undo-fu 使用 Emacs 内置的撤消功能来同时提供撤消和重做。
编辑:现在,undo-fu 已经集成到了 evil-mode 中(如果您是evil-mode用户)。
示例:
(use-package undo-fu)
(use-package evil
:init
(setq evil-undo-system 'undo-fu))
ESC
键C + /
)