Answers:
简短版本:通过撤消撤消。如果您撤消,然后执行一个非编辑命令,例如C-f,则下一次撤消将撤消撤消,从而导致重做。
较长版本:
您可以将undo视为对一堆操作的操作。如果C-f在一系列撤消操作之后执行某些命令(甚至是诸如的导航命令),则所有撤消都将推入操作堆栈。因此,下一次撤消将撤消最后一个命令。假设您的操作序列如下所示:
现在,您撤消。它撤消上一个操作,从而产生以下列表:
如果此时您执行的操作不是undo,例如C-f,则操作堆栈如下所示:
现在,当您撤消操作时,撤消的第一件事就是撤消。产生原始堆栈(和文档状态):
如果您执行修改命令以破坏撤消顺序,则该命令将在撤消之后添加,因此是之后要撤消的第一件事。假设你在退格“酒吧”,而不是打击C-f。那你本来有
这种添加/重新添加是无限的。这需要一点时间来适应,但实际上确实为Emacs提供了高度灵活和强大的撤消/重做机制。
撤销: C-_
撤消后要重做: C-g C-_
多次键入 C-_ 以重做已撤消的操作 C-_ 要重复执行emacs命令多次,请执行命令,然后键入C-xz,然后在z键盘上键入多次以重复该命令(当您想多次执行宏时,会很有意思)
C-u
,例如C-u 8 *
(在插入号处插入8 *)。这样您就可以C-u x C-_
撤消x个步骤。
C-x e
)之后,您可以按e
需要多次按以再次执行它。
C-/
和C-x u
是替代撤消键绑定,等效于C-_
。我更喜欢,C-/
因为它更容易打。
C-g C-_
“将在撤消后重做”时,仅在您首次按下组合时适用。在那之后,重复您的撤消键,不要输入C-g
。因此,要撤消后立即重做三遍,请键入C-g C-_ C-_ C-_
。如果您键入C-g C-_ C-g C-_ C-g C-_
,您将绕圈走动,撤消对撤消的重做...
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的内置撤消系统,但是发现此软件包非常直观。
这是文件本身的注释:
Emacs具有强大的撤消系统。与大多数软件中的标准撤消/重做系统不同,它允许您恢复任何缓冲区的过去状态(而标准撤消/重做系统在您重做后可能会丢失过去的状态)。但是,这种功能是有代价的:许多人发现Emacs的撤消系统令人困惑且难以使用,产生了许多软件包,用功能更弱但更直观的撤消/重做系统代替了它。
标准撤消/重做导致的数据丢失,以及Emacs撤消的混乱,都源于试图将撤消历史视为线性的变化序列。不是。该软件包提供的'undo-tree-mode'替换了Emacs的undo系统,该系统将撤消历史视为原样:更改的分支树。这个简单的想法可以将标准撤消/重做系统的更直观的行为与永不丢失任何历史记录的强大功能相结合。附加的好处是,在某些情况下,撤消历史记录可以更有效地存储,从而允许在Emacs开始丢弃历史记录之前积累更多的更改。
我发现执行“正常”撤消/重做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
。