diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1566,26 +1566,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 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."