ChatGPT解决这个技术问题 Extra ChatGPT

Emacs 中有 (repeat-last-command) 吗?

我经常深入研究 apropos 和 docs 寻找类似以下内容的内容,只是为了放弃手头的任务:

(重复最后一个命令)

执行我刚刚执行的最后一个 C- 或 M- 命令(要反弹到 fn 键)

或者有时是相关的:

(描述最后一个功能)

我刚刚错误地发出了什么击键,我想将其效果添加到我的技巧包中。 describe-key 很接近,但需要知道我输入了什么。

我只是对我可信赖的伙伴要求太多了吗?

Cx z (repeat) 和 Cx Mz (repeat-complex-command)。另见(repeat-matching-complex-command)

E
Emerick Rogul

重复功能由 repeat.el Emacs Lisp 包提供,该包包含在标准 Emacs 发行版中。来自 repeat.el 的文档:

这个包定义了一个重复前面命令的命令,不管是什么,包括它的参数,不管它们是什么。此命令连接到键 Cx z。要重复上一个命令一次,请键入 Cx z。要立即重复第二次,只需键入 z。通过一次又一次地键入 z,您可以一遍又一遍地重复该命令。

要查看有关重复命令的其他信息,请在 Emacs 中键入 Ch F repeat RET。


Z
Zach Young

重复上一个命令

C-xz

按下它后,只需按 z 即可重复(无需再次按 Cx)。


正是我所期望的。
a
ashawley

是的,有一个 repeat 命令。它被称为 repeat

您可以使用 Cx z 重复命令,然后按 z 继续重复。

有点令人震惊的是没有人提到 repeat-complex-command,可从键绑定 Cx ESC ESC 获得。


类似于 Mx Mp,除了 repeat-complex-command 重复前面的参数。
同样在 C-x M-: 上(助记符:类似于 M-:,但已经为您填写了 elisp 表达式)。
是的,确实令人震惊。接受的答案不是这里的最佳答案,IMO(但 OP 显然认为它最符合她的问题)。对我来说,这个答案最接近书面问题的要求(重复最后一个命令)。 repeat.el(包含 C-x z z z...)提供的可能性是第二接近的。 Wrt 问的第二个问题,关于最后击中的按键,最佳答案是 C-h l (view-lossage)。恕我直言,describe-last-command 命令几乎没有用处。
您还可以将 C-x M-: 用作键盘宏的一部分,这很方便。默认的 repeat-complex-command 绑定有点过于繁琐,无法一遍又一遍地键入。
C
Chris Conway

关于'describe-last-function':

有一个变量 last-command 设置为代表您所做的最后一件事的符号。所以这个 elisp 片段 - (describe-function last-command) - 应该为立即发生的事情提供文档。

所以你可以像这样做一个微不足道的工作describe-last-function

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

将该省略号放入 .emacs 或等效项中,您将拥有一个 Mx describe-last-function

如果您在感兴趣的事情之后敲了几个键或做了一些修改 last-command 的事情,那么 command-history 函数可能会很有趣。你可以通过 Mx command-history 得到它


q
quodlibetor

此外,M-x view-lossage 会显示您输入的最后一百 (?) 次击键。因此,您将能够看到命令在哪里。这是我使用的,直到我现在才发现 M-x command-history,我想我现在将与 C-h w 一起使用。


p
phils

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

命令 C-xz (repeat) 提供了另一种重复 Emacs 命令多次的方法。这个命令重复前面的 Emacs 命令,不管它是什么。重复一个命令使用之前使用的相同参数;它不会每次都读取新参数。

Emacs 手册,8.11 重复命令


正如 Johannes Schaub 所指出的,随后仅按 z 将继续重复。
M
Murali VP

可能这也有帮助......来自emacs帮助逐字:

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.

s
sabof

我个人发现塞巴斯蒂安的想法很有用。这是一个工作版本

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

考虑到 isearchisearch-backward 是重要的导航命令,并且后者绑定到 <kbd>Cr</kbd>默认情况下,可能会为重复命令找到更好的绑定。在 Mac 上,我建议使用 Command(super)-Y,因为某些应用程序已经有使用它作为“撤消”相反的约定。
D
Doug F

这是旧的,但是当我想要检索我在 Emacs 提示符下键入的最后一个命令时,Google 会首先弹出这个帖子。这些答案都不适合我,所以我决定为那些以后可能会像我一样偶然发现这个问题的人投入两分钱。我正在使用 Portacle,但我在 here 中找到了我想要的东西,所以我希望它足够通用,可以用于不同的设置。无论如何,对我有用的是使用 C-↑C-↓ 循环浏览历史。使用 MpMn 也可以,但我更喜欢使用箭头,因为我经常使用 Bash。


M
Micah Elliott

dot-mode 是一种重复上一个命令的方式。

从它的评论中:

它模拟 vi 'redo' 命令,重复前面的命令序列。这是通过记录改变缓冲区的输入命令来完成的,即不是运动命令。