求教:(current-buffer) 的变动是发生在哪里?

大概意思是这样: 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有几个概念:

  1. current buffer,当前工作的buffer,所有的buffer local变量都是这个当前buffer的。
  2. current buffer不一定就是window buffer,就是说,可能当前window显示的A,但是current buffer可能是B

而emacs自动干的事情就是,进入命令循环之后,自动让当前window里面的buffer变成 current buffer 。

多谢解惑,我这辈子都甭想搞懂emacs 了 :sweat_smile:

你挺懂的~~~

那个timer的思路,不就是你想出来的嘛