Я заметил тенденцию в моем коде повторения того же (with-current-buffer ....
снова и снова, поэтому я решил определить макрос, основанный на этом определении макроса with-current-buffer
- это то, что у меня есть до сих пор:Тело defmacro не выполняется
(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
это работает отлично. Итак, в стороне от почему тело никогда не было выполнено, мой другой вопрос - делает ли это больше смысла в качестве макроса, чем defun?
Для цитирования Emacs-23's 'Ch f switch-to-buffer':« ПРЕДУПРЕЖДЕНИЕ: Это не способ временно работать с другим буфером в программе Lisp! Вместо этого используйте 'set-buffer'. Это позволяет избежать messing с соответствием оконных буферов " – Stefan