2

ソースのコンパイル中に、GNUMakeにemacsdefunを呼び出してもらいたいと思います。このために私は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)です。(message ...)このために呼び出されたときの動作を変更することは可能(my-emacs-defun)? Can I useですか(defadvice) `

編集 本当の問題は、メッセージがミニバッファに表示されることです。そのとき(例えば、中(find-file))にミニバッファを使用するときはイライラします。

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

メッセージバッファを一時的に再バインドすることもできますが、どこに保存されているのかわかりません。

于 2013-02-12T15:56:14.117 に答える
1

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

于 2013-02-12T19:24:10.107 に答える
1

次のように、関数呼び出しの前にエコー領域に表示されたメッセージを復元できます。

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

私はemacsのソースコードを調べましたが、このハックを見つけました:

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

これはすべてのメッセージを抑制しますが、それでも(find-file)ミニバッファーのフォーカスが失われます。

于 2013-02-13T09:26:14.727 に答える
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 に答える