这篇文章说“Emacs有重做,因为你可以在撤销的时候反转方向,从而撤销撤销”。

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


当前回答

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

长版:

您可以将撤消看作是对操作堆栈的操作。如果在一系列撤销操作之后执行某些命令(甚至是C-f之类的导航命令),则所有的撤销操作都将被推入操作堆栈。因此,下一个undo命令将撤销上一个命令。假设你确实有一个这样的操作序列:

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。

现在,撤销。它将撤销最后一个操作,结果是以下列表:

插入“foo” 插入“酒吧”

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

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。 撤销插入“我爱垃圾邮件”

当你撤消时,首先要撤消的是撤消。导致您的原始堆栈(和文档状态):

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。

如果您执行一个修改命令来打破undo序列,则该命令被添加在undo之后,因此是之后要撤消的第一件事。假设你在bar上倒空,而不是在C-f上。那么你就有了

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。 撤销插入“我爱垃圾邮件” 删除“酒吧”

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

其他回答

取消一次:C-/ 取消两次:C-/ C-/

在撤消后立即重做一次:C-g C-/ 取消后立即重做两次:C-g C-/ C-/。注意C-g没有重复。

再次立即撤销一次:C-g C-/ 再次立即撤销,两次:C-g C-/ C-/

重做一次,同样的…

如果您在上一次执行undo命令后按了任何键(无论是键入字符还是只是移动光标),那么在执行下一次撤销/重做命令之前,不需要键入C-g。C-g只是一个安全的键,它本身没有任何作用,但可以作为一个非撤消键来表示撤消序列的结束。按另一个命令,如C-f也可以;它只是将光标从你的位置移动。

如果你在无意中按了C-g或其他命令,而你现在正在错误的方向上撤销,只需按C-g就可以再次逆转你的方向。在你到达你想要的撤销之前,你将不得不在所有偶然的重做和撤销中撤销,但如果你只是继续按C-/,你最终会到达你想要的状态。事实上,如果你按C-g一次,然后按C-/足够多次,缓冲区曾经处于的每个状态都是可以到达的。

除了C-/,还有C-_、C-x u和M-x undo。

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

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

长版:

您可以将撤消看作是对操作堆栈的操作。如果在一系列撤销操作之后执行某些命令(甚至是C-f之类的导航命令),则所有的撤销操作都将被推入操作堆栈。因此,下一个undo命令将撤销上一个命令。假设你确实有一个这样的操作序列:

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。

现在,撤销。它将撤销最后一个操作,结果是以下列表:

插入“foo” 插入“酒吧”

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

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。 撤销插入“我爱垃圾邮件”

当你撤消时,首先要撤消的是撤消。导致您的原始堆栈(和文档状态):

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。

如果您执行一个修改命令来打破undo序列,则该命令被添加在undo之后,因此是之后要撤消的第一件事。假设你在bar上倒空,而不是在C-f上。那么你就有了

插入“foo” 插入“酒吧” 我喜欢垃圾邮件。 撤销插入“我爱垃圾邮件” 删除“酒吧”

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

如果您需要重做上次的操作,请执行以下操作。

ESC 执行另一个撤销(C + /)

撤消:C-_

撤销后重做:C-g C-_

在C-_上多次输入以重做被C-_撤消的内容 若要多次重做emacs命令,请执行命令,然后键入C-xz,然后在z键上键入多次以重复该命令(当您想多次执行一个宏时很有趣)

我找到了重做。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中。