Emacs 从EmacClient无声地调用defun

Emacs 从EmacClient无声地调用defun,emacs,emacsclient,Emacs,Emacsclient,在编译源代码的过程中,我希望GNU Make调用emacs defun。 为此,我有两种选择: 启动一个新的emacs实例,加载所需的函数并调用它 从EmacClient调用defun,如下所示: emacsclient --eval "(my-emacs-defun)" 后者的优点是速度更快,因为emacs服务器已经在运行,并且已经加载了所需的defun 但这也有一个缺点,如果从(my emacs defun)调用(message…),它会中断我的活动emacs会话。 我可以尝试修改(

在编译源代码的过程中,我希望GNU Make调用emacs defun。 为此,我有两种选择:

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

    emacsclient --eval "(my-emacs-defun)"
    
后者的优点是速度更快,因为emacs服务器已经在运行,并且已经加载了所需的defun

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

因此,我想知道如何抑制来自
(我的emacs defun)
(消息…
)。 调用
(my emacs defun)时,是否可以更改
(消息…
行为?我能用
(defadvice)`来做这个吗

编辑
真正的问题是,消息显示在minibuffer中。此时(例如在
(查找文件)
)期间)使用微型缓冲区时会令人恼火。

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

(let ((msg (current-message)))
  (do-something-that-calls-message)
  (message "%s" (or msg "")))
sometarget:
        @emacs --batch --eval "$${elisp_code}"

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

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

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

例子:
您还可以临时重新绑定的消息缓冲区,但我不知道它存储在哪里。

(使用temp message“”(my emacs func))
我查看了emacs源代码,发现了以下漏洞:

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

这确实会抑制所有消息,但仍然在
(查找文件)
小缓冲区的焦点丢失时。

我决定选择第一个选项:不使用EmacClient

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

emacs --batch --eval "(my-emacs-defun)"
在我的Makefile中,它如下所示:

(let ((msg (current-message)))
  (do-something-that-calls-message)
  (message "%s" (or msg "")))
sometarget:
        @emacs --batch --eval "$${elisp_code}"

define elisp_code
   (require 'something)
   (my-emacs-defun)
endif
这似乎也很快。

更好的是:

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 $<
定义emacs\u脚本\u内容=
(需要“某物”)
(我的emacs defun)
恩德夫
导出emacs\u脚本\u内容
emacs脚本:
@echo$${emacs\u script\u content}>$@
.mediate:emacs脚本
一些目标:emacs脚本
@emacs——脚本$<

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

您的函数可能正在调用仅用于交互命令而非函数的Emacs函数。检查这些函数的文档,看看它们是否建议以编程方式调用其他函数。例如,当从C代码调用
(消息)
时,
设置标记不起作用。例如
(write region nil nil(buffer file name)nil)
将显示“write file”(已写入的文件)。这会在微型缓冲区中还原以前的消息,但不会阻止生成消息。