Emacs 从EmacClient无声地调用defun
在编译源代码的过程中,我希望GNU Make调用emacs 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会话。 我可以尝试修改(
- 启动一个新的emacs实例,加载所需的函数并调用它
- 从EmacClient调用defun,如下所示:
emacsclient --eval "(my-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”(已写入的文件)。这会在微型缓冲区中还原以前的消息,但不会阻止生成消息。