From unknown Tue Jun 17 20:19:35 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#67032 <67032@debbugs.gnu.org> To: bug#67032 <67032@debbugs.gnu.org> Subject: Status: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly Reply-To: bug#67032 <67032@debbugs.gnu.org> Date: Wed, 18 Jun 2025 03:19:35 +0000 retitle 67032 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly reassign 67032 emacs submitter 67032 "J.P." severity 67032 normal tag 67032 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Thu Nov 09 21:28:11 2023 Received: (at submit) by debbugs.gnu.org; 10 Nov 2023 02:28:11 +0000 Received: from localhost ([127.0.0.1]:49240 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r1HFi-0005p5-2o for submit@debbugs.gnu.org; Thu, 09 Nov 2023 21:28:11 -0500 Received: from lists.gnu.org ([2001:470:142::17]:58926) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r1HFf-0005or-5s for submit@debbugs.gnu.org; Thu, 09 Nov 2023 21:28:08 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r1HEw-0003hv-5v for bug-gnu-emacs@gnu.org; Thu, 09 Nov 2023 21:27:22 -0500 Received: from mail-108-mta235.mxroute.com ([136.175.108.235]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r1HEs-0000bw-E8 for bug-gnu-emacs@gnu.org; Thu, 09 Nov 2023 21:27:21 -0500 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta235.mxroute.com (ZoneMTA) with ESMTPSA id 18bb70e128e000190b.001 for (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Fri, 10 Nov 2023 02:27:14 +0000 X-Zone-Loop: 665062e715eaecedd45d688a4330aed67438d0667af9 X-Originating-IP: [136.175.111.2] 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:Date:Subject:To:From:Sender: Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=Whg26xiPJR5dRWnhNbwtjm+P6JlgcKXIeUFo9IB6E5Q=; b=WYqprN/0+XeyKDxJlvviQAP6R6 FvXQVF4pjBJQnxnnCSU3TBrn4eHEtd6ivLrqTBljspLvL5BZSbeMW0xMH4eFa3SWE2JOLA4I1SPtf m0RxR8wBofLxObRObttp7qI1qupc5rdg5HTC8djthH5Sl2VMV+cJ3/fcYStpddDPC/9ncmUXo8RIK Tc0JjCOuCWCyvGG4zdrGA/kJnLewCyIlnkoPQ7fp7oLuTHFWJ7ZbpXlAkf2UOIHBA/Dxr68fcOxFW +IagzcnCAyBw+sk9R2nbXW6SARTXZ2QjV+Ca1/eJFzHxd7oHSkqLx1dFxU7Pl2CkhlkHoAYWmyStY KBy3llyQ==; From: "J.P." To: bug-gnu-emacs@gnu.org Subject: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly X-Debbugs-CC: emacs-erc@gnu.org Date: Thu, 09 Nov 2023 18:26:51 -0800 Message-ID: <87v8aa9wd0.fsf@neverwas.me> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Authenticated-Id: masked@neverwas.me Received-SPF: pass client-ip=136.175.108.235; envelope-from=jp@neverwas.me; helo=mail-108-mta235.mxroute.com 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, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 0.9 (/) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.1 (/) --=-=-= Content-Type: text/plain Tags: patch The function `erc-send-message', as used in-tree, sends and inserts messages produced by handlers for certain slash commands. But rather than being a simplistic analog for `erc-send-current-line', it's used in practice to take over for that function in situations where the actual prompt input is modified or replaced (and possibly reprocessed anew as simulated "meta" input, as is the case with /SAY). From the user's perspective, such messages are supposed to look and feel like all other outgoing chat messages. However, at present, they don't. I was originally hoping to introduce these changes for the next release, but a bug has surfaced that exposes a major problem with the current implementation. >From emacs -Q: 1. Connect and join a channel 2. Type /sm RET at the prompt 3. Check the server buffer for a "message too long" error The issue here is not that we've reached a module count large enough to tip the outgoing text produced by `erc-modes' over the byte limit but rather that `erc-send-message' has outgrown its usefulness and must now evolve into something more robust and capable (in a backward compatible way, of course). In tackling this, I've opted to sidestep a few related concerns that will have to be dealt with eventually. The first has to do with discovering and possibly reintegrating whatever role the `noncommands' module is designed to play in processing specialty slash commands, like those reliant on `erc-send-message'. These days (reaching as far back as Emacs 26.1), the module appears to effectively be a no-op, at least with the default client configuration. Until we know more, I'm inclined to let it rot away in erc-goodies, since its code only runs on interactive input anyway. Another issue I've avoided confronting with these changes is the ugly relationship between `erc-format-privmessage', `erc-server-PRIVMSG', `erc-format-nick-function', and `erc-display-message'. Sooner or later, most of the speaker-related formatting shared between this bunch will need to be consolidated and likely made accessible from `erc-display-message' alone so that various next-gen features, such as displaying messages from other devices sharing the same presence, can be handled properly and made to look like the result of local prompt input. All in good time, I guess. In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.38, cairo version 1.17.6) of 2023-11-09 built on localhost Repository revision: 9c9b87639f919169eed956e9e7cce472d3a2f719 Repository branch: master Windowing system distributor 'The X.Org Foundation', version 11.0.12014000 System Description: Fedora Linux 37 (Workstation Edition) Configured using: 'configure --enable-check-lisp-object-type --enable-checking=yes,glyphs 'CFLAGS=-O0 -g3' PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB Important settings: value of $LANG: en_US.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t minibuffer-regexp-mode: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message mailcap yank-media puny dired dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util text-property-search time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils erc auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x map format-spec cl-loaddefs cl-lib erc-backend erc-networks byte-opt gv bytecomp byte-compile erc-common erc-compat erc-loaddefs rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd touch-screen tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo gtk x-toolkit xinput2 x multi-tty move-toolbar make-network-process emacs) Memory information: ((conses 16 66646 9545) (symbols 48 8720 0) (strings 32 23596 1638) (string-bytes 1 688941) (vectors 16 16134) (vector-slots 8 216395 14139) (floats 8 24 47) (intervals 56 242 0) (buffers 984 10)) --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-5.6-Make-ERC-error-notice-formatting-more-consistent.patch >From 2f5095294b7df8489fbb4c6ab9e75ad5fe1b2462 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 8 Nov 2023 19:14:55 -0800 Subject: [PATCH 1/5] [5.6] Make ERC error-notice formatting more consistent * lisp/erc/erc-backend.el (erc--server-propagate-failed-connection): Print leading notice prefix when reporting process exit status, and set `erc-msg' type to `notice-error'. (erc-schedule-reconnect): Print leading notice prefix when printing `reconnecting' message. * lisp/erc/erc.el (erc-process-input-line, erc-cmd-PART, erc-cmd-TOPIC): Print `no-target' messages as error notices. (erc-message-english-disconnected, erc-message-english-disconnected-noreconnect): Hard-code standard "***" notice prefix into message text, for consistency. * test/lisp/erc/erc-tests.el (erc--refresh-prompt): Expect notice prefix before `no-target' message. --- lisp/erc/erc-backend.el | 4 ++-- lisp/erc/erc.el | 11 ++++++----- test/lisp/erc/erc-tests.el | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 4b5edaa77d2..32d891cd1c6 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -728,7 +728,7 @@ erc--server-propagate-failed-connection the server buffer in any case." (when (eq (process-status process) 'failed) (erc-display-message - nil 'error (process-buffer process) + nil '(notice error) (process-buffer process) (format "Process exit status: %S" (process-exit-status process))) (pcase (process-exit-status process) (111 @@ -995,7 +995,7 @@ erc-schedule-reconnect (- erc-server-reconnect-attempts (cl-incf erc-server-reconnect-count (or incr 1))))) (proc (buffer-local-value 'erc-server-process buffer))) - (erc-display-message nil 'error buffer 'reconnecting + (erc-display-message nil '(notice error) buffer 'reconnecting ?m erc-server-reconnect-timeout ?i (if count erc-server-reconnect-count "N") ?n (if count erc-server-reconnect-attempts "A")) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index fd57cb9d6a0..2d8f388328d 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3729,7 +3729,7 @@ erc-process-input-line (let ((r (erc-default-target))) (if r (funcall erc-send-input-line-function r line force) - (erc-display-message nil 'error (current-buffer) 'no-target) + (erc-display-message nil '(notice error) (current-buffer) 'no-target) nil))))) (defconst erc--shell-parse-regexp @@ -4581,7 +4581,7 @@ erc-cmd-PART (format "PART %s" ch) (format "PART %s :%s" ch reason)) nil ch)) - (erc-display-message nil 'error (current-buffer) 'no-target))) + (erc-display-message nil '(notice error) (current-buffer) 'no-target))) t) (t nil))) (put 'erc-cmd-PART 'do-not-parse-args t) @@ -4921,7 +4921,7 @@ erc-cmd-TOPIC (progn (erc-log (format "cmd: TOPIC [%s]: %s" ch topic)) (erc-server-send (format "TOPIC %s :%s" ch topic) nil ch)) - (erc-display-message nil 'error (current-buffer) 'no-target))) + (erc-display-message nil '(notice error) (current-buffer) 'no-target))) t) (t nil))) (defalias 'erc-cmd-T #'erc-cmd-TOPIC) @@ -8194,9 +8194,10 @@ erc-define-catalog (flood-ctcp-off . "FLOOD PROTECTION: Automatic CTCP responses turned off.") (flood-strict-mode . "FLOOD PROTECTION: Switched to Strict Flood Control mode.") - (disconnected . "\n\nConnection failed! Re-establishing connection...\n") + (disconnected + . "\n\n*** Connection failed! Re-establishing connection...\n") (disconnected-noreconnect - . "\n\nConnection failed! Not re-establishing connection.\n") + . "\n\n*** Connection failed! Not re-establishing connection.\n") (reconnecting . "Reconnecting in %ms: attempt %i/%n ...") (reconnect-canceled . "Canceled %u reconnect timer with %cs to go...") (finished . "\n\n*** ERC finished ***\n") diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 916b394c8ff..2898ca7be75 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -317,7 +317,7 @@ erc--refresh-prompt (insert "Howdy") (erc-send-current-line) (save-excursion (forward-line -1) - (should (looking-at "No target")) + (should (looking-at (rx "*** No target"))) (forward-line -1) (should (looking-at " Howdy"))) (should (looking-back "ServNet 6> ")) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-5.6-Make-ERC-s-message-sending-functions-more-flexib.patch >From a4a8360804d58beaa3357e35207d6f9bc7ef532b Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 15 Jul 2022 05:02:35 -0700 Subject: [PATCH 2/5] [5.6] Make ERC's message-sending functions more flexible * lisp/erc/erc-backend.el (erc--server-send, erc-server-send): Convert the latter to a wrapper that calls the former, a "new" internal generic function. Extend `no-penalty' parameter to mean ERC will schedule an imminent send via a timer. Always run `erc-server-send-queue' on a timer. * lisp/erc/erc.el (erc-send-action, erc--send-action): Make former a wrapper for latter, a new generic function. The rationale is that built-in modules should be able to elect to handle insertion themselves. Also fix bug involving /ME ACTIONs not having `erc-my-nick-face' applied to the speaker. (erc-send-message, erc--send-message): Make the former a wrapper for the latter, a new generic function. Since commands, like /SV, use this function to handle their own insertion, modules can't leverage the normal API to suppress insertion. (erc--send-input-lines): Convert to generic function. --- lisp/erc/erc-backend.el | 12 +++++++++--- lisp/erc/erc.el | 11 +++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 32d891cd1c6..b16824b1f73 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -1171,7 +1171,7 @@ erc-server-send When FORCE is non-nil, bypass flood protection so that STRING is sent directly without modifying the queue. When FORCE is the symbol `no-penalty', exempt this round from accumulating a -timeout penalty. +timeout penalty and schedule it to run ASAP instead of blocking. If TARGET is specified, look up encoding information for that channel in `erc-encoding-coding-alist' or @@ -1179,6 +1179,9 @@ erc-server-send See `erc-server-flood-margin' for an explanation of the flood protection algorithm." + (erc--server-send string force target)) + +(cl-defmethod erc--server-send (string force target) (erc-log (concat "erc-server-send: " string "(" (buffer-name) ")")) (setq erc-server-last-sent-time (erc-current-time)) (let ((encoding (erc-coding-system-for-target target))) @@ -1199,14 +1202,17 @@ erc-server-send (when (fboundp 'set-process-coding-system) (set-process-coding-system erc-server-process 'raw-text encoding)) - (process-send-string erc-server-process str)) + (if (and (eq force 'no-penalty)) + (run-at-time nil nil #'process-send-string + erc-server-process str) + (process-send-string erc-server-process str))) ;; See `erc-server-send-queue' for full ;; explanation of why we need this condition-case (error nil))) (setq erc-server-flood-queue (append erc-server-flood-queue (list (cons str encoding)))) - (erc-server-send-queue (current-buffer)))) + (run-at-time nil nil #'erc-server-send-queue (current-buffer)))) t) (message "ERC: No process running") nil))) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 2d8f388328d..a885038411d 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2950,13 +2950,17 @@ erc-toggle-debug-irc-protocol (defun erc-send-action (tgt str &optional force) "Send CTCP ACTION information described by STR to TGT." + (erc--send-action tgt str force)) + +(cl-defmethod erc--send-action (tgt str &optional force) (erc-send-ctcp-message tgt (format "ACTION %s" str) force) ;; Allow hooks that act on inserted PRIVMSG and NOTICES to process us. (let ((erc--msg-prop-overrides `((erc-msg . msg) (erc-ctcp . ACTION) ,@erc--msg-prop-overrides)) (nick (erc-current-nick))) - (setq nick (propertize nick 'erc-speaker nick)) + (setq nick (propertize nick 'erc-speaker nick + 'font-lock-face 'erc-my-nick-face)) (erc-display-message nil '(t action input) (current-buffer) 'ACTION ?n nick ?a str ?u "" ?h ""))) @@ -4493,6 +4497,9 @@ erc-send-message "Send LINE to the current channel or user and display it. See also `erc-message' and `erc-display-line'." + (erc--send-message line force)) + +(cl-defgeneric erc--send-message (line force) (erc-message "PRIVMSG" (concat (erc-default-target) " " line) force) (erc-display-line (concat (erc-format-my-nick) line) @@ -6978,7 +6985,7 @@ erc--run-send-hooks (user-error "Multiline command detected" )) lines-obj) -(defun erc--send-input-lines (lines-obj) +(cl-defmethod erc--send-input-lines (lines-obj) "Send lines in `erc--input-split-lines' object LINES-OBJ." (when (erc--input-split-sendp lines-obj) (dolist (line (erc--input-split-lines lines-obj)) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0003-5.6-Simplify-logic-for-inserting-ERC-prompt-input.patch >From ff74bec6e42aa9eede09f9361410f8bd14755027 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 9 Jun 2023 21:00:03 -0700 Subject: [PATCH 3/5] [5.6] Simplify logic for inserting ERC prompt input * lisp/erc/erc.el (erc--current-line-input-split): New variable bound to the current `erc--input-split' object, post review, for the extent of display processing, so that "slash" commands can access it. (erc-cmd-SAY): Defer to `erc--send-message'. (erc--send-message): New implementation. When called internally and the variable `erc--current-line-input-split' is non-nil, treat input as an outgoing message to ensure "send" hooks run and invariants for prompt markers are preserved. For example, this means noncommands, like /SV will have `erc-input-face' applied, which is correct because this message is sent to an actual target on the server. (erc--make-input-split): New function. (erc-send-current-line): Bind `erc--current-line-input-split' when dispatching prompt-input handlers. Use helper `erc--make-input-split'. (erc--run-send-hooks): Honor existing `refoldp' slot from `erc--input-split' object. --- lisp/erc/erc.el | 50 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index a885038411d..4828319727e 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3659,6 +3659,12 @@ erc--called-as-input-p "Non-nil when a user types a \"/slash\" command. Remains bound until `erc-cmd-SLASH' returns.") +(defvar erc--current-line-input-split nil + "Current `erc--input-split' instance when processing user input. +This is for special cases in which a \"slash\" command needs +details about the input it's handling or needs to detect whether +it's been dispatched by `erc-send-current-line'.") + (defvar-local erc-send-input-line-function #'erc-send-input-line "Function for sending lines lacking a leading \"slash\" command. When prompt input starts with a \"slash\" command, like \"/MSG\", @@ -3795,9 +3801,7 @@ erc-cmd-SAY (if (string-match "^\\s-*$" line) nil (string-match "^ ?\\(.*\\)" line) - (let ((msg (match-string 1 line))) - (erc-display-msg msg) - (erc-process-input-line msg nil t)))) + (erc--send-message (match-string 1 line) nil))) (put 'erc-cmd-SAY 'do-not-parse-args t) (defun erc-cmd-SET (line) @@ -4507,6 +4511,27 @@ erc--send-message ;; FIXME - treat multiline, run hooks, or remove me? t) +;; When running inside insert and send hooks, take more care in +;; dealing with the prompt. +(cl-defmethod erc--send-message + (input-line force &context (erc--current-line-input-split erc--input-split)) + "Process non-command INPUT-LINE almost as if it's normal chat input. +Expect INPUT-LINE to differ from the `string' slot of the calling +context's `erc--current-line-input-split' object because the +latter is likely a slash command invocation whose handler +generated INPUT-LINE. Before inserting INPUT-LINE, split it and +run `erc-send-modify-hook' and `erc-send-post-hook' on each +actual outgoing line. Forgo input validation because this isn't +interactive input, and skip `erc-send-completed-hook' because it +will run just before the outer `erc-send-current-line' call +returns." + (let* ((erc-flood-protect (not force)) + (lines-obj (erc--make-input-split input-line))) + (setf (erc--input-split-refoldp lines-obj) t + (erc--input-split-cmdp lines-obj) nil) + (erc--send-input-lines (erc--run-send-hooks lines-obj))) + t) + (defun erc-cmd-MODE (line) "Change or display the mode value of a channel or user. The first word specifies the target. The rest is the mode string @@ -6880,6 +6905,14 @@ erc--inhibit-slash-cmd-insertion (when (erc--input-split-cmdp state) (setf (erc--input-split-insertp state) nil))) +(defun erc--make-input-split (string) + (make-erc--input-split + :string string + :insertp erc-insert-this + :sendp erc-send-this + :lines (split-string string erc--input-line-delim-regexp) + :cmdp (string-match erc-command-regexp string))) + (defun erc-send-current-line () "Parse current line and send it to IRC." (interactive) @@ -6894,16 +6927,11 @@ erc-send-current-line (expand-abbrev)) (widen) (let* ((str (erc-user-input)) - (state (make-erc--input-split - :string str - :insertp erc-insert-this - :sendp erc-send-this - :lines (split-string - str erc--input-line-delim-regexp) - :cmdp (string-match erc-command-regexp str)))) + (state (erc--make-input-split str))) (run-hook-with-args 'erc--input-review-functions state) (when-let (((not (erc--input-split-abortp state))) (inhibit-read-only t) + (erc--current-line-input-split state) (old-buf (current-buffer))) (let ((erc--msg-prop-overrides `((erc-msg . msg) ,@erc--msg-prop-overrides))) @@ -6969,6 +6997,8 @@ erc--run-send-hooks (run-hook-with-args 'erc-send-pre-hook str) (make-erc-input :string str :insertp erc-insert-this + :refoldp (erc--input-split-refoldp + lines-obj) :sendp erc-send-this)))) (run-hook-with-args 'erc-pre-send-functions state) (setf (erc--input-split-sendp lines-obj) (erc-input-sendp state) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0004-5.6-Slightly-simplify-text-props-on-echoed-ERC-input.patch >From 52664b3d71a7bb3d6c57165300c9271d6079daaf Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 8 Nov 2023 21:20:54 -0800 Subject: [PATCH 4/5] [5.6] Slightly simplify text props on echoed ERC input * lisp/erc/erc.el (erc--msg-props): Reformat doc to improve readability. (erc-send-current-line): Don't bind `erc--msg-prop-overrides' because it affects all calls to `erc-display-message' made by slash commands, etc. (erc-display-msg): Set `erc-msg' property to `msg' instead of `self' because the only legitimate use of this function is for inserting "echoed" prompt input. (Bug#60936) --- lisp/erc/erc.el | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 4828319727e..be8e2d19b7f 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -155,31 +155,28 @@ erc--msg-props as of ERC 5.6: - `erc-msg': a symbol, guaranteed present; values include: - - - `msg', signifying a `PRIVMSG' or an incoming `NOTICE' - - `self', a fallback used by `erc-display-msg' for callers - that don't specify an `erc-msg' - - `unknown', a similar fallback for `erc-display-message' - - a catalog key, such as `s401' or `finished' - - an `erc-display-message' TYPE parameter, like `notice' + `msg', signifying a `PRIVMSG' or an incoming `NOTICE'; + `unknown', a fallback for `erc-display-message'; a catalog + key, such as `s401' or `finished'; an `erc-display-message' + TYPE parameter, like `notice' - `erc-cmd': a message's associated IRC command, as read by `erc--get-eq-comparable-cmd'; currently either a symbol, like `PRIVMSG', or a number, like 5, which represents the numeric - \"005\"; absent on \"local\" messages, such as simple warnings - and help text, and on outgoing messages unless echoed back by - the server (assuming future support) + \"005\"; absent on \"local\" messages, such as simple warnings + and help text, and on outgoing messages unless echoed back by + the server (assuming future support) - `erc-ctcp': a CTCP command, like `ACTION' - `erc-ts': a timestamp, possibly provided by the server; as of - 5.6, a ticks/hertz pair on Emacs 29 and above, and a \"list\" - type otherwise; managed by the `stamp' module + 5.6, a ticks/hertz pair on Emacs 29 and above, and a \"list\" + type otherwise; managed by the `stamp' module - `erc-ephemeral': a symbol prefixed by or matching a module - name; indicates to other modules and members of modification - hooks that the current message should not affect stateful - operations, such as recording a channel's most recent speaker + name; indicates to other modules and members of modification + hooks that the current message should not affect stateful + operations, such as recording a channel's most recent speaker This is an internal API, and the selection of related helper utilities is fluid and provisional. As of ERC 5.6, see the @@ -6933,8 +6930,7 @@ erc-send-current-line (inhibit-read-only t) (erc--current-line-input-split state) (old-buf (current-buffer))) - (let ((erc--msg-prop-overrides `((erc-msg . msg) - ,@erc--msg-prop-overrides))) + (progn ; unprogn this during next major surgery (erc-set-active-buffer (current-buffer)) ;; Kill the input and the prompt (delete-region erc-input-marker (erc-end-of-input-line)) @@ -7079,16 +7075,15 @@ erc-send-input (defun erc-display-msg (line) "Insert LINE into current buffer and run \"send\" hooks. -Expect LINE to originate from input submitted interactively at -the prompt, such as outgoing chat messages or echoed slash -commands." +Treat LINE as input submitted interactively at the prompt, such +as outgoing chat messages and echoed slash commands." (when erc-insert-this (save-excursion (erc--assert-input-bounds) (let ((insert-position (marker-position (goto-char erc-insert-marker))) - (erc--msg-props (or erc--msg-props ; prefer `self' to `unknown' + (erc--msg-props (or erc--msg-props (let ((ovs erc--msg-prop-overrides)) - (map-into `((erc-msg . self) ,@(reverse ovs)) + (map-into `((erc-msg . msg) ,@(reverse ovs)) 'hash-table)))) beg) (insert (erc-format-my-nick)) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0005-5.6-Don-t-output-non-modules-in-erc-modes.patch >From 667ef74338ef3d085db96eb9f4cecccd984d43a3 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Thu, 9 Nov 2023 10:37:49 -0800 Subject: [PATCH 5/5] [5.6] Don't output non-modules in erc-modes * lisp/erc/erc.el (erc-modes): Only list actual modules created via `define-erc-module. Also `quote' members of the resulting list. --- lisp/erc/erc.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index be8e2d19b7f..00ee97b7e14 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -8135,8 +8135,9 @@ erc-modes (let (modes (case-fold-search nil)) (dolist (var (apropos-internal "^erc-.*mode$")) (when (and (boundp var) + (get var 'erc-module) (symbol-value var)) - (setq modes (cons (symbol-name var) + (setq modes (cons (concat "`" (symbol-name var) "'") modes)))) modes) ", "))) -- 2.41.0 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri Nov 10 20:10:54 2023 Received: (at 67032-quiet) by debbugs.gnu.org; 11 Nov 2023 01:10:55 +0000 Received: from localhost ([127.0.0.1]:51246 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r1cWU-00067y-Rc for submit@debbugs.gnu.org; Fri, 10 Nov 2023 20:10:54 -0500 Received: from mail-108-mta99.mxroute.com ([136.175.108.99]:38725) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r1cWT-00067r-BC for 67032-quiet@debbugs.gnu.org; Fri, 10 Nov 2023 20:10:53 -0500 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta99.mxroute.com (ZoneMTA) with ESMTPSA id 18bbbedd56a000190b.001 for <67032-quiet@debbugs.gnu.org> (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Sat, 11 Nov 2023 01:10:07 +0000 X-Zone-Loop: 68431af03d0f95a23d26b4fdb203601c2db06be0eae7 X-Originating-IP: [136.175.111.2] 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:Date:Subject:To:From:Sender: Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=85iZ9kssfsTx2s2mIUtSneoymvMMKKH/iNbwDPZY/nU=; b=dHG2sNx1Q0AAKQw39AK4z/Awlg VBNiOEgGzt6QF9cewjx6ghYCNr7MeoW9veaFcllJFcPjh2XVyyZjAkI7hnUKHvTi4E0Hn0F7qoFJj 4roh+11m9umZb/p0BLa7lt+3j9Fk4d/kuUlB7vUh9F6mzkHSuUTdu8gaRACxuAEIHs5LKv5Io0k1M jck8q5hihdMkxBLD+pLr+NULN6AFcSq6pm1KZraNQGXsQy1aMDbEu67B6f6NaObkyxPizOzL75KaX QDwPBT7J7oudqFz67up90gw05hHUh5lvL1rykbBrsM48RxtifWEaNuKasR+bKZT9xCjvR2lCCuMEc Erw9a+pQ==; From: "J.P." To: 67032-quiet@debbugs.gnu.org Subject: Re: bug#67032: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly Date: Fri, 10 Nov 2023 17:09:41 -0800 Message-ID: <87o7g1859m.fsf@neverwas.me> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Authenticated-Id: masked@neverwas.me X-Debbugs-Envelope-To: 67032-quiet X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=-=-= Content-Type: text/plain Screenshot storage. --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=erc-command-indicator.png Content-Transfer-Encoding: base64 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 etbGnMLkHkZk+650iPCu0rSi1v3riLZIRB09j+OKweQd5BzbwOotp1FEdKWxolTOjhR2r03Av2dH 6mgBZIzHt7DLGkmPO3wh4yDRZzypnbWRNamNuf++UI7+tIqk+gN5qHMoSifpirRY1h/3pPOd9S/V l5zJwQ3H8ejUkboXrh10rZm48DV2DzxCg5tiKtzSKqm/EhUfH659f+xZR9j41zZO5nnTpFtfupb5 fgiCIAjCLcel+LR0lwNnGVwjO4lLn6Rtj0msTjSRsfNj7m3Tl9l7zBdXlxs9kc79PuSY0oDl348Z PWoGv23ZwbEMh/N02UxS7Ha2bdvGti0/8d6TL7H0dKl7zvYUfpv8FONfepRH31lH/LkDfPtkBwbP jcfh0vqduOb1V8YG2Dk5ZyAdHp7Nn8dyyEtYwfiuXXnjnwvdGhwkfnsf7Z5cQiJ65JTtzH1iEK9v r1q3B4WXN7oDCxj38iLiytyytxH3/cO06fU665LSObF8Ms9+eYyLH7HuYObDb7A268JXxUHC0pd4 5psjxYPFHZzHk0MH8+J3+4ie8QCD753Igj0bmTF4BN8kO5ymS+oEFj/xDN8nXaot28HPefLVDZhL jzqff4j5Y+biNv4ZWlynefCujpP6c3Z8uPL93T6VPp0e49tD+cjGXXw4pCNP/nzWhe+XIAiCINy0 XIlHZQA/IBAIAWoBdYEIoDEQCbQERhqNRrmylyzLctFfo+VababJR2zylUyr5CdDG8ovbTWXvGGT 4z/vIQf0+FxOsMuyLOfLy4b5yX3mn5MdsizL1n3ymy3byu8dvpCZs/RSLNvklxq0kN/cZ730nu2E PLO9l9zpvVjZJMuyLDvkjG/7yd53fyWnOaqYvzNXtf7KlJShqFAuKvXeofday7VGry95r1D+c0Sw HPl/20vyv0oOk3xk5Tfy0l3pcplimVbKj4dEyOM2Xsi9eP1hY/4uXn/hL/L9Xj3luSmOi+n734qS I17cKltkWbZsfFau3XiS/I/FKu+d0lxuOH6bXGQ9KL/Tqr78/GaL03RZtsh7pkTJzV/dLVtkWZbl AnnzC03l3l8kyPYyVZUkx+5Nla3yTcZZ/Tk7Ppx9f6z75beiasuP/nZpvxX+M0mObPa6vOemqwxB EAThf4Ur8eG1AEaWxKKRJbFpREmsWqskdg0E/C5vob1uXQ5sJ2LY5ejMXW3dSt5REta7D/X27SDW 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 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri Nov 10 20:16:32 2023 Received: (at 67032) by debbugs.gnu.org; 11 Nov 2023 01:16:32 +0000 Received: from localhost ([127.0.0.1]:51249 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r1cbt-0006GQ-GR for submit@debbugs.gnu.org; Fri, 10 Nov 2023 20:16:32 -0500 Received: from mail-108-mta123.mxroute.com ([136.175.108.123]:45857) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r1cbo-0006GE-Lx for 67032@debbugs.gnu.org; Fri, 10 Nov 2023 20:16:28 -0500 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta123.mxroute.com (ZoneMTA) with ESMTPSA id 18bbbf2eb07000190b.001 for <67032@debbugs.gnu.org> (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Sat, 11 Nov 2023 01:15:41 +0000 X-Zone-Loop: 0b21ee1776d50e122fd8dd26471e87548cffb853d2c5 X-Originating-IP: [136.175.111.2] 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:Date:References:In-Reply-To: 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=45nYfeXZwYsfKiR31vZIB5WtvP5QDum8xUwLPocJvqY=; b=Yd/5WBy0f9dKFIZQdi0xP4NJn+ zSO/bNwb/z2jdpAixX5d+x7mS8/azs8FfMDK7T+yHFfUf0e9yw0+1YuwYw9ALi31lzCKGJdNYC7oL JX5dkZWoe63c7lhPe9I4umLphdOP5QTMnq9myjX+PRxoPWfEmdj28GCpPctjg1NsxyZlg+ZDvDb7G Ute7N2i/ntFkGDfpP4n7IiWNytp6QW48X952DYRVhhTLW7uKKVYcUMxJSzRDznYJY/G1mUJX6xtZj yqzZIacpYGzT7VWx8LUeQ+SlpaSOLWHQX8I9d6K1fUgwvzKyyERLnTCnuYn3OkpaQY5z/5p+FJt25 Mpr5mI9Q==; From: "J.P." To: 67032@debbugs.gnu.org Subject: Re: bug#67032: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly In-Reply-To: <87v8aa9wd0.fsf@neverwas.me> (J. P.'s message of "Thu, 09 Nov 2023 18:26:51 -0800") References: <87v8aa9wd0.fsf@neverwas.me> Date: Fri, 10 Nov 2023 17:15:14 -0800 Message-ID: <87h6lt850d.fsf@neverwas.me> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Authenticated-Id: masked@neverwas.me X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 67032 Cc: emacs-erc@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain v2. Revive `erc-command-indicator' functionality as new module. "J.P." writes: > In tackling this, I've opted to sidestep a few related concerns that > will have to be dealt with eventually. The first has to do with > discovering and possibly reintegrating whatever role the `noncommands' > module is designed to play in processing specialty slash commands, like > those reliant on `erc-send-message'. These days (reaching as far back as > Emacs 26.1), the module appears to effectively be a no-op, at least with > the default client configuration. Until we know more, I'm inclined to > let it rot away in erc-goodies, since its code only runs on interactive > input anyway. Actually, I've gone ahead and done some cursory spelunking in hopes of shedding some light on this `noncommands' quandary. First off, there's no relevant mention of `erc-display-command' or `erc-command-indicator' in the old erc-discuss archives. But it's my current understanding that the module seems to have been effectively sidelined when the lone call site for `erc-display-command' was deep sixed in d1036d288de backport: erc bugfixes (This was back in November of 2013, under 5.3.x and what became Emacs 24.5.) Strangely, that commit did not include any change log or ERC-NEWS mentions, which is unfortunate because it's wide-ranging and largely nontrivial. For example, it left behind related faces and options, like `erc-command-indicator', thereupon effectively neutering them along with `noncommands'. More recently, `erc-display-command' was commented out in 0c599ee2e2c * lisp/erc/erc.el: Use `run-hook-with-args` for `erc-pre-send-functions` and later removed by a63ed6f78a6 Remove duplicate ERC prompt on reconnect but the damage had long since been done. My point in drudging this up is merely to highlight where the behavior concerned diverged and that we'll likely never know why. I really have no interest in relitigating ancient motivations and methods. (It's quite possible that discussions did take place elsewhere, like on Freenode or the old sourceforge list.) Anyway, since both the interface (options, fonts) and infrastructure are still in place, I think it behooves us to revive this functionality, not least as a signal to others that ERC picks up after itself (eventually). I've thus added some changes to this effect (see last patch). Screenshot: https://debbugs.gnu.org/cgi/bugreport.cgi?msg=6;filename=erc-command-indicator.png;att=1;bug=67032 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0000-v1-v2.diff >From 96b62219e43df0585ddfbabaa904342ca0385d22 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 10 Nov 2023 16:28:33 -0800 Subject: [PATCH 0/6] *** NOT A PATCH *** *** BLURB HERE *** F. Jason Park (6): [5.6] Make ERC error-notice formatting more consistent [5.6] Make ERC's message-sending functions more flexible [5.6] Simplify logic for inserting ERC prompt input [5.6] Slightly simplify text props on echoed ERC input [5.6] Don't output non-modules in erc-modes [5.6] Revive erc-display-command as module command-indicator etc/ERC-NEWS | 15 ++++ lisp/erc/erc-backend.el | 16 ++-- lisp/erc/erc-goodies.el | 113 +++++++++++++++++++++-- lisp/erc/erc-match.el | 14 +-- lisp/erc/erc.el | 177 +++++++++++++++++++++---------------- test/lisp/erc/erc-tests.el | 5 +- 6 files changed, 238 insertions(+), 102 deletions(-) Interdiff: diff --git a/etc/ERC-NEWS b/etc/ERC-NEWS index f59023eae62..49b623aa7f0 100644 --- a/etc/ERC-NEWS +++ b/etc/ERC-NEWS @@ -157,6 +157,21 @@ asking users who've customized this option to switch to that some other solution, like automatic migration, is justified, please make that known on the bug list. +** Module 'noncommands' deprecated, replaced by 'command-indicator'. +Command-line echoing has returned to ERC after a near-decade-long +hiatus. This means you can elect to have ERC leave a trail of most +slash-command input submitted at the prompt, in a manner resembling a +shell or a REPL. The particulars are likely of little interest to +most users, but the gist is that this functionality was removed in +5.3.x (Emacs 24.5) under mysterious circumstances, without mention in +this document or any change log. Everything's mostly been restored, +except that the feature is now opt-in. (Add 'command-indicator' to +'erc-modules' to get started.) The only real gotcha is that related +faces and options, like 'erc-command-indicator', have moved to the +'erc-goodies' library, although their Custom groups remain the same. +Hint: once enabled, use 'erc-command-indicator-toggle-hidden' to +dynamically toggle echoed command-line visibility. + ** 'erc-button-alist' and 'erc-nick-popup-alist' have evolved slightly. It's no secret that the 'buttons' module treats potential nicknames specially. This is perhaps most evident in its treatment of the diff --git a/lisp/erc/erc-goodies.el b/lisp/erc/erc-goodies.el index 4cc81dd9378..93b76c544aa 100644 --- a/lisp/erc/erc-goodies.el +++ b/lisp/erc/erc-goodies.el @@ -471,21 +471,26 @@ erc-noncommands-list erc-cmd-COUNTRY erc-cmd-SV erc-cmd-SM - erc-cmd-SMV + erc-cmd-SAY erc-cmd-LASTLOG) - "List of commands that are aliases for CTCP ACTION or for ERC messages. - -If a command's function symbol is in this list, the typed command -does not appear in the ERC buffer after the user presses ENTER.") + "List of commands that perform their own buffer I/O. +The `command-indicator' module forgoes echoing commands in this +list.") ;;;###autoload(autoload 'erc-noncommands-mode "erc-goodies" nil t) (define-erc-module noncommands nil - "This mode distinguishes non-commands. -Commands listed in `erc-insert-this' know how to display -themselves." + "Treat commands that display themselves specially. +This module has been a no-op since ERC 5.3 and has likely only +ever made sense in the context of `erc-command-indicator'. It +was deprecated in ERC 5.6." ((add-hook 'erc--input-review-functions #'erc-send-distinguish-noncommands)) ((remove-hook 'erc--input-review-functions #'erc-send-distinguish-noncommands))) +(make-obsolete-variable 'erc-noncommand-mode + 'erc-command-indicator-mode "30.1") +(make-obsolete 'erc-noncommand-mode 'erc-command-indicator-mode "30.1") +(make-obsolete 'erc-noncommand-enable 'erc-command-indicator-enable "30.1") +(make-obsolete 'erc-noncommand-disable 'erc-command-indicator-disable "30.1") (defun erc-send-distinguish-noncommands (state) "If STR is an ERC non-command, set `insertp' in STATE to nil." @@ -499,6 +504,98 @@ erc-send-distinguish-noncommands ;; Inhibit sending this string. (setf (erc-input-insertp state) nil)))) + +;;; Command-indicator + +(defface erc-command-indicator-face + '((t :inherit (shadow fixed-pitch-serif))) + "Face for echoed command lines, including the prompt. +See option `erc-command-indicator'." + :package-version '(ERC . "5.6") + :group 'erc-faces) + +(defcustom erc-command-indicator "$>" + "Pseudo prompt for echoed command lines. +An analog of the option `erc-prompt' that replaces the \"speaker +label\" for echoed \"slash\" commands submitted at the prompt. A +value of nil means ERC only inserts the command line portion, +sans pseudo prompt, which may trick certain modules into treating +the slash command itself as the message's \"speaker\"." + :package-version '(ERC . "5.6") + :group 'erc-display + :type '(choice (const "$>") (const nil) string function)) + +;;;###autoload(autoload 'erc-command-indicator-mode "erc-goodies" nil t) +(define-erc-module command-indicator nil + "Echo command lines for \"slash commands,\" like /JOIN, /HELP, etc. +Skip those appearing in `erc-noncommands-list'. + +Users can run \\[erc-command-indicator-toggle-hidden] to hide and +reveal echoed command lines after they've been inserted." + ((add-hook 'erc--input-review-functions + #'erc--command-indicator-permit-insertion 90 t) + (erc-command-indicator-toggle-hidden -1)) + ((remove-hook 'erc--input-review-functions + #'erc--command-indicator-permit-insertion t) + (erc-command-indicator-toggle-hidden +1)) + 'local) + +(defun erc-command-indicator () + "Return the command-indicator prompt as a string. +Do nothing if the variable `erc-command-indicator' is nil." + (and erc-command-indicator + (let ((prompt (if (functionp erc-command-indicator) + (funcall erc-command-indicator) + erc-command-indicator))) + (concat prompt (and (not (string-empty-p prompt)) " "))))) + +(defun erc-command-indicator-toggle-hidden (arg) + "Toggle whether echoed \"slash commands\" are visible." + (interactive "P") + (erc--toggle-hidden 'command-indicator arg)) + +(defun erc--command-indicator-permit-insertion (state) + "Insert `erc-input' STATE's message if it's an echoed command." + (cl-assert erc-command-indicator-mode) + (when (erc--input-split-cmdp state) + (setf (erc--input-split-insertp state) #'erc--command-indicator-display) + (erc-send-distinguish-noncommands state))) + +;; That function used to be called `erc-display-command'. It was +;; neutered in ERC 5.3.x (Emacs 24.5), commented out in 5.4, removed +;; in 5.5, and restored in 5.6. +(defun erc--command-indicator-display (line) + "Insert command LINE as echoed input resembling that of REPLs and shells." + (when erc-insert-this + (save-excursion + (erc--assert-input-bounds) + (let ((insert-position (marker-position (goto-char erc-insert-marker))) + (erc--msg-props (or erc--msg-props + (let ((ovs erc--msg-prop-overrides)) + (map-into `((erc-msg . slash-cmd) + ,@(reverse ovs)) + 'hash-table))))) + (when-let ((string (erc-command-indicator)) + (erc-input-marker (copy-marker erc-input-marker))) + (erc-display-prompt nil nil string 'erc-command-indicator-face) + (set-marker erc-input-marker nil)) + (let ((beg (point))) + (insert line) + (erc-put-text-property beg (point) + 'font-lock-face 'erc-command-indicator-face) + (insert "\n")) + (save-restriction + (narrow-to-region insert-position (point)) + (run-hooks 'erc-send-modify-hook) + (run-hooks 'erc-send-post-hook) + (cl-assert (> (- (point-max) (point-min)) 1)) + (erc--hide-message 'command-indicator) + (add-text-properties (point-min) (1+ (point-min)) + (erc--order-text-properties-from-hash + erc--msg-props)))) + (erc--refresh-prompt)))) + + ;;; IRC control character processing. (defgroup erc-control-characters nil "Dealing with control characters." diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el index 8644e61106f..6fff54d3cf4 100644 --- a/lisp/erc/erc-match.el +++ b/lisp/erc/erc-match.el @@ -695,19 +695,7 @@ erc-match-toggle-hidden-fools Expect the function `erc-hide-fools' or similar to be present in `erc-text-matched-hook'." (interactive "P") - (erc-match--toggle-hidden 'match-fools arg)) - -(defun erc-match--toggle-hidden (prop arg) - "Toggle invisibility for spec member PROP. -Treat ARG in a manner similar to mode toggles defined by -`define-minor-mode'." - (when arg - (setq arg (prefix-numeric-value arg))) - (if (memq prop (ensure-list buffer-invisibility-spec)) - (unless (natnump arg) - (remove-from-invisibility-spec prop)) - (when (or (not arg) (natnump arg)) - (add-to-invisibility-spec prop)))) + (erc--toggle-hidden 'match-fools arg)) (provide 'erc-match) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 00ee97b7e14..89b3397d8f1 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -346,8 +346,13 @@ 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. See -`erc-unhide-query-prompt' for behavior concerning query prompts." +prompts are unhidden upon rejoining. For behavior concerning +query prompts, see `erc-unhide-query-prompt'. Longtime ERC users +should note that this option was repurposed in ERC 5.5 because it +had lain dormant for years after being sidelined in 5.3 when its +only use in the interactive client was removed. Before then, its +role was controlling whether `erc-command-indicator' would appear +alongside echoed slash-command lines." :package-version '(ERC . "5.5") :group 'erc-display :type '(choice (const :tag "Always hide prompt" t) @@ -759,28 +764,6 @@ erc-prompt (concat prompt " ") prompt))) -(defcustom erc-command-indicator nil - "Indicator used by ERC for showing commands. - -If non-nil, this will be used in the ERC buffer to indicate -commands (i.e., input starting with a `/'). - -If nil, the prompt will be constructed from the variable `erc-prompt'." - :group 'erc-display - :type '(choice (const nil) string function)) - -(defun erc-command-indicator () - "Return the command indicator prompt as a string. - -This only has any meaning if the variable `erc-command-indicator' is non-nil." - (and erc-command-indicator - (let ((prompt (if (functionp erc-command-indicator) - (funcall erc-command-indicator) - erc-command-indicator))) - (if (> (length prompt) 0) - (concat prompt " ") - prompt)))) - (defcustom erc-notice-prefix "*** " "Prefix for all notices." :group 'erc-display @@ -1364,12 +1347,6 @@ erc-prompt-face "ERC face for the prompt." :group 'erc-faces) -(defface erc-command-indicator-face - '((t :weight bold)) - "ERC face for the command indicator. -See the variable `erc-command-indicator'." - :group 'erc-faces) - (defface erc-notice-face '((default :weight bold) (((class color) (min-colors 88) (supports :weight semi-bold)) @@ -2077,7 +2054,7 @@ erc--sort-modules (defcustom erc-modules '( autojoin button completion fill imenu irccontrols list match menu move-to-prompt netsplit - networks noncommands readonly ring stamp track) + networks readonly ring stamp track) "A list of modules which ERC should enable. If you set the value of this without using `customize' remember to call \(erc-update-modules) after you change it. When using `customize', modules @@ -2127,6 +2104,7 @@ erc-modules (const :tag "button: Buttonize URLs, nicknames, and other text" button) (const :tag "capab: Mark unidentified users on servers supporting CAPAB" capab-identify) + (const :tag "command-indicator: Echo command lines." command-indicator) (const :tag "completion: Complete nicknames and commands (programmable)" completion) (const :tag "dcc: Provide Direct Client-to-Client support" dcc) @@ -2146,7 +2124,7 @@ erc-modules (const :tag "networks: Provide data about IRC networks" networks) (const :tag "nickbar: Show nicknames in a dyamic side window" nickbar) (const :tag "nicks: Uniquely colorize nicknames in target buffers" nicks) - (const :tag "noncommands: Don't display non-IRC commands after evaluation" + (const :tag "noncommands: Deprecated. See module `command-indicator'." noncommands) (const :tag "notifications: Desktop alerts on PRIVMSG or mentions" notifications) @@ -3309,6 +3287,18 @@ erc--hide-message (cl-incf beg)) (erc--merge-prop (1- beg) (1- end) 'invisible value))))) +(defun erc--toggle-hidden (prop arg) + "Toggle invisibility for spec member PROP. +Treat ARG in a manner similar to mode toggles defined by +`define-minor-mode'." + (when arg + (setq arg (prefix-numeric-value arg))) + (if (memq prop (ensure-list buffer-invisibility-spec)) + (unless (natnump arg) + (remove-from-invisibility-spec prop)) + (when (or (not arg) (natnump arg)) + (add-to-invisibility-spec prop)))) + (defun erc--delete-inserted-message (beg-or-point &optional end) "Remove message between BEG and END. Expect BEG and END to match bounds as returned by the macro @@ -7016,7 +7006,9 @@ erc--send-input-lines (when (erc--input-split-sendp lines-obj) (dolist (line (erc--input-split-lines lines-obj)) (when (erc--input-split-insertp lines-obj) - (erc-display-msg line)) + (if (functionp (erc--input-split-insertp lines-obj)) + (funcall (erc--input-split-insertp lines-obj) line) + (erc-display-msg line))) (erc-process-input-line (concat line "\n") (null erc-flood-protect) (not (erc--input-split-cmdp lines-obj)))))) @@ -7522,7 +7514,10 @@ erc-load-irc-script-lines user input." (let* ((cb (current-buffer)) (s "") - (sp (or (erc-command-indicator) (erc-prompt))) + (sp (or (and (bound-and-true-p erc-command-indicator-mode) + (fboundp 'erc-command-indicator) + (erc-command-indicator)) + (erc-prompt))) (args (and (boundp 'erc-script-args) erc-script-args))) (if (and args (string-match "^ " args)) (setq args (substring args 1))) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 2898ca7be75..e7422d330c0 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -2543,7 +2543,8 @@ erc-handle-irc-url (kill-buffer "#chan"))) (defconst erc-tests--modules - '( autoaway autojoin bufbar button capab-identify completion dcc fill identd + '( autoaway autojoin bufbar button capab-identify + command-indicator completion dcc fill identd imenu irccontrols keep-place list log match menu move-to-prompt netsplit networks nickbar nicks noncommands notifications notify page readonly replace ring sasl scrolltobottom services smiley sound -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-5.6-Make-ERC-error-notice-formatting-more-consistent.patch >From 7e3b7c789f0c8b8d658b2571d09b124edc94edbd Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 8 Nov 2023 19:14:55 -0800 Subject: [PATCH 1/6] [5.6] Make ERC error-notice formatting more consistent * lisp/erc/erc-backend.el (erc--server-propagate-failed-connection): Print leading notice prefix when reporting process exit status, and set `erc-msg' type to `notice-error'. (erc-schedule-reconnect): Print leading notice prefix when printing `reconnecting' message. * lisp/erc/erc.el (erc-process-input-line, erc-cmd-PART, erc-cmd-TOPIC): Print `no-target' messages as error notices. (erc-message-english-disconnected, erc-message-english-disconnected-noreconnect): Hard-code standard "***" notice prefix into message text, for consistency. * test/lisp/erc/erc-tests.el (erc--refresh-prompt): Expect notice prefix before `no-target' message. --- lisp/erc/erc-backend.el | 4 ++-- lisp/erc/erc.el | 11 ++++++----- test/lisp/erc/erc-tests.el | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 4b5edaa77d2..32d891cd1c6 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -728,7 +728,7 @@ erc--server-propagate-failed-connection the server buffer in any case." (when (eq (process-status process) 'failed) (erc-display-message - nil 'error (process-buffer process) + nil '(notice error) (process-buffer process) (format "Process exit status: %S" (process-exit-status process))) (pcase (process-exit-status process) (111 @@ -995,7 +995,7 @@ erc-schedule-reconnect (- erc-server-reconnect-attempts (cl-incf erc-server-reconnect-count (or incr 1))))) (proc (buffer-local-value 'erc-server-process buffer))) - (erc-display-message nil 'error buffer 'reconnecting + (erc-display-message nil '(notice error) buffer 'reconnecting ?m erc-server-reconnect-timeout ?i (if count erc-server-reconnect-count "N") ?n (if count erc-server-reconnect-attempts "A")) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index fd57cb9d6a0..2d8f388328d 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3729,7 +3729,7 @@ erc-process-input-line (let ((r (erc-default-target))) (if r (funcall erc-send-input-line-function r line force) - (erc-display-message nil 'error (current-buffer) 'no-target) + (erc-display-message nil '(notice error) (current-buffer) 'no-target) nil))))) (defconst erc--shell-parse-regexp @@ -4581,7 +4581,7 @@ erc-cmd-PART (format "PART %s" ch) (format "PART %s :%s" ch reason)) nil ch)) - (erc-display-message nil 'error (current-buffer) 'no-target))) + (erc-display-message nil '(notice error) (current-buffer) 'no-target))) t) (t nil))) (put 'erc-cmd-PART 'do-not-parse-args t) @@ -4921,7 +4921,7 @@ erc-cmd-TOPIC (progn (erc-log (format "cmd: TOPIC [%s]: %s" ch topic)) (erc-server-send (format "TOPIC %s :%s" ch topic) nil ch)) - (erc-display-message nil 'error (current-buffer) 'no-target))) + (erc-display-message nil '(notice error) (current-buffer) 'no-target))) t) (t nil))) (defalias 'erc-cmd-T #'erc-cmd-TOPIC) @@ -8194,9 +8194,10 @@ erc-define-catalog (flood-ctcp-off . "FLOOD PROTECTION: Automatic CTCP responses turned off.") (flood-strict-mode . "FLOOD PROTECTION: Switched to Strict Flood Control mode.") - (disconnected . "\n\nConnection failed! Re-establishing connection...\n") + (disconnected + . "\n\n*** Connection failed! Re-establishing connection...\n") (disconnected-noreconnect - . "\n\nConnection failed! Not re-establishing connection.\n") + . "\n\n*** Connection failed! Not re-establishing connection.\n") (reconnecting . "Reconnecting in %ms: attempt %i/%n ...") (reconnect-canceled . "Canceled %u reconnect timer with %cs to go...") (finished . "\n\n*** ERC finished ***\n") diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 916b394c8ff..2898ca7be75 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -317,7 +317,7 @@ erc--refresh-prompt (insert "Howdy") (erc-send-current-line) (save-excursion (forward-line -1) - (should (looking-at "No target")) + (should (looking-at (rx "*** No target"))) (forward-line -1) (should (looking-at " Howdy"))) (should (looking-back "ServNet 6> ")) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-5.6-Make-ERC-s-message-sending-functions-more-flexib.patch >From a3bd16a010472ca6b4ce54cb5230f246e84c685d Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 15 Jul 2022 05:02:35 -0700 Subject: [PATCH 2/6] [5.6] Make ERC's message-sending functions more flexible * lisp/erc/erc-backend.el (erc--server-send, erc-server-send): Convert the latter to a wrapper that calls the former, a "new" internal generic function. Extend `no-penalty' parameter to mean ERC will schedule an imminent send via a timer. Always run `erc-server-send-queue' on a timer. * lisp/erc/erc.el (erc-send-action, erc--send-action): Make former a wrapper for latter, a new generic function. The rationale is that built-in modules should be able to elect to handle insertion themselves. Also fix bug involving /ME ACTIONs not having `erc-my-nick-face' applied to the speaker. (erc-send-message, erc--send-message): Make the former a wrapper for the latter, a new generic function. Since commands, like /SV, use this function to handle their own insertion, modules can't leverage the normal API to suppress insertion. (erc--send-input-lines): Convert to generic function. --- lisp/erc/erc-backend.el | 12 +++++++++--- lisp/erc/erc.el | 11 +++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 32d891cd1c6..b16824b1f73 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -1171,7 +1171,7 @@ erc-server-send When FORCE is non-nil, bypass flood protection so that STRING is sent directly without modifying the queue. When FORCE is the symbol `no-penalty', exempt this round from accumulating a -timeout penalty. +timeout penalty and schedule it to run ASAP instead of blocking. If TARGET is specified, look up encoding information for that channel in `erc-encoding-coding-alist' or @@ -1179,6 +1179,9 @@ erc-server-send See `erc-server-flood-margin' for an explanation of the flood protection algorithm." + (erc--server-send string force target)) + +(cl-defmethod erc--server-send (string force target) (erc-log (concat "erc-server-send: " string "(" (buffer-name) ")")) (setq erc-server-last-sent-time (erc-current-time)) (let ((encoding (erc-coding-system-for-target target))) @@ -1199,14 +1202,17 @@ erc-server-send (when (fboundp 'set-process-coding-system) (set-process-coding-system erc-server-process 'raw-text encoding)) - (process-send-string erc-server-process str)) + (if (and (eq force 'no-penalty)) + (run-at-time nil nil #'process-send-string + erc-server-process str) + (process-send-string erc-server-process str))) ;; See `erc-server-send-queue' for full ;; explanation of why we need this condition-case (error nil))) (setq erc-server-flood-queue (append erc-server-flood-queue (list (cons str encoding)))) - (erc-server-send-queue (current-buffer)))) + (run-at-time nil nil #'erc-server-send-queue (current-buffer)))) t) (message "ERC: No process running") nil))) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 2d8f388328d..a885038411d 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2950,13 +2950,17 @@ erc-toggle-debug-irc-protocol (defun erc-send-action (tgt str &optional force) "Send CTCP ACTION information described by STR to TGT." + (erc--send-action tgt str force)) + +(cl-defmethod erc--send-action (tgt str &optional force) (erc-send-ctcp-message tgt (format "ACTION %s" str) force) ;; Allow hooks that act on inserted PRIVMSG and NOTICES to process us. (let ((erc--msg-prop-overrides `((erc-msg . msg) (erc-ctcp . ACTION) ,@erc--msg-prop-overrides)) (nick (erc-current-nick))) - (setq nick (propertize nick 'erc-speaker nick)) + (setq nick (propertize nick 'erc-speaker nick + 'font-lock-face 'erc-my-nick-face)) (erc-display-message nil '(t action input) (current-buffer) 'ACTION ?n nick ?a str ?u "" ?h ""))) @@ -4493,6 +4497,9 @@ erc-send-message "Send LINE to the current channel or user and display it. See also `erc-message' and `erc-display-line'." + (erc--send-message line force)) + +(cl-defgeneric erc--send-message (line force) (erc-message "PRIVMSG" (concat (erc-default-target) " " line) force) (erc-display-line (concat (erc-format-my-nick) line) @@ -6978,7 +6985,7 @@ erc--run-send-hooks (user-error "Multiline command detected" )) lines-obj) -(defun erc--send-input-lines (lines-obj) +(cl-defmethod erc--send-input-lines (lines-obj) "Send lines in `erc--input-split-lines' object LINES-OBJ." (when (erc--input-split-sendp lines-obj) (dolist (line (erc--input-split-lines lines-obj)) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0003-5.6-Simplify-logic-for-inserting-ERC-prompt-input.patch >From 65bc05e03a022ed58774226bf3d3dc9f35525820 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 9 Jun 2023 21:00:03 -0700 Subject: [PATCH 3/6] [5.6] Simplify logic for inserting ERC prompt input * lisp/erc/erc.el (erc--current-line-input-split): New variable bound to the current `erc--input-split' object, post review, for the extent of display processing, so that "slash" commands can access it. (erc-cmd-SAY): Defer to `erc--send-message'. (erc--send-message): New implementation. When called internally and the variable `erc--current-line-input-split' is non-nil, treat input as an outgoing message to ensure "send" hooks run and invariants for prompt markers are preserved. For example, this means noncommands, like /SV will have `erc-input-face' applied, which is correct because this message is sent to an actual target on the server. (erc--make-input-split): New function. (erc-send-current-line): Bind `erc--current-line-input-split' when dispatching prompt-input handlers. Use helper `erc--make-input-split'. (erc--run-send-hooks): Honor existing `refoldp' slot from `erc--input-split' object. --- lisp/erc/erc.el | 50 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index a885038411d..4828319727e 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3659,6 +3659,12 @@ erc--called-as-input-p "Non-nil when a user types a \"/slash\" command. Remains bound until `erc-cmd-SLASH' returns.") +(defvar erc--current-line-input-split nil + "Current `erc--input-split' instance when processing user input. +This is for special cases in which a \"slash\" command needs +details about the input it's handling or needs to detect whether +it's been dispatched by `erc-send-current-line'.") + (defvar-local erc-send-input-line-function #'erc-send-input-line "Function for sending lines lacking a leading \"slash\" command. When prompt input starts with a \"slash\" command, like \"/MSG\", @@ -3795,9 +3801,7 @@ erc-cmd-SAY (if (string-match "^\\s-*$" line) nil (string-match "^ ?\\(.*\\)" line) - (let ((msg (match-string 1 line))) - (erc-display-msg msg) - (erc-process-input-line msg nil t)))) + (erc--send-message (match-string 1 line) nil))) (put 'erc-cmd-SAY 'do-not-parse-args t) (defun erc-cmd-SET (line) @@ -4507,6 +4511,27 @@ erc--send-message ;; FIXME - treat multiline, run hooks, or remove me? t) +;; When running inside insert and send hooks, take more care in +;; dealing with the prompt. +(cl-defmethod erc--send-message + (input-line force &context (erc--current-line-input-split erc--input-split)) + "Process non-command INPUT-LINE almost as if it's normal chat input. +Expect INPUT-LINE to differ from the `string' slot of the calling +context's `erc--current-line-input-split' object because the +latter is likely a slash command invocation whose handler +generated INPUT-LINE. Before inserting INPUT-LINE, split it and +run `erc-send-modify-hook' and `erc-send-post-hook' on each +actual outgoing line. Forgo input validation because this isn't +interactive input, and skip `erc-send-completed-hook' because it +will run just before the outer `erc-send-current-line' call +returns." + (let* ((erc-flood-protect (not force)) + (lines-obj (erc--make-input-split input-line))) + (setf (erc--input-split-refoldp lines-obj) t + (erc--input-split-cmdp lines-obj) nil) + (erc--send-input-lines (erc--run-send-hooks lines-obj))) + t) + (defun erc-cmd-MODE (line) "Change or display the mode value of a channel or user. The first word specifies the target. The rest is the mode string @@ -6880,6 +6905,14 @@ erc--inhibit-slash-cmd-insertion (when (erc--input-split-cmdp state) (setf (erc--input-split-insertp state) nil))) +(defun erc--make-input-split (string) + (make-erc--input-split + :string string + :insertp erc-insert-this + :sendp erc-send-this + :lines (split-string string erc--input-line-delim-regexp) + :cmdp (string-match erc-command-regexp string))) + (defun erc-send-current-line () "Parse current line and send it to IRC." (interactive) @@ -6894,16 +6927,11 @@ erc-send-current-line (expand-abbrev)) (widen) (let* ((str (erc-user-input)) - (state (make-erc--input-split - :string str - :insertp erc-insert-this - :sendp erc-send-this - :lines (split-string - str erc--input-line-delim-regexp) - :cmdp (string-match erc-command-regexp str)))) + (state (erc--make-input-split str))) (run-hook-with-args 'erc--input-review-functions state) (when-let (((not (erc--input-split-abortp state))) (inhibit-read-only t) + (erc--current-line-input-split state) (old-buf (current-buffer))) (let ((erc--msg-prop-overrides `((erc-msg . msg) ,@erc--msg-prop-overrides))) @@ -6969,6 +6997,8 @@ erc--run-send-hooks (run-hook-with-args 'erc-send-pre-hook str) (make-erc-input :string str :insertp erc-insert-this + :refoldp (erc--input-split-refoldp + lines-obj) :sendp erc-send-this)))) (run-hook-with-args 'erc-pre-send-functions state) (setf (erc--input-split-sendp lines-obj) (erc-input-sendp state) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0004-5.6-Slightly-simplify-text-props-on-echoed-ERC-input.patch >From 2aaad91082113724ccd8ad6f9b5731815ad621f5 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 8 Nov 2023 21:20:54 -0800 Subject: [PATCH 4/6] [5.6] Slightly simplify text props on echoed ERC input * lisp/erc/erc.el (erc--msg-props): Reformat doc to improve readability. (erc-send-current-line): Don't bind `erc--msg-prop-overrides' because it affects all calls to `erc-display-message' made by slash commands, etc. (erc-display-msg): Set `erc-msg' property to `msg' instead of `self' because the only legitimate use of this function is for inserting "echoed" prompt input. (Bug#60936) --- lisp/erc/erc.el | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 4828319727e..be8e2d19b7f 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -155,31 +155,28 @@ erc--msg-props as of ERC 5.6: - `erc-msg': a symbol, guaranteed present; values include: - - - `msg', signifying a `PRIVMSG' or an incoming `NOTICE' - - `self', a fallback used by `erc-display-msg' for callers - that don't specify an `erc-msg' - - `unknown', a similar fallback for `erc-display-message' - - a catalog key, such as `s401' or `finished' - - an `erc-display-message' TYPE parameter, like `notice' + `msg', signifying a `PRIVMSG' or an incoming `NOTICE'; + `unknown', a fallback for `erc-display-message'; a catalog + key, such as `s401' or `finished'; an `erc-display-message' + TYPE parameter, like `notice' - `erc-cmd': a message's associated IRC command, as read by `erc--get-eq-comparable-cmd'; currently either a symbol, like `PRIVMSG', or a number, like 5, which represents the numeric - \"005\"; absent on \"local\" messages, such as simple warnings - and help text, and on outgoing messages unless echoed back by - the server (assuming future support) + \"005\"; absent on \"local\" messages, such as simple warnings + and help text, and on outgoing messages unless echoed back by + the server (assuming future support) - `erc-ctcp': a CTCP command, like `ACTION' - `erc-ts': a timestamp, possibly provided by the server; as of - 5.6, a ticks/hertz pair on Emacs 29 and above, and a \"list\" - type otherwise; managed by the `stamp' module + 5.6, a ticks/hertz pair on Emacs 29 and above, and a \"list\" + type otherwise; managed by the `stamp' module - `erc-ephemeral': a symbol prefixed by or matching a module - name; indicates to other modules and members of modification - hooks that the current message should not affect stateful - operations, such as recording a channel's most recent speaker + name; indicates to other modules and members of modification + hooks that the current message should not affect stateful + operations, such as recording a channel's most recent speaker This is an internal API, and the selection of related helper utilities is fluid and provisional. As of ERC 5.6, see the @@ -6933,8 +6930,7 @@ erc-send-current-line (inhibit-read-only t) (erc--current-line-input-split state) (old-buf (current-buffer))) - (let ((erc--msg-prop-overrides `((erc-msg . msg) - ,@erc--msg-prop-overrides))) + (progn ; unprogn this during next major surgery (erc-set-active-buffer (current-buffer)) ;; Kill the input and the prompt (delete-region erc-input-marker (erc-end-of-input-line)) @@ -7079,16 +7075,15 @@ erc-send-input (defun erc-display-msg (line) "Insert LINE into current buffer and run \"send\" hooks. -Expect LINE to originate from input submitted interactively at -the prompt, such as outgoing chat messages or echoed slash -commands." +Treat LINE as input submitted interactively at the prompt, such +as outgoing chat messages and echoed slash commands." (when erc-insert-this (save-excursion (erc--assert-input-bounds) (let ((insert-position (marker-position (goto-char erc-insert-marker))) - (erc--msg-props (or erc--msg-props ; prefer `self' to `unknown' + (erc--msg-props (or erc--msg-props (let ((ovs erc--msg-prop-overrides)) - (map-into `((erc-msg . self) ,@(reverse ovs)) + (map-into `((erc-msg . msg) ,@(reverse ovs)) 'hash-table)))) beg) (insert (erc-format-my-nick)) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0005-5.6-Don-t-output-non-modules-in-erc-modes.patch >From e7f166024092087721269f7bdab9153fceec08ec Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Thu, 9 Nov 2023 10:37:49 -0800 Subject: [PATCH 5/6] [5.6] Don't output non-modules in erc-modes * lisp/erc/erc.el (erc-modes): Only list actual modules created via `define-erc-module. Also `quote' members of the resulting list. --- lisp/erc/erc.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index be8e2d19b7f..00ee97b7e14 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -8135,8 +8135,9 @@ erc-modes (let (modes (case-fold-search nil)) (dolist (var (apropos-internal "^erc-.*mode$")) (when (and (boundp var) + (get var 'erc-module) (symbol-value var)) - (setq modes (cons (symbol-name var) + (setq modes (cons (concat "`" (symbol-name var) "'") modes)))) modes) ", "))) -- 2.41.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0006-5.6-Revive-erc-display-command-as-module-command-ind.patch >From 96b62219e43df0585ddfbabaa904342ca0385d22 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 10 Nov 2023 13:34:31 -0800 Subject: [PATCH 6/6] [5.6] Revive erc-display-command as module command-indicator * lisp/erc/erc-goodies.el (erc-noncommands-list): Replace the nonexistent `erc-cmd-SMV' with `erc-cmd-SAY'. (erc-noncommands-mode, erc-noncommands-enable, erc-noncommands-disable): Deprecate. (erc-command-indicator-face, erc-command-indicator): Migrate from main library. (erc-command-indicator-mode, erc-command-indicator-enable, erc-command-indicator-disable): New module to take the place of `noncommands'. (erc-command-indicator-toggle-hidden): New command to toggle echoed command-line visibility. (erc--command-indicator-permit-insertion): New function. (erc--command-indicator-display): New function, a slightly revised version of the old `erc-display-command' from the main library. Its only call site was removed back in d1036d288de "backport: erc bugfixes". However, references were left behind to associated assets, like `erc-command-indicator', etc. The function was later commented out in 0c599ee2e2c "* lisp/erc/erc.el: Use `run-hook-with-args` for `erc-pre-send-functions`", and then removed by a63ed6f78a6 "Remove duplicate ERC prompt on reconnect". * lisp/erc/erc-match.el (erc-match-toggle-hidden-fools): Use new non-module-specific name for `erc-match--toggle-hidden'. (erc-match--toggle-hidden): Move to main library for shared use by other modules. * lisp/erc/erc.el (erc-hide-prompt): Leave note explaining updated role. (erc-command-indicator): Move to erc-goodies. (erc-command-indicator-face): Move to erc-goodies. (erc-modules): Remove module `noncommands' from standard value. (erc--toggle-hidden): "New" function, a rebranded version of `erc-match--toggle-hidden'. (erc--send-input-lines): Accommodate modules wanting alternate insertion functions. (erc-load-irc-script-lines): Account for `erc-command-indicator' no longer being defined in this library. * test/lisp/erc/erc-tests.el (erc-tests--modules): Remove deprecated module `noncommands' from manifest. (Bug#67031) --- etc/ERC-NEWS | 15 +++++ lisp/erc/erc-goodies.el | 113 ++++++++++++++++++++++++++++++++++--- lisp/erc/erc-match.el | 14 +---- lisp/erc/erc.el | 63 ++++++++++----------- test/lisp/erc/erc-tests.el | 3 +- 5 files changed, 152 insertions(+), 56 deletions(-) diff --git a/etc/ERC-NEWS b/etc/ERC-NEWS index f59023eae62..49b623aa7f0 100644 --- a/etc/ERC-NEWS +++ b/etc/ERC-NEWS @@ -157,6 +157,21 @@ asking users who've customized this option to switch to that some other solution, like automatic migration, is justified, please make that known on the bug list. +** Module 'noncommands' deprecated, replaced by 'command-indicator'. +Command-line echoing has returned to ERC after a near-decade-long +hiatus. This means you can elect to have ERC leave a trail of most +slash-command input submitted at the prompt, in a manner resembling a +shell or a REPL. The particulars are likely of little interest to +most users, but the gist is that this functionality was removed in +5.3.x (Emacs 24.5) under mysterious circumstances, without mention in +this document or any change log. Everything's mostly been restored, +except that the feature is now opt-in. (Add 'command-indicator' to +'erc-modules' to get started.) The only real gotcha is that related +faces and options, like 'erc-command-indicator', have moved to the +'erc-goodies' library, although their Custom groups remain the same. +Hint: once enabled, use 'erc-command-indicator-toggle-hidden' to +dynamically toggle echoed command-line visibility. + ** 'erc-button-alist' and 'erc-nick-popup-alist' have evolved slightly. It's no secret that the 'buttons' module treats potential nicknames specially. This is perhaps most evident in its treatment of the diff --git a/lisp/erc/erc-goodies.el b/lisp/erc/erc-goodies.el index 4cc81dd9378..93b76c544aa 100644 --- a/lisp/erc/erc-goodies.el +++ b/lisp/erc/erc-goodies.el @@ -471,21 +471,26 @@ erc-noncommands-list erc-cmd-COUNTRY erc-cmd-SV erc-cmd-SM - erc-cmd-SMV + erc-cmd-SAY erc-cmd-LASTLOG) - "List of commands that are aliases for CTCP ACTION or for ERC messages. - -If a command's function symbol is in this list, the typed command -does not appear in the ERC buffer after the user presses ENTER.") + "List of commands that perform their own buffer I/O. +The `command-indicator' module forgoes echoing commands in this +list.") ;;;###autoload(autoload 'erc-noncommands-mode "erc-goodies" nil t) (define-erc-module noncommands nil - "This mode distinguishes non-commands. -Commands listed in `erc-insert-this' know how to display -themselves." + "Treat commands that display themselves specially. +This module has been a no-op since ERC 5.3 and has likely only +ever made sense in the context of `erc-command-indicator'. It +was deprecated in ERC 5.6." ((add-hook 'erc--input-review-functions #'erc-send-distinguish-noncommands)) ((remove-hook 'erc--input-review-functions #'erc-send-distinguish-noncommands))) +(make-obsolete-variable 'erc-noncommand-mode + 'erc-command-indicator-mode "30.1") +(make-obsolete 'erc-noncommand-mode 'erc-command-indicator-mode "30.1") +(make-obsolete 'erc-noncommand-enable 'erc-command-indicator-enable "30.1") +(make-obsolete 'erc-noncommand-disable 'erc-command-indicator-disable "30.1") (defun erc-send-distinguish-noncommands (state) "If STR is an ERC non-command, set `insertp' in STATE to nil." @@ -499,6 +504,98 @@ erc-send-distinguish-noncommands ;; Inhibit sending this string. (setf (erc-input-insertp state) nil)))) + +;;; Command-indicator + +(defface erc-command-indicator-face + '((t :inherit (shadow fixed-pitch-serif))) + "Face for echoed command lines, including the prompt. +See option `erc-command-indicator'." + :package-version '(ERC . "5.6") + :group 'erc-faces) + +(defcustom erc-command-indicator "$>" + "Pseudo prompt for echoed command lines. +An analog of the option `erc-prompt' that replaces the \"speaker +label\" for echoed \"slash\" commands submitted at the prompt. A +value of nil means ERC only inserts the command line portion, +sans pseudo prompt, which may trick certain modules into treating +the slash command itself as the message's \"speaker\"." + :package-version '(ERC . "5.6") + :group 'erc-display + :type '(choice (const "$>") (const nil) string function)) + +;;;###autoload(autoload 'erc-command-indicator-mode "erc-goodies" nil t) +(define-erc-module command-indicator nil + "Echo command lines for \"slash commands,\" like /JOIN, /HELP, etc. +Skip those appearing in `erc-noncommands-list'. + +Users can run \\[erc-command-indicator-toggle-hidden] to hide and +reveal echoed command lines after they've been inserted." + ((add-hook 'erc--input-review-functions + #'erc--command-indicator-permit-insertion 90 t) + (erc-command-indicator-toggle-hidden -1)) + ((remove-hook 'erc--input-review-functions + #'erc--command-indicator-permit-insertion t) + (erc-command-indicator-toggle-hidden +1)) + 'local) + +(defun erc-command-indicator () + "Return the command-indicator prompt as a string. +Do nothing if the variable `erc-command-indicator' is nil." + (and erc-command-indicator + (let ((prompt (if (functionp erc-command-indicator) + (funcall erc-command-indicator) + erc-command-indicator))) + (concat prompt (and (not (string-empty-p prompt)) " "))))) + +(defun erc-command-indicator-toggle-hidden (arg) + "Toggle whether echoed \"slash commands\" are visible." + (interactive "P") + (erc--toggle-hidden 'command-indicator arg)) + +(defun erc--command-indicator-permit-insertion (state) + "Insert `erc-input' STATE's message if it's an echoed command." + (cl-assert erc-command-indicator-mode) + (when (erc--input-split-cmdp state) + (setf (erc--input-split-insertp state) #'erc--command-indicator-display) + (erc-send-distinguish-noncommands state))) + +;; That function used to be called `erc-display-command'. It was +;; neutered in ERC 5.3.x (Emacs 24.5), commented out in 5.4, removed +;; in 5.5, and restored in 5.6. +(defun erc--command-indicator-display (line) + "Insert command LINE as echoed input resembling that of REPLs and shells." + (when erc-insert-this + (save-excursion + (erc--assert-input-bounds) + (let ((insert-position (marker-position (goto-char erc-insert-marker))) + (erc--msg-props (or erc--msg-props + (let ((ovs erc--msg-prop-overrides)) + (map-into `((erc-msg . slash-cmd) + ,@(reverse ovs)) + 'hash-table))))) + (when-let ((string (erc-command-indicator)) + (erc-input-marker (copy-marker erc-input-marker))) + (erc-display-prompt nil nil string 'erc-command-indicator-face) + (set-marker erc-input-marker nil)) + (let ((beg (point))) + (insert line) + (erc-put-text-property beg (point) + 'font-lock-face 'erc-command-indicator-face) + (insert "\n")) + (save-restriction + (narrow-to-region insert-position (point)) + (run-hooks 'erc-send-modify-hook) + (run-hooks 'erc-send-post-hook) + (cl-assert (> (- (point-max) (point-min)) 1)) + (erc--hide-message 'command-indicator) + (add-text-properties (point-min) (1+ (point-min)) + (erc--order-text-properties-from-hash + erc--msg-props)))) + (erc--refresh-prompt)))) + + ;;; IRC control character processing. (defgroup erc-control-characters nil "Dealing with control characters." diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el index 8644e61106f..6fff54d3cf4 100644 --- a/lisp/erc/erc-match.el +++ b/lisp/erc/erc-match.el @@ -695,19 +695,7 @@ erc-match-toggle-hidden-fools Expect the function `erc-hide-fools' or similar to be present in `erc-text-matched-hook'." (interactive "P") - (erc-match--toggle-hidden 'match-fools arg)) - -(defun erc-match--toggle-hidden (prop arg) - "Toggle invisibility for spec member PROP. -Treat ARG in a manner similar to mode toggles defined by -`define-minor-mode'." - (when arg - (setq arg (prefix-numeric-value arg))) - (if (memq prop (ensure-list buffer-invisibility-spec)) - (unless (natnump arg) - (remove-from-invisibility-spec prop)) - (when (or (not arg) (natnump arg)) - (add-to-invisibility-spec prop)))) + (erc--toggle-hidden 'match-fools arg)) (provide 'erc-match) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 00ee97b7e14..89b3397d8f1 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -346,8 +346,13 @@ 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. See -`erc-unhide-query-prompt' for behavior concerning query prompts." +prompts are unhidden upon rejoining. For behavior concerning +query prompts, see `erc-unhide-query-prompt'. Longtime ERC users +should note that this option was repurposed in ERC 5.5 because it +had lain dormant for years after being sidelined in 5.3 when its +only use in the interactive client was removed. Before then, its +role was controlling whether `erc-command-indicator' would appear +alongside echoed slash-command lines." :package-version '(ERC . "5.5") :group 'erc-display :type '(choice (const :tag "Always hide prompt" t) @@ -759,28 +764,6 @@ erc-prompt (concat prompt " ") prompt))) -(defcustom erc-command-indicator nil - "Indicator used by ERC for showing commands. - -If non-nil, this will be used in the ERC buffer to indicate -commands (i.e., input starting with a `/'). - -If nil, the prompt will be constructed from the variable `erc-prompt'." - :group 'erc-display - :type '(choice (const nil) string function)) - -(defun erc-command-indicator () - "Return the command indicator prompt as a string. - -This only has any meaning if the variable `erc-command-indicator' is non-nil." - (and erc-command-indicator - (let ((prompt (if (functionp erc-command-indicator) - (funcall erc-command-indicator) - erc-command-indicator))) - (if (> (length prompt) 0) - (concat prompt " ") - prompt)))) - (defcustom erc-notice-prefix "*** " "Prefix for all notices." :group 'erc-display @@ -1364,12 +1347,6 @@ erc-prompt-face "ERC face for the prompt." :group 'erc-faces) -(defface erc-command-indicator-face - '((t :weight bold)) - "ERC face for the command indicator. -See the variable `erc-command-indicator'." - :group 'erc-faces) - (defface erc-notice-face '((default :weight bold) (((class color) (min-colors 88) (supports :weight semi-bold)) @@ -2077,7 +2054,7 @@ erc--sort-modules (defcustom erc-modules '( autojoin button completion fill imenu irccontrols list match menu move-to-prompt netsplit - networks noncommands readonly ring stamp track) + networks readonly ring stamp track) "A list of modules which ERC should enable. If you set the value of this without using `customize' remember to call \(erc-update-modules) after you change it. When using `customize', modules @@ -2127,6 +2104,7 @@ erc-modules (const :tag "button: Buttonize URLs, nicknames, and other text" button) (const :tag "capab: Mark unidentified users on servers supporting CAPAB" capab-identify) + (const :tag "command-indicator: Echo command lines." command-indicator) (const :tag "completion: Complete nicknames and commands (programmable)" completion) (const :tag "dcc: Provide Direct Client-to-Client support" dcc) @@ -2146,7 +2124,7 @@ erc-modules (const :tag "networks: Provide data about IRC networks" networks) (const :tag "nickbar: Show nicknames in a dyamic side window" nickbar) (const :tag "nicks: Uniquely colorize nicknames in target buffers" nicks) - (const :tag "noncommands: Don't display non-IRC commands after evaluation" + (const :tag "noncommands: Deprecated. See module `command-indicator'." noncommands) (const :tag "notifications: Desktop alerts on PRIVMSG or mentions" notifications) @@ -3309,6 +3287,18 @@ erc--hide-message (cl-incf beg)) (erc--merge-prop (1- beg) (1- end) 'invisible value))))) +(defun erc--toggle-hidden (prop arg) + "Toggle invisibility for spec member PROP. +Treat ARG in a manner similar to mode toggles defined by +`define-minor-mode'." + (when arg + (setq arg (prefix-numeric-value arg))) + (if (memq prop (ensure-list buffer-invisibility-spec)) + (unless (natnump arg) + (remove-from-invisibility-spec prop)) + (when (or (not arg) (natnump arg)) + (add-to-invisibility-spec prop)))) + (defun erc--delete-inserted-message (beg-or-point &optional end) "Remove message between BEG and END. Expect BEG and END to match bounds as returned by the macro @@ -7016,7 +7006,9 @@ erc--send-input-lines (when (erc--input-split-sendp lines-obj) (dolist (line (erc--input-split-lines lines-obj)) (when (erc--input-split-insertp lines-obj) - (erc-display-msg line)) + (if (functionp (erc--input-split-insertp lines-obj)) + (funcall (erc--input-split-insertp lines-obj) line) + (erc-display-msg line))) (erc-process-input-line (concat line "\n") (null erc-flood-protect) (not (erc--input-split-cmdp lines-obj)))))) @@ -7522,7 +7514,10 @@ erc-load-irc-script-lines user input." (let* ((cb (current-buffer)) (s "") - (sp (or (erc-command-indicator) (erc-prompt))) + (sp (or (and (bound-and-true-p erc-command-indicator-mode) + (fboundp 'erc-command-indicator) + (erc-command-indicator)) + (erc-prompt))) (args (and (boundp 'erc-script-args) erc-script-args))) (if (and args (string-match "^ " args)) (setq args (substring args 1))) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 2898ca7be75..e7422d330c0 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -2543,7 +2543,8 @@ erc-handle-irc-url (kill-buffer "#chan"))) (defconst erc-tests--modules - '( autoaway autojoin bufbar button capab-identify completion dcc fill identd + '( autoaway autojoin bufbar button capab-identify + command-indicator completion dcc fill identd imenu irccontrols keep-place list log match menu move-to-prompt netsplit networks nickbar nicks noncommands notifications notify page readonly replace ring sasl scrolltobottom services smiley sound -- 2.41.0 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Mon Nov 13 15:12:22 2023 Received: (at 67032-done) by debbugs.gnu.org; 13 Nov 2023 20:12:22 +0000 Received: from localhost ([127.0.0.1]:59382 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r2dIE-00020a-2L for submit@debbugs.gnu.org; Mon, 13 Nov 2023 15:12:22 -0500 Received: from mail-108-mta42.mxroute.com ([136.175.108.42]:36001) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1r2dIC-00020S-M7 for 67032-done@debbugs.gnu.org; Mon, 13 Nov 2023 15:12:21 -0500 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta42.mxroute.com (ZoneMTA) with ESMTPSA id 18bca4f9a1a000190b.001 for <67032-done@debbugs.gnu.org> (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Mon, 13 Nov 2023 20:11:36 +0000 X-Zone-Loop: 7f44fd3f9ccf6b82febbfd5e9b8a79868803881f6fb1 X-Originating-IP: [136.175.111.2] 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:Date:References:In-Reply-To: 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=lB2OzhPsGdwz6WqKgA7E+K5955P6QdjN39hD132N3Z0=; b=DsvH6I/nwKsH9rPS4UfRptkb96 Y+uRCV1yObKTMfTyVKu14vOPmHc4My2O8/cSdtbp+2YjKZfG48mWyhXkNSOTTjEyIdcOBBQkW7YIM TdgGfeUsLxohLsas8QPI31PLdJxcQdHSkkwzjQSXVqg/OMIC3oXpcFYS6YRLfhWIYADvn2337VSKY CxImi9w1jjNbvrMnytGfJWhj2N3ixe+ottqeVh6dD3YZBWsdh8SCDLhSzzolpc8On8RU/KXHPkhEG V2SDrTq22huacrk5w17tT7RZmcisWBqC9ipD3dIZ7YAggOXdLzbqc9nv71RzUJUjkTDZaQvHQFmnD YIBM5CfA==; From: "J.P." To: 67032-done@debbugs.gnu.org Subject: Re: bug#67032: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly In-Reply-To: <87h6lt850d.fsf@neverwas.me> (J. P.'s message of "Fri, 10 Nov 2023 17:15:14 -0800") References: <87v8aa9wd0.fsf@neverwas.me> <87h6lt850d.fsf@neverwas.me> Date: Mon, 13 Nov 2023 12:11:10 -0800 Message-ID: <87fs19za5d.fsf@neverwas.me> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Authenticated-Id: masked@neverwas.me X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 67032-done Cc: emacs-erc@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) "J.P." writes: > v2. Revive `erc-command-indicator' functionality as new module. > > [...] > > but the damage had long since been done. My point in drudging this up is dredging* > merely to highlight where the behavior concerned diverged and that we'll > likely never know why. I really have no interest in relitigating ancient > motivations and methods. (It's quite possible that discussions did take > place elsewhere, like on Freenode or the old sourceforge list.) > > Anyway, since both the interface (options, fonts) and infrastructure are > still in place, I think it behooves us to revive this functionality, not > least as a signal to others that ERC picks up after itself (eventually). > I've thus added some changes to this effect (see last patch). This has been installed as 1d2aa130cae * Revive erc-command-indicator as new module And changes similar to those initially proposed can be found in and around 174b3dd9bd7 * Make nested input handling more robust in ERC Thanks and closing. From unknown Tue Jun 17 20:19:35 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Tue, 12 Dec 2023 12:24:06 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Wed Mar 13 21:15:36 2024 Received: (at control) by debbugs.gnu.org; 14 Mar 2024 01:15:36 +0000 Received: from localhost ([127.0.0.1]:47622 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rkZh2-0006qK-GR for submit@debbugs.gnu.org; Wed, 13 Mar 2024 21:15:36 -0400 Received: from mail-108-mta173.mxroute.com ([136.175.108.173]:44189) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rkZgz-0006qB-Oq for control@debbugs.gnu.org; Wed, 13 Mar 2024 21:15:35 -0400 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta173.mxroute.com (ZoneMTA) with ESMTPSA id 18e3a86c2400003bea.001 for (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Thu, 14 Mar 2024 01:14:53 +0000 X-Zone-Loop: 74939bdd0de9873ef0709a3bc6dab2d96ae6fbe66233 X-Originating-IP: [136.175.111.2] 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:Date:Subject:To:From:Sender: Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=SfUKprHaV6XgSmUnIWGL+U7eOLo7uqR24Um8uJxOPAA=; b=XrA8NYauzXClmCLpTxr2JZf+a/ 8IWdEpwR8cMKbsqKMnwF8RkYuCi+KR2oc+vkATgVOczXs8jvnwhYp7j/KKU3k1+UglKksP+vU8el9 fc4UGqHcJ7Tdqd39X6v/27UEKZ4GuKgOiiY2R8kH6tLjJ9WikhBnCscQEu2c872c9qsR6EBuyyuq4 iqZ4gwuPoRiDvLpGUwRys1Qw3oyX1WNc+H5FjqKnw4djYDK71XuByRXKs+SFJGSMJwK+zrM51lIET gPFjF1mYczM6joskkzXzuMvtLcKF7rHvsyte5J98IjsVddBdMi8u3tF8n5nl9vUs3w124sAMb3vCX 0pk+jW4A==; From: "J.P." To: control@debbugs.gnu.org Subject: control message for bug #67032 Date: Wed, 13 Mar 2024 18:14:49 -0700 Message-ID: <87zfv162d2.fsf@neverwas.me> MIME-Version: 1.0 Content-Type: text/plain X-Authenticated-Id: masked@neverwas.me X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) unarchive 67032 quit From debbugs-submit-bounces@debbugs.gnu.org Wed Mar 13 22:12:23 2024 Received: (at 67032) by debbugs.gnu.org; 14 Mar 2024 02:12:23 +0000 Received: from localhost ([127.0.0.1]:47653 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rkaZv-0002cb-Ei for submit@debbugs.gnu.org; Wed, 13 Mar 2024 22:12:23 -0400 Received: from mail-108-mta188.mxroute.com ([136.175.108.188]:42763) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rkaZp-0002cO-V2 for 67032@debbugs.gnu.org; Wed, 13 Mar 2024 22:12:18 -0400 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta188.mxroute.com (ZoneMTA) with ESMTPSA id 18e3abaa5580003bea.001 for <67032@debbugs.gnu.org> (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Thu, 14 Mar 2024 02:11:34 +0000 X-Zone-Loop: 218261fae2242fc9e40f37f20f2dab12efc4933e388c X-Originating-IP: [136.175.111.2] 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:Date:References:In-Reply-To: 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=4ifGecPdA9UHIyFA8581FgzVC8rT/ROyr+2X653T+xQ=; b=IU8p+2dfNFVRJ7t8i++EhheGW5 /cD2hMIzMTleDYv/o5UEW1QKBchyhe6udTpDEam0CC7rVOGbxecRecrllDdbuvVHcn7gt8Xoz3C/H 4ui5hza0psCGZMdPCD9oFliUQ5/gX1dE/t45V+O+SATMBMWGCdq7LLLnshk63C3SzDszXgSzVPN2K 0DNewKuImlFTgLqSM9fUztnim6+WBWIXnUwP4YeG/Pb4Z/jpcbQPfUlaO7OhuEKxQus5vYoSR8DE3 tM2PwpdJ8lAfsLfjKEEiZFWDH8Oc9+rwcghEaGqbthoV6m0PZTHqHCCQ2TPXOpgk+7Hzjk1zgJjtc UXi5sQpQ==; From: "J.P." To: 67032@debbugs.gnu.org Subject: Re: bug#67032: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly In-Reply-To: <87fs19za5d.fsf@neverwas.me> (J. P.'s message of "Mon, 13 Nov 2023 12:11:10 -0800") References: <87v8aa9wd0.fsf@neverwas.me> <87h6lt850d.fsf@neverwas.me> <87fs19za5d.fsf@neverwas.me> Date: Wed, 13 Mar 2024 19:11:30 -0700 Message-ID: <878r2l5zql.fsf@neverwas.me> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Authenticated-Id: masked@neverwas.me X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 67032 Cc: emacs-erc@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain > This has been installed as > > 1d2aa130cae * Revive erc-command-indicator as new module One aspect this change should've addressed but didn't was using the revived `command-indicator' facility in `erc-load-irc-script-lines' to make its output more predictable and consistent with other displayed messages. While leaving it to rot would of course be safer, I suspect it's rarely used enough to warrant the risk. An ancillary benefit of fixing this is that it helps clarify the role of boolean return values for `erc-process-input-line', `erc-send-input-line-function', `erc-message', and the various `erc-cmd-FOO' slash-command handlers. See second patch (lacks tests). Thanks. P.S. The commit named above unfortunately cites the wrong bug number (67031) in its commit message. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-5.6-Restore-leading-space-to-right-margin-stamps-in-.patch Content-Transfer-Encoding: quoted-printable >From 65ae6054894b1d30794b241ed9a285edbe3e7e36 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 10 Mar 2024 23:09:59 -0700 Subject: [PATCH 1/2] [5.6] Restore leading space to right margin stamps in = ERC * lisp/erc/erc-stamp.el (erc-insert-timestamp-right): Insert a single space character immediately before right-side stamps managed by `erc-stamp--display-margin-mode'. Include it as part of the `timestamp' field. This behavior was originally present in an earlier draft of the changes for bug#60936, mainly to favor symmetry between hard-wrapped fill styles and fill-wrap with regard to stamps. It was subsequently removed to simplify management, so that the `field' and `display' intervals aligned. * test/lisp/erc/erc-stamp-tests.el (erc-stamp--display-margin-mode--right): Update expected output. ; test/lisp/erc/resources/fill/snapshots/merge-01-start.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/merge-02-right.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/merge-wrap-01.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-post-01.eld: ; Add space. ; test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-pre-01.eld: ; Add space. ; test/lisp/erc/resources/fill/snapshots/monospace-01-start.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/monospace-02-right.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/monospace-03-left.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/monospace-04-reset.eld: Add space. ; test/lisp/erc/resources/fill/snapshots/spacing-01-mono.eld: Add space. --- lisp/erc/erc-stamp.el | 1 + test/lisp/erc/erc-stamp-tests.el | 16 ++++++++-------- .../resources/fill/snapshots/merge-01-start.eld | 2 +- .../resources/fill/snapshots/merge-02-right.eld | 2 +- .../resources/fill/snapshots/merge-wrap-01.eld | 2 +- .../snapshots/merge-wrap-indicator-post-01.eld | 2 +- .../snapshots/merge-wrap-indicator-pre-01.eld | 2 +- .../fill/snapshots/monospace-01-start.eld | 2 +- .../fill/snapshots/monospace-02-right.eld | 2 +- .../fill/snapshots/monospace-03-left.eld | 2 +- .../fill/snapshots/monospace-04-reset.eld | 2 +- .../resources/fill/snapshots/spacing-01-mono.eld | 2 +- 12 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el index 44f92c5a7e2..bcb9b4aafef 100644 --- a/lisp/erc/erc-stamp.el +++ b/lisp/erc/erc-stamp.el @@ -623,6 +623,7 @@ erc-insert-timestamp-right ((guard erc-stamp--display-margin-mode) (let ((s (propertize (substring-no-properties string) 'invisible erc-stamp--invisible-property))) + (insert " ") (put-text-property 0 (length string) 'display `((margin right-margin) ,s) string))) diff --git a/test/lisp/erc/erc-stamp-tests.el b/test/lisp/erc/erc-stamp-tes= ts.el index a49173ffa2f..5fee21ec28f 100644 --- a/test/lisp/erc/erc-stamp-tests.el +++ b/test/lisp/erc/erc-stamp-tests.el @@ -168,11 +168,11 @@ erc-stamp--display-margin-mode--right (put-text-property 0 (length msg) 'wrap-prefix 10 msg) (erc-display-message nil nil (current-buffer) msg))) (goto-char (point-min)) - ;; Space not added (treated as opaque string). - (should (search-forward "msg one[" nil t)) - ;; Field covers stamp alone + ;; Leading space added as part of the stamp's field. + (should (search-forward "msg one [" nil t)) + ;; Field covers stamp and space. (should (eql ?e (char-before (field-beginning (point))))) - ;; Vanity props extended + ;; Vanity props extended. (should (get-text-property (field-beginning (point)) 'wrap-prefix)) (should (get-text-property (1+ (field-beginning (point))) 'wrap-pre= fix)) (should (get-text-property (1- (field-end (point))) 'wrap-prefix)) @@ -183,10 +183,10 @@ erc-stamp--display-margin-mode--right (erc-timestamp-right-column 20)) (let ((msg (erc-format-privmessage "bob" "tttt wwww oooo" nil t))) (erc-display-message nil nil (current-buffer) msg))) - ;; No hard wrap - (should (search-forward "oooo[" nil t)) - ;; Field starts at format string (right bracket) - (should (eql ?\[ (char-after (field-beginning (point))))) + ;; No hard wrap. + (should (search-forward "oooo [" nil t)) + ;; Field starts at managed space before format string. + (should (eql ?\s (char-after (field-beginning (point))))) (should (eql ?\n (char-after (field-end (point))))))))) =20 ;; This concerns a proposed partial reversal of the changes resulting diff --git a/test/lisp/erc/resources/fill/snapshots/merge-01-start.eld b/te= st/lisp/erc/resources/fill/snapshots/merge-01-start.eld index 3c32719a052..6ff7af218c0 100644 --- a/test/lisp/erc/resources/fill/snapshots/merge-01-start.eld +++ b/test/lisp/erc/resources/fill/snapshots/merge-01-start.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n\n[= Sat Apr 1 2023]\n zero.[07:00]\n one.\n two.\n thr= ee.\n four.\n five.\n six.\n" 2 3 (erc--msg datestamp er= c--ts 0 field erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(sp= ace :width 27) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg noti= ce erc--ts 0 wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22= 183 (wrap-prefix #1# line-prefix #2#) 183 190 (field erc-timestamp wrap-pr= efix #1# line-prefix #2# display (#6=3D(margin right-margin) #("[00:00]" 0 = 7 (invisible timestamp)))) 191 192 (erc--msg msg erc--ts 0 erc--spkr "alice= " erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)= ))) 192 197 (wrap-prefix #1# line-prefix #3#) 197 199 (wrap-prefix #1# line= -prefix #3#) 199 202 (wrap-prefix #1# line-prefix #3#) 202 315 (wrap-prefix= #1# line-prefix #3#) 316 348 (wrap-prefix #1# line-prefix #3#) 349 350 (er= c--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG wrap-prefix #1# line-= prefix #4=3D(space :width (- 27 (6)))) 350 353 (wrap-prefix #1# line-prefix= #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 360 (wrap-prefix #1# li= ne-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #4#) 436 437 (erc--msg = datestamp erc--ts 1680307200 field erc-timestamp) 437 454 (field erc-timest= amp wrap-prefix #1# line-prefix (space :width (- 27 (18)))) 455 456 (erc--m= sg msg erc--ts 1680332400 erc--spkr "bob" erc--cmd PRIVMSG wrap-prefix #1# = line-prefix #5=3D(space :width (- 27 (6)))) 456 459 (wrap-prefix #1# line-p= refix #5#) 459 466 (wrap-prefix #1# line-prefix #5#) 466 473 (field erc-tim= estamp wrap-prefix #1# line-prefix #5# display (#6# #("[07:00]" 0 7 (invisi= ble timestamp)))) 474 475 (erc--msg msg erc--ts 1680332400 erc--spkr "alice= " erc--cmd PRIVMSG wrap-prefix #1# line-prefix #7=3D(space :width (- 27 (8)= ))) 475 480 (wrap-prefix #1# line-prefix #7#) 480 486 (wrap-prefix #1# line= -prefix #7#) 487 488 (erc--msg msg erc--ts 1680332400 erc--spkr "alice" erc= --cmd PRIVMSG wrap-prefix #1# line-prefix #8=3D(space :width (- 27 0)) disp= lay #9=3D"") 488 493 (wrap-prefix #1# line-prefix #8# display #9#) 493 495 = (wrap-prefix #1# line-prefix #8# display #9#) 495 499 (wrap-prefix #1# line= -prefix #8#) 500 501 (erc--msg msg erc--ts 1680332400 erc--spkr "bob" erc--= cmd PRIVMSG wrap-prefix #1# line-prefix #10=3D(space :width (- 27 (6)))) 50= 1 504 (wrap-prefix #1# line-prefix #10#) 504 512 (wrap-prefix #1# line-pref= ix #10#) 513 514 (erc--msg msg erc--ts 1680332400 erc--spkr "bob" erc--cmd = PRIVMSG wrap-prefix #1# line-prefix #11=3D(space :width (- 27 0)) display #= 9#) 514 517 (wrap-prefix #1# line-prefix #11# display #9#) 517 519 (wrap-pr= efix #1# line-prefix #11# display #9#) 519 524 (wrap-prefix #1# line-prefix= #11#) 525 526 (erc--msg msg erc--ts 1680332400 erc--spkr "Dummy" erc--cmd = PRIVMSG wrap-prefix #1# line-prefix #12=3D(space :width (- 27 (8)))) 526 53= 1 (wrap-prefix #1# line-prefix #12#) 531 538 (wrap-prefix #1# line-prefix #= 12#) 539 540 (erc--msg msg erc--ts 1680332400 erc--spkr "Dummy" erc--cmd PR= IVMSG wrap-prefix #1# line-prefix #13=3D(space :width (- 27 0)) display #9#= ) 540 545 (wrap-prefix #1# line-prefix #13# display #9#) 545 547 (wrap-pref= ix #1# line-prefix #13# display #9#) 547 551 (wrap-prefix #1# line-prefix #= 13#)) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n\n= [Sat Apr 1 2023]\n zero. [07:00]\n one.\n two.\n t= hree.\n four.\n five.\n six.\n" 2 3 (erc--msg datestamp = erc--ts 0 field erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(= space :width 27) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg no= tice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) = 22 183 (wrap-prefix #1# line-prefix #2#) 183 184 (field erc-timestamp wrap-= prefix #1# line-prefix #2#) 184 191 (field erc-timestamp wrap-prefix #1# li= ne-prefix #2# display (#6=3D(margin right-margin) #("[00:00]" 0 7 (invisibl= e timestamp)))) 192 193 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd = PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 193 198= (wrap-prefix #1# line-prefix #3#) 198 200 (wrap-prefix #1# line-prefix #3#= ) 200 203 (wrap-prefix #1# line-prefix #3#) 203 316 (wrap-prefix #1# line-p= refix #3#) 317 349 (wrap-prefix #1# line-prefix #3#) 350 351 (erc--msg msg = erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4= =3D(space :width (- 27 (6)))) 351 354 (wrap-prefix #1# line-prefix #4#) 354= 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-prefix #1# line-prefix= #4#) 361 436 (wrap-prefix #1# line-prefix #4#) 437 438 (erc--msg datestamp= erc--ts 1680307200 field erc-timestamp) 438 455 (field erc-timestamp wrap-= prefix #1# line-prefix (space :width (- 27 (18)))) 456 457 (erc--msg msg er= c--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-pref= ix #5=3D(space :width (- 27 (6)))) 457 460 (wrap-prefix #1# line-prefix #5#= ) 460 467 (wrap-prefix #1# line-prefix #5#) 467 468 (field erc-timestamp wr= ap-prefix #1# line-prefix #5#) 468 475 (field erc-timestamp wrap-prefix #1#= line-prefix #5# display (#6# #("[07:00]" 0 7 (invisible timestamp)))) 476 = 477 (erc--msg msg erc--spkr "alice" erc--ts 1680332400 erc--cmd PRIVMSG wra= p-prefix #1# line-prefix #7=3D(space :width (- 27 (8)))) 477 482 (wrap-pref= ix #1# line-prefix #7#) 482 488 (wrap-prefix #1# line-prefix #7#) 489 490 (= erc--msg msg erc--spkr "alice" erc--ts 1680332400 erc--cmd PRIVMSG wrap-pre= fix #1# line-prefix #8=3D(space :width (- 27 0)) display #9=3D"") 490 495 (= wrap-prefix #1# line-prefix #8# display #9#) 495 497 (wrap-prefix #1# line-= prefix #8# display #9#) 497 501 (wrap-prefix #1# line-prefix #8#) 502 503 (= erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefi= x #1# line-prefix #10=3D(space :width (- 27 (6)))) 503 506 (wrap-prefix #1#= line-prefix #10#) 506 514 (wrap-prefix #1# line-prefix #10#) 515 516 (erc-= -msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1= # line-prefix #11=3D(space :width (- 27 0)) display #9#) 516 519 (wrap-pref= ix #1# line-prefix #11# display #9#) 519 521 (wrap-prefix #1# line-prefix #= 11# display #9#) 521 526 (wrap-prefix #1# line-prefix #11#) 527 528 (erc--m= sg msg erc--spkr "Dummy" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1= # line-prefix #12=3D(space :width (- 27 (8)))) 528 533 (wrap-prefix #1# lin= e-prefix #12#) 533 540 (wrap-prefix #1# line-prefix #12#) 541 542 (erc--msg= msg erc--spkr "Dummy" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# = line-prefix #13=3D(space :width (- 27 0)) display #9#) 542 547 (wrap-prefix= #1# line-prefix #13# display #9#) 547 549 (wrap-prefix #1# line-prefix #13= # display #9#) 549 553 (wrap-prefix #1# line-prefix #13#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/merge-02-right.eld b/te= st/lisp/erc/resources/fill/snapshots/merge-02-right.eld index e2064b914c4..7d9822c80bc 100644 --- a/test/lisp/erc/resources/fill/snapshots/merge-02-right.eld +++ b/test/lisp/erc/resources/fill/snapshots/merge-02-right.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n\n[= Sat Apr 1 2023]\n zero.[07:00]\n one.\n two.\n thr= ee.\n four.\n five.\n six.\n" 2 3 (erc--msg datestamp er= c--ts 0 field erc-timestamp) 3 20 (wrap-prefix #1=3D(space :width 29) line-= prefix (space :width (- 29 (18))) field erc-timestamp) 21 22 (wrap-prefix #= 1# line-prefix #2=3D(space :width (- 29 (4))) erc--msg notice erc--ts 0) 22= 183 (wrap-prefix #1# line-prefix #2#) 183 190 (wrap-prefix #1# line-prefix= #2# field erc-timestamp display (#6=3D(margin right-margin) #("[00:00]" 0 = 7 (invisible timestamp)))) 191 192 (wrap-prefix #1# line-prefix #3=3D(space= :width (- 29 (8))) erc--msg msg erc--ts 0 erc--spkr "alice" erc--cmd PRIVM= SG) 192 197 (wrap-prefix #1# line-prefix #3#) 197 199 (wrap-prefix #1# line= -prefix #3#) 199 202 (wrap-prefix #1# line-prefix #3#) 202 315 (wrap-prefix= #1# line-prefix #3#) 316 348 (wrap-prefix #1# line-prefix (space :width (-= 29 (8)))) 349 350 (wrap-prefix #1# line-prefix #4=3D(space :width (- 29 (6= ))) erc--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG) 350 353 (wrap-= prefix #1# line-prefix #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 3= 60 (wrap-prefix #1# line-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #= 4#) 436 437 (erc--msg datestamp erc--ts 1680307200 field erc-timestamp) 437= 454 (wrap-prefix #1# line-prefix (space :width (- 29 (18))) field erc-time= stamp) 455 456 (wrap-prefix #1# line-prefix #5=3D(space :width (- 29 (6))) = erc--msg msg erc--ts 1680332400 erc--spkr "bob" erc--cmd PRIVMSG) 456 459 (= wrap-prefix #1# line-prefix #5#) 459 466 (wrap-prefix #1# line-prefix #5#) = 466 473 (wrap-prefix #1# line-prefix #5# field erc-timestamp display (#6# #= ("[07:00]" 0 7 (invisible timestamp)))) 474 475 (wrap-prefix #1# line-prefi= x #7=3D(space :width (- 29 (8))) erc--msg msg erc--ts 1680332400 erc--spkr = "alice" erc--cmd PRIVMSG) 475 480 (wrap-prefix #1# line-prefix #7#) 480 486= (wrap-prefix #1# line-prefix #7#) 487 488 (wrap-prefix #1# line-prefix #8= =3D(space :width (- 29 0)) erc--msg msg erc--ts 1680332400 erc--spkr "alice= " erc--cmd PRIVMSG display #9=3D"") 488 493 (wrap-prefix #1# line-prefix #8= # display #9#) 493 495 (wrap-prefix #1# line-prefix #8# display #9#) 495 49= 9 (wrap-prefix #1# line-prefix #8#) 500 501 (wrap-prefix #1# line-prefix #1= 0=3D(space :width (- 29 (6))) erc--msg msg erc--ts 1680332400 erc--spkr "bo= b" erc--cmd PRIVMSG) 501 504 (wrap-prefix #1# line-prefix #10#) 504 512 (wr= ap-prefix #1# line-prefix #10#) 513 514 (wrap-prefix #1# line-prefix #11=3D= (space :width (- 29 0)) erc--msg msg erc--ts 1680332400 erc--spkr "bob" erc= --cmd PRIVMSG display #9#) 514 517 (wrap-prefix #1# line-prefix #11# displa= y #9#) 517 519 (wrap-prefix #1# line-prefix #11# display #9#) 519 524 (wrap= -prefix #1# line-prefix #11#) 525 526 (wrap-prefix #1# line-prefix #12=3D(s= pace :width (- 29 (8))) erc--msg msg erc--ts 1680332400 erc--spkr "Dummy" e= rc--cmd PRIVMSG) 526 531 (wrap-prefix #1# line-prefix #12#) 531 538 (wrap-p= refix #1# line-prefix #12#) 539 540 (wrap-prefix #1# line-prefix #13=3D(spa= ce :width (- 29 0)) erc--msg msg erc--ts 1680332400 erc--spkr "Dummy" erc--= cmd PRIVMSG display #9#) 540 545 (wrap-prefix #1# line-prefix #13# display = #9#) 545 547 (wrap-prefix #1# line-prefix #13# display #9#) 547 551 (wrap-p= refix #1# line-prefix #13#)) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n\n= [Sat Apr 1 2023]\n zero. [07:00]\n one.\n two.\n t= hree.\n four.\n five.\n six.\n" 2 3 (erc--msg datestamp = erc--ts 0 field erc-timestamp) 3 20 (wrap-prefix #1=3D(space :width 29) lin= e-prefix (space :width (- 29 (18))) field erc-timestamp) 21 22 (wrap-prefix= #1# line-prefix #2=3D(space :width (- 29 (4))) erc--msg notice erc--ts 0) = 22 183 (wrap-prefix #1# line-prefix #2#) 183 184 (wrap-prefix #1# line-pref= ix #2# field erc-timestamp) 184 191 (wrap-prefix #1# line-prefix #2# field = erc-timestamp display (#6=3D(margin right-margin) #("[00:00]" 0 7 (invisibl= e timestamp)))) 192 193 (wrap-prefix #1# line-prefix #3=3D(space :width (- = 29 (8))) erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd PRIVMSG) 193 198= (wrap-prefix #1# line-prefix #3#) 198 200 (wrap-prefix #1# line-prefix #3#= ) 200 203 (wrap-prefix #1# line-prefix #3#) 203 316 (wrap-prefix #1# line-p= refix #3#) 317 349 (wrap-prefix #1# line-prefix (space :width (- 29 (8)))) = 350 351 (wrap-prefix #1# line-prefix #4=3D(space :width (- 29 (6))) erc--ms= g msg erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG) 351 354 (wrap-prefix #1# = line-prefix #4#) 354 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-pr= efix #1# line-prefix #4#) 361 436 (wrap-prefix #1# line-prefix #4#) 437 438= (erc--msg datestamp erc--ts 1680307200 field erc-timestamp) 438 455 (wrap-= prefix #1# line-prefix (space :width (- 29 (18))) field erc-timestamp) 456 = 457 (wrap-prefix #1# line-prefix #5=3D(space :width (- 29 (6))) erc--msg ms= g erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG) 457 460 (wrap-prefix= #1# line-prefix #5#) 460 467 (wrap-prefix #1# line-prefix #5#) 467 468 (wr= ap-prefix #1# line-prefix #5# field erc-timestamp) 468 475 (wrap-prefix #1#= line-prefix #5# field erc-timestamp display (#6# #("[07:00]" 0 7 (invisibl= e timestamp)))) 476 477 (wrap-prefix #1# line-prefix #7=3D(space :width (- = 29 (8))) erc--msg msg erc--spkr "alice" erc--ts 1680332400 erc--cmd PRIVMSG= ) 477 482 (wrap-prefix #1# line-prefix #7#) 482 488 (wrap-prefix #1# line-p= refix #7#) 489 490 (wrap-prefix #1# line-prefix #8=3D(space :width (- 29 0)= ) erc--msg msg erc--spkr "alice" erc--ts 1680332400 erc--cmd PRIVMSG displa= y #9=3D"") 490 495 (wrap-prefix #1# line-prefix #8# display #9#) 495 497 (w= rap-prefix #1# line-prefix #8# display #9#) 497 501 (wrap-prefix #1# line-p= refix #8#) 502 503 (wrap-prefix #1# line-prefix #10=3D(space :width (- 29 (= 6))) erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG) 503 = 506 (wrap-prefix #1# line-prefix #10#) 506 514 (wrap-prefix #1# line-prefix= #10#) 515 516 (wrap-prefix #1# line-prefix #11=3D(space :width (- 29 0)) e= rc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG display #9#= ) 516 519 (wrap-prefix #1# line-prefix #11# display #9#) 519 521 (wrap-pref= ix #1# line-prefix #11# display #9#) 521 526 (wrap-prefix #1# line-prefix #= 11#) 527 528 (wrap-prefix #1# line-prefix #12=3D(space :width (- 29 (8))) e= rc--msg msg erc--spkr "Dummy" erc--ts 1680332400 erc--cmd PRIVMSG) 528 533 = (wrap-prefix #1# line-prefix #12#) 533 540 (wrap-prefix #1# line-prefix #12= #) 541 542 (wrap-prefix #1# line-prefix #13=3D(space :width (- 29 0)) erc--= msg msg erc--spkr "Dummy" erc--ts 1680332400 erc--cmd PRIVMSG display #9#) = 542 547 (wrap-prefix #1# line-prefix #13# display #9#) 547 549 (wrap-prefix= #1# line-prefix #13# display #9#) 549 553 (wrap-prefix #1# line-prefix #13= #)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/merge-wrap-01.eld b/tes= t/lisp/erc/resources/fill/snapshots/merge-wrap-01.eld index feaba85ec90..2d0e5a5965f 100644 --- a/test/lisp/erc/resources/fill/snapshots/merge-wrap-01.eld +++ b/test/lisp/erc/resources/fill/snapshots/merge-wrap-01.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n\n[= Sat Apr 1 2023]\n zero.[07:00]\n 0.5\n* bob one.\n two.\n 2.5\n* bob three\n four.\n" 2 3 (erc--msg datestamp erc--ts 0 fiel= d erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(space :width 2= 7) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts 0= wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap-p= refix #1# line-prefix #2#) 183 190 (field erc-timestamp wrap-prefix #1# lin= e-prefix #2# display (#5=3D(margin right-margin) #("[00:00]" 0 7 (invisible= timestamp)))) 191 192 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd P= RIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 192 197 = (wrap-prefix #1# line-prefix #3#) 197 199 (wrap-prefix #1# line-prefix #3#)= 199 202 (wrap-prefix #1# line-prefix #3#) 202 315 (wrap-prefix #1# line-pr= efix #3#) 316 348 (wrap-prefix #1# line-prefix #3#) 349 350 (erc--msg msg e= rc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4=3D= (space :width (- 27 (6)))) 350 353 (wrap-prefix #1# line-prefix #4#) 353 35= 5 (wrap-prefix #1# line-prefix #4#) 355 360 (wrap-prefix #1# line-prefix #4= #) 360 435 (wrap-prefix #1# line-prefix #4#) 436 437 (erc--msg datestamp er= c--ts 1680307200 field erc-timestamp) 437 454 (field erc-timestamp wrap-pre= fix #1# line-prefix (space :width (- 27 (18)))) 455 456 (erc--msg msg erc--= spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix = #6=3D(space :width (- 27 (6)))) 456 459 (wrap-prefix #1# line-prefix #6#) 4= 59 466 (wrap-prefix #1# line-prefix #6#) 466 473 (field erc-timestamp wrap-= prefix #1# line-prefix #6# display (#5# #("[07:00]" 0 7 (invisible timestam= p)))) 474 475 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRI= VMSG wrap-prefix #1# line-prefix #7=3D(space :width (- 27 0)) display #8=3D= "") 475 478 (wrap-prefix #1# line-prefix #7# display #8#) 478 480 (wrap-pre= fix #1# line-prefix #7# display #8#) 480 483 (wrap-prefix #1# line-prefix #= 7#) 484 485 (erc--msg ctcp-action erc--spkr "bob" erc--ts 1680332400 erc--c= md PRIVMSG erc--ctcp ACTION wrap-prefix #1# line-prefix #9=3D(space :width = (- 27 (6)))) 485 486 (wrap-prefix #1# line-prefix #9#) 486 489 (wrap-prefix= #1# line-prefix #9#) 489 494 (wrap-prefix #1# line-prefix #9#) 495 496 (er= c--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix = #1# line-prefix #10=3D(space :width (- 27 (6)))) 496 499 (wrap-prefix #1# l= ine-prefix #10#) 499 505 (wrap-prefix #1# line-prefix #10#) 506 507 (erc--m= sg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# = line-prefix #11=3D(space :width (- 27 0)) display #8#) 507 510 (wrap-prefix= #1# line-prefix #11# display #8#) 510 512 (wrap-prefix #1# line-prefix #11= # display #8#) 512 515 (wrap-prefix #1# line-prefix #11#) 516 517 (erc--msg= ctcp-action erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG erc--ctcp = ACTION wrap-prefix #1# line-prefix #12=3D(space :width (- 27 (2)))) 517 518= (wrap-prefix #1# line-prefix #12#) 518 521 (wrap-prefix #1# line-prefix #1= 2#) 521 527 (wrap-prefix #1# line-prefix #12#) 528 529 (erc--msg msg erc--s= pkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #= 13=3D(space :width (- 27 (6)))) 529 532 (wrap-prefix #1# line-prefix #13#) = 532 539 (wrap-prefix #1# line-prefix #13#)) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n\n= [Sat Apr 1 2023]\n zero. [07:00]\n 0.5\n* bob one.\n two.\n= 2.5\n* bob three\n four.\n" 2 3 (erc--msg datestamp erc--ts 0 fi= eld erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(space :width= 27) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts= 0 wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap= -prefix #1# line-prefix #2#) 183 184 (field erc-timestamp wrap-prefix #1# l= ine-prefix #2#) 184 191 (field erc-timestamp wrap-prefix #1# line-prefix #2= # display (#5=3D(margin right-margin) #("[00:00]" 0 7 (invisible timestamp)= ))) 192 193 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd PRIVMSG wrap= -prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 193 198 (wrap-prefi= x #1# line-prefix #3#) 198 200 (wrap-prefix #1# line-prefix #3#) 200 203 (w= rap-prefix #1# line-prefix #3#) 203 316 (wrap-prefix #1# line-prefix #3#) 3= 17 349 (wrap-prefix #1# line-prefix #3#) 350 351 (erc--msg msg erc--spkr "b= ob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4=3D(space :wid= th (- 27 (6)))) 351 354 (wrap-prefix #1# line-prefix #4#) 354 356 (wrap-pre= fix #1# line-prefix #4#) 356 361 (wrap-prefix #1# line-prefix #4#) 361 436 = (wrap-prefix #1# line-prefix #4#) 437 438 (erc--msg datestamp erc--ts 16803= 07200 field erc-timestamp) 438 455 (field erc-timestamp wrap-prefix #1# lin= e-prefix (space :width (- 27 (18)))) 456 457 (erc--msg msg erc--spkr "bob" = erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #6=3D(space= :width (- 27 (6)))) 457 460 (wrap-prefix #1# line-prefix #6#) 460 467 (wra= p-prefix #1# line-prefix #6#) 467 468 (field erc-timestamp wrap-prefix #1# = line-prefix #6#) 468 475 (field erc-timestamp wrap-prefix #1# line-prefix #= 6# display (#5# #("[07:00]" 0 7 (invisible timestamp)))) 476 477 (erc--msg = msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# lin= e-prefix #7=3D(space :width (- 27 0)) display #8=3D"") 477 480 (wrap-prefix= #1# line-prefix #7# display #8#) 480 482 (wrap-prefix #1# line-prefix #7# = display #8#) 482 485 (wrap-prefix #1# line-prefix #7#) 486 487 (erc--msg ct= cp-action erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG erc--ctcp ACT= ION wrap-prefix #1# line-prefix #9=3D(space :width (- 27 (6)))) 487 488 (wr= ap-prefix #1# line-prefix #9#) 488 491 (wrap-prefix #1# line-prefix #9#) 49= 1 496 (wrap-prefix #1# line-prefix #9#) 497 498 (erc--msg msg erc--spkr "bo= b" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #10=3D(s= pace :width (- 27 (6)))) 498 501 (wrap-prefix #1# line-prefix #10#) 501 507= (wrap-prefix #1# line-prefix #10#) 508 509 (erc--msg msg erc--spkr "bob" e= rc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #11=3D(space= :width (- 27 0)) display #8#) 509 512 (wrap-prefix #1# line-prefix #11# di= splay #8#) 512 514 (wrap-prefix #1# line-prefix #11# display #8#) 514 517 (= wrap-prefix #1# line-prefix #11#) 518 519 (erc--msg ctcp-action erc--spkr "= bob" erc--ts 1680332400 erc--cmd PRIVMSG erc--ctcp ACTION wrap-prefix #1# l= ine-prefix #12=3D(space :width (- 27 (2)))) 519 520 (wrap-prefix #1# line-p= refix #12#) 520 523 (wrap-prefix #1# line-prefix #12#) 523 529 (wrap-prefix= #1# line-prefix #12#) 530 531 (erc--msg msg erc--spkr "bob" erc--ts 168033= 2400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #13=3D(space :width (- 27= (6)))) 531 534 (wrap-prefix #1# line-prefix #13#) 534 541 (wrap-prefix #1#= line-prefix #13#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-po= st-01.eld b/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-pos= t-01.eld index ed1488c8595..e019e60bb26 100644 --- a/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-post-01.e= ld +++ b/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-post-01.e= ld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n\n[= Sat Apr 1 2023]\n zero.[07:00]\n 0.5\n* bob one.\n two.\n 2.5\n* bob three\n four.\n" 2 3 (erc--msg datestamp erc--ts 0 fiel= d erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(space :width 2= 7) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts 0= wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap-p= refix #1# line-prefix #2#) 183 190 (field erc-timestamp wrap-prefix #1# lin= e-prefix #2# display (#5=3D(margin right-margin) #("[00:00]" 0 7 (invisible= timestamp)))) 191 192 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd P= RIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 192 197 = (wrap-prefix #1# line-prefix #3#) 197 199 (wrap-prefix #1# line-prefix #3#)= 199 202 (wrap-prefix #1# line-prefix #3#) 202 315 (wrap-prefix #1# line-pr= efix #3#) 316 348 (wrap-prefix #1# line-prefix #3#) 349 350 (erc--msg msg e= rc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4=3D= (space :width (- 27 (6)))) 350 353 (wrap-prefix #1# line-prefix #4#) 353 35= 5 (wrap-prefix #1# line-prefix #4#) 355 360 (wrap-prefix #1# line-prefix #4= #) 360 435 (wrap-prefix #1# line-prefix #4#) 436 437 (erc--msg datestamp er= c--ts 1680307200 field erc-timestamp) 437 454 (field erc-timestamp wrap-pre= fix #1# line-prefix (space :width (- 27 (18)))) 455 456 (erc--msg msg erc--= spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix = #6=3D(space :width (- 27 (6)))) 456 459 (wrap-prefix #1# line-prefix #6#) 4= 59 466 (wrap-prefix #1# line-prefix #6#) 466 473 (field erc-timestamp wrap-= prefix #1# line-prefix #6# display (#5# #("[07:00]" 0 7 (invisible timestam= p)))) 474 475 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRI= VMSG wrap-prefix #1# line-prefix #7=3D(space :width (- 27 0)) display #8=3D= "") 475 478 (wrap-prefix #1# line-prefix #7# display #8#) 478 480 (wrap-pre= fix #1# line-prefix #7# display #8#) 480 483 (wrap-prefix #1# line-prefix #= 7#) 484 485 (erc--msg ctcp-action erc--spkr "bob" erc--ts 1680332400 erc--c= md PRIVMSG erc--ctcp ACTION wrap-prefix #1# line-prefix #9=3D(space :width = (- 27 (6)))) 485 486 (wrap-prefix #1# line-prefix #9#) 486 489 (wrap-prefix= #1# line-prefix #9#) 489 494 (wrap-prefix #1# line-prefix #9#) 495 496 (er= c--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix = #1# line-prefix #10=3D(space :width (- 27 (6)))) 496 499 (wrap-prefix #1# l= ine-prefix #10#) 499 505 (wrap-prefix #1# line-prefix #10#) 505 506 (displa= y #("~\n" 0 2 (font-lock-face shadow))) 506 507 (erc--msg msg erc--spkr "bo= b" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #11=3D(s= pace :width (- 27 0)) display #8#) 507 510 (wrap-prefix #1# line-prefix #11= # display #8#) 510 512 (wrap-prefix #1# line-prefix #11# display #8#) 512 5= 15 (wrap-prefix #1# line-prefix #11#) 516 517 (erc--msg ctcp-action erc--sp= kr "bob" erc--ts 1680332400 erc--cmd PRIVMSG erc--ctcp ACTION wrap-prefix #= 1# line-prefix #12=3D(space :width (- 27 (2)))) 517 518 (wrap-prefix #1# li= ne-prefix #12#) 518 521 (wrap-prefix #1# line-prefix #12#) 521 527 (wrap-pr= efix #1# line-prefix #12#) 528 529 (erc--msg msg erc--spkr "bob" erc--ts 16= 80332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #13=3D(space :width (= - 27 (6)))) 529 532 (wrap-prefix #1# line-prefix #13#) 532 539 (wrap-prefix= #1# line-prefix #13#)) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n\n= [Sat Apr 1 2023]\n zero. [07:00]\n 0.5\n* bob one.\n two.\n= 2.5\n* bob three\n four.\n" 2 3 (erc--msg datestamp erc--ts 0 fi= eld erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(space :width= 27) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts= 0 wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap= -prefix #1# line-prefix #2#) 183 184 (field erc-timestamp wrap-prefix #1# l= ine-prefix #2#) 184 191 (field erc-timestamp wrap-prefix #1# line-prefix #2= # display (#5=3D(margin right-margin) #("[00:00]" 0 7 (invisible timestamp)= ))) 192 193 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd PRIVMSG wrap= -prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 193 198 (wrap-prefi= x #1# line-prefix #3#) 198 200 (wrap-prefix #1# line-prefix #3#) 200 203 (w= rap-prefix #1# line-prefix #3#) 203 316 (wrap-prefix #1# line-prefix #3#) 3= 17 349 (wrap-prefix #1# line-prefix #3#) 350 351 (erc--msg msg erc--spkr "b= ob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4=3D(space :wid= th (- 27 (6)))) 351 354 (wrap-prefix #1# line-prefix #4#) 354 356 (wrap-pre= fix #1# line-prefix #4#) 356 361 (wrap-prefix #1# line-prefix #4#) 361 436 = (wrap-prefix #1# line-prefix #4#) 437 438 (erc--msg datestamp erc--ts 16803= 07200 field erc-timestamp) 438 455 (field erc-timestamp wrap-prefix #1# lin= e-prefix (space :width (- 27 (18)))) 456 457 (erc--msg msg erc--spkr "bob" = erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #6=3D(space= :width (- 27 (6)))) 457 460 (wrap-prefix #1# line-prefix #6#) 460 467 (wra= p-prefix #1# line-prefix #6#) 467 468 (field erc-timestamp wrap-prefix #1# = line-prefix #6#) 468 475 (field erc-timestamp wrap-prefix #1# line-prefix #= 6# display (#5# #("[07:00]" 0 7 (invisible timestamp)))) 476 477 (erc--msg = msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# lin= e-prefix #7=3D(space :width (- 27 0)) display #8=3D"") 477 480 (wrap-prefix= #1# line-prefix #7# display #8#) 480 482 (wrap-prefix #1# line-prefix #7# = display #8#) 482 485 (wrap-prefix #1# line-prefix #7#) 486 487 (erc--msg ct= cp-action erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG erc--ctcp ACT= ION wrap-prefix #1# line-prefix #9=3D(space :width (- 27 (6)))) 487 488 (wr= ap-prefix #1# line-prefix #9#) 488 491 (wrap-prefix #1# line-prefix #9#) 49= 1 496 (wrap-prefix #1# line-prefix #9#) 497 498 (erc--msg msg erc--spkr "bo= b" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #10=3D(s= pace :width (- 27 (6)))) 498 501 (wrap-prefix #1# line-prefix #10#) 501 507= (wrap-prefix #1# line-prefix #10#) 507 508 (display #("~\n" 0 2 (font-lock= -face shadow))) 508 509 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 er= c--cmd PRIVMSG wrap-prefix #1# line-prefix #11=3D(space :width (- 27 0)) di= splay #8#) 509 512 (wrap-prefix #1# line-prefix #11# display #8#) 512 514 (= wrap-prefix #1# line-prefix #11# display #8#) 514 517 (wrap-prefix #1# line= -prefix #11#) 518 519 (erc--msg ctcp-action erc--spkr "bob" erc--ts 1680332= 400 erc--cmd PRIVMSG erc--ctcp ACTION wrap-prefix #1# line-prefix #12=3D(sp= ace :width (- 27 (2)))) 519 520 (wrap-prefix #1# line-prefix #12#) 520 523 = (wrap-prefix #1# line-prefix #12#) 523 529 (wrap-prefix #1# line-prefix #12= #) 530 531 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMS= G wrap-prefix #1# line-prefix #13=3D(space :width (- 27 (6)))) 531 534 (wra= p-prefix #1# line-prefix #13#) 534 541 (wrap-prefix #1# line-prefix #13#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-pr= e-01.eld b/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-pre-= 01.eld index a3530a6c44d..615de982b1e 100644 --- a/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-pre-01.eld +++ b/test/lisp/erc/resources/fill/snapshots/merge-wrap-indicator-pre-01.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n\n[= Sat Apr 1 2023]\n zero.[07:00]\n 0.5\n* bob one.\n two.\n 2.5\n* bob three\n four.\n" 2 3 (erc--msg datestamp erc--ts 0 fiel= d erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(space :width 2= 7) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts 0= wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap-p= refix #1# line-prefix #2#) 183 190 (field erc-timestamp wrap-prefix #1# lin= e-prefix #2# display (#5=3D(margin right-margin) #("[00:00]" 0 7 (invisible= timestamp)))) 191 192 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd P= RIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 192 197 = (wrap-prefix #1# line-prefix #3#) 197 199 (wrap-prefix #1# line-prefix #3#)= 199 202 (wrap-prefix #1# line-prefix #3#) 202 315 (wrap-prefix #1# line-pr= efix #3#) 316 348 (wrap-prefix #1# line-prefix #3#) 349 350 (erc--msg msg e= rc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4=3D= (space :width (- 27 (6)))) 350 353 (wrap-prefix #1# line-prefix #4#) 353 35= 5 (wrap-prefix #1# line-prefix #4#) 355 360 (wrap-prefix #1# line-prefix #4= #) 360 435 (wrap-prefix #1# line-prefix #4#) 436 437 (erc--msg datestamp er= c--ts 1680307200 field erc-timestamp) 437 454 (field erc-timestamp wrap-pre= fix #1# line-prefix (space :width (- 27 (18)))) 455 456 (erc--msg msg erc--= spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix = #6=3D(space :width (- 27 (6)))) 456 459 (wrap-prefix #1# line-prefix #6#) 4= 59 466 (wrap-prefix #1# line-prefix #6#) 466 473 (field erc-timestamp wrap-= prefix #1# line-prefix #6# display (#5# #("[07:00]" 0 7 (invisible timestam= p)))) 474 475 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRI= VMSG wrap-prefix #1# line-prefix #7=3D(space :width (- 27 #10=3D(2))) displ= ay #8=3D#("> " 0 1 (font-lock-face shadow))) 475 478 (wrap-prefix #1# line-= prefix #7# display #8#) 478 480 (wrap-prefix #1# line-prefix #7# display #8= #) 480 483 (wrap-prefix #1# line-prefix #7#) 484 485 (erc--msg ctcp-action = erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG erc--ctcp ACTION wrap-p= refix #1# line-prefix #9=3D(space :width (- 27 (6)))) 485 486 (wrap-prefix = #1# line-prefix #9#) 486 489 (wrap-prefix #1# line-prefix #9#) 489 494 (wra= p-prefix #1# line-prefix #9#) 495 496 (erc--msg msg erc--spkr "bob" erc--ts= 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #11=3D(space :widt= h (- 27 (6)))) 496 499 (wrap-prefix #1# line-prefix #11#) 499 505 (wrap-pre= fix #1# line-prefix #11#) 506 507 (erc--msg msg erc--spkr "bob" erc--ts 168= 0332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #12=3D(space :width (-= 27 #10#)) display #8#) 507 510 (wrap-prefix #1# line-prefix #12# display #= 8#) 510 512 (wrap-prefix #1# line-prefix #12# display #8#) 512 515 (wrap-pr= efix #1# line-prefix #12#) 516 517 (erc--msg ctcp-action erc--spkr "bob" er= c--ts 1680332400 erc--cmd PRIVMSG erc--ctcp ACTION wrap-prefix #1# line-pre= fix #13=3D(space :width (- 27 (2)))) 517 518 (wrap-prefix #1# line-prefix #= 13#) 518 521 (wrap-prefix #1# line-prefix #13#) 521 527 (wrap-prefix #1# li= ne-prefix #13#) 528 529 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 er= c--cmd PRIVMSG wrap-prefix #1# line-prefix #14=3D(space :width (- 27 (6))))= 529 532 (wrap-prefix #1# line-prefix #14#) 532 539 (wrap-prefix #1# line-p= refix #14#)) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n\n= [Sat Apr 1 2023]\n zero. [07:00]\n 0.5\n* bob one.\n two.\n= 2.5\n* bob three\n four.\n" 2 3 (erc--msg datestamp erc--ts 0 fi= eld erc-timestamp) 3 20 (field erc-timestamp wrap-prefix #1=3D(space :width= 27) line-prefix (space :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts= 0 wrap-prefix #1# line-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap= -prefix #1# line-prefix #2#) 183 184 (field erc-timestamp wrap-prefix #1# l= ine-prefix #2#) 184 191 (field erc-timestamp wrap-prefix #1# line-prefix #2= # display (#5=3D(margin right-margin) #("[00:00]" 0 7 (invisible timestamp)= ))) 192 193 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd PRIVMSG wrap= -prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 193 198 (wrap-prefi= x #1# line-prefix #3#) 198 200 (wrap-prefix #1# line-prefix #3#) 200 203 (w= rap-prefix #1# line-prefix #3#) 203 316 (wrap-prefix #1# line-prefix #3#) 3= 17 349 (wrap-prefix #1# line-prefix #3#) 350 351 (erc--msg msg erc--spkr "b= ob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #4=3D(space :wid= th (- 27 (6)))) 351 354 (wrap-prefix #1# line-prefix #4#) 354 356 (wrap-pre= fix #1# line-prefix #4#) 356 361 (wrap-prefix #1# line-prefix #4#) 361 436 = (wrap-prefix #1# line-prefix #4#) 437 438 (erc--msg datestamp erc--ts 16803= 07200 field erc-timestamp) 438 455 (field erc-timestamp wrap-prefix #1# lin= e-prefix (space :width (- 27 (18)))) 456 457 (erc--msg msg erc--spkr "bob" = erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #6=3D(space= :width (- 27 (6)))) 457 460 (wrap-prefix #1# line-prefix #6#) 460 467 (wra= p-prefix #1# line-prefix #6#) 467 468 (field erc-timestamp wrap-prefix #1# = line-prefix #6#) 468 475 (field erc-timestamp wrap-prefix #1# line-prefix #= 6# display (#5# #("[07:00]" 0 7 (invisible timestamp)))) 476 477 (erc--msg = msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-prefix #1# lin= e-prefix #7=3D(space :width (- 27 #10=3D(2))) display #8=3D#("> " 0 1 (font= -lock-face shadow))) 477 480 (wrap-prefix #1# line-prefix #7# display #8#) = 480 482 (wrap-prefix #1# line-prefix #7# display #8#) 482 485 (wrap-prefix = #1# line-prefix #7#) 486 487 (erc--msg ctcp-action erc--spkr "bob" erc--ts = 1680332400 erc--cmd PRIVMSG erc--ctcp ACTION wrap-prefix #1# line-prefix #9= =3D(space :width (- 27 (6)))) 487 488 (wrap-prefix #1# line-prefix #9#) 488= 491 (wrap-prefix #1# line-prefix #9#) 491 496 (wrap-prefix #1# line-prefix= #9#) 497 498 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRI= VMSG wrap-prefix #1# line-prefix #11=3D(space :width (- 27 (6)))) 498 501 (= wrap-prefix #1# line-prefix #11#) 501 507 (wrap-prefix #1# line-prefix #11#= ) 508 509 (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG= wrap-prefix #1# line-prefix #12=3D(space :width (- 27 #10#)) display #8#) = 509 512 (wrap-prefix #1# line-prefix #12# display #8#) 512 514 (wrap-prefix= #1# line-prefix #12# display #8#) 514 517 (wrap-prefix #1# line-prefix #12= #) 518 519 (erc--msg ctcp-action erc--spkr "bob" erc--ts 1680332400 erc--cm= d PRIVMSG erc--ctcp ACTION wrap-prefix #1# line-prefix #13=3D(space :width = (- 27 (2)))) 519 520 (wrap-prefix #1# line-prefix #13#) 520 523 (wrap-prefi= x #1# line-prefix #13#) 523 529 (wrap-prefix #1# line-prefix #13#) 530 531 = (erc--msg msg erc--spkr "bob" erc--ts 1680332400 erc--cmd PRIVMSG wrap-pref= ix #1# line-prefix #14=3D(space :width (- 27 (6)))) 531 534 (wrap-prefix #1= # line-prefix #14#) 534 541 (wrap-prefix #1# line-prefix #14#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/monospace-01-start.eld = b/test/lisp/erc/resources/fill/snapshots/monospace-01-start.eld index c94629cf357..0228e716731 100644 --- a/test/lisp/erc/resources/fill/snapshots/monospace-01-start.eld +++ b/test/lisp/erc/resources/fill/snapshots/monospace-01-start.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n" 2= 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-times= tamp wrap-prefix #1=3D(space :width 27) line-prefix (space :width (- 27 (18= )))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(spa= ce :width (- 27 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 190 (fi= eld erc-timestamp wrap-prefix #1# line-prefix #2# display ((margin right-ma= rgin) #("[00:00]" 0 7 (invisible timestamp)))) 191 192 (erc--msg msg erc--t= s 0 erc--spkr "alice" erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(sp= ace :width (- 27 (8)))) 192 197 (wrap-prefix #1# line-prefix #3#) 197 199 (= wrap-prefix #1# line-prefix #3#) 199 202 (wrap-prefix #1# line-prefix #3#) = 202 315 (wrap-prefix #1# line-prefix #3#) 316 348 (wrap-prefix #1# line-pre= fix #3#) 349 350 (erc--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG w= rap-prefix #1# line-prefix #4=3D(space :width (- 27 (6)))) 350 353 (wrap-pr= efix #1# line-prefix #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 360= (wrap-prefix #1# line-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #4#= )) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n" = 2 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-time= stamp wrap-prefix #1=3D(space :width 27) line-prefix (space :width (- 27 (1= 8)))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(sp= ace :width (- 27 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 184 (f= ield erc-timestamp wrap-prefix #1# line-prefix #2#) 184 191 (field erc-time= stamp wrap-prefix #1# line-prefix #2# display ((margin right-margin) #("[00= :00]" 0 7 (invisible timestamp)))) 192 193 (erc--msg msg erc--spkr "alice" = erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (= - 27 (8)))) 193 198 (wrap-prefix #1# line-prefix #3#) 198 200 (wrap-prefix = #1# line-prefix #3#) 200 203 (wrap-prefix #1# line-prefix #3#) 203 316 (wra= p-prefix #1# line-prefix #3#) 317 349 (wrap-prefix #1# line-prefix #3#) 350= 351 (erc--msg msg erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #= 1# line-prefix #4=3D(space :width (- 27 (6)))) 351 354 (wrap-prefix #1# lin= e-prefix #4#) 354 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-prefi= x #1# line-prefix #4#) 361 436 (wrap-prefix #1# line-prefix #4#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/monospace-02-right.eld = b/test/lisp/erc/resources/fill/snapshots/monospace-02-right.eld index 127c0b29bc9..9ab89041b53 100644 --- a/test/lisp/erc/resources/fill/snapshots/monospace-02-right.eld +++ b/test/lisp/erc/resources/fill/snapshots/monospace-02-right.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n" 2= 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-times= tamp wrap-prefix #1=3D(space :width 29) line-prefix (space :width (- 29 (18= )))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(spa= ce :width (- 29 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 190 (fi= eld erc-timestamp wrap-prefix #1# line-prefix #2# display ((margin right-ma= rgin) #("[00:00]" 0 7 (invisible timestamp)))) 191 192 (erc--msg msg erc--t= s 0 erc--spkr "alice" erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(sp= ace :width (- 29 (8)))) 192 197 (wrap-prefix #1# line-prefix #3#) 197 199 (= wrap-prefix #1# line-prefix #3#) 199 202 (wrap-prefix #1# line-prefix #3#) = 202 315 (wrap-prefix #1# line-prefix #3#) 316 348 (wrap-prefix #1# line-pre= fix #3#) 349 350 (erc--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG w= rap-prefix #1# line-prefix #4=3D(space :width (- 29 (6)))) 350 353 (wrap-pr= efix #1# line-prefix #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 360= (wrap-prefix #1# line-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #4#= )) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n" = 2 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-time= stamp wrap-prefix #1=3D(space :width 29) line-prefix (space :width (- 29 (1= 8)))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(sp= ace :width (- 29 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 184 (f= ield erc-timestamp wrap-prefix #1# line-prefix #2#) 184 191 (field erc-time= stamp wrap-prefix #1# line-prefix #2# display ((margin right-margin) #("[00= :00]" 0 7 (invisible timestamp)))) 192 193 (erc--msg msg erc--spkr "alice" = erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (= - 29 (8)))) 193 198 (wrap-prefix #1# line-prefix #3#) 198 200 (wrap-prefix = #1# line-prefix #3#) 200 203 (wrap-prefix #1# line-prefix #3#) 203 316 (wra= p-prefix #1# line-prefix #3#) 317 349 (wrap-prefix #1# line-prefix #3#) 350= 351 (erc--msg msg erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #= 1# line-prefix #4=3D(space :width (- 29 (6)))) 351 354 (wrap-prefix #1# lin= e-prefix #4#) 354 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-prefi= x #1# line-prefix #4#) 361 436 (wrap-prefix #1# line-prefix #4#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/monospace-03-left.eld b= /test/lisp/erc/resources/fill/snapshots/monospace-03-left.eld index a9f3f1d1904..87ea4692d9d 100644 --- a/test/lisp/erc/resources/fill/snapshots/monospace-03-left.eld +++ b/test/lisp/erc/resources/fill/snapshots/monospace-03-left.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n" 2= 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-times= tamp wrap-prefix #1=3D(space :width 25) line-prefix (space :width (- 25 (18= )))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(spa= ce :width (- 25 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 190 (fi= eld erc-timestamp wrap-prefix #1# line-prefix #2# display ((margin right-ma= rgin) #("[00:00]" 0 7 (invisible timestamp)))) 191 192 (erc--msg msg erc--t= s 0 erc--spkr "alice" erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(sp= ace :width (- 25 (8)))) 192 197 (wrap-prefix #1# line-prefix #3#) 197 199 (= wrap-prefix #1# line-prefix #3#) 199 202 (wrap-prefix #1# line-prefix #3#) = 202 315 (wrap-prefix #1# line-prefix #3#) 316 348 (wrap-prefix #1# line-pre= fix #3#) 349 350 (erc--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG w= rap-prefix #1# line-prefix #4=3D(space :width (- 25 (6)))) 350 353 (wrap-pr= efix #1# line-prefix #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 360= (wrap-prefix #1# line-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #4#= )) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n" = 2 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-time= stamp wrap-prefix #1=3D(space :width 25) line-prefix (space :width (- 25 (1= 8)))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(sp= ace :width (- 25 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 184 (f= ield erc-timestamp wrap-prefix #1# line-prefix #2#) 184 191 (field erc-time= stamp wrap-prefix #1# line-prefix #2# display ((margin right-margin) #("[00= :00]" 0 7 (invisible timestamp)))) 192 193 (erc--msg msg erc--spkr "alice" = erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (= - 25 (8)))) 193 198 (wrap-prefix #1# line-prefix #3#) 198 200 (wrap-prefix = #1# line-prefix #3#) 200 203 (wrap-prefix #1# line-prefix #3#) 203 316 (wra= p-prefix #1# line-prefix #3#) 317 349 (wrap-prefix #1# line-prefix #3#) 350= 351 (erc--msg msg erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #= 1# line-prefix #4=3D(space :width (- 25 (6)))) 351 354 (wrap-prefix #1# lin= e-prefix #4#) 354 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-prefi= x #1# line-prefix #4#) 361 436 (wrap-prefix #1# line-prefix #4#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/monospace-04-reset.eld = b/test/lisp/erc/resources/fill/snapshots/monospace-04-reset.eld index c94629cf357..0228e716731 100644 --- a/test/lisp/erc/resources/fill/snapshots/monospace-04-reset.eld +++ b/test/lisp/erc/resources/fill/snapshots/monospace-04-reset.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n" 2= 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-times= tamp wrap-prefix #1=3D(space :width 27) line-prefix (space :width (- 27 (18= )))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(spa= ce :width (- 27 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 190 (fi= eld erc-timestamp wrap-prefix #1# line-prefix #2# display ((margin right-ma= rgin) #("[00:00]" 0 7 (invisible timestamp)))) 191 192 (erc--msg msg erc--t= s 0 erc--spkr "alice" erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(sp= ace :width (- 27 (8)))) 192 197 (wrap-prefix #1# line-prefix #3#) 197 199 (= wrap-prefix #1# line-prefix #3#) 199 202 (wrap-prefix #1# line-prefix #3#) = 202 315 (wrap-prefix #1# line-prefix #3#) 316 348 (wrap-prefix #1# line-pre= fix #3#) 349 350 (erc--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG w= rap-prefix #1# line-prefix #4=3D(space :width (- 27 (6)))) 350 353 (wrap-pr= efix #1# line-prefix #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 360= (wrap-prefix #1# line-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #4#= )) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n" = 2 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 20 (field erc-time= stamp wrap-prefix #1=3D(space :width 27) line-prefix (space :width (- 27 (1= 8)))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# line-prefix #2=3D(sp= ace :width (- 27 (4)))) 22 183 (wrap-prefix #1# line-prefix #2#) 183 184 (f= ield erc-timestamp wrap-prefix #1# line-prefix #2#) 184 191 (field erc-time= stamp wrap-prefix #1# line-prefix #2# display ((margin right-margin) #("[00= :00]" 0 7 (invisible timestamp)))) 192 193 (erc--msg msg erc--spkr "alice" = erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (= - 27 (8)))) 193 198 (wrap-prefix #1# line-prefix #3#) 198 200 (wrap-prefix = #1# line-prefix #3#) 200 203 (wrap-prefix #1# line-prefix #3#) 203 316 (wra= p-prefix #1# line-prefix #3#) 317 349 (wrap-prefix #1# line-prefix #3#) 350= 351 (erc--msg msg erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #= 1# line-prefix #4=3D(space :width (- 27 (6)))) 351 354 (wrap-prefix #1# lin= e-prefix #4#) 354 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-prefi= x #1# line-prefix #4#) 361 436 (wrap-prefix #1# line-prefix #4#)) \ No newline at end of file diff --git a/test/lisp/erc/resources/fill/snapshots/spacing-01-mono.eld b/t= est/lisp/erc/resources/fill/snapshots/spacing-01-mono.eld index 754d7989cea..ae364accdea 100644 --- a/test/lisp/erc/resources/fill/snapshots/spacing-01-mono.eld +++ b/test/lisp/erc/resources/fill/snapshots/spacing-01-mono.eld @@ -1 +1 @@ -#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect.[00:00]\n bob: come, you ar= e a tedious fool: to the purpose. What was done to Elbow's wife, that he ha= th cause to complain of? Come me to what was done to her.\n alice: Eit= her your unparagoned mistress is dead, or she's outprized by a trifle.\n This buffer is for text.\n*** one two three\n*** four five six\n So= mebody stop me\n" 2 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3 = 20 (field erc-timestamp wrap-prefix #1=3D(space :width 27) line-prefix (spa= ce :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# li= ne-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap-prefix #1# line-pref= ix #2#) 183 190 (field erc-timestamp wrap-prefix #1# line-prefix #2# displa= y ((margin right-margin) #("[00:00]" 0 7 (invisible timestamp)))) 190 191 (= line-spacing 0.5) 191 192 (erc--msg msg erc--ts 0 erc--spkr "alice" erc--cm= d PRIVMSG wrap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 192 1= 97 (wrap-prefix #1# line-prefix #3#) 197 199 (wrap-prefix #1# line-prefix #= 3#) 199 202 (wrap-prefix #1# line-prefix #3#) 202 315 (wrap-prefix #1# line= -prefix #3#) 316 348 (wrap-prefix #1# line-prefix #3#) 348 349 (line-spacin= g 0.5) 349 350 (erc--msg msg erc--ts 0 erc--spkr "bob" erc--cmd PRIVMSG wra= p-prefix #1# line-prefix #4=3D(space :width (- 27 (6)))) 350 353 (wrap-pref= ix #1# line-prefix #4#) 353 355 (wrap-prefix #1# line-prefix #4#) 355 360 (= wrap-prefix #1# line-prefix #4#) 360 435 (wrap-prefix #1# line-prefix #4#) = 435 436 (line-spacing 0.5) 436 437 (erc--msg msg erc--ts 0 erc--spkr "bob" = erc--cmd PRIVMSG wrap-prefix #1# line-prefix #5=3D(space :width (- 27 0)) d= isplay #6=3D"") 437 440 (wrap-prefix #1# line-prefix #5# display #6#) 440 4= 42 (wrap-prefix #1# line-prefix #5# display #6#) 442 466 (wrap-prefix #1# l= ine-prefix #5#) 466 467 (line-spacing 0.5) 467 468 (erc--msg notice erc--ts= 0 wrap-prefix #1# line-prefix #7=3D(space :width (- 27 (4)))) 468 484 (wra= p-prefix #1# line-prefix #7#) 485 486 (erc--msg notice erc--ts 0 wrap-prefi= x #1# line-prefix #8=3D(space :width (- 27 (4)))) 486 502 (wrap-prefix #1# = line-prefix #8#) 502 503 (line-spacing 0.5) 503 504 (erc--msg msg erc--ts 0= erc--spkr "bob" erc--cmd PRIVMSG wrap-prefix #1# line-prefix #9=3D(space := width (- 27 (6)))) 504 507 (wrap-prefix #1# line-prefix #9#) 507 525 (wrap-= prefix #1# line-prefix #9#)) \ No newline at end of file +#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is loggin= g all user I/O. If you do not wish for everything you send to be readable b= y the server owner(s), please disconnect. [00:00]\n bob: come, you a= re a tedious fool: to the purpose. What was done to Elbow's wife, that he h= ath cause to complain of? Come me to what was done to her.\n alice: Ei= ther your unparagoned mistress is dead, or she's outprized by a trifle.\n This buffer is for text.\n*** one two three\n*** four five six\n S= omebody stop me\n" 2 3 (erc--msg datestamp erc--ts 0 field erc-timestamp) 3= 20 (field erc-timestamp wrap-prefix #1=3D(space :width 27) line-prefix (sp= ace :width (- 27 (18)))) 21 22 (erc--msg notice erc--ts 0 wrap-prefix #1# l= ine-prefix #2=3D(space :width (- 27 (4)))) 22 183 (wrap-prefix #1# line-pre= fix #2#) 183 184 (field erc-timestamp wrap-prefix #1# line-prefix #2#) 184 = 191 (field erc-timestamp wrap-prefix #1# line-prefix #2# display ((margin r= ight-margin) #("[00:00]" 0 7 (invisible timestamp)))) 191 192 (line-spacing= 0.5) 192 193 (erc--msg msg erc--spkr "alice" erc--ts 0 erc--cmd PRIVMSG wr= ap-prefix #1# line-prefix #3=3D(space :width (- 27 (8)))) 193 198 (wrap-pre= fix #1# line-prefix #3#) 198 200 (wrap-prefix #1# line-prefix #3#) 200 203 = (wrap-prefix #1# line-prefix #3#) 203 316 (wrap-prefix #1# line-prefix #3#)= 317 349 (wrap-prefix #1# line-prefix #3#) 349 350 (line-spacing 0.5) 350 3= 51 (erc--msg msg erc--spkr "bob" erc--ts 0 erc--cmd PRIVMSG wrap-prefix #1#= line-prefix #4=3D(space :width (- 27 (6)))) 351 354 (wrap-prefix #1# line-= prefix #4#) 354 356 (wrap-prefix #1# line-prefix #4#) 356 361 (wrap-prefix = #1# line-prefix #4#) 361 436 (wrap-prefix #1# line-prefix #4#) 436 437 (lin= e-spacing 0.5) 437 438 (erc--msg msg erc--spkr "bob" erc--ts 0 erc--cmd PRI= VMSG wrap-prefix #1# line-prefix #5=3D(space :width (- 27 0)) display #6=3D= "") 438 441 (wrap-prefix #1# line-prefix #5# display #6#) 441 443 (wrap-pre= fix #1# line-prefix #5# display #6#) 443 467 (wrap-prefix #1# line-prefix #= 5#) 467 468 (line-spacing 0.5) 468 469 (erc--msg notice erc--ts 0 wrap-pref= ix #1# line-prefix #7=3D(space :width (- 27 (4)))) 469 485 (wrap-prefix #1#= line-prefix #7#) 486 487 (erc--msg notice erc--ts 0 wrap-prefix #1# line-p= refix #8=3D(space :width (- 27 (4)))) 487 503 (wrap-prefix #1# line-prefix = #8#) 503 504 (line-spacing 0.5) 504 505 (erc--msg msg erc--spkr "bob" erc--= ts 0 erc--cmd PRIVMSG wrap-prefix #1# line-prefix #9=3D(space :width (- 27 = (6)))) 505 508 (wrap-prefix #1# line-prefix #9#) 508 526 (wrap-prefix #1# l= ine-prefix #9#)) \ No newline at end of file --=20 2.44.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-5.x-Use-command-indicator-in-erc-load-irc-script-lin.patch >From 46ad0f95a39f6abc231bb22a5c248807d3cedfc8 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 10 Mar 2024 23:09:59 -0700 Subject: [PATCH 2/2] [5.x] Use command-indicator in erc-load-irc-script-lines * lisp/erc/erc-goodies.el (erc-load-irc-script-lines): Move here from main file and rework to always use `command-indicator' instead of only partially, when available. Also use internal "send-action" and "send-message" interfaces to defer command-handler output until command lines have been inserted. * lisp/erc/erc.el (erc-process-input-line): Redo doc string. (erc-process-script-line): Split overlong line. (erc-load-irc-script-lines): Move to erc-goodies.el. (Bug#67032) --- lisp/erc/erc-goodies.el | 42 +++++++++++++++++++++++++++++ lisp/erc/erc.el | 58 +++++++++++------------------------------ 2 files changed, 57 insertions(+), 43 deletions(-) diff --git a/lisp/erc/erc-goodies.el b/lisp/erc/erc-goodies.el index da14f5bd728..ed45dc92ebc 100644 --- a/lisp/erc/erc-goodies.el +++ b/lisp/erc/erc-goodies.el @@ -625,6 +625,48 @@ erc--command-indicator-display erc--msg-props)))) (erc--refresh-prompt)))) +;;;###autoload +(defun erc-load-irc-script-lines (lines &optional force noexpand) + "Process a list of LINES as prompt input submissions. +If optional NOEXPAND is non-nil, do not expand script-specific +substitution sequences via `erc-process-script-line' and instead +process LINES as literal prompt input. With FORCE, bypass flood +protection." + ;; The various erc-cmd-CMDs were designed to return non-nil when + ;; their command line should be echoed. But at some point, these + ;; handlers began displaying their own output, which naturally + ;; appeared *above* the echoed command. This tries to intercept + ;; these insertions, deferring them until the command has returned + ;; and its command line has been printed. + (cl-assert (eq 'erc-mode major-mode)) + (let ((args (and erc-script-args + (if (string-match "^ " erc-script-args) + (substring erc-script-args 1) + erc-script-args)))) + (with-silent-modifications + (dolist (line lines) + (erc-log (concat "erc-load-script: CMD: " line)) + (unless (string-match (rx bot (* (syntax whitespace)) eot) line) + (unless noexpand + (setq line (erc-process-script-line line args))) + (let ((erc--current-line-input-split (erc--make-input-split line)) + calls insertp) + (add-function :around (local 'erc--send-message-nested-function) + (lambda (&rest args) (push args calls)) + '((name . erc-script-lines-fn) (depth . -80))) + (add-function :around (local 'erc--send-action-function) + (lambda (&rest args) (push args calls)) + '((name . erc-script-lines-fn) (depth . -80))) + (setq insertp + (unwind-protect (erc-process-input-line line force) + (remove-function (local 'erc--send-action-function) + 'erc-script-lines-fn) + (remove-function (local 'erc--send-message-nested-function) + 'erc-script-lines-fn))) + (when (and insertp erc-script-echo) + (erc--command-indicator-display line) + (dolist (call calls) + (apply (car call) (cdr call)))))))))) ;;; IRC control character processing. (defgroup erc-control-characters nil diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 3cc9bd54228..0750463a4e7 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -4004,17 +4004,19 @@ erc-command-name command-name))) (defun erc-process-input-line (line &optional force no-command) - "Translate LINE to an RFC1459 command and send it based. -Returns non-nil if the command is actually sent to the server, and nil -otherwise. - -If the command in the LINE is not bound as a function `erc-cmd-', -it is passed to `erc-cmd-default'. If LINE is not a command (i.e. doesn't -start with /) then it is sent as a message. - -An optional FORCE argument forces sending the line when flood -protection is in effect. The optional NO-COMMAND argument prohibits -this function from interpreting the line as a command." + "Dispatch a slash-command or chat-input handler from user-input LINE. +If simplistic validation fails, print an error and return nil. +Otherwise, defer to an appropriate handler. For \"slash\" commands, +like \"/JOIN\", expect a handler, like `erc-cmd-JOIN', to return non-nil +if LINE is fit for echoing as a command line when executing scripts. +For normal chat input, expect a handler to return non-nil if a message +was successfully processed as an outgoing \"PRIVMSG\". If LINE is a +slash command, and ERC can't find a corresponding handler of the form +`erc-cmd-', pass LINE to `erc-cmd-default', treating it as a +catch-all handler. Otherwise, for normal chat input, pass LINE and the +boolean argument FORCE to `erc-send-input-line-function'. With a +non-nil NO-COMMAND, always treat LINE as normal chat input rather than a +slash command." (let ((command-list (erc-extract-command-from-line line))) (if (and command-list (not no-command)) @@ -8512,7 +8514,8 @@ erc-process-script-line ((string-match "^%[Ss]$" esc) server) ((string-match "^%[Nn]$" esc) nick) ((string-match "^%\\(.\\)$" esc) (match-string 1 esc)) - (t (erc-log (format "BUG in erc-process-script-line: bad escape sequence: %S\n" esc)) + (t (erc-log (format "Bad escape sequence in %s: %S\n" + 'erc-process-script-line esc)) (message "BUG IN ERC: esc=%S" esc) ""))) (setq line tail) @@ -8531,37 +8534,6 @@ erc-load-irc-script (buffer-string)))) (erc-load-irc-script-lines (erc-split-multiline-safe str) force))) -(defun erc-load-irc-script-lines (lines &optional force noexpand) - "Load IRC script LINES (a list of strings). - -If optional NOEXPAND is non-nil, do not expand script-specific -sequences, process the lines verbatim. Use this for multiline -user input." - (let* ((cb (current-buffer)) - (s "") - (sp (or (and (bound-and-true-p erc-command-indicator-mode) - (fboundp 'erc-command-indicator) - (erc-command-indicator)) - (erc-prompt))) - (args (and (boundp 'erc-script-args) erc-script-args))) - (if (and args (string-match "^ " args)) - (setq args (substring args 1))) - ;; prepare the prompt string for echo - (erc-put-text-property 0 (length sp) - 'font-lock-face 'erc-command-indicator-face sp) - (while lines - (setq s (car lines)) - (erc-log (concat "erc-load-script: CMD: " s)) - (unless (string-match "^\\s-*$" s) - (let ((line (if noexpand s (erc-process-script-line s args)))) - (if (and (erc-process-input-line line force) - erc-script-echo) - (progn - (erc-put-text-property 0 (length line) - 'font-lock-face 'erc-input-face line) - (erc-display-line (concat sp line) cb))))) - (setq lines (cdr lines))))) - ;; authentication (defun erc--unfun (maybe-fn) -- 2.44.0 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Mar 28 13:35:00 2024 Received: (at 67032) by debbugs.gnu.org; 28 Mar 2024 17:35:01 +0000 Received: from localhost ([127.0.0.1]:41080 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rpteW-0000fK-Ky for submit@debbugs.gnu.org; Thu, 28 Mar 2024 13:35:00 -0400 Received: from mail-108-mta172.mxroute.com ([136.175.108.172]:41179) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rpteU-0000fC-QZ for 67032@debbugs.gnu.org; Thu, 28 Mar 2024 13:34:59 -0400 Received: from filter006.mxroute.com ([136.175.111.2] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta172.mxroute.com (ZoneMTA) with ESMTPSA id 18e862100580003bea.001 for <67032@debbugs.gnu.org> (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Thu, 28 Mar 2024 17:34:53 +0000 X-Zone-Loop: affd0a205a03a9896becd328d18a15b42effc2881cc4 X-Originating-IP: [136.175.111.2] 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:Date:References:In-Reply-To: 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=2h4fcWW3w16B2ni89jjsYS1zrj8ZTjLHOuD0HRlgM3w=; b=fuFo335ZQxPoS52IjMPitKoRSt FqFCd8UuD3wBFH1bOi3X/9IDLIBwa+qHCZFshPQiVkTK7wFuv6heALUtihgr7/mV+0m6EeX/vJdUb C7YS7uo8RVOnPwMKeS/190d9UMoOakDup9cOREJewXgsxyDm4uF6LsPS/72iNDxByBbpRcUk0sGHJ CQEhGaW4zL6mgeRJrCqSY2d2dAXnga9e0BgQDGQjSPZcF9YAEFdzy59wmsAB/tpftCJMdFlA89lI0 Wp1DKFzMQBo2kwMGyTFLB/Id1OAiZqy79qFzYvtE6p9IKZzcBEj0zOAS71BGiTFyPQV1U6X/THreV mklhaIAA==; From: "J.P." To: 67032@debbugs.gnu.org Subject: Re: bug#67032: 30.0.50; ERC 5.6-git: Treat erc-send-message more responsibly In-Reply-To: <878r2l5zql.fsf@neverwas.me> (J. P.'s message of "Wed, 13 Mar 2024 19:11:30 -0700") References: <87v8aa9wd0.fsf@neverwas.me> <87h6lt850d.fsf@neverwas.me> <87fs19za5d.fsf@neverwas.me> <878r2l5zql.fsf@neverwas.me> Date: Thu, 28 Mar 2024 10:34:50 -0700 Message-ID: <87y1a28dl1.fsf@neverwas.me> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Authenticated-Id: masked@neverwas.me X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 67032 Cc: emacs-erc@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) "J.P." writes: > One aspect this change should've addressed but didn't was using the > revived `command-indicator' facility in `erc-load-irc-script-lines' to > make its output more predictable and consistent with other displayed > messages. While leaving it to rot would of course be safer, I suspect > it's rarely used enough to warrant the risk. An ancillary benefit of > fixing this is that it helps clarify the role of boolean return values > for `erc-process-input-line', `erc-send-input-line-function', > `erc-message', and the various `erc-cmd-FOO' slash-command handlers. > See second patch (lacks tests). This has been installed as a46789b56af * Reuse command-indicator code for script lines in ERC This bug is already closed. From unknown Tue Jun 17 20:19:35 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Fri, 26 Apr 2024 11:25:20 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator