【发布时间】:2012-11-18 21:51:02
【问题描述】:
我注意到我的代码中有一种趋势是一遍又一遍地重复相同的(with-current-buffer ....,因此我决定根据with-current-buffer 的宏定义来定义一个宏——这就是我目前所拥有的:
(defmacro with-assembla-buffer(asm-buffer-name heading-str &rest body)
"Create buffer with name of ASM-BUFFER-NAME, or uses it if exists,
preps it with readonly/erase/heading - executes `body' - then puts
readonly back on, goes to beginning of buffer, and switches to it."
(with-current-buffer (get-buffer-create asm-buffer-name)
(assembla-mode)
(toggle-read-only -1)
(erase-buffer)
(insert (format "-- %s --------------------" heading-str))
(newline)
`(progn ,@body)
(toggle-read-only 1)
(goto-char (point-min))
(switch-to-buffer (current-buffer))))
它的主体永远不会被执行,但是当它切换到defun 而不是defmacro 时确实可以正常工作。所以除了为什么从不执行 body,我的另一个问题是 - 作为宏比 defun 更有意义吗?
【问题讨论】:
-
引用 Emacs-23 的
C-h f switch-to-buffer:“警告:这不是在 Lisp 程序中临时处理另一个缓冲区的方法!请改用set-buffer。这样可以避免弄乱窗口缓冲区通信”