Emacs中是否有“重复上一个命令”的功能?

158

经常有这样的情况,我翻阅apropos和文档寻找像下面这样的内容,但最终放弃回到手头的任务:

(重复上一个命令)

执行我刚刚执行的最后一个C-或M-命令(重新绑定到fn键)

或者有时是相关的:

(描述最后一个函数)

我刚刚误按了哪个按键,它的效果想要加入我的技巧袋中。describe-key很接近,但需要知道我输入了什么。

我的忠实助手可能只是无法满足我的要求吗?


3
C-x z 代表 (repeat),C-x M-z 代表 (repeat-complex-command)。另外还有一个命令是 (repeat-matching-complex-command) - Hatshepsut
10个回答

175

repeat.el Emacs Lisp软件包提供了重复功能,是标准的Emacs发行版中包含的。根据 repeat.el 文档:

该软件包定义了一个命令,可以重复执行先前执行的命令(无论是什么),包括其参数(如果有的话)。 这个命令连接到键 C-x z。 要再次执行上一个命令,请按 C-x z。要立即再次执行它,请仅键入z。通过一遍又一遍地键入z,可以重复执行该命令。

要查看关于重复命令的其他信息,请在Emacs中键入 C-h F repeat RET


172

重复上一个命令

C-xz

按下该组合键后,再次仅需按下z即可重复执行上一个命令(无需再次按下C-x)。


正如我所预期的那样。 - Vasantha Ganesh

88

是的,有一个repeat命令。它叫repeat:

  • 你可以使用C-x z重复命令,并按z键保持重复。

有点令人震惊的是没有人提到repeat-complex-command,可以通过按键绑定C-x ESC ESC使用。


3
类似于 M-x M-p,但 repeat-complex-command 会重复之前的参数。 - Yoo
6
同样在C-x M-:命令中(提示:类似于M-:,但elisp表达式已经填写好了)。 - phils
7
确实令人震惊。在我看来,被采纳的答案并不是最好的答案(但提问者显然认为它最符合她的问题)。对我而言,这个答案最接近所问的内容(重复上一个命令)。而repeat.el 提供的可能性则排名第二。关于第二个问题,即最后按下了哪些按键,最佳答案是 C-h lview-lossage)。我认为,describe-last-command 命令用处不大。 - Drew
你也可以将 C-x M-: 作为键盘宏的一部分来使用,这会非常方便。默认的 repeat-complex-command 绑定在键入多次时有点太麻烦了。 - remcycles

64

关于'describe-last-function':

有一个变量last-command,它被设置为代表您上次执行的操作的符号。因此,这段elisp代码 - (describe-function last-command) - 应该会显示刚刚发生的操作的文档。

因此,您可以像这样轻松地创建一个有效的describe-last-function函数:

(defun describe-last-function() 
  (interactive) 
  (describe-function last-command))

将elisp放入.emacs或等效位置后,您将拥有M-x describe-last-function

如果您已经敲击了几个键或执行了一些修改last-command的操作,那么command-history函数可能会引起您的兴趣。您可以通过M-x command-history获取它。


24

此外,M-x view-lossage 可以显示你最近输入的一百个(?)按键。所以,你可以看到命令输入的位置。这是我用过的方法,直到刚才才发现 M-x command-history ,我现在想要使用它和 C-h w


18

我不是很确定,但也许你正在寻找这个?

  

命令 C-xz (repeat) 提供了另一种重复执行Emacs命令的方式。该命令会重复执行上一个Emacs命令,无论那个命令是什么。重复执行命令时会使用之前使用的相同参数,而不是每次都读取新参数。

Emacs 手册,8.11 重复执行命令


2
正如 Johannes Schaub 所指出的那样,随后再次单独按下 z 将继续重复。 - phils

9
也许这也有所帮助... 从Emacs帮助中的verbatim部分:
C-x M-ESC runs the command repeat-complex-command
  which is an interactive compiled Lisp function in `simple.el'.
It is bound to <again>, <redo>, C-x M-:, C-x M-ESC.
(repeat-complex-command ARG)

Edit and re-evaluate last complex command, or ARGth from last.
A complex command is one which used the minibuffer.
The command is placed in the minibuffer as a Lisp form for editing.
The result is executed, repeating the command as changed.
If the command has been changed or is not the most recent previous command
it is added to the front of the command history.
You can use the minibuffer history commands M-n and M-p
to get different commands to edit and resubmit.

4

个人认为Sebastian的想法很有用。这里是一个可工作的版本。

(global-set-key "\C-r" #'(lambda () (interactive)
                                 (eval (car command-history))))

2
考虑到 isearchisearch-backward 是重要的导航命令,而后者默认绑定到 <kbd>C-r</kbd>,我们可能可以为 repeat-command 找到更好的绑定。在 Mac 上,我建议使用 Command(super)-Y,因为一些应用程序已经约定将其作为“撤消”的相反操作。 - Brighid McDonnell

1

这篇文章虽然有点旧,但是当我在寻找如何检索Emacs提示符下最后一条命令时,谷歌搜索结果把它排在了第一位。然而,这些答案对我都不起作用,所以我想为那些像我一样后来者提供自己的经验。我使用的是Portacle,但是我在这里找到了我需要的内容,希望它足够通用以适用于不同的设置。无论如何,对我有效的方法是使用C-↑C-↓来循环浏览历史记录。使用M-pM-n也可以,但是由于我经常使用Bash,所以更喜欢使用箭头。


0

点操作是一种重复最后的命令的方式。

根据其评论:

它模拟了vi的“重做”命令,重复前面的命令序列。 这是通过记录改变缓冲区的输入命令来完成的,即非动作命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接