Emacs Lispをデバッグしていて、特定の関数の引数と返り値を トレースしたくなることはよくあります。
そのときは標準添付の trace.el を使います。
M-x trace-function で、トレースする関数と トレース結果を出力するバッファを指定します。
その後で対象関数を呼び出すと、 トレース結果のバッファが ポップアップします。
トレースをやめるには M-x untrace-function や M-x untrace-all を使います。
しかし、これらのコマンドはわざわざ関数名を 入力する必要があるため使いづらいものです。
そこで、現在の関数(defun)を評価するC-M-xに 組み込んでしまいましょう。
元々 C-u C-M-x で現在の関数を edebug デバッガにかけることができるので、 C-u C-u C-M-xでtrace-function、 C-u C-u C-u C-M-xでuntrace-function することにしました。
トレースの詳しい使い方は 旧ブログ:デバッグの第一歩!Emacs Lisp関数をトレースする方法 を 参照してください。
(require 'cl-lib)
(defun current-defun ()
(save-excursion
(beginning-of-defun)
(forward-char 1)
(forward-sexp 2)
(symbol-at-point)))
(defun eval-defun-or-trace-function (arg)
"C-M-xにtrace-functionの機能をつける"
(interactive "p")
(cl-case arg
(64 (untrace-function (current-defun))
(message "untrace-function: %s" (current-defun)))
(16 (trace-function (current-defun))
(message "trace-function: %s" (current-defun)))
(4 (eval-defun t))
(t (eval-defun nil))))
(define-key emacs-lisp-mode-map (kbd "C-M-x") 'eval-defun-or-trace-function)
$ wget http://rubikitch.com/f/141001104025.eval-defun.trace-function.el $ emacs -Q -f package-initialize -l 141001104025.eval-defun.trace-function.el