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

Reply via email to