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

Posted

技术标签:

【中文标题】Emacs 中有 (repeat-last-command) 吗?【英文标题】:Is there a (repeat-last-command) in Emacs? 【发布时间】:2010-09-21 12:13:22 【问题描述】:

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

(重复最后命令)

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

或者有时是相关的:

(描述最后一个函数)

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

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

【问题讨论】:

C-x z (repeat) 和 C-x M-z (repeat-complex-command)。另见(repeat-matching-complex-command) 【参考方案1】:

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

这个包定义了一个命令 重复前面的命令, 不管是什么,包括它的 争论,不管它们是什么。这 命令连接到键 C-x z。 要重复上一个命令一次, 键入 C-x z。重复第二次 紧接着,输入 z。经过 一遍又一遍地输入z,你可以 一遍又一遍地重复这个命令。

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

【讨论】:

【参考方案2】:

重复上一个命令

C-xz

一旦你按下它,只需按下 z 之后它会重复(无需再次按 C-x)。

【讨论】:

完全符合我的预期。【参考方案3】:

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

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

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

【讨论】:

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

关于“describe-last-function”:

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

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

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

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

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

得到它

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

Emacs 手册,8.11 重复命令

【讨论】:

正如 Johannes Schaub 所指出的,随后仅按 z 本身将继续重复。【参考方案7】:

也许这也有帮助... 来自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.

【讨论】:

【参考方案8】:

我个人觉得 Sebastian 的想法很有用。这是一个工作版本

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

【讨论】:

考虑到isearchisearch-backward 是重要的导航命令,而后者默认绑定到Cr,可能会找到更好的重复绑定-命令。在 Mac 上,我建议使用 Command(super)-Y,因为某些应用程序已经有使用它作为“撤消”相反的约定。【参考方案9】:

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

【讨论】:

【参考方案10】:

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

来自它的评论:

它模拟 vi `redo' 命令,重复 紧接前面的命令序列。这是由 记录改变缓冲区的输入命令,即不是运动 命令。

【讨论】:

以上是关于Emacs 中有 (repeat-last-command) 吗?的主要内容,如果未能解决你的问题,请参考以下文章

emacs:手动切换模式时绕过模式挂钩

一些 emacs 桌面保存问题:如何将其更改为保存在 ~/.emacs.d/.emacs.desktop

将 Emacs 用于 $PAGER?

Emacs 中的 Python 高亮显示

.emacs 中区分大小写的 setq 无效

用于 IRC 的 Emacs ERC 自动 Nickserv 识别