(let ((prev-buffers (window-prev-buffers)))
(print (seq-take prev-buffers 3))
(switch-to-buffer "*Messages*")
(print (seq-take prev-buffers 3)) ;; <--- 结果已改变
nil)
;; =>
;; (#<buffer *test*> (#<buffer *scratch*> #<marker at 2244 in *scratch*> #<marker at 2726 in *scratch*>) (#<buffer *test*> #<marker at 1 in *test*> #<marker at 1 in *test*>))
;; (#<buffer *test*> (#<buffer *test*> #<marker at 1 in *test*> #<marker at 1 in *test*>) (#<buffer *Messages*> #<marker at 1 in *Messages*> #<marker at 1 in *Messages*>))
很显然局部变量 prev-buffers 改变了。
(window-prev-buffers) 返回的其实是一个“引用”,你甚至可手动修改它:
(let ((prev-buffers (window-prev-buffers)))
(print (car prev-buffers))
(setcar prev-buffers (get-buffer-create "*test*"))
(print (car (window-prev-buffers))) ;; <--- 结果已改变
nil)
;; =>
;; (#<buffer emacs-china.org/t/window-prev-buffers/20925> #<marker at 1 in emacs-china.org/t/window-prev-buffers/20925> #<marker at 83 in emacs-china.org/t/window-prev-buffers/20925>)
;; #<buffer *test*>