大概意思是这样: emacs的 命令循环(command loop)读取键盘输入,并执行对应的命令。命令执行完之后,会让 active window里面的buffer变成 current buffer (通过set-buffer call).
(progn
(message "first %s" (buffer-name))
(about-emacs)
(message "second %s" (buffer-name))
)
这个整个一块是在一个command里面运行的,那么about-emacs 没有改变current buffer. 但是在这个command完成之后,emacs的命令循环发现active window里面是 *About GNU Emacs*
, 就把它设成current buffer. 这件事发生在下个command 之前,包括run-with-timer设定的timer function.
多谢 再请教一下
(progn
(message "first %s" (buffer-name))
(view-external-packages)
(message "second %s" (buffer-name))
)
;; =>
;; first *scratch*
;; second *info* (view-external-packages) 这个命令的buffer 为什么直接显示了呢?与 (about-emacs) 不一致啊?
;; "second *info*"
这个是正常情况啊。
比如 (view-external-packages)
里面调用了switch-to-buffer
emacs 的 buffer/window有几个概念:
- current buffer,当前工作的buffer,所有的buffer local变量都是这个当前buffer的。
- current buffer不一定就是window buffer,就是说,可能当前window显示的A,但是current buffer可能是B
而emacs自动干的事情就是,进入命令循环之后,自动让当前window里面的buffer变成 current buffer 。