From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "J.P." Newsgroups: gmane.emacs.bugs Subject: bug#54826: 29.0.50; Prevent duplicate prompts when reconnecting in ERC Date: Fri, 29 Apr 2022 06:08:33 -0700 Message-ID: <878rro2g1a.fsf__12124.9550649495$1651237767$gmane$org@neverwas.me> References: <87pmlqgfvg.fsf@neverwas.me> <8735ilqfn4.fsf@gnus.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="4464"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) Cc: 54826@debbugs.gnu.org, emacs-erc@gnu.org To: Lars Ingebrigtsen Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Apr 29 15:09:20 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1nkQN5-0000wA-Dm for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 29 Apr 2022 15:09:20 +0200 Original-Received: from localhost ([::1]:36106 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nkQN4-0002vX-CZ for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 29 Apr 2022 09:09:18 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:41602) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nkQMq-0002sK-19 for bug-gnu-emacs@gnu.org; Fri, 29 Apr 2022 09:09:05 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:57325) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nkQMp-000162-NB for bug-gnu-emacs@gnu.org; Fri, 29 Apr 2022 09:09:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nkQMo-0000oD-J0 for bug-gnu-emacs@gnu.org; Fri, 29 Apr 2022 09:09:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: "J.P." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 29 Apr 2022 13:09:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 54826 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 54826-submit@debbugs.gnu.org id=B54826.16512377313083 (code B ref 54826); Fri, 29 Apr 2022 13:09:02 +0000 Original-Received: (at 54826) by debbugs.gnu.org; 29 Apr 2022 13:08:51 +0000 Original-Received: from localhost ([127.0.0.1]:51221 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nkQMc-0000ne-6f for submit@debbugs.gnu.org; Fri, 29 Apr 2022 09:08:51 -0400 Original-Received: from mail-108-mta101.mxroute.com ([136.175.108.101]:34867) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nkQMZ-0000nO-Hd for 54826@debbugs.gnu.org; Fri, 29 Apr 2022 09:08:48 -0400 Original-Received: from filter006.mxroute.com ([140.82.40.27] 140.82.40.27.vultrusercontent.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta101.mxroute.com (ZoneMTA) with ESMTPSA id 18075700722000fe85.001 for <54826@debbugs.gnu.org> (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Fri, 29 Apr 2022 13:08:37 +0000 X-Zone-Loop: 5730b541dab498b033d8ed6b8579ccc63466d33ae4ae X-Originating-IP: [140.82.40.27] DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=neverwas.me ; s=x; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date:References: Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=e2sVOHkvWp1pUh657dhDyr2Lihhco1GtaU8N8qWNpNY=; b=QZA8nevRW09pIX35eUjitnQtcu y/BsBu3cyoFDwFUGv9sLvf6aQVEBh1TF3Rp4tRWsgpj+1Fz76QOFZB7XeeQD9GZGSBKcG00D9s3Dz oRnAr5dEgj2OQKEUx0QFa/+OUm8QWUFk1nU0saFiM+fPY0xdszilAWvue8LdNd01CHzTjdjOuwaqW vBGLEa3NujIAdZ/STb66p5jqF1oY/dmp/izGttsoBPxo1lxoP6QgPQZpAjFineHtkWglk2XMaxGZy iGqfCroJuGmLver+iu8V/9BfDNMd43LsHBXSrqOjbmRqyhD+oOi/oneyjs5kTGU/+I4oWRuW1bP7f WwzTWQcQ==; In-Reply-To: <8735ilqfn4.fsf@gnus.org> (Lars Ingebrigtsen's message of "Sun, 10 Apr 2022 14:36:31 +0200") X-AuthUser: masked@neverwas.me X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:230957 Archived-At: --=-=-= Content-Type: text/plain Lars Ingebrigtsen writes: > "J.P." writes: > >> The proposed patch leverages a long abandoned option called >> `erc-hide-prompt' to help address both these concerns. > > Makes sense to me. > >> 1. Currently, channels and queries are lumped together as 'target'. What >> about changing the shape of the option to a set of {'server', >> 'channel', 'query'} in a union with t for "all of the above" (to >> preserve compatibility)? > > Sure. > >> Is overloading the "prompt hidden" indicator with multiple meanings >> too distracting? (Currently, it means both "disconnected" and >> "physically connected but possibly not resumable".) Should we instead >> just reveal the prompt for all queries upon reconnecting, even though >> it may not be possible to continue certain conversations? Would it be >> worth accommodating both behaviors via yet another knob (or perhaps >> different 'query' variants, when going with 1, above)? > > I think a new knob would be probably be preferable. > >> 2. Right now, the prompt looks like this when hidden: >> >> n-1 | *** ERC finished *** [04:30] >> n | >_ >> >> Where _ is the cursor at point max. Should we leave a space after the >> ">"? > > I think having a space there would be good. Thanks Lars. To everyone else out there: since no one has cared to comment, I've based these changes on Lars's feedback alone. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0000-v1-v2.diff >From 2476ad0cb7b8016dbef1e41080941a727d2be992 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Mon, 25 Apr 2022 22:42:10 -0700 Subject: [PATCH 0/2] *** NOT A PATCH *** *** BLURB HERE *** F. Jason Park (2): Add some ERC test helpers [SQUASH-ME] Remove duplicate ERC prompt on reconnect lisp/erc/erc-backend.el | 41 ++++++++-- lisp/erc/erc.el | 74 ++++++++++-------- test/lisp/erc/erc-tests.el | 150 +++++++++++++++++++++++++++++++++++-- 3 files changed, 221 insertions(+), 44 deletions(-) Interdiff: diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index ff5c28b5d8..a09c1608f9 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -713,14 +713,20 @@ erc--hide-prompt (erc-with-all-buffers-of-server proc nil ; sorta wish this was indent 2 (when (and erc-hide-prompt - (memq erc-hide-prompt - (list t (if (erc-default-target) 'target 'server))) + (or (eq erc-hide-prompt t) + ;; FIXME use `erc--target' after bug#48598 + (memq (if (erc-default-target) + (if (erc-channel-p (car erc-default-recipients)) + 'channel + 'query) + 'server) + erc-hide-prompt)) (marker-position erc-insert-marker) (marker-position erc-input-marker) (get-text-property erc-insert-marker 'erc-prompt)) (with-silent-modifications - (add-text-properties erc-insert-marker - erc-input-marker `(display ,erc-prompt-hidden))) + (add-text-properties erc-insert-marker (1- erc-input-marker) + `(display ,erc-prompt-hidden))) (add-hook 'pre-command-hook #'erc--unhide-prompt-on-self-insert 0 t)))) (defun erc-process-sentinel (cproc event) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 8ce4e91812..500f8d7406 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -234,14 +234,25 @@ erc-hide-prompt "If non-nil, hide input prompt upon disconnecting. To unhide, type something in the input area. Once revealed, a prompt remains unhidden until the next disconnection. Channel prompts are -unhidden upon rejoining. Query prompts remain hidden until user input -is detected or a new message arrives from the target." +unhidden upon rejoining. See `erc-unhide-query-prompt' for behavior +concerning query prompts." :package-version '(ERC . "5.4.1") ; FIXME increment on next ELPA release :group 'erc-display :type '(choice (const :tag "Always hide prompt" t) - (const :tag "Never hide prompt" nil) - (const :tag "Only hide target prompt" 'target) - (const :tag "Only hide server prompt" 'server))) + (set (const server) + (const query) + (const channel)))) + +(defcustom erc-unhide-query-prompt nil + "When non-nil, always reveal query prompts upon reconnecting. +Otherwise, prompts in a connection's query buffers remain hidden until +the user types in the input area or a new message arrives from the +target." + :package-version '(ERC . "5.4.1") + :group 'erc-display + ;; Extensions may one day offer a way to discover whether a target + ;; is online. When that happens, this can be expanded accordingly. + :type 'boolean) ;; tunable GUI stuff @@ -4722,7 +4733,14 @@ erc-connection-established (erc-update-mode-line) (erc-set-initial-user-mode nick buffer) (erc-server-setup-periodical-ping buffer) - (run-hook-with-args 'erc-after-connect server nick))))) + (run-hook-with-args 'erc-after-connect server nick)))) + + (when erc-unhide-query-prompt + (erc-with-all-buffers-of-server proc + nil ; FIXME use `erc--target' after bug#48598 + (when (and (erc-default-target) + (not (erc-channel-p (car erc-default-recipients)))) + (erc--unhide-prompt))))) (defun erc-set-initial-user-mode (nick buffer) "If `erc-user-mode' is non-nil for NICK, set the user modes. diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index c1d2196a38..961aab4338 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -148,6 +148,14 @@ erc-hide-prompt (get-buffer "ServNet")) erc-default-recipients '("#chan"))) + (with-current-buffer (get-buffer-create "bob") + (erc-tests--send-prep) + (goto-char erc-insert-marker) + (should (looking-at-p (regexp-quote erc-prompt))) + (setq erc-server-process (buffer-local-value 'erc-server-process + (get-buffer "ServNet")) + erc-default-recipients '("bob"))) + (ert-info ("Value: t (default)") (should (eq erc-hide-prompt t)) (with-current-buffer "ServNet" @@ -166,6 +174,17 @@ erc-hide-prompt (should-not (memq #'erc--unhide-prompt-on-self-insert pre-command-hook))) + (with-current-buffer "bob" + (goto-char erc-insert-marker) + (should (string= ">" (get-text-property (point) 'display))) + (should (memq #'erc--unhide-prompt-on-self-insert pre-command-hook)) + (goto-char erc-input-marker) + (ert-simulate-command '(self-insert-command 1 ?/)) + (goto-char erc-insert-marker) + (should-not (get-text-property (point) 'display)) + (should-not (memq #'erc--unhide-prompt-on-self-insert + pre-command-hook))) + (with-current-buffer "ServNet" (should (get-text-property erc-insert-marker 'display)) (should (memq #'erc--unhide-prompt-on-self-insert pre-command-hook)) @@ -175,7 +194,7 @@ erc-hide-prompt (should-not (get-text-property erc-insert-marker 'display)))) (ert-info ("Value: server") - (setq erc-hide-prompt 'server) + (setq erc-hide-prompt '(server)) (with-current-buffer "ServNet" (erc--hide-prompt erc-server-process) (should (string= ">" (get-text-property erc-insert-marker 'display)))) @@ -183,27 +202,50 @@ erc-hide-prompt (with-current-buffer "#chan" (should-not (get-text-property erc-insert-marker 'display))) + (with-current-buffer "bob" + (should-not (get-text-property erc-insert-marker 'display))) + (with-current-buffer "ServNet" (erc--unhide-prompt) (should-not (get-text-property erc-insert-marker 'display)))) - (ert-info ("Value: target") - (setq erc-hide-prompt 'target) + (ert-info ("Value: channel") + (setq erc-hide-prompt '(channel)) (with-current-buffer "ServNet" (erc--hide-prompt erc-server-process) (should-not (get-text-property erc-insert-marker 'display))) + (with-current-buffer "bob" + (should-not (get-text-property erc-insert-marker 'display))) + (with-current-buffer "#chan" (should (string= ">" (get-text-property erc-insert-marker 'display))) (erc--unhide-prompt) (should-not (get-text-property erc-insert-marker 'display)))) + (ert-info ("Value: query") + (setq erc-hide-prompt '(query)) + (with-current-buffer "ServNet" + (erc--hide-prompt erc-server-process) + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "bob" + (should (string= ">" (get-text-property erc-insert-marker 'display))) + (erc--unhide-prompt) + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "#chan" + (should-not (get-text-property erc-insert-marker 'display)))) + (ert-info ("Value: nil") (setq erc-hide-prompt nil) (with-current-buffer "ServNet" (erc--hide-prompt erc-server-process) (should-not (get-text-property erc-insert-marker 'display))) + (with-current-buffer "bob" + (should-not (get-text-property erc-insert-marker 'display))) + (with-current-buffer "#chan" (should-not (get-text-property erc-insert-marker 'display)) (erc--unhide-prompt) ; won't blow up when prompt already showing @@ -211,6 +253,7 @@ erc-hide-prompt (when noninteractive (kill-buffer "#chan") + (kill-buffer "bob") (kill-buffer "ServNet")))) (ert-deftest erc--switch-to-buffer () -- 2.35.1 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Add-some-ERC-test-helpers.patch >From 8796cf5ee37983477c7fec271d15ea74c8b7b2e9 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Tue, 5 Apr 2022 17:45:00 -0700 Subject: [PATCH 1/2] Add some ERC test helpers * test/lisp/erc/erc-tests.el (erc-tests--test-prep, erc-tests--set-fake-server-process): Factor out some common buffer-prep boilerplate involving user input and the server process. Shared with bug#54536. --- test/lisp/erc/erc-tests.el | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 520f10dd4e..373bed55af 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -114,6 +114,20 @@ erc-with-all-buffers-of-server (should (get-buffer "#spam")) (kill-buffer "#spam"))) +(defun erc-tests--send-prep () + (erc-mode) + (insert "\n\n") + (setq erc-input-marker (make-marker) + erc-insert-marker (make-marker)) + (set-marker erc-insert-marker (point-max)) + (erc-display-prompt) + (should (= (point) erc-input-marker))) + +(defun erc-tests--set-fake-server-process (&rest args) + (setq erc-server-process + (apply #'start-process (car args) (current-buffer) args)) + (set-process-query-on-exit-flag erc-server-process nil)) + (ert-deftest erc--switch-to-buffer () (defvar erc-modified-channels-alist) ; lisp/erc/erc-track.el @@ -197,14 +211,10 @@ erc-ring-previous-command-base-case (ert-deftest erc-ring-previous-command () (with-current-buffer (get-buffer-create "*#fake*") (erc-mode) - (insert "\n\n") + (erc-tests--send-prep) + (setq-local erc-last-input-time 0) (should-not (local-variable-if-set-p 'erc-send-completed-hook)) (set (make-local-variable 'erc-send-completed-hook) nil) ; skip t (globals) - (setq erc-input-marker (make-marker) - erc-insert-marker (make-marker)) - (set-marker erc-insert-marker (point-max)) - (erc-display-prompt) - (should (= (point) erc-input-marker)) ;; Just in case erc-ring-mode is already on (setq-local erc-pre-send-functions nil) (add-hook 'erc-pre-send-functions #'erc-add-to-input-ring) -- 2.35.1 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-SQUASH-ME-Remove-duplicate-ERC-prompt-on-reconnect.patch >From 2476ad0cb7b8016dbef1e41080941a727d2be992 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Mon, 4 Apr 2022 01:50:50 -0700 Subject: [PATCH 2/2] [SQUASH-ME] Remove duplicate ERC prompt on reconnect * lisp/erc/erc-backend.el (erc--unhide-prompt, erc--hide-prompt, erc--unhide-prompt-on-self-insert): Add functions to ensure prompt is hidden on disconnect and shown when a user types /reconnect in a disconnected server buffer. (erc-process-sentinel): Register aforementioned function with `pre-command-hook' when prompt is deleted after disconnecting. (erc-server-PRIVMSG): ensure prompt is showing when a new message arrives from target. * lisp/erc/erc.el (erc-hide-prompt): Repurpose unused option by changing meaning slightly to mean "selectively hide prompt when disconnected." Also delete obsolete, commented-out code that at some point used this option in its prior incarnation. (erc-prompt-hidden): Add new option to specify look of prompt when hidden. (erc-unhide-query-prompt): Add option to force-reveal query prompts on reconnect. (erc-open): Augment earlier reconnect-detection semantics by incorporating `erc--server-reconnecting'. In existing buffers, remove prompt-related hooks and reveal prompt, if necessary. (erc-cmd-RECONNECT): allow a user to reconnect when already connected (by first disconnecting). (erc-connection-established): Possibly unhide query prompts. --- lisp/erc/erc-backend.el | 41 ++++++++++-- lisp/erc/erc.el | 74 +++++++++++---------- test/lisp/erc/erc-tests.el | 128 +++++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 38 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 4b21711da4..a09c1608f9 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -696,6 +696,39 @@ erc-process-sentinel-1 ;; unexpected disconnect (erc-process-sentinel-2 event buffer)))) +(defun erc--unhide-prompt () + (remove-hook 'pre-command-hook #'erc--unhide-prompt-on-self-insert t) + (when (and (marker-position erc-insert-marker) + (marker-position erc-input-marker)) + (with-silent-modifications + (remove-text-properties erc-insert-marker erc-input-marker + '(display nil))))) + +(defun erc--unhide-prompt-on-self-insert () + (when (and (eq this-command #'self-insert-command) + (or (eobp) (= (point) erc-input-marker))) + (erc--unhide-prompt))) + +(defun erc--hide-prompt (proc) + (erc-with-all-buffers-of-server + proc nil ; sorta wish this was indent 2 + (when (and erc-hide-prompt + (or (eq erc-hide-prompt t) + ;; FIXME use `erc--target' after bug#48598 + (memq (if (erc-default-target) + (if (erc-channel-p (car erc-default-recipients)) + 'channel + 'query) + 'server) + erc-hide-prompt)) + (marker-position erc-insert-marker) + (marker-position erc-input-marker) + (get-text-property erc-insert-marker 'erc-prompt)) + (with-silent-modifications + (add-text-properties erc-insert-marker (1- erc-input-marker) + `(display ,erc-prompt-hidden))) + (add-hook 'pre-command-hook #'erc--unhide-prompt-on-self-insert 0 t)))) + (defun erc-process-sentinel (cproc event) "Sentinel function for ERC process." (let ((buf (process-buffer cproc))) @@ -718,11 +751,8 @@ erc-process-sentinel (dolist (buf (erc-buffer-filter (lambda () (boundp 'erc-channel-users)) cproc)) (with-current-buffer buf (setq erc-channel-users (make-hash-table :test 'equal)))) - ;; Remove the prompt - (goto-char (or (marker-position erc-input-marker) (point-max))) - (forward-line 0) - (erc-remove-text-properties-region (point) (point-max)) - (delete-region (point) (point-max)) + ;; Hide the prompt + (erc--hide-prompt cproc) ;; Decide what to do with the buffer ;; Restart if disconnected (erc-process-sentinel-1 event buf)))))) @@ -1470,6 +1500,7 @@ define-erc-response-handler (setq buffer (erc-get-buffer (if privp nick tgt) proc)) (when buffer (with-current-buffer buffer + (when privp (erc--unhide-prompt)) ;; update the chat partner info. Add to the list if private ;; message. We will accumulate private identities indefinitely ;; at this point. diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 06381c5ebe..500f8d7406 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -224,13 +224,34 @@ erc-send-whitespace-lines :group 'erc :type 'boolean) -(defcustom erc-hide-prompt nil - "If non-nil, do not display the prompt for commands. - -\(A command is any input starting with a `/'). +(defcustom erc-prompt-hidden ">" + "Text to show in lieu of the prompt when hidden." + :package-version '(ERC . "5.4.1") ; FIXME increment on next ELPA release + :group 'erc-display + :type 'string) -See also the variables `erc-prompt' and `erc-command-indicator'." +(defcustom erc-hide-prompt t + "If non-nil, hide input prompt upon disconnecting. +To unhide, type something in the input area. Once revealed, a prompt +remains unhidden until the next disconnection. Channel prompts are +unhidden upon rejoining. See `erc-unhide-query-prompt' for behavior +concerning query prompts." + :package-version '(ERC . "5.4.1") ; FIXME increment on next ELPA release :group 'erc-display + :type '(choice (const :tag "Always hide prompt" t) + (set (const server) + (const query) + (const channel)))) + +(defcustom erc-unhide-query-prompt nil + "When non-nil, always reveal query prompts upon reconnecting. +Otherwise, prompts in a connection's query buffers remain hidden until +the user types in the input area or a new message arrives from the +target." + :package-version '(ERC . "5.4.1") + :group 'erc-display + ;; Extensions may one day offer a way to discover whether a target + ;; is online. When that happens, this can be expanded accordingly. :type 'boolean) ;; tunable GUI stuff @@ -1996,7 +2017,7 @@ erc-open (buffer (erc-get-buffer-create server port channel)) (old-buffer (current-buffer)) old-point - continued-session) + (continued-session erc--server-reconnecting)) (when connect (run-hook-with-args 'erc-before-connect server port nick)) (erc-update-modules) (set-buffer buffer) @@ -2014,7 +2035,7 @@ erc-open ;; (the buffer may have existed) (goto-char (point-max)) (forward-line 0) - (when (get-text-property (point) 'erc-prompt) + (when (or continued-session (get-text-property (point) 'erc-prompt)) (setq continued-session t) (set-marker erc-input-marker (or (next-single-property-change (point) 'erc-prompt) @@ -2074,7 +2095,8 @@ erc-open (goto-char (point-max)) (insert "\n")) (if continued-session - (goto-char old-point) + (progn (goto-char old-point) + (erc--unhide-prompt)) (set-marker erc-insert-marker (point)) (erc-display-prompt) (goto-char (point-max))) @@ -3745,9 +3767,9 @@ erc-cmd-RECONNECT (setq erc--server-reconnecting t) (setq erc-server-reconnect-count 0) (setq process (get-buffer-process (erc-server-buffer))) - (if process - (delete-process process) - (erc-server-reconnect)) + (when process + (delete-process process)) + (erc-server-reconnect) (with-suppressed-warnings ((obsolete erc-server-reconnecting)) (setq erc-server-reconnecting nil)) (setq erc--server-reconnecting nil))) @@ -4711,7 +4733,14 @@ erc-connection-established (erc-update-mode-line) (erc-set-initial-user-mode nick buffer) (erc-server-setup-periodical-ping buffer) - (run-hook-with-args 'erc-after-connect server nick))))) + (run-hook-with-args 'erc-after-connect server nick)))) + + (when erc-unhide-query-prompt + (erc-with-all-buffers-of-server proc + nil ; FIXME use `erc--target' after bug#48598 + (when (and (erc-default-target) + (not (erc-channel-p (car erc-default-recipients)))) + (erc--unhide-prompt))))) (defun erc-set-initial-user-mode (nick buffer) "If `erc-user-mode' is non-nil for NICK, set the user modes. @@ -5665,27 +5694,6 @@ erc-send-input (erc-process-input-line (concat string "\n") t nil)) t)))))) -;; (defun erc-display-command (line) -;; (when erc-insert-this -;; (let ((insert-position (point))) -;; (unless erc-hide-prompt -;; (erc-display-prompt nil nil (erc-command-indicator) -;; (and (erc-command-indicator) -;; 'erc-command-indicator-face))) -;; (let ((beg (point))) -;; (insert line) -;; (erc-put-text-property beg (point) -;; 'font-lock-face 'erc-command-indicator-face) -;; (insert "\n")) -;; (when (processp erc-server-process) -;; (set-marker (process-mark erc-server-process) (point))) -;; (set-marker erc-insert-marker (point)) -;; (save-excursion -;; (save-restriction -;; (narrow-to-region insert-position (point)) -;; (run-hooks 'erc-send-modify-hook) -;; (run-hooks 'erc-send-post-hook)))))) - (defun erc-display-msg (line) "Display LINE as a message of the user to the current target at point." (when erc-insert-this diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 373bed55af..961aab4338 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -128,6 +128,134 @@ erc-tests--set-fake-server-process (apply #'start-process (car args) (current-buffer) args)) (set-process-query-on-exit-flag erc-server-process nil)) +(ert-deftest erc-hide-prompt () + (let (erc-kill-channel-hook erc-kill-server-hook erc-kill-buffer-hook) + + (with-current-buffer (get-buffer-create "ServNet") + (erc-tests--send-prep) + (goto-char erc-insert-marker) + (should (looking-at-p (regexp-quote erc-prompt))) + (erc-tests--set-fake-server-process "sleep" "1") + (set-process-sentinel erc-server-process #'ignore) + (setq erc-network 'ServNet) + (set-process-query-on-exit-flag erc-server-process nil)) + + (with-current-buffer (get-buffer-create "#chan") + (erc-tests--send-prep) + (goto-char erc-insert-marker) + (should (looking-at-p (regexp-quote erc-prompt))) + (setq erc-server-process (buffer-local-value 'erc-server-process + (get-buffer "ServNet")) + erc-default-recipients '("#chan"))) + + (with-current-buffer (get-buffer-create "bob") + (erc-tests--send-prep) + (goto-char erc-insert-marker) + (should (looking-at-p (regexp-quote erc-prompt))) + (setq erc-server-process (buffer-local-value 'erc-server-process + (get-buffer "ServNet")) + erc-default-recipients '("bob"))) + + (ert-info ("Value: t (default)") + (should (eq erc-hide-prompt t)) + (with-current-buffer "ServNet" + (should (= (point) erc-insert-marker)) + (erc--hide-prompt erc-server-process) + (should (string= ">" (get-text-property (point) 'display)))) + + (with-current-buffer "#chan" + (goto-char erc-insert-marker) + (should (string= ">" (get-text-property (point) 'display))) + (should (memq #'erc--unhide-prompt-on-self-insert pre-command-hook)) + (goto-char erc-input-marker) + (ert-simulate-command '(self-insert-command 1 ?/)) + (goto-char erc-insert-marker) + (should-not (get-text-property (point) 'display)) + (should-not (memq #'erc--unhide-prompt-on-self-insert + pre-command-hook))) + + (with-current-buffer "bob" + (goto-char erc-insert-marker) + (should (string= ">" (get-text-property (point) 'display))) + (should (memq #'erc--unhide-prompt-on-self-insert pre-command-hook)) + (goto-char erc-input-marker) + (ert-simulate-command '(self-insert-command 1 ?/)) + (goto-char erc-insert-marker) + (should-not (get-text-property (point) 'display)) + (should-not (memq #'erc--unhide-prompt-on-self-insert + pre-command-hook))) + + (with-current-buffer "ServNet" + (should (get-text-property erc-insert-marker 'display)) + (should (memq #'erc--unhide-prompt-on-self-insert pre-command-hook)) + (erc--unhide-prompt) + (should-not (memq #'erc--unhide-prompt-on-self-insert + pre-command-hook)) + (should-not (get-text-property erc-insert-marker 'display)))) + + (ert-info ("Value: server") + (setq erc-hide-prompt '(server)) + (with-current-buffer "ServNet" + (erc--hide-prompt erc-server-process) + (should (string= ">" (get-text-property erc-insert-marker 'display)))) + + (with-current-buffer "#chan" + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "bob" + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "ServNet" + (erc--unhide-prompt) + (should-not (get-text-property erc-insert-marker 'display)))) + + (ert-info ("Value: channel") + (setq erc-hide-prompt '(channel)) + (with-current-buffer "ServNet" + (erc--hide-prompt erc-server-process) + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "bob" + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "#chan" + (should (string= ">" (get-text-property erc-insert-marker 'display))) + (erc--unhide-prompt) + (should-not (get-text-property erc-insert-marker 'display)))) + + (ert-info ("Value: query") + (setq erc-hide-prompt '(query)) + (with-current-buffer "ServNet" + (erc--hide-prompt erc-server-process) + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "bob" + (should (string= ">" (get-text-property erc-insert-marker 'display))) + (erc--unhide-prompt) + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "#chan" + (should-not (get-text-property erc-insert-marker 'display)))) + + (ert-info ("Value: nil") + (setq erc-hide-prompt nil) + (with-current-buffer "ServNet" + (erc--hide-prompt erc-server-process) + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "bob" + (should-not (get-text-property erc-insert-marker 'display))) + + (with-current-buffer "#chan" + (should-not (get-text-property erc-insert-marker 'display)) + (erc--unhide-prompt) ; won't blow up when prompt already showing + (should-not (get-text-property erc-insert-marker 'display)))) + + (when noninteractive + (kill-buffer "#chan") + (kill-buffer "bob") + (kill-buffer "ServNet")))) + (ert-deftest erc--switch-to-buffer () (defvar erc-modified-channels-alist) ; lisp/erc/erc-track.el -- 2.35.1 --=-=-=--