# HG changeset patch # User Karl Fogel # Date 1252167927 0 # Node ID 53d8d2c49942819cca33087ea31e89819ee90247 # Parent ea5c49fab49a14fe3b61d8414b6ef5bf145f996c * lisp/files.el (find-alternate-file): Run `kill-buffer-hook' manually before killing the old buffer, since by the time `kill-buffer' is run so many buffer variables have been set to nil that it may not behave as expected. (Bug#4061) diff -r ea5c49fab49a -r 53d8d2c49942 lisp/ChangeLog --- a/lisp/ChangeLog Sat Sep 05 15:16:49 2009 +0000 +++ b/lisp/ChangeLog Sat Sep 05 16:25:27 2009 +0000 @@ -1,3 +1,10 @@ +2009-09-05 Karl Fogel + + * files.el (find-alternate-file): Run `kill-buffer-hook' manually + before killing the old buffer, since by the time `kill-buffer' is + run so many buffer variables have been set to nil that it may not + behave as expected. (Bug#4061) + 2009-09-05 Karl Fogel * files.el (find-alternate-file): If the old buffer is modified diff -r ea5c49fab49a -r 53d8d2c49942 lisp/files.el --- a/lisp/files.el Sat Sep 05 15:16:49 2009 +0000 +++ b/lisp/files.el Sat Sep 05 16:25:27 2009 +0000 @@ -1493,6 +1493,17 @@ (odir dired-directory) (otrue buffer-file-truename) (oname (buffer-name))) + ;; Run `kill-buffer-hook' here. It needs to happen before + ;; variables like `buffer-file-name' etc are set to nil below, + ;; because some of the hooks that could be invoked + ;; (e.g., `save-place-to-alist') depend on those variables. + ;; + ;; Note that `kill-buffer-hook' is not what queries whether to + ;; save a modified buffer visiting a file. Rather, `kill-buffer' + ;; asks that itself. Thus, there's no need to temporarily do + ;; `(set-buffer-modified-p nil)' before running this hook. + (run-hooks 'kill-buffer-hook) + ;; Okay, now we can end-of-life the old buffer. (if (get-buffer " **lose**") (kill-buffer " **lose**")) (rename-buffer " **lose**") @@ -1520,8 +1531,8 @@ (rename-buffer oname))) (unless (eq (current-buffer) obuf) (with-current-buffer obuf - ;; We already asked; don't ask again. - (let ((kill-buffer-query-functions)) + ;; We already ran these; don't run them again. + (let (kill-buffer-query-functions kill-buffer-hook) (kill-buffer obuf)))))) (defun create-file-buffer (filename)