我可以在emacs中禁用“(键入e重复宏)”消息吗?

时间:2010-05-25 06:29:21

标签: ruby emacs elisp dot-emacs

所以,我终于搞砸了,并且已经到了我很高兴从vi和vim切换到emacs的状态......我一直把东西放在我的.emacs文件中,学习如何评估事物(更不用说熟悉运动命令)等等。

现在我的.emacs文件中有一个require行有问题(一个require语句*),当我启动emacs时它会爆炸(并且通常无法工作)。

因此,这引出了以下情况:

在尝试调试上述情况的过程中,我所做的其中一个步骤是打开我试图要求的文件,并使用C-M-fC-x C-e一点一点地评估它。 (后来只是M-x eval-buffer),这一切都很好。但是在逐节的过程中,我厌倦了输入所有这些,所以我录制了一个键盘宏...... C-x ( C-M-f C-x C-e C-x )然后C-x e ......这给了我一条消息在迷你缓冲区(我想我使用了正确的名字),说(Type e to repeat macro)。这意味着我再也看不到每个代码部分评估的结果值......虽然在这种情况下并不重要,但我还是喜欢。

这引出了我的实际问题:

有没有办法禁用该消息,和/或导致迷你缓冲区一次显示多行?

我知道*Messages*缓冲区,这可能有所帮助,我只是想知道是否有办法禁用该消息,或以其他方式使其与其他消息共存。有什么建议吗?

谢谢!

  • lindes

* - 手头的问题,这不是我的问题,是(require 'ruby-mode/ruby-mode)失败,即使emacs绝对成功(每个系统调用跟踪)打开并读取ruby-mode.el文件。我认为这是因为provide行只是'ruby-mode。我找到了解决方案,但如果有人能指出我的任何“最佳实践”,我会很感激。

5 个答案:

答案 0 :(得分:3)

(我可以先说:这是我在很长一段时间里读过的最清楚的问题!做得好)。

你可以点击F4来运行你的宏。这与C-x e大致相同,只是它不包含该消息!

答案 1 :(得分:1)

我不知道你的“隐藏信息”问题。

关于功能和require / provide功能,通常的做法虽然我不会称之为“最佳”,但是将.el文件命名为它“提供”的功能。

并非所有模块都这样做。在这些情况下,您需要查看EL文件以找出.el文件提供的功能的名称。或者查看文档,在极少数情况下存在。然后在require调用中使用可选参数。

(require 'feature-name  "name-of-el-file-that-provides-feature.el")

.el文件必须位于加载路径上。

答案 2 :(得分:1)

要完全禁用此功能,您可以将其添加到.emacs:

(setq kmacro-call-repeat-key nil)

没有办法(当前)保持启用功能但没有消息。

答案 3 :(得分:1)

要优化lindes' answer,我会这样实现:

(require 'cl) ; for flet
(add-to-list 'minor-mode-alist '(kmacro-repeat-mode " MACRO-REPEAT!"))
(defadvice kmacro-call-macro (around kmacro-call-macro-without-message activate)
  "run kmacro-call-macro without any messages"
  (flet ((message (&rest args)))
    (let ((kmacro-repeat-mode t))
      ad-do-it)))

我撤消了minor-mode-alist的修改,因为没有理由多次这样做。其余的使用letflet进行临时绑定,在nonlocal exits出现时更加清晰且安全。

就个人而言,我不会使用这个建议,因为它会在宏的持续时间内禁用message函数,这意味着实际使用 message的所有宏都不会更长的功能同样的方式。我可能会选择edited version of kmacro-call-macro。当然,您可以使用可以选择性地发送消息的变量来包装对消息的调用。

答案 4 :(得分:0)

好吧,接受“无法做到”的挑战回答(我很感激,让我们说),我开始尝试找到一种方法来做到这一点。

我认为在模式行中显示某些内容会更好,而不是作为消息,所以...

我阅读了source code for kmacro-call-macroelisp Minor Mode Conventions以及其他各种网页的(某些可通过网络访问的版本)。我试了一些东西。我做了一些调试。最后,我提出了这个(不完美 - 更多关于下面的内容)的一点点:

;;;;; change kmacro-call-macro (C-x e) to not generate any messages,
;;;;; and instead add a minor mode to the modeline
(defadvice kmacro-call-macro (around kmacro-call-macro-without-message activate)
  "run kmacro-call-macro without any messages"
  (fset 'saved-message (symbol-function 'message))
  (unless (assq 'kmacro-repeat-mode minor-mode-alist)
    (setq minor-mode-alist
          (cons '(kmacro-repeat-mode " MACRO-REPEAT!") minor-mode-alist)))
  (setq kmacro-repeat-mode t)
  (defun message (format-string &rest args))
  ad-do-it
  (fset 'message (symbol-function 'saved-message))
  (setq kmacro-repeat-mode nil))

我很确定这不是最干净的方法 - 事实上,它实际上似乎有些错误 - 并不总是打开和关闭模式行消息。但它主要起作用,这让我很开心。

如果有人对如何进一步提高它有任何暗示,我将不胜感激。

我认为另一种解决方案是重新编写kmacro-call-macro以基本上包含此功能,可能还有另一个自定义变量来控制它。我想,这样做也可以允许显示消息中的附加信息(重复的键;重复计数信息)。也许甚至可以使用defadvice?可能通过重新定义的消息函数影响广告返回值的价值?

无论如何,上面的代码已经添加到我的.emacs文件中,希望在某些时候能够得到改进,当我了解elisp及其最佳实践时,我会更好。

我希望其他人觉得这很有用。

同样,对此的改进非常受欢迎。

编辑:

我最初有:

  (defun message (s &optional rest stuff))

应该真的(现在,上面):

  (defun message (format-string &rest args))

希望能解决问题!这是间歇性的,我认为现在判断为时尚早......