# HG changeset patch # User Juanma Barranquero # Date 1263843295 -3600 # Node ID ee670d4f8293371a3bd798ee905c5ccaaac2e247 # Parent e3970f7c14d43e3d2a2efc9d41dcb3b49536f4b4 ido.el: Consider the possibility of buffer names changing after kill-buffer. diff -r e3970f7c14d4 -r ee670d4f8293 lisp/ChangeLog --- a/lisp/ChangeLog Mon Jan 18 11:29:00 2010 -0500 +++ b/lisp/ChangeLog Mon Jan 18 20:34:55 2010 +0100 @@ -1,3 +1,15 @@ +2010-01-18 Óscar Fuentes + + * ido.el (ido-cur-list): Initialize as nil. + Remove obsolete information from commentary. + (ido-choice-list): Initialize as nil. + (ido-get-bufname): Reject minibuffers. + (ido-make-buffer-list): If "default" is a nonexistent + buffer, ignore it, as per the docstring. + (ido-kill-buffer-internal): New function. + (ido-kill-buffer-at-head): Use it. + (ido-visit-buffer): Likewise. + 2010-01-18 Chong Yidong * calendar/time-date.el (date-to-time): Doc fix (Bug#5408). diff -r e3970f7c14d4 -r ee670d4f8293 lisp/ido.el --- a/lisp/ido.el Mon Jan 18 11:29:00 2010 -0500 +++ b/lisp/ido.el Mon Jan 18 20:34:55 2010 +0100 @@ -1042,11 +1042,11 @@ ;; Stores the current list of items that will be searched through. ;; The list is ordered, so that the most interesting item comes first, ;; although by default, the files visible in the current frame are put -;; at the end of the list. Created by `ido-make-item-list'. -(defvar ido-cur-list) +;; at the end of the list. +(defvar ido-cur-list nil) ;; Stores the choice list for ido-completing-read -(defvar ido-choice-list) +(defvar ido-choice-list nil) ;; Stores the list of items which are ignored when building ;; `ido-cur-list'. It is in no specific order. @@ -3344,7 +3344,7 @@ (if ido-temp-list (nconc ido-temp-list ido-current-buffers) (setq ido-temp-list ido-current-buffers)) - (if default + (if (and default (buffer-live-p (get-buffer default))) (progn (setq ido-temp-list (delete default ido-temp-list)) @@ -3590,6 +3590,7 @@ ;; Used by `ido-get-buffers-in-frames' to walk through all windows (let ((buf (buffer-name (window-buffer win)))) (unless (or (member buf ido-bufs-in-frame) + (minibufferp buf) (member buf ido-ignore-item-temp-list)) ;; Only add buf if it is not already in list. ;; This prevents same buf in two different windows being @@ -3830,6 +3831,27 @@ ;;(add-hook 'completion-setup-hook 'completion-setup-function) (display-completion-list completion-list))))))) +(defun ido-kill-buffer-internal (buf) + "Kill buffer BUF and rebuild ido's buffer list if needed." + (if (not (kill-buffer buf)) + ;; buffer couldn't be killed. + (setq ido-rescan t) + ;; else buffer was killed so remove name from list. + (setq ido-cur-list (delq buf ido-cur-list)) + ;; Some packages, like uniquify.el, may rename buffers when one + ;; is killed, so we need to test this condition to avoid using + ;; an outdated list of buffer names. We don't want to always + ;; rebuild the list of buffers, as this alters the previous + ;; buffer order that the user was seeing on the prompt. However, + ;; when we rebuild the list, we try to keep the previous second + ;; buffer as the first one. + (catch 'update + (dolist (b ido-cur-list) + (unless (get-buffer b) + (setq ido-cur-list (ido-make-buffer-list (cadr ido-matches))) + (setq ido-rescan t) + (throw 'update nil)))))) + ;;; KILL CURRENT BUFFER (defun ido-kill-buffer-at-head () "Kill the buffer at the head of `ido-matches'. @@ -3840,7 +3862,7 @@ (let ((enable-recursive-minibuffers t) (buf (ido-name (car ido-matches)))) (when buf - (kill-buffer buf) + (ido-kill-buffer-internal buf) ;; Check if buffer still exists. (if (get-buffer buf) ;; buffer couldn't be killed. @@ -3884,7 +3906,7 @@ ((eq method 'kill) (if record (ido-record-command 'kill-buffer buffer)) - (kill-buffer buffer)) + (ido-kill-buffer-internal buffer)) ((eq method 'other-window) (if record