所以,我终于搞砸了,并且已经到了我很高兴从vi和vim切换到emacs的状态......我一直把东西放在我的.emacs文件中,学习如何评估事物(更不用说熟悉运动命令)等等。
现在我的.emacs文件中有一个require行有问题(一个require语句*),当我启动emacs时它会爆炸(并且通常无法工作)。
因此,这引出了以下情况:
在尝试调试上述情况的过程中,我所做的其中一个步骤是打开我试图要求的文件,并使用C-M-f
和C-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*
缓冲区,这可能有所帮助,我只是想知道是否有办法禁用该消息,或以其他方式使其与其他消息共存。有什么建议吗?
谢谢!
* - 手头的问题,这不是我的问题,是(require 'ruby-mode/ruby-mode)
失败,即使emacs绝对成功(每个系统调用跟踪)打开并读取ruby-mode.el文件。我认为这是因为provide
行只是'ruby-mode
。我找到了解决方案,但如果有人能指出我的任何“最佳实践”,我会很感激。
答案 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
的修改,因为没有理由多次这样做。其余的使用let
和flet
进行临时绑定,在nonlocal exits出现时更加清晰且安全。
就个人而言,我不会使用这个建议,因为它会在宏的持续时间内禁用message
函数,这意味着实际使用 message
的所有宏都不会更长的功能同样的方式。我可能会选择edited version of kmacro-call-macro。当然,您可以使用可以选择性地发送消息的变量来包装对消息的调用。
答案 4 :(得分:0)
好吧,接受“无法做到”的挑战回答(我很感激,让我们说),我开始尝试找到一种方法来做到这一点。
我认为在模式行中显示某些内容会更好,而不是作为消息,所以...
我阅读了source code for kmacro-call-macro和elisp 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))
希望能解决问题!这是间歇性的,我认为现在判断为时尚早......