[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 4f93c52f7fd 4/5: Recompute erc-prompt when inserting messages
From: |
F. Jason Park |
Subject: |
master 4f93c52f7fd 4/5: Recompute erc-prompt when inserting messages |
Date: |
Tue, 30 May 2023 00:48:34 -0400 (EDT) |
branch: master
commit 4f93c52f7fd1b7c5f75a0d049e5a1015a268265a
Author: F. Jason Park <jp@neverwas.me>
Commit: F. Jason Park <jp@neverwas.me>
Recompute erc-prompt when inserting messages
* lisp/erc/erc.el (erc--refresh-prompt): New function for redrawing
the prompt in a couple select places.
(erc-display-line-1, erc-display-msg): Replace the prompt after
inserting messages.
* test/lisp/erc/erc-tests.el (erc--refresh-prompt): New
test. (Bug#60936)
---
lisp/erc/erc.el | 16 +++++++-
test/lisp/erc/erc-tests.el | 99 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 113 insertions(+), 2 deletions(-)
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index a84e38e70e5..9c1125a9351 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -2805,6 +2805,18 @@ this option to nil."
(cl-assert (< erc-insert-marker erc-input-marker))
(cl-assert (= (field-end erc-insert-marker) erc-input-marker)))))
+(defun erc--refresh-prompt ()
+ "Re-render ERC's prompt when the option `erc-prompt' is a function."
+ (erc--assert-input-bounds)
+ (when (functionp erc-prompt)
+ (save-excursion
+ (goto-char erc-insert-marker)
+ ;; Avoid `erc-prompt' (the named function), which appends a
+ ;; space, and `erc-display-prompt', which propertizes all but
+ ;; that space.
+ (insert-and-inherit (funcall erc-prompt))
+ (delete-region (point) (1- erc-input-marker)))))
+
(defun erc-display-line-1 (string buffer)
"Display STRING in `erc-mode' BUFFER.
Auxiliary function used in `erc-display-line'. The line gets filtered to
@@ -2848,7 +2860,7 @@ If STRING is nil, the function does nothing."
(when erc-remove-parsed-property
(remove-text-properties (point-min) (point-max)
'(erc-parsed nil))))
- (erc--assert-input-bounds)))))
+ (erc--refresh-prompt)))))
(run-hooks 'erc-insert-done-hook)
(erc-update-undo-list (- (or (marker-position erc-insert-marker)
(point-max))
@@ -6470,7 +6482,7 @@ Return non-nil only if we actually send anything."
(narrow-to-region insert-position (point))
(run-hooks 'erc-send-modify-hook)
(run-hooks 'erc-send-post-hook))
- (erc--assert-input-bounds)))))
+ (erc--refresh-prompt)))))
(defun erc-command-symbol (command)
"Return the ERC command symbol for COMMAND if it exists and is bound."
diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el
index b624186d88d..1c75f35e1b5 100644
--- a/test/lisp/erc/erc-tests.el
+++ b/test/lisp/erc/erc-tests.el
@@ -269,6 +269,105 @@
(kill-buffer "bob")
(kill-buffer "ServNet"))))
+(ert-deftest erc--refresh-prompt ()
+ (let* ((counter 0)
+ (erc-prompt (lambda ()
+ (format "%s %d>"
+ (erc-format-target-and/or-network)
+ (cl-incf counter))))
+ erc-accidental-paste-threshold-seconds
+ erc-insert-modify-hook
+ erc--input-review-functions
+ erc-send-completed-hook)
+
+ (ert-info ("Server buffer")
+ (with-current-buffer (get-buffer-create "ServNet")
+ (erc-tests--send-prep)
+ (goto-char erc-insert-marker)
+ (should (looking-at-p "ServNet 3>"))
+ (erc-tests--set-fake-server-process "sleep" "1")
+ (set-process-sentinel erc-server-process #'ignore)
+ (setq erc-network 'ServNet
+ erc-server-current-nick "tester"
+ erc-networks--id (erc-networks--id-create nil)
+ erc-server-users (make-hash-table :test 'equal))
+ (set-process-query-on-exit-flag erc-server-process nil)
+ ;; Incoming message redraws prompt
+ (erc-display-message nil 'notice nil "Welcome")
+ (should (looking-at-p "ServNet 4>"))
+ ;; Say something
+ (save-excursion (goto-char erc-input-marker)
+ (insert "Howdy")
+ (erc-send-current-line)
+ (forward-line -1)
+ (should (looking-at "No target"))
+ (forward-line -1)
+ (should (looking-at "<tester> Howdy")))
+ (should (looking-at-p "ServNet 6>"))
+ ;; Space after prompt is unpropertized
+ (should (get-text-property (1- erc-input-marker) 'erc-prompt))
+ (should-not (get-text-property erc-input-marker 'erc-prompt))
+ ;; No sign of old prompts
+ (save-excursion
+ (goto-char (point-min))
+ (should-not (search-forward (rx (any "3-5") ">") nil t)))))
+
+ (ert-info ("Channel buffer")
+ (with-current-buffer (get-buffer-create "#chan")
+ (erc-tests--send-prep)
+ (goto-char erc-insert-marker)
+ (should (looking-at-p "#chan 9>"))
+ (setq erc-server-process (buffer-local-value 'erc-server-process
+ (get-buffer "ServNet"))
+ erc-networks--id (erc-with-server-buffer erc-networks--id)
+ erc--target (erc--target-from-string "#chan")
+ erc-default-recipients (list "#chan")
+ erc-channel-users (make-hash-table :test 'equal))
+ (erc-update-current-channel-member "alice" "alice")
+ (erc-update-current-channel-member "bob" "bob")
+ (erc-update-current-channel-member "tester" "tester")
+ (erc-display-message nil nil (current-buffer)
+ (erc-format-privmessage "alice" "Hi" nil t))
+ (should (looking-at-p "#chan@ServNet 10>"))
+ (save-excursion (goto-char erc-input-marker)
+ (insert "Howdy")
+ (erc-send-current-line)
+ (forward-line -1)
+ (should (looking-at "<tester> Howdy")))
+ (should (looking-at-p "#chan@ServNet 11>"))
+ (save-excursion (goto-char erc-input-marker)
+ (insert "/query bob")
+ (erc-send-current-line))
+ ;; Query does not redraw (nor /help, only message input)
+ (should (looking-at-p "#chan@ServNet 11>"))
+ ;; No sign of old prompts
+ (save-excursion
+ (goto-char (point-min))
+ (should-not (search-forward (rx (or "9" "10") ">") nil t)))))
+
+ (ert-info ("Query buffer")
+ (with-current-buffer (get-buffer "bob")
+ (goto-char erc-insert-marker)
+ (should (looking-at-p "bob@ServNet 14>"))
+ (erc-display-message nil nil (current-buffer)
+ (erc-format-privmessage "bob" "Hi" nil t))
+ (should (looking-at-p "bob@ServNet 15>"))
+ (save-excursion (goto-char erc-input-marker)
+ (insert "Howdy")
+ (erc-send-current-line)
+ (forward-line -1)
+ (should (looking-at "<tester> Howdy")))
+ (should (looking-at-p "bob@ServNet 16>"))
+ ;; No sign of old prompts
+ (save-excursion
+ (goto-char (point-min))
+ (should-not (search-forward (rx (or "14" "15") ">") nil t)))))
+
+ (when noninteractive
+ (kill-buffer "#chan")
+ (kill-buffer "bob")
+ (kill-buffer "ServNet"))))
+
(ert-deftest erc--initialize-markers ()
(let ((proc (start-process "true" (current-buffer) "true"))
erc-modules