2

在源代码编译期间,我希望 GNU Make 调用 emacs defun。为此,我有 2 个选项:

  • 启动一个新的 emacs 实例,并加载所需的函数并调用它。
  • 从 emacsclient 调用 defun 如下:

    emacsclient --eval "(my-emacs-defun)"
    

后者有优势,它更快,因为 emacs 服务器已经在运行并且加载了所需的 defun。

但这也有一个缺点,如果(message ...)从 调用(my-emacs-defun),它会中断我的活动 emacs 会话。我可以尝试修改(my-emacs-defun)所以(message ...)不调用,但是在使用 emacs 内置函数时真的很难。

因此,我想知道如何抑制(message ...)from (my-emacs-defun)。是否可以在为此调用 (defadvice)` 时改变(message ...)行为(my-emacs-defun)? Can I use

编辑 真正的问题是,消息显示在小缓冲区中。那时(例如在 期间(find-file))使用 minibuffer 时会很烦人。

4

6 回答 6

2

只需为您的呼叫重新定义消息功能(暂时):

(flet ((message (msg) ))
  (my-emacs-defun)))

由于全局函数的动态作用域,名称message将在flet 表达式内执行时重新定义,并且在退出flet后将返回其原始含义。

例子:

(defun verbose ()
  (message "hi"))

(let ()
  (message "one")
  (flet ((message (msg) ))
     (verbose))
  (message "two"))
; ->
; one
; two

您也可以暂时重新绑定 s Messages缓冲区,但我不知道它存储在哪里。

于 2013-02-12T15:56:14.117 回答
1

您可以在函数调用之前恢复回显区域中显示的消息,如下所示:

(let ((msg (current-message)))
  (do-something-that-calls-message)
  (message "%s" (or msg "")))
于 2013-02-12T15:44:31.160 回答
1

我决定选择第一个选项:没有 emacsclient。

更准确地说,我现在使用:

emacs --batch --eval "(my-emacs-defun)"

在我的 Makefile 中,它看起来像这样:

sometarget:
        @emacs --batch --eval "$${elisp_code}"

define elisp_code
   (require 'something)
   (my-emacs-defun)
endif

这似乎也很快。

于 2013-02-13T13:31:09.713 回答
1

更好的是:

define emacs_script_content=
  (require 'something)
  (my-emacs-defun)
endef
export emacs_script_content

emacs-script:
    @echo $${emacs_script_content} > $@
.INTERMEDIATE: emacs-script

some-target: emacs-script
    @emacs --script $<

make这样您在调用函数或"text"在脚本中引用时不会出错。

于 2013-03-01T10:53:42.260 回答
1

我查看了 emacs 源代码,发现了这个 hack:

  (let ((message-log-max nil)
        (executing-kbd-macro t))
    (my-emacs-defun))

这确实会抑制所有消息,但仍然(find-file)会丢失迷你缓冲区的焦点。

于 2013-02-13T09:26:14.727 回答
1

(with-temp-message "" (my-emacs-func))

于 2013-02-12T19:24:10.107 回答