如何在Emacs“撤销”之后“重做”更改?
这篇文章说“Emacs有重做,因为你可以撤消方向,因此撤消撤消方向”。
这是什么意思? 用户如何重做Emacs?
短版本:通过撤销撤消。 如果撤销,然后执行一个非编辑命令(如Cf) ,则下一个撤销将撤消撤消,导致重做。
更长的版本:
您可以将撤消视为在一堆操作上进行操作。 如果在一系列撤销操作之后执行一些命令(甚至是Cf等导航命令),则所有的撤消操作都将被推送到操作堆栈。 所以下一个撤消撤消最后一个命令。 假设你有一个如下的操作序列:
- 插入“foo”
- 插入“栏”
- 插入“我爱垃圾邮件”
现在,你撤消。 它解除了最后一个操作,导致以下列表:
- 插入“foo”
- 插入“栏”
如果你在这一点上做了一些除了撤销之外的事情 – 比如说Cf ,操作堆栈看起来像这样:
- 插入“foo”
- 插入“栏”
- 插入“我爱垃圾邮件”
- 撤消插入“我爱垃圾邮件”
现在,当你撤消时,撤消的第一件事就是撤消。 导致您的原始堆栈(和文档状态):
- 插入“foo”
- 插入“栏”
- 插入“我爱垃圾邮件”
如果执行修改命令来中断撤销序列,那么该命令将在撤消之后添加,因此是之后要撤消的第一件事情。 假设你用“bar”而不是Cf来代替。 那么你会有
- 插入“foo”
- 插入“栏”
- 插入“我爱垃圾邮件”
- 撤消插入“我爱垃圾邮件”
- 删除“栏”
这个添加/重新添加是无限的。 它需要一点点习惯,但它确实给了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字符还是只是移动光标),则在下次撤销/重做之前不需要键入Cg
。 Cg
只是一个安全的按键,它自己不做任何事情,而是作为一个不可撤消的键来表示撤销序列的结束。 按另一个命令如Cf
也可以; 只是它将光标从你所在的位置移开。
如果你不打算按Cg
或其他命令,而你现在正在以错误的方向撤消,只需点击Cg
即可再次改变方向。 在到达所需的undos之前,您将不得不一直通过意外的重做和撤消操作,但是如果您只是一直按住C-/
,您将最终达到您想要的状态。 事实上,缓冲区所处的每个状态都是可达的,如果你点击Cg
一次,然后按C-/
足够的次数。
除C-/
,用于undo
替代快捷方式是C-_
, Cx u
和Mx
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
。