M-! 执行 shell 命令时,一般情况下输出结果将直接显示在 echo area(即 minibuffer)。但如果输出过长的时候,则会自动将输出写到 *Shell Command Output* buffer 中,例如执行: M-! ls -l 。这个功能相当贴心。
当调试 elisp 的时候,通常会需要用 C-x C-e 或者 M-: 来查询某些变量或者表达式之值,经常输出会比较长,例如 twittering-mode 中的 twittering-service-method-table ,这样在 echo area 里查看时很不方便。如果让 C-x C-e 或 M-: 也达到类似 M-! 的效果岂不美哉? 通過下面兩個 advices 可以实现我们想要的效果:
;; Display eval output in a way similar to shell-command. (defadvice eval-expression (around display-large-output-other-buffer activate) (let ((inhibit-read-only t)) (display-message-or-buffer (pp ad-do-it)))) (defadvice eval-last-sexp (around display-large-output-other-buffer activate) (let ((inhibit-read-only t)) (display-message-or-buffer (pp ad-do-it))))
另外,在 eval-expression 的时候, Emacs 还有 eval-expression-print-length,eval-expression-print-level 两个变量来控制打印的最大深度和长度。默认仅为 12 和 4 。可以将它们调大一点:
(setq eval-expression-print-length 100)