在使用Emacs进行“撤消”操作后,您如何“重做”更改?


268

本文说:“ Emacs具有重做功能,因为您可以在撤消操作时反转方向,从而撤消撤消操作”。

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


3
接受的答案下面的答案告诉你如何,如果你为什么要寻找这个答案,其中,由于它是怎么写的那个年代,我希望大多数人实际寻找那。
亚伦·霍尔

我只是按了空格键,然后撤消了操作,然后撤消了空间并重做您所做的撤消操作,直到操作结束,然后又再次返回。简单,这就是我的方向。
2013年

Answers:


294

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

较长版本:

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

  1. 插入“ foo”
  2. 插入“栏”
  3. 插入“我喜欢垃圾邮件”

现在,您撤消。它撤消上一个操作,从而产生以下列表:

  1. 插入“ foo”
  2. 插入“栏”

如果此时您执行的操作不是undo,例如C-f,则操作堆栈如下所示:

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

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

  1. 插入“ foo”
  2. 插入“栏”
  3. 插入“我喜欢垃圾邮件”

如果您执行修改命令以破坏撤消顺序,则该命令将在撤消之后添加,因此是之后要撤消的第一件事。假设你在退格“酒吧”,而不是打击C-f。那你本来有

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

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


117
以防万一这听起来很烦人,主要优点是您始终可以恢复到以前的状态。在大多数编辑器中,撤消几个更改然后不小心键入一个字符将使您“束手无策”,无法重做已撤消的操作。Emacs做到了这一点。
phils 2010年

3
我想在您的结构中,如果有人想在纸上做这件事,则需要两叠。例如,在您写“现在,您要撤消。它撤消了上一个动作的点”上,结果是清单:“(您可以理解)您没有显示撤消操作,并且如果他进行了许多撤消操作,则在完成破坏撤消顺序的操作之前,您不会显示它们,然后添加它们。另一种方式来显示它是将有一个列表,以及索马里发展事务处添加到列表中他们打破那么即使过,但需要注意的地方光标在列表中,所以我们知道那里的索马里发展事务处被向后从工作
barlop

25
听起来很烦人。
费利佩

13
我不知道为什么,当它甚至不告诉你这个答案被接受HOW
亚伦·霍尔

8
可悲的是,这个答案没有提到有关Cg C- /的重做命令。
vishnuprasanth

211

撤销: C-_

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

多次键入 C-_ 以重做已撤消的操作 C-_ 要重复执行emacs命令多次,请执行命令,然后键入C-xz,然后在z键盘上键入多次以重复该命令(当您想多次执行宏时,会很有意思)


4
要重复内容,您也可以使用C-u,例如C-u 8 *(在插入号处插入8 *)。这样您就可以C-u x C-_撤消x个步骤。
Patrick

10
这与原始问题无关,但是在执行完键盘宏(带有C-x e)之后,您可以按e需要多次按以再次执行它。
Christian Berg

7
另外,C-/C-x u是替代撤消键绑定,等效于C-_。我更喜欢,C-/因为它更容易打。
罗里·奥肯

8
警告:当此答案说C-g C-_“将在撤消后重做”时,仅在您首次按下组合时适用。在那之后,重复您的撤消键,不要输入C-g。因此,要撤消后立即重做三遍,请键入C-g C-_ C-_ C-_。如果您键入C-g C-_ C-g C-_ C-g C-_,您将绕圈走动,撤消对撤消的重做...
Rory O'Kane

@ RoryO'Kane我对emacs不太了解,所以请纠正我错的地方,但是鉴于Cg C-_重做后没有任何作用,可能是因为它仅在撤消操作(就像您描述“撤消后重做”一样。)它并不是要在整个圈子中重做撤消或重做操作,而是做任何事情,因为撤消操作不是在撤消之前完成的,所以Cg C- _ Cg C-_在第一个循环之后并没有绕圈走,它实际上什么也没做
。– barlop

56
  • 撤消一次: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 uM-x undo

撤消在Emacs的手册上的Emacs的撤消系统的更多细节。


38

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

我喜欢Emacs的内置撤消系统,但是发现此软件包非常直观。

这是文件本身的注释:

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

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


3
太棒了!谁说emacs撤消是深不可测的?:-)
Peter.O

惊人!从概念上讲声音和用户直观。这应该在默认软件包中。一个评论:我希望从分支点重做时还显示一些警报消息,而不仅是恢复到分支点时。例如,当用户调用重做时:“从分支点重做”或“使用的默认重做分支”-只是提醒用户有多个分支。
巴塞尔Shishani 2014年

1
解决此问题的另一种方法更易于实现,并且不需要可视化工具,它仅保留最后一个分支点,并提供3个命令:撤消,重做,切换分支。撤消/重做将在到达分支时发出警报,如果在分支处,则分支开关将仅在其他分支处发出“不在分支处”消息。如果随时发生分支,则先前的分支点将丢失。这将以最小的复杂度合理地解决状态丢失问题。
巴塞尔Shishani 2014年

1
请注意,重做中存在一个长期存在的错误,该错误可能会随机失败:github.com/syl20bnr/spacemacs/issues/9903-自2014
ideaman42 '17

@ ideasman42显然,这是一个“非虫”:dr-qubit.org/Lost_undo-tree_history.html
Dalker

19

注意重做撤销树怪癖!

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

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

相反,您可以将这些对称密钥用于undo / redo

C-/     undo
C-S-/   redo

这些功能很有用,因为有时您想快速重做而不打开可视化器。


这个。我正在使用Spacemacs,无法弄清楚为什么它对我不起作用。谢谢!
mghaoui

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


redo.el标头中的注释说,它是为XEmacs设计的。在GNU Emacs和其他相关的Emacsen中使用它是否有问题?
A. Levy,2010年

我还没有遇到任何问题,并且我已经使用了至少6个月:)
monotux

4
来自emacswiki.org/emacs/RedoMode:但是,redo.el是过时的,并且经常破坏“ buffer”的内容,因为自“ Emacs 22”以来,“ primitive-undo”的行为与旧行为略有不同。 redo.el的一个分支,并且可以在新版本的Emacs中正常工作。您可以在此处获得RedoPlus:emacswiki.org/emacs/redo+.el
rofrol 2014年

2

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

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

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

1

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

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

0

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

但是,也可以使用Emacs内置的undo来实现重做命令。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.