branch: externals/auctex-label-numbers
commit f8e1dc2ab1f27703b59ba473e4647fc7c2d9d33e
Author: Paul Nelson <[email protected]>
Commit: Paul Nelson <[email protected]>
Preserve folding spec signatures
* auctex-label-numbers.el (auctex-label-numbers--fold-spec-display)
(auctex-label-numbers--fold-spec-with-display): New functions.
(auctex-label-numbers-mode): Preserve the signature of each replaced
AUCTeX folding spec.
* tests/auctex-label-numbers-tests.el: Require the library.
(test-auctex-label-numbers-fold-spec-signatures): New test.
---
auctex-label-numbers.el | 44 +++++++++++++++++++++++++++++--------
tests/auctex-label-numbers-tests.el | 35 +++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/auctex-label-numbers.el b/auctex-label-numbers.el
index 1462cfcda46..9d8500c5e15 100644
--- a/auctex-label-numbers.el
+++ b/auctex-label-numbers.el
@@ -195,6 +195,18 @@ label number cannot be retrieved."
(defvar auctex-label-numbers--saved-spec-list nil
"Saved values from `TeX-fold-macro-spec-list'.")
+(defun auctex-label-numbers--fold-spec-display (spec)
+ "Return the display component of folding SPEC.
+SPEC may be an unsigned display such as `TeX-fold-cite-display', or a
+signed display such as (\"[l]\" . TeX-fold-stop-after-first-mandatory)."
+ (if (consp spec) (car spec) spec))
+
+(defun auctex-label-numbers--fold-spec-with-display (spec display)
+ "Return folding SPEC with its display component replaced by DISPLAY.
+For example, replacing `TeX-fold-cite-display' returns DISPLAY, while
+replacing (\"[r]\" . 1) returns (DISPLAY . 1), preserving the signature."
+ (if (consp spec) (cons display (cdr spec)) display))
+
(defcustom auctex-label-numbers-macro-list '("ref" "eqref" "label")
"List of macros to fold with theorem or equation numbers.
Each element describes a LaTeX macro that takes a label as its argument.
@@ -238,14 +250,25 @@ Call ORIG-FUN with ARGS, and add the label number to the
annotation."
(advice-add 'reftex-goto-label :around
#'auctex-label-numbers--reftex-goto-label-advice)
(require 'tex-fold)
(dolist (macro auctex-label-numbers-macro-list)
- (let ((func (intern (format "auctex-label-numbers-%s-display" macro))))
- (dolist (spec TeX-fold-macro-spec-list)
- (when (and (member macro (cadr spec))
- (not (eq (car spec) func)))
- (push (cons macro (car spec))
auctex-label-numbers--saved-spec-list)
- (setcdr spec (list
- (seq-remove (lambda (x) (equal x macro)) (cadr
spec))))))
- (add-to-list 'TeX-fold-macro-spec-list (list func (list macro)))))
+ (let* ((func (intern (format "auctex-label-numbers-%s-display" macro)))
+ (entry
+ (seq-find
+ (lambda (entry)
+ (and (member macro (cadr entry))
+ (not (eq (auctex-label-numbers--fold-spec-display
+ (car entry))
+ func))))
+ TeX-fold-macro-spec-list))
+ (old-spec (and entry (car entry)))
+ (replacement-spec
+ (and old-spec
+ (auctex-label-numbers--fold-spec-with-display
+ old-spec func))))
+ (when entry
+ (push (cons macro old-spec) auctex-label-numbers--saved-spec-list)
+ (setcdr entry (list (remove macro (cadr entry)))))
+ (add-to-list 'TeX-fold-macro-spec-list
+ (list (or replacement-spec func) (list macro)))))
(when TeX-fold-mode
(TeX-fold-mode 1)))
(t
@@ -257,7 +280,10 @@ Call ORIG-FUN with ARGS, and add the label number to the
annotation."
(dolist (macro auctex-label-numbers-macro-list)
(let ((func (intern (format "auctex-label-numbers-%s-display" macro))))
(setq TeX-fold-macro-spec-list
- (seq-remove (lambda (elem) (eq (car elem) func))
+ (seq-remove (lambda (elem)
+ (eq (auctex-label-numbers--fold-spec-display
+ (car elem))
+ func))
TeX-fold-macro-spec-list)))
(when-let ((saved (assoc macro auctex-label-numbers--saved-spec-list)))
(dolist (spec TeX-fold-macro-spec-list)
diff --git a/tests/auctex-label-numbers-tests.el
b/tests/auctex-label-numbers-tests.el
index b71f910e4e0..c1e1a8e45f7 100644
--- a/tests/auctex-label-numbers-tests.el
+++ b/tests/auctex-label-numbers-tests.el
@@ -25,6 +25,7 @@
;;; Code:
(require 'ert)
+(require 'auctex-label-numbers)
(ert-deftest
test-auctex-label-numbers--external-document-regexp ()
@@ -68,5 +69,39 @@
(should-not (string-match auctex-label-numbers--external-document-regexp
"\\externaldocument[prefix]nobraces")))
+(ert-deftest test-auctex-label-numbers-fold-spec-signatures ()
+ "Preserve AUCTeX signatures while replacing folding displays."
+ (let ((auctex-label-numbers-macro-list '("ref" "eqref" "label"))
+ (auctex-label-numbers--saved-spec-list nil)
+ (TeX-fold-macro-spec-list
+ '((("[l]" . TeX-fold-stop-after-first-mandatory) ("label"))
+ (("[r]" . 1) ("ref" "eqref"))))
+ (preview-preprocess-functions nil)
+ (TeX-fold-mode nil))
+ (unwind-protect
+ (progn
+ (auctex-label-numbers-mode 1)
+ (should
+ (member '((auctex-label-numbers-ref-display . 1) ("ref"))
+ TeX-fold-macro-spec-list))
+ (should
+ (member '((auctex-label-numbers-eqref-display . 1) ("eqref"))
+ TeX-fold-macro-spec-list))
+ (should
+ (member
+ '((auctex-label-numbers-label-display
+ . TeX-fold-stop-after-first-mandatory)
+ ("label"))
+ TeX-fold-macro-spec-list)))
+ (auctex-label-numbers-mode -1))
+ (should-not
+ (seq-some
+ (lambda (spec)
+ (memq (if (consp (car spec)) (caar spec) (car spec))
+ '(auctex-label-numbers-ref-display
+ auctex-label-numbers-eqref-display
+ auctex-label-numbers-label-display)))
+ TeX-fold-macro-spec-list))))
+
(provide 'auctex-label-numbers-tests)
;;; auctex-label-numbers-tests.el ends here