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: Re: PATCH: Fix IDO interaction with uniquify.el Date: Mon, 18 Jan 2010 15:13:10 +0100 Message-ID: <87d4171oy1.fsf@telefonica.net> References: <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 1263824090 6858 80.91.229.12 (18 Jan 2010 14:14:50 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 18 Jan 2010 14:14:50 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Jan 18 15:14:43 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 1NWsNM-0003GE-Jz for ged-emacs-devel@m.gmane.org; Mon, 18 Jan 2010 15:14:41 +0100 Original-Received: from localhost ([127.0.0.1]:58360 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NWsNN-0006AT-6E for ged-emacs-devel@m.gmane.org; Mon, 18 Jan 2010 09:14:41 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NWsMY-00060S-E6 for emacs-devel@gnu.org; Mon, 18 Jan 2010 09:13:50 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NWsMU-000608-Jg for emacs-devel@gnu.org; Mon, 18 Jan 2010 09:13:50 -0500 Original-Received: from [199.232.76.173] (port=35129 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NWsMU-000605-F8 for emacs-devel@gnu.org; Mon, 18 Jan 2010 09:13:46 -0500 Original-Received: from lo.gmane.org ([80.91.229.12]:54806) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NWsMU-0004pC-0w for emacs-devel@gnu.org; Mon, 18 Jan 2010 09:13:46 -0500 Original-Received: from list by lo.gmane.org with local (Exim 4.50) id 1NWsMQ-0002nz-8H for emacs-devel@gnu.org; Mon, 18 Jan 2010 15:13:42 +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 15:13:42 +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 15:13:42 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 138 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:4uxD0uuo81Fe58/x1DcfTZjQtpk= 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:120205 Archived-At: Hello Juanma. Thanks for testing. Comments and a new patch follows. Juanma Barranquero writes: > Nice. A problem, though: > > emacs -Q -f ido-mode > C-x k > > => Symbol's value as variable is void: ido-cur-list This is solved by using (defvar ido-cur-list nil) instead of (defvar ido-cur-list) Hope it's acceptable. > Another weirdness: > > cd c:\emacs\trunk > emacs -Q -l uniquify -f ido-mode --eval "(setq > uniquify-buffer-name-style 'forward)" > C-x C-f ChangeLog > C-x C-f src/ChangeLog > C-x b => "buffer: {trunk/ChangeLog | *scratch* | *Messages* | > src/ChangeLog}" > C-k => "buffer: {*scratch* | *Messages* | *Minibuf-1* | ChangeLog}" > > " *Minibuf-1*" is unexpected. This is solved by explicitly ignoring minibuffers while gathering the list of buffers. 2010-01-18 Óscar Fuentes * ido.el (ido-cur-list): Initialize as nil. Remove obsolete information from its 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. === modified file 'lisp/ido.el' --- lisp/ido.el 2010-01-13 08:35:10 +0000 +++ lisp/ido.el 2010-01-18 14:06:20 +0000 @@ -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,32 @@ ;;(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) + (ido-set-matches))))) + ;;; KILL CURRENT BUFFER (defun ido-kill-buffer-at-head () "Kill the buffer at the head of `ido-matches'. @@ -3840,7 +3867,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 +3911,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