在编译源代码时,我希望GNU Make能够调用emacs defun。 为此,我有两个选择:
从emacsclient调用defun,如:
emacsclient --eval "(my-emacs-defun)"
后者具有优势,它更快,因为emacs服务器已经运行并且已经加载了所需的defun。
但这也有一个缺点,如果从(message ...)
调用(my-emacs-defun)
,它会中断我的活动emacs会话。
我可以尝试修改(my-emacs-defun)
,因此(message ...)
未被调用,但在使用emacs内置函数时非常难。
因此,我想知道如何从(message ...)
取消(my-emacs-defun)
。
为此调用(message ...)
(defadvice)时是否可以改变(my-emacs-defun)? Can I use
行为?
修改
真正的问题是,消息显示迷你缓冲区。当时使用迷你缓冲区(例如(find-file)
期间)会很烦人。
答案 0 :(得分: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 消息缓冲区,但我不知道它存储在哪里。
答案 1 :(得分:1)
您可以在函数调用之前恢复回显区域中显示的消息,如下所示:
(let ((msg (current-message)))
(do-something-that-calls-message)
(message "%s" (or msg "")))
答案 2 :(得分:1)
(with-temp-message "" (my-emacs-func))
答案 3 :(得分:1)
我查看了emacs源代码,发现了这个黑客:
(let ((message-log-max nil)
(executing-kbd-macro t))
(my-emacs-defun))
这会取消所有消息,但仍会在(find-file)
时迷失迷你话筒的焦点。
答案 4 :(得分:1)
我决定选择第一个选项:没有emacsclient。
更确切地说,我现在使用:
emacs --batch --eval "(my-emacs-defun)"
在我的Makefile中,它看起来像这样:
sometarget:
@emacs --batch --eval "$${elisp_code}"
define elisp_code
(require 'something)
(my-emacs-defun)
endif
这似乎也很快。
答案 5 :(得分: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"
时,您不会收到错误。