From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: =?utf-8?Q?=C3=93scar_Fuentes?= Newsgroups: gmane.emacs.devel Subject: PATCH: Fix IDO interaction with uniquify.el Date: Mon, 18 Jan 2010 11:27:54 +0100 Message-ID: <87k4vf1zdh.fsf@telefonica.net> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1263810646 25154 80.91.229.12 (18 Jan 2010 10:30:46 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 18 Jan 2010 10:30:46 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Jan 18 11:30:38 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NWosX-000392-Cs for ged-emacs-devel@m.gmane.org; Mon, 18 Jan 2010 11:30:37 +0100 Original-Received: from localhost ([127.0.0.1]:57013 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NWosX-0002Um-Ot for ged-emacs-devel@m.gmane.org; Mon, 18 Jan 2010 05:30:37 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NWoqP-000232-Q5 for emacs-devel@gnu.org; Mon, 18 Jan 2010 05:28:25 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NWoqK-000217-CM for emacs-devel@gnu.org; Mon, 18 Jan 2010 05:28:24 -0500 Original-Received: from [199.232.76.173] (port=36516 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NWoqK-00020z-1A for emacs-devel@gnu.org; Mon, 18 Jan 2010 05:28:20 -0500 Original-Received: from lo.gmane.org ([80.91.229.12]:45490) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NWoqJ-0007fm-E7 for emacs-devel@gnu.org; Mon, 18 Jan 2010 05:28:19 -0500 Original-Received: from list by lo.gmane.org with local (Exim 4.50) id 1NWoqD-0002MX-Vn for emacs-devel@gnu.org; Mon, 18 Jan 2010 11:28:13 +0100 Original-Received: from 251.red-88-24-228.staticip.rima-tde.net ([88.24.228.251]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 18 Jan 2010 11:28:13 +0100 Original-Received: from ofv by 251.red-88-24-228.staticip.rima-tde.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 18 Jan 2010 11:28:13 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 86 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 251.red-88-24-228.staticip.rima-tde.net User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.91 (gnu/linux) Cancel-Lock: sha1:9Ex2VuGHv3CJ86C8UihcoHuhTBs= X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:120192 Archived-At: When `uniquify' is in effect, killing a buffer may cause the renaming of others. While switching buffers with ido-mode enabled, the user is presented with a list of buffer names to choose. From the prompt he can kill the first buffer list, which is removed from the list, and keeps waiting for further user interaction. However, IDO does not take into account that some buffers may have changed names. This patch rebuilds the list of buffer names used by IDO after a buffer is killed if some name contained in the list no longer maps to an existing buffer. BTW, iswitchb-mode suffers from the same problem. 2010-01-18 Óscar Fuentes * ido.el (ido-make-buffer-list): If `default' is a nonexistent buffer, ignore it, as per the documentation. (ido-kill-buffer-internal): New function. (ido-kill-buffer-at-head): Use it. (ido-visit-buffer): Likewise. === modified file 'lisp/ido.el' --- lisp/ido.el 2010-01-04 05:35:18 +0000 +++ lisp/ido.el 2010-01-18 10:25:26 +0000 @@ -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)) @@ -3830,6 +3830,31 @@ ;;(add-hook 'completion-setup-hook 'completion-setup-function) (display-completion-list completion-list))))))) +(defun ido-kill-buffer-internal (buf) + "Actually kill the buffer and check if it is needed to rebuild +the list of known buffers." + (kill-buffer buf) + (if (get-buffer buf) + ;; buffer couldn't be killed. + (setq ido-rescan t) + (let ((next-buf (cadr ido-matches)) + (needs-update nil)) + ;; 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. + (dolist (b ido-cur-list) + (if (not (get-buffer b)) + (setq needs-update t))) + (when needs-update + (setq ido-cur-list (ido-make-buffer-list next-buf)) + (setq ido-rescan t))))) + ;;; KILL CURRENT BUFFER (defun ido-kill-buffer-at-head () "Kill the buffer at the head of `ido-matches'. @@ -3840,7 +3865,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 +3909,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