From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Mingde (Matthew) Zeng" Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] erc: fix erc-reuse-buffers behavior Date: Thu, 09 Jul 2020 15:05:42 -0400 Message-ID: <87pn944igp.fsf@gmail.com> References: <87eepnx04c.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="4782"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.4.10; emacs 27.0.91 Cc: bandali@gnu.org, emacs-devel@gnu.org To: "Mingde (Matthew) Zeng" Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Jul 09 21:06:26 2020 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jtbsI-00017C-7K for ged-emacs-devel@m.gmane-mx.org; Thu, 09 Jul 2020 21:06:26 +0200 Original-Received: from localhost ([::1]:59114 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtbsH-0005ay-7J for ged-emacs-devel@m.gmane-mx.org; Thu, 09 Jul 2020 15:06:25 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:48814) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtbrh-0004no-54 for emacs-devel@gnu.org; Thu, 09 Jul 2020 15:05:49 -0400 Original-Received: from mail-qt1-x843.google.com ([2607:f8b0:4864:20::843]:36007) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jtbrf-00044h-Fp; Thu, 09 Jul 2020 15:05:48 -0400 Original-Received: by mail-qt1-x843.google.com with SMTP id x62so2540456qtd.3; Thu, 09 Jul 2020 12:05:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=references:user-agent:from:to:cc:subject:in-reply-to:date :message-id:mime-version; bh=vcgvYYGrsxFh4XDF/H5liRj1tXzIb3RQ+LwwH60Jnew=; b=sUXILzvurqloihqs8ZYCWnUdXDcfv3qEdsIh8uYBDe2f/0mg12SXW9YB4FJe2MeMHR itf7AkAjwj45qIpyDIMw+kodOizAucOzh3vViloxhLNukC8YcvDQMND+Nx8erk8j6IY0 YOHcacc0up2WjUGqltrb7+22b0Hr4ZLkhXe5G0ACd0gfKULeFcaBcyDiZMajTTjUtrJh YvN2IPooobcBiRzMjsBgxy2ItzZXC82orsJ6UD9yNk25sgMKGKLeiiCvSdhHsVs/VGkO FqFsOmI0NoZTbSyNPD9Noi/OeBWS1lq3AhpO4HBEyRsS/PexC6ISehKgGTJlZRR/01D2 qgBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:references:user-agent:from:to:cc:subject :in-reply-to:date:message-id:mime-version; bh=vcgvYYGrsxFh4XDF/H5liRj1tXzIb3RQ+LwwH60Jnew=; b=aRcax7EGrfIXJzvlHau+Mru7MgX/M+b+4yLEOmn1CDJIjkndZ/XjKbkmjofMU1JUHS nnax1OYQUfgNuyajG5rtoOIFWOQaCv2IItWMRoY4BkIIGqzhZjf8VB2K1BWE7CffQFO+ iC00FtXwHHVGh4UAp02ccmWZZUelwpyNsIIoX+veNfotcCizF+kKa9f6zPcOV6zoymT7 FaGIb0ikoOSNXnStvYGd1a50NkTdf/5fZrUFe8Py496pq6ElB1wGSInstB92ECgvGpvy tbkBTtqTqOpSxNmxJLfN4t9xKmpxBhMlkkyqCt9Kx/AnlghxPz8wEy8o74vWSFrLig7w 2oEw== X-Gm-Message-State: AOAM532Z8+/0fQTfgum+T6JVtqcu8gRGHf5+dUiKTYKueGAN6CtaUsVl UYW4qsPua8cZ2wRs1DIbxNiBjoU5bWU= X-Google-Smtp-Source: ABdhPJwxaF6rL4R1DwSYbjekWfxi1CZv3ocmfjwMjXhwTM+p3l6JTLZ73/JTiDI29SxNAynBCizlYw== X-Received: by 2002:ac8:35d8:: with SMTP id l24mr37755503qtb.300.1594321545509; Thu, 09 Jul 2020 12:05:45 -0700 (PDT) Original-Received: from mt-manjaro (216-58-109-18.cpe.distributel.net. [216.58.109.18]) by smtp.gmail.com with ESMTPSA id z17sm5216301qth.24.2020.07.09.12.05.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:05:44 -0700 (PDT) In-reply-to: <87eepnx04c.fsf@gmail.com> Received-SPF: pass client-ip=2607:f8b0:4864:20::843; envelope-from=matthewzmd@gmail.com; helo=mail-qt1-x843.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:252800 Archived-At: Mingde (Matthew) Zeng writes: > By definition of erc-reuse-buffers, if non-nil it should create a > new buffer when joining channels with same names on different > servers. The current behavior of erc-reuse-buffers is: > 1. when non-nil, it will always reuse the same channel buffer, > resulting in server A's channel gets reconnected to the channel with > the same name of server B. > 2. when nil, the buffer-name of the joined channel is > '#channel/server'. However if one tries to '/join #channel' from the > server buffer, it creates a new empty buffer with buffer-name > '#channel', instead of opening the already-joined channel buffer. > > * lisp/erc/erc.el (erc-generate-new-buffer-name): since `target' is > always non-nil, buffer-name is non-nil, erc-reuse-buffers is t, it > will always use the first candidate, resulting in behavior 1. This is > now fixed, and both channel buffers with the same name will be formated > '#channel/serverA' and '#channel/serverB' for the sake of consistency. > > * lisp/erc/erc.el (erc-cmd-JOIN): with some refactoring, it ensures > the joined channel buffer is selected and thereby fixes behavior 2. > > Signed-off-by: Mingde (Matthew) Zeng > --- > lisp/erc/erc.el | 38 +++++++++++++++++++++++--------------- > 1 file changed, 23 insertions(+), 15 deletions(-) > > diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el > index 3880778794..f0ace765d9 100644 > --- a/lisp/erc/erc.el > +++ b/lisp/erc/erc.el > @@ -1622,14 +1622,20 @@ symbol, it may have these values: > (if (and (not buffer-name) > erc-reuse-buffers > (or (not (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 (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))) > + (setq buffer-name candidate) > + (when (and erc-reuse-buffers (get-buffer buf-name)) I discovered an edge case and a minor adjustment will need to be made along this line. Will submit a new patch after I receive and sign the copyright assignment form from assign@gnu.org - they're not very responding right now for some reason. Matthew > + ;; a new buffer will be created with the name buf-name/server, rename > + ;; the existing name-duplicated buffer with the same format as well > + (with-current-buffer (get-buffer buf-name) > + (when (derived-mode-p 'erc-mode) ; ensure it's an erc buffer > + (rename-buffer > + (concat buf-name "/" (or erc-session-server erc-server-announced-name)))))))) > ;; if buffer-name is unset, neither candidate worked out for us, > ;; fallback to the old uniquification method: > (or buffer-name (generate-new-buffer-name (concat buf-name "/" server))))) > @@ -3097,16 +3103,18 @@ were most recently invited. See also `invitation'." > (setq chnl (erc-ensure-channel-name channel))) > (when chnl > ;; Prevent double joining of same channel on same server. > - (let ((joined-channels > - (mapcar #'(lambda (chanbuf) > - (with-current-buffer chanbuf (erc-default-target))) > - (erc-channel-list erc-server-process)))) > - (if (erc-member-ignore-case chnl joined-channels) > - (switch-to-buffer (car (erc-member-ignore-case chnl > - joined-channels))) > - (let ((server (with-current-buffer (process-buffer erc-server-process) > - (or erc-session-server erc-server-announced-name)))) > - (erc-server-join-channel server chnl key)))))) > + (let* ((joined-channels > + (mapcar #'(lambda (chanbuf) > + (with-current-buffer chanbuf (erc-default-target))) > + (erc-channel-list erc-server-process))) > + (server (with-current-buffer (process-buffer erc-server-process) > + (or erc-session-server erc-server-announced-name))) > + (chnl-name (car (erc-member-ignore-case chnl joined-channels)))) > + (if chnl-name > + (switch-to-buffer (if (get-buffer chnl-name) > + chnl-name > + (concat chnl-name "/" server))) > + (erc-server-join-channel server chnl key))))) > t) > > (defalias 'erc-cmd-CHANNEL 'erc-cmd-JOIN) -- Mingde (Matthew) Zeng