默默地从emacsclient调用defun

时间:2013-02-12 11:20:56

标签: emacs emacsclient

在编译源代码时,我希望GNU Make能够调用emacs defun。 为此,我有两个选择:

  • 启动一个新的emacs实例,然后加载所需的功能并调用它。
  • 从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)期间)会很烦人。

6 个答案:

答案 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"时,您不会收到错误。