emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

PATCH: Fix IDO interaction with uniquify.el


From: Óscar Fuentes
Subject: PATCH: Fix IDO interaction with uniquify.el
Date: Mon, 18 Jan 2010 11:27:54 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.91 (gnu/linux)

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  <address@hidden>

        * 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






reply via email to

[Prev in Thread] Current Thread [Next in Thread]