* erc.el (erc-generate-new-buffer-name): Reuse old buffer names
authorVivek Dasmohapatra <vivek@etla.org>
Mon, 4 Jul 2011 13:23:04 +0000 (15:23 +0200)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 4 Jul 2011 13:23:04 +0000 (15:23 +0200)
when reconnecting.

Fixes: debbugs:5563

lisp/erc/ChangeLog
lisp/erc/erc.el

index 3d9b0c8..1560f2a 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-04  Vivek Dasmohapatra  <vivek@etla.org>
+
+       * erc.el (erc-generate-new-buffer-name): Reuse old buffer names
+       when reconnecting (bug#5563).
+
 2011-06-23  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * erc.el (erc-ssl): Made into a synonym for erc-tls, which
index e036c1d..a4040b2 100644 (file)
@@ -1555,26 +1555,33 @@ symbol, it may have these values:
 (defun erc-generate-new-buffer-name (server port target &optional proc)
   "Create a new buffer name based on the arguments."
   (when (numberp port) (setq port (number-to-string port)))
-  (let* ((buf-name (or target
-                      (or (let ((name (concat server ":" port)))
-                            (when (> (length name) 1)
-                              name))
-                          ; This fallback should in fact never happen
-                          "*erc-server-buffer*"))))
+  (let ((buf-name (or target
+                      (or (let ((name (concat server ":" port)))
+                            (when (> (length name) 1)
+                              name))
+                          ;; This fallback should in fact never happen
+                          "*erc-server-buffer*")))
+        buffer-name)
     ;; Reuse existing buffers, but not if the buffer is a connected server
     ;; buffer and not if its associated with a different server than the
     ;; current ERC buffer.
-    (if (and erc-reuse-buffers
-            (get-buffer buf-name)
-            (or target
-                (with-current-buffer (get-buffer buf-name)
-                  (and (erc-server-buffer-p)
-                       (not (erc-server-process-alive)))))
-            (with-current-buffer (get-buffer buf-name)
-              (and (string= erc-session-server server)
-                   (erc-port-equal erc-session-port port))))
-       buf-name
-      (generate-new-buffer-name buf-name))))
+    ;; if buf-name is taken by a different connection (or by something !erc)
+    ;; then see if "buf-name/server" meets the same criteria
+    (dolist (candidate (list buf-name (concat buf-name "/" server))) 
+      (if (and (not buffer-name)
+               erc-reuse-buffers
+               (get-buffer candidate)
+               (or target
+                   (with-current-buffer (get-buffer candidate)
+                     (and (erc-server-buffer-p)
+                          (not (erc-server-process-alive)))))
+               (with-current-buffer (get-buffer candidate)
+                 (and (string= erc-session-server server)
+                      (erc-port-equal erc-session-port port))))
+          (setq buffer-name candidate)))
+    ;; if buffer-name is unset, neither candidate worked out for us,
+    ;; fallback to the old <N> uniquification method:
+    (or buffer-name (generate-new-buffer-name buf-name)) ))
 
 (defun erc-get-buffer-create (server port target &optional proc)
   "Create a new buffer based on the arguments."