如何在Emacs“撤销”之后“重做”更改?

这篇文章说“Emacs有重做,因为你可以撤消方向,因此撤消撤消方向”。

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

短版本:通过撤销撤消。 如果撤销,然后执行一个非编辑命令(如Cf) ,则下一个撤销将撤消撤消,导致重做。

更长的版本:

您可以将撤消视为在一堆操作上进行操作。 如果在一系列撤销操作之后执行一些命令(甚至是Cf等导航命令),则所有的撤消操作都将被推送到操作堆栈。 所以下一个撤消撤消最后一个命令。 假设你有一个如下的操作序列:

  1. 插入“foo”
  2. 插入“栏”
  3. 插入“我爱垃圾邮​​件”

现在,你撤消。 它解除了最后一个操作,导致以下列表:

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

如果你在这一点上做了一些除了撤销之外的事情 – 比如说Cf ,操作堆栈看起来像这样:

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

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

  1. 插入“foo”
  2. 插入“栏”
  3. 插入“我爱垃圾邮​​件”

如果执行修改命令来中断撤销序列,那么该命令将在撤消之后添加,因此是之后要撤消的第一件事情。 假设你用“bar”而不是Cf来代替。 那么你会有

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

这个添加/重新添加是无限的。 它需要一点点习惯,但它确实给了Emacs一个高​​度灵活和强大的撤销/重做机制。

撤消: C-_

撤销后重做: Cg C-_

C-_上多次input以重做C-_已经撤销的内容重复执行多次emacs命令,执行命令,然后inputCx z ,然后在z键上多次input重复命令(当你想要执行多次macros)

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

我喜欢Emacs的内置撤销系统,但是find这个包非常直观。

以下是文件本身的评论:

Emacs有一个强大的撤销系统。 与大多数软件中的标准撤消/重做系统不同,它允许你恢复缓冲区的任何过去状态(而标准撤销/重做系统只要你重做就可以丢失过去的状态)。 然而,这种能力是有代价的:许多人发现Emacs的撤消系统令人困惑,而且很难使用,产生了一些用不那么强大但更直观的撤销/重做系统取代它的软件包。

使用标准的撤消/重做来丢失数据,以及Emacs撤消的混淆,都是因为试图将撤销历史视为一系列线性变化。 不是。 这个包提供的`undo-tree-mode'将Emacs的撤销系统replace为一个系统,该系统将撤销历史视为一个变化的分支树。 这个简单的想法允许标准的撤销/重做系统的更直观的行为与永不丢失任何历史的力量相结合。 另外一个好处就是在某些情况下可以更有效地存储撤消历史logging,在Emacs开始丢弃历史logging之前允许更多的更改累积。

  • 撤消一次: C-/
  • 要撤销两次: C-/ C-/
  • 重做一次后,立即撤消: Cg C-/
  • 重做两次,立即撤消后: Cg C-/ C-/ 。 请注意, Cg不会重复。
  • 立即再次 撤消一次: Cg C-/
  • 立即再次撤消,两次: Cg C-/ C-/
  • 重做 ,相同…

如果自上次撤销命令以来按下了任何键(无论是input字符还是只是移动光标),则在下次撤销/重做之前不需要键入CgCg只是一个安全的按键,它自己不做任何事情,而是作为一个不可撤消的键来表示撤销序列的结束。 按另一个命令如Cf也可以; 只是它将光标从你所在的位置移开。

如果你不打算按Cg或其他命令,而你现在正在以错误的方向撤消,只需点击Cg即可再次改变方向。 在到达所需的undos之前,您将不得不一直通过意外的重做和撤消操作,但是如果您只是一直按住C-/ ,您将最终达到您想要的状态。 事实上,缓冲区所处的每个状态都是可达的,如果你点击Cg一次,然后按C-/足够的次数。

C-/ ,用于undo替代快捷方式是C-_Cx uMx undo

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

小心一个撤销树怪癖重做

许多stream行的“入门套件”(prelude,purcell,spacemacs)都与undo-tree捆绑在一起。 大多数(全部?)甚至自动启用它。 如前所述,撤销树是可视化和遍历撤销/重做树的一种便捷方式。 前奏甚至给它一个和弦( uu ),还有Cx u

问题是: undo-tree似乎破坏了Emacs默认和已知的重做绑定: Cg C-/

相反,您可以使用这些对称密钥进行撤销/重做

 C-/ undo CS-/ redo 

这些是有用的,因为有时你想快速重做,而不打开可视化。

我发现redo.el用于做“正常的”撤销/重做非常方便 ,我通常将它绑定到CSz并撤销到Cz,如下所示:

 (when (require 'redo nil 'noerror) (global-set-key (kbd "CSz") 'redo)) (global-set-key (kbd "Cz") 'undo) 

只需下载该文件,将其放在您的lisppath中,并将上述内容粘贴到.emacs