>From 0086b2cfc73cae92c2aa505ba166e02e67739942 Mon Sep 17 00:00:00 2001 From: Alcor Date: Fri, 22 Nov 2024 17:46:12 +0000 Subject: [PATCH] Support buffer-local `erc-hide-list', `erc-channel-hide-list' & Co. * lisp/erc/erc.el (erc-buffer-expand): New function. (erc-hide-current-message-in-buffer-p): New function. (erc-display-message): Insert into non-hidden buffers. (erc--route-insertion): Refactor to use erc-buffer-expand. --- lisp/erc/erc.el | 61 ++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 7028d0a..ea384d2 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3550,26 +3550,14 @@ modification hooks)." "Check if NICK is a valid IRC nickname." (string-match (concat "\\`" erc-valid-nick-regexp "\\'") nick)) -(defun erc--route-insertion (string buffer) +(defun erc--route-insertion (string buffer &optional setprops) "Insert STRING in BUFFER. See `erc-display-message' for acceptable BUFFER types." (let (seen msg-props) - (dolist (buf (cond - ((bufferp buffer) (list buffer)) - ((consp buffer) - (setq msg-props erc--msg-props) - buffer) - ((processp buffer) (list (process-buffer buffer))) - ((eq 'all buffer) - ;; Hmm, or all of the same session server? - (erc-buffer-list nil erc-server-process)) - ((and-let* (((eq 'active buffer)) - (b (erc-active-buffer))) - (list b))) - ((erc-server-buffer-live-p) - (list (process-buffer erc-server-process))) - (t (list (current-buffer))))) - (when (buffer-live-p buf) + (when setprops + (setq msg-props erc--msg-props)) + (dolist (buf buffer) + (when (and (buffer-live-p buf)) (when msg-props (setq erc--msg-props (copy-hash-table msg-props))) (erc-insert-line string buf) @@ -4007,6 +3995,21 @@ returns non-nil." (member command current-hide-list) (and (member command erc-lurker-hide-list) (erc-lurker-p sender))))) +(defun erc-buffer-expand (buffer) + "Normalize an Erc buffer specification BUFFER into a list of buffer objects." + (cond + ((bufferp buffer) (list buffer)) + ((consp buffer) buffer) + ((processp buffer) (list (process-buffer buffer))) + ((eq 'all buffer) (erc-buffer-list nil erc-server-process)) + ((and-let* (((eq 'active buffer)) (b (erc-active-buffer))) (list b))) + ((erc-server-buffer-live-p) (list (process-buffer erc-server-process))) + (t (list (current-buffer))))) + +(defun erc-hide-current-message-in-buffer-p (parsed buffer) + "Call ERC-HIDE-CURRENT-MESSAGE-P in BUFFER scope." + (with-current-buffer buffer (erc-hide-current-message-p parsed))) + (defun erc-display-message (parsed type buffer msg &rest args) "Display MSG in BUFFER. @@ -4086,13 +4089,23 @@ various default response handlers may appear to presume nil." (erc-display-message-highlight type string)))) (if (not (erc-response-p parsed)) - (erc--route-insertion string buffer) - (unless (erc-hide-current-message-p parsed) - (erc-put-text-property 0 (length string) 'erc-parsed parsed string) - (when (erc-response.tags parsed) - (erc-put-text-property 0 (length string) 'tags (erc-response.tags parsed) - string)) - (erc--route-insertion string buffer))))) + (erc--route-insertion string (erc-buffer-expand buffer) (consp buffer)) + (let* ((expanded-buffers (erc-buffer-expand buffer)) + (visible-buffers + (seq-remove + (lambda (buffer) + (erc-hide-current-message-in-buffer-p parsed buffer)) + expanded-buffers))) + (when visible-buffers + (mapc (lambda (buffer) + (with-current-buffer buffer + (erc-put-text-property + 0 (length string) 'erc-parsed parsed string))) + visible-buffers) + (when (erc-response.tags parsed) + (erc-put-text-property + 0 (length string) 'tags (erc-response.tags parsed) string)) + (erc--route-insertion string visible-buffers (consp buffer))))))) (defun erc-message-type-member (position list) "Return non-nil if the erc-parsed text-property at POSITION is in LIST. -- 2.43.0