mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Make erc-fill-wrap work with left-sided stamps
* etc/ERC-NEWS: Remove all mention of option `erc-timestamp-align-to' supporting a value of `margin', which has been abandoned. Do mention leading white space before stamps now having stamp-related properties. * lisp/erc/erc-backend.el (erc--reveal-prompt, erc--conceal-prompt): New generic functions with default implementations factored out from `erc--unhide-prompt' and `erc--hide-prompt'. (erc--prompt-hidden-p): New internal predicate function. (erc--unhide-prompt): Defer to `erc--reveal-prompt', and set `erc-prompt' text property to t. (erc--hide-prompt): Defer to `erc--conceal-prompt', and set `erc-prompt' text property to `hidden'. * lisp/erc/erc-compat.el (erc-compat--29-browse-url-irc): Don't use `function-equal'. * lisp/erc/erc-fill.el (erc-fill-wrap-margin-width, erc-fill-wrap-margin-side): New options to control side and initial width of `fill-wrap' margin. (erc-fill--wrap-beginning-of-line): Fix bug involving non-string valued `display' props. (erc-fill-wrap-toggle-truncate-lines): New command to re-enable `visual-line-mode' when toggling off `truncate-lines'. (erc-fill-wrap-mode-map): Remap `toggle-truncate-lines' to `erc-fill-wrap-toggle-truncate-lines'. (erc-fill-wrap-mode, erc-fill-wrap-enable, erc-fill-wrap-disable): Update doc string, persist a few local vars, and conditionally set `erc-stamp--margin-left-p'. When deactivating, disable `visual-line-mode' first. (erc-fill--wrap-continued-message-p): Use `erc-speaker' instead of heuristics when comparing nicks between consecutive messages. (erc-fill-wrap-nudge): Update doc string and account for left-sided stamps. (erc-timestamp-offset): Add comment regarding conditional guard based on function-valued option. * lisp/erc/erc-stamp.el (erc-timestamp-use-align-to): Remove value variant `margin', which was originally intended to be new in ERC 5.6. This functionality was all but useless without the internal minor mode `erc-stamp--display-margin-mode' active. (erc-stamp-right-margin-width): Remove unused option new in 5.6. (erc-stamp--display-margin-force): Remove unused function. (erc-stamp--margin-width, erc-stamp--margin-left-p): New internal variables. (erc-stamp--init-margins-on-connect): New function for initializing mode-managed margin after connecting. (erc-stamp--adjust-right-margin, erc-stamp--adjust-margin): Rename function to latter and accommodate left-hand stamps. (erc-stamp--inherited-props): Move definition higher up in same file. (erc-stamp--display-margin-mode): Update function name, and adjust setup and teardown to accommodate left-handed stamps. Don't add advice around `erc-insert-timestamp-function'. (erc-stamp--last-prompt, erc-stamp--display-prompt-in-left-margin): New function and helper var to convert a normal inserted prompt so that it appears in the left margin. (erc-stamp--refresh-left-margin-prompt): Helper for other modules to quickly refresh prompt outside of insert hooks. (erc--reveal-prompt, erc--conceal-prompt): New implementations for when `erc-stamp--display-margin-mode' is active. (erc-insert-timestamp-left): Convert to generic function and provide implementation for `erc-stamp--display-margin-mode'. (erc-stamp--omit-properties-on-folded-lines): New variable, an escape hatch for propertizing white space before right-side stamps folded over onto another line. (erc-insert-timestamp-right): Don't expect `erc-timestamp-align-to' to ever be the symbol `margin'. Move handling for that case to one contingent on the internal minor mode `erc-stamp--display-margin-mode' being active. Add text properties preceding stamps that occupy a line by their lonesome. See related news entry for rationale. This is arguably a breaking change. * lisp/erc/erc.el (erc--refresh-prompt-hook): New hook variable for modules to adjust prompt properties whenever it's refreshed. (erc--refresh-prompt): Fix bug in which user-defined prompt functions failed to hide when quitting in server buffers. Run new hook `erc--refresh-prompt-hook'. (erc-display-prompt): Add comment noting that the text property `erc-prompt' now actually matters: it's t while a session is running and `hidden' when disconnected. * test/lisp/erc/erc-fill-tests.el (erc-fill--left-hand-stamps): New test. * test/lisp/erc/erc-stamp-tests.el (erc-stamp-tests--use-align-to--nil, erc-stamp-tests--use-align-to--t): New functions forged from old test bodies to allow optionally asserting pre-5.6 behavior regarding leading white space on right-hand stamps that exist on their own line. (erc-timestamp-use-align-to--nil, erc-timestamp-use-align-to--t): Parameterize with compatibility flag. (erc-timestamp-use-align-to--margin, erc-stamp--display-margin-mode--right): Rename test to latter. * test/lisp/erc/erc-tests.el (erc-hide-prompt): Add some assertions for new possible value of `erc-prompt' text property. * test/lisp/erc/resources/fill/snapshots/stamps-left-01.eld: New test data file. (Bug#60936)
This commit is contained in:
parent
d09464e504
commit
63d8b2a59a
10 changed files with 352 additions and 116 deletions
|
|
@ -340,4 +340,41 @@
|
|||
(should (search-backward "ERC> " nil t))
|
||||
(execute-kbd-macro "\C-a")))))
|
||||
|
||||
(ert-deftest erc-fill--left-hand-stamps ()
|
||||
:tags '(:unstable)
|
||||
(unless (>= emacs-major-version 29)
|
||||
(ert-skip "Emacs version too low, missing `buffer-text-pixel-size'"))
|
||||
|
||||
(let ((erc-timestamp-only-if-changed-flag nil)
|
||||
(erc-insert-timestamp-function #'erc-insert-timestamp-left))
|
||||
(erc-fill-tests--wrap-populate
|
||||
(lambda ()
|
||||
(should (= 8 left-margin-width))
|
||||
(pcase-let ((`((margin left-margin) ,displayed)
|
||||
(get-text-property erc-insert-marker 'display)))
|
||||
(should (equal-including-properties
|
||||
displayed #(" ERC>" 4 8
|
||||
( read-only t
|
||||
front-sticky t
|
||||
field erc-prompt
|
||||
erc-prompt t
|
||||
rear-nonsticky t
|
||||
font-lock-face erc-prompt-face)))))
|
||||
(erc-fill-tests--compare "stamps-left-01")
|
||||
|
||||
(ert-info ("Shrink left margin by 1 col")
|
||||
(erc-stamp--adjust-margin -1)
|
||||
(with-silent-modifications (erc--refresh-prompt))
|
||||
(should (= 7 left-margin-width))
|
||||
(pcase-let ((`((margin left-margin) ,displayed)
|
||||
(get-text-property erc-insert-marker 'display)))
|
||||
(should (equal-including-properties
|
||||
displayed #(" ERC>" 3 7
|
||||
( read-only t
|
||||
front-sticky t
|
||||
field erc-prompt
|
||||
erc-prompt t
|
||||
rear-nonsticky t
|
||||
font-lock-face erc-prompt-face))))))))))
|
||||
|
||||
;;; erc-fill-tests.el ends here
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
(advice-remove 'erc-format-timestamp
|
||||
'ert-deftest--erc-timestamp-use-align-to)))
|
||||
|
||||
(ert-deftest erc-timestamp-use-align-to--nil ()
|
||||
(defun erc-stamp-tests--use-align-to--nil (compat)
|
||||
(erc-stamp-tests--insert-right
|
||||
(lambda ()
|
||||
|
||||
|
|
@ -83,12 +83,20 @@
|
|||
(erc-display-message nil 'notice (current-buffer)
|
||||
"twenty characters"))
|
||||
(should (search-forward-regexp (rx bol (+ "\t") (* " ") "[") nil t))
|
||||
;; Field excludes leading whitespace (arguably undesirable).
|
||||
(should (eql ?\[ (char-after (field-beginning (point)))))
|
||||
;; Field includes leading whitespace.
|
||||
(should (eql (if compat ?\[ ?\n)
|
||||
(char-after (field-beginning (point)))))
|
||||
;; Timestamp extends to the end of the line.
|
||||
(should (eql ?\n (char-after (field-end (point)))))))))
|
||||
|
||||
(ert-deftest erc-timestamp-use-align-to--t ()
|
||||
(ert-deftest erc-timestamp-use-align-to--nil ()
|
||||
(ert-info ("Field starts on stamp text (compat)")
|
||||
(let ((erc-stamp--omit-properties-on-folded-lines t))
|
||||
(erc-stamp-tests--use-align-to--nil 'compat)))
|
||||
(ert-info ("Field includes leaidng white space")
|
||||
(erc-stamp-tests--use-align-to--nil nil)))
|
||||
|
||||
(defun erc-stamp-tests--use-align-to--t (compat)
|
||||
(erc-stamp-tests--insert-right
|
||||
(lambda ()
|
||||
|
||||
|
|
@ -110,10 +118,17 @@
|
|||
(erc-display-message nil nil (current-buffer) msg)))
|
||||
;; Indented to pos (this is arguably a bug).
|
||||
(should (search-forward-regexp (rx bol (+ "\t") (* " ") "[") nil t))
|
||||
;; Field starts *after* leading space (arguably bad).
|
||||
(should (eql ?\[ (char-after (field-beginning (point)))))
|
||||
;; Field includes leading space.
|
||||
(should (eql (if compat ?\[ ?\n) (char-after (field-beginning (point)))))
|
||||
(should (eql ?\n (char-after (field-end (point)))))))))
|
||||
|
||||
(ert-deftest erc-timestamp-use-align-to--t ()
|
||||
(ert-info ("Field starts on stamp text (compat)")
|
||||
(let ((erc-stamp--omit-properties-on-folded-lines t))
|
||||
(erc-stamp-tests--use-align-to--t 'compat)))
|
||||
(ert-info ("Field includes leaidng white space")
|
||||
(erc-stamp-tests--use-align-to--t nil)))
|
||||
|
||||
(ert-deftest erc-timestamp-use-align-to--integer ()
|
||||
(erc-stamp-tests--insert-right
|
||||
(lambda ()
|
||||
|
|
@ -140,7 +155,7 @@
|
|||
(should (eql ?\s (char-after (field-beginning (point)))))
|
||||
(should (eql ?\n (char-after (field-end (point)))))))))
|
||||
|
||||
(ert-deftest erc-timestamp-use-align-to--margin ()
|
||||
(ert-deftest erc-stamp--display-margin-mode--right ()
|
||||
(erc-stamp-tests--insert-right
|
||||
(lambda ()
|
||||
(erc-stamp--display-margin-mode +1)
|
||||
|
|
|
|||
|
|
@ -219,6 +219,7 @@
|
|||
(setq erc-hide-prompt '(server))
|
||||
(with-current-buffer "ServNet"
|
||||
(erc--hide-prompt erc-server-process)
|
||||
(should (eq (get-text-property erc-insert-marker 'erc-prompt) 'hidden))
|
||||
(should (string= ">" (get-text-property erc-insert-marker 'display))))
|
||||
|
||||
(with-current-buffer "#chan"
|
||||
|
|
@ -229,6 +230,7 @@
|
|||
|
||||
(with-current-buffer "ServNet"
|
||||
(erc--unhide-prompt)
|
||||
(should (eq (get-text-property erc-insert-marker 'erc-prompt) t))
|
||||
(should-not (get-text-property erc-insert-marker 'display))))
|
||||
|
||||
(ert-info ("Value: channel")
|
||||
|
|
@ -242,7 +244,9 @@
|
|||
|
||||
(with-current-buffer "#chan"
|
||||
(should (string= ">" (get-text-property erc-insert-marker 'display)))
|
||||
(should (eq (get-text-property erc-insert-marker 'erc-prompt) 'hidden))
|
||||
(erc--unhide-prompt)
|
||||
(should (eq (get-text-property erc-insert-marker 'erc-prompt) t))
|
||||
(should-not (get-text-property erc-insert-marker 'display))))
|
||||
|
||||
(ert-info ("Value: query")
|
||||
|
|
@ -253,7 +257,9 @@
|
|||
|
||||
(with-current-buffer "bob"
|
||||
(should (string= ">" (get-text-property erc-insert-marker 'display)))
|
||||
(should (eq (get-text-property erc-insert-marker 'erc-prompt) 'hidden))
|
||||
(erc--unhide-prompt)
|
||||
(should (eq (get-text-property erc-insert-marker 'erc-prompt) t))
|
||||
(should-not (get-text-property erc-insert-marker 'display)))
|
||||
|
||||
(with-current-buffer "#chan"
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
#("\n\n[00:00]*** This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.\n[00:00]<alice> bob: come, you are a tedious fool: to the purpose. What was done to Elbow's wife, that he hath cause to complain of? Come me to what was done to her.\n[00:00]<bob> alice: Either your unparagoned mistress is dead, or she's outprized by a trifle.\n" 2 9 (erc-timestamp 0 display (#4=(margin left-margin) #("[00:00]" 0 7 (invisible timestamp font-lock-face erc-timestamp-face))) field erc-timestamp wrap-prefix #1=(space :width 27) line-prefix #2=(space :width (- 27 (4)))) 9 171 (erc-timestamp 0 wrap-prefix #1# line-prefix #2#) 172 179 (erc-timestamp 0 display (#4# #("[00:00]" 0 7 (invisible timestamp font-lock-face erc-timestamp-face))) field erc-timestamp wrap-prefix #1# line-prefix #3=(space :width (- 27 (8)))) 179 180 (erc-timestamp 0 wrap-prefix #1# line-prefix #3# erc-command PRIVMSG) 180 185 (erc-timestamp 0 wrap-prefix #1# line-prefix #3# erc-command PRIVMSG) 185 187 (erc-timestamp 0 wrap-prefix #1# line-prefix #3# erc-command PRIVMSG) 187 190 (erc-timestamp 0 wrap-prefix #1# line-prefix #3# erc-command PRIVMSG) 190 303 (erc-timestamp 0 wrap-prefix #1# line-prefix #3# erc-command PRIVMSG) 303 304 (erc-timestamp 0 erc-command PRIVMSG) 304 336 (erc-timestamp 0 wrap-prefix #1# line-prefix #3# erc-command PRIVMSG) 337 344 (erc-timestamp 0 display (#4# #("[00:00]" 0 7 (invisible timestamp font-lock-face erc-timestamp-face))) field erc-timestamp wrap-prefix #1# line-prefix #5=(space :width (- 27 (6)))) 344 345 (erc-timestamp 0 wrap-prefix #1# line-prefix #5# erc-command PRIVMSG) 345 348 (erc-timestamp 0 wrap-prefix #1# line-prefix #5# erc-command PRIVMSG) 348 350 (erc-timestamp 0 wrap-prefix #1# line-prefix #5# erc-command PRIVMSG) 350 355 (erc-timestamp 0 wrap-prefix #1# line-prefix #5# erc-command PRIVMSG) 355 430 (erc-timestamp 0 wrap-prefix #1# line-prefix #5# erc-command PRIVMSG))
|
||||
Loading…
Add table
Add a link
Reference in a new issue