0

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

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

因此,这导致我出现以下情况:

在尝试调试上述情况的过程中,我所做的一个步骤是打开我试图要求的文件,并使用C-M-fand 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行说 just 'ruby-mode。我已经找到了解决方案,但如果有人能指出任何“最佳实践”,我将不胜感激。

4

5 回答 5

3

(我可以先说:这是我很长时间以来在这里读到的最清楚的问题!干得好)。

您可以按 F4 运行宏。这与 Cx e 的作用大致相同,只是它不包含该消息!

于 2010-05-25T15:55:46.623 回答
1

为了完善林德斯的答案,我会这样实现:

(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因为没有理由多次这样做。剩下的就是使用letandflet来做临时绑定,这在存在非本地出口的情况下更干净,也更安全。

就个人而言,我不会使用这个建议,因为它会在message宏的持续时间内禁用该功能,这意味着实际使用 message的所有宏将不再以相同的方式运行。我可能会选择kmacro-call-macro 的编辑版本。当然,您可以使用可以选择性地发送消息的变量来包装对消息的调用。

于 2010-05-28T16:00:45.360 回答
1

我不知道您的“隐藏消息”问题。

关于特性和需要/提供函数,通常的做法是,虽然我不会称其为“最佳”,但将 .el 文件命名为与其“提供”的特性相同。

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

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

.el 文件必须在您的加载路径上。

于 2010-05-25T11:10:37.127 回答
1

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

(setq kmacro-call-repeat-key nil)

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

于 2010-05-25T16:41:10.617 回答
0

好吧,接受“没有办法做到这一点”答案的挑战(我很感激,可以这么说),我开始尝试找到一种方法来做到这一点。

我认为在模式行中显示一些东西会很好,而不是作为消息,所以......

我阅读了 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))

在这里,希望能解决问题!它是断断续续的,我认为现在说还为时过早......

于 2010-05-27T06:01:13.657 回答