GNU bug report logs - #78798
bibtex-font-lock-url-regexp should re-eval after setting bibtex-generate-url-list

Previous Next

Package: emacs;

Reported by: MAN ONE <pRoMMMModE <at> outlook.com>

Date: Sun, 15 Jun 2025 12:09:02 UTC

Severity: normal

To reply to this bug, email your comments to 78798 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#78798; Package emacs. (Sun, 15 Jun 2025 12:09:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to MAN ONE <pRoMMMModE <at> outlook.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sun, 15 Jun 2025 12:09:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: MAN ONE <pRoMMMModE <at> outlook.com>
To: "bug-gnu-emacs <at> gnu.org" <bug-gnu-emacs <at> gnu.org>
Subject: bibtex-font-lock-url-regexp should re-eval after setting
 bibtex-generate-url-list 
Date: Sun, 15 Jun 2025 12:02:25 +0000
Currently `bibtex-font-lock-url-regexp` only eval once when loading bibtex.el, this means setting `bibtex-generate-url-list` to a new value after loading bibtex.el has no effect.



Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#78798; Package emacs. (Wed, 02 Jul 2025 02:50:03 GMT) Full text and rfc822 format available.

Message #8 received at 78798 <at> debbugs.gnu.org (full text, mbox):

From: MAN ONE <pRoMMMModE <at> outlook.com>
To: "78798 <at> debbugs.gnu.org" <78798 <at> debbugs.gnu.org>
Date: Wed, 2 Jul 2025 02:48:57 +0000
Hi, I made a small patch to resolve the bug, in my own testing it works so I would like to submit it.

-------------------------------------------------------------------------
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 2bef0573bed..5ed5e625b7e 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -1495,7 +1495,16 @@ bibtex-generate-url-list
                                (choice (string :tag "Replacement")
                               (integer :tag "Sub-match")
                                        (function :tag "Filter")))))))
-  :risky t)
+  :risky t
+  :set (lambda (symbol value)
+         (set-default symbol value)
+         (let ((fields (delete-dups (mapcar #'caar bibtex-generate-url-list))))
+           (set-default-toplevel-value
+            'bibtex-font-lock-url-regexp
+            ;; Assume that field names begin at the beginning of a line.
+            (concat "^[ \t]*"
+                    (regexp-opt fields 'paren)
+                    "[ \t\n]*=[ \t\n]*")))))
 
 (defcustom bibtex-cite-matcher-alist
   '(("\\\\cite[ \t\n]*{\\([^}]+\\)}" . 1))
@@ -1838,11 +1847,7 @@ bibtex-font-lock-keywords
               bibtex-cite-matcher-alist))
   "Default expressions to highlight in BibTeX mode.")
 
-(defvar bibtex-font-lock-url-regexp
-  ;; Assume that field names begin at the beginning of a line.
-  (concat "^[ \t]*"
-          (regexp-opt (delete-dups (mapcar #'caar bibtex-generate-url-list)) t)
-          "[ \t\n]*=[ \t\n]*")
+(defvar bibtex-font-lock-url-regexp nil
   "Regexp for `bibtex-font-lock-url' derived from `bibtex-generate-url-list'.")
 
 (defvar bibtex-string-empty-key nil
------------------------------------------------------------------------------

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#78798; Package emacs. (Wed, 02 Jul 2025 11:46:02 GMT) Full text and rfc822 format available.

Message #11 received at 78798 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: MAN ONE <pRoMMMModE <at> outlook.com>, Roland Winkler <winkler <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 78798 <at> debbugs.gnu.org
Subject: Re: bug#78798: bibtex-font-lock-url-regexp should re-eval after
 setting bibtex-generate-url-list
Date: Wed, 02 Jul 2025 14:45:11 +0300
> From: MAN ONE <pRoMMMModE <at> outlook.com>
> Date: Wed, 2 Jul 2025 02:48:57 +0000
> msip_labels: 
> 
> Hi, I made a small patch to resolve the bug, in my own testing it works so I would like to submit it.
> 
> -------------------------------------------------------------------------
> diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
> index 2bef0573bed..5ed5e625b7e 100644
> --- a/lisp/textmodes/bibtex.el
> +++ b/lisp/textmodes/bibtex.el
> @@ -1495,7 +1495,16 @@ bibtex-generate-url-list
>                                 (choice (string :tag "Replacement")
>                                (integer :tag "Sub-match")
>                                         (function :tag "Filter")))))))
> -  :risky t)
> +  :risky t
> +  :set (lambda (symbol value)
> +         (set-default symbol value)
> +         (let ((fields (delete-dups (mapcar #'caar bibtex-generate-url-list))))
> +           (set-default-toplevel-value
> +            'bibtex-font-lock-url-regexp
> +            ;; Assume that field names begin at the beginning of a line.
> +            (concat "^[ \t]*"
> +                    (regexp-opt fields 'paren)
> +                    "[ \t\n]*=[ \t\n]*")))))
>  
>  (defcustom bibtex-cite-matcher-alist
>    '(("\\\\cite[ \t\n]*{\\([^}]+\\)}" . 1))
> @@ -1838,11 +1847,7 @@ bibtex-font-lock-keywords
>                bibtex-cite-matcher-alist))
>    "Default expressions to highlight in BibTeX mode.")
>  
> -(defvar bibtex-font-lock-url-regexp
> -  ;; Assume that field names begin at the beginning of a line.
> -  (concat "^[ \t]*"
> -          (regexp-opt (delete-dups (mapcar #'caar bibtex-generate-url-list)) t)
> -          "[ \t\n]*=[ \t\n]*")
> +(defvar bibtex-font-lock-url-regexp nil
>    "Regexp for `bibtex-font-lock-url' derived from `bibtex-generate-url-list'.")
>  
>  (defvar bibtex-string-empty-key nil
> ------------------------------------------------------------------------------

Roland and Stefan, any comments?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#78798; Package emacs. (Tue, 08 Jul 2025 19:58:02 GMT) Full text and rfc822 format available.

Message #14 received at 78798 <at> debbugs.gnu.org (full text, mbox):

From: Roland Winkler <winkler <at> gnu.org>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 78798 <at> debbugs.gnu.org, Stefan Monnier <monnier <at> iro.umontreal.ca>,
 MAN ONE <pRoMMMModE <at> outlook.com>
Subject: Re: bug#78798: bibtex-font-lock-url-regexp should re-eval after
 setting bibtex-generate-url-list
Date: Tue, 08 Jul 2025 11:46:34 -0500
On Wed, Jul 02 2025, Eli Zaretskii wrote:
>> +  :set (lambda (symbol value)
>> +         (set-default symbol value)
>> +         (let ((fields (delete-dups (mapcar #'caar bibtex-generate-url-list))))
>> +           (set-default-toplevel-value
>> +            'bibtex-font-lock-url-regexp
>> +            ;; Assume that field names begin at the beginning of a line.
>> +            (concat "^[ \t]*"
>> +                    (regexp-opt fields 'paren)
>> +                    "[ \t\n]*=[ \t\n]*")))))

Small thing: What is the purpose of the intermediate let-binding?

The elisp manual says about setfunctions:

     If you specify this keyword, the variable’s documentation string
     should describe how to do the same job in hand-written Lisp code,
     either by invoking SETFUNCTION directly or by using ‘setopt’.

Isn't it then cleaner to define a helper function instead of using
a lambda expression?

>> -(defvar bibtex-font-lock-url-regexp
>> -  ;; Assume that field names begin at the beginning of a line.
>> -  (concat "^[ \t]*"
>> -          (regexp-opt (delete-dups (mapcar #'caar bibtex-generate-url-list)) t)
>> -          "[ \t\n]*=[ \t\n]*")
>> +(defvar bibtex-font-lock-url-regexp nil
>>    "Regexp for `bibtex-font-lock-url' derived from `bibtex-generate-url-list'.")

I was surprised when I tested the above that it sets
bibtex-font-lock-url-regexp even if the value of
bibtex-generate-url-list is defined outside defcustom, that is,
defcustom evaluates the above setfunction even when it ignores the
standard value for bibtex-generate-url-list.  This is sensible,
but I did not find it documented anywhere.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#78798; Package emacs. (Wed, 09 Jul 2025 03:44:02 GMT) Full text and rfc822 format available.

Message #17 received at 78798 <at> debbugs.gnu.org (full text, mbox):

From: MAN ONE <pRoMMMModE <at> outlook.com>
To: Roland Winkler <winkler <at> gnu.org>
Cc: Eli Zaretskii <eliz <at> gnu.org>,
 "78798 <at> debbugs.gnu.org" <78798 <at> debbugs.gnu.org>,
 "monnier <at> iro.umontreal.ca" <monnier <at> iro.umontreal.ca>
Subject: Re: bug#78798: bibtex-font-lock-url-regexp should re-eval after
 setting bibtex-generate-url-list
Date: Wed, 9 Jul 2025 03:43:40 +0000
Perhaps this one is better?

=============================
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -39,7 +39,14 @@
 ;;; Code:
 
 (require 'iso8601)
-
+(eval-and-compile
+  (defun bibtex--generate-url-list (symbol value)
+    "Set the default value of `bibtex-generate-url-list' and populate `bibtex-font-lock-url-regexp'."
+    (set-default symbol value)
+    (setq bibtex-font-lock-url-regexp
+          (concat "^[ \t]*"           ; Assume that field names begin at the beginning of a line.
+                  (regexp-opt (delete-dups (mapcar #'caar value)) 'paren)
+                  "[ \t\n]*=[ \t\n]*"))))
 
 ;; User Options:
 
@@ -1495,7 +1502,8 @@ bibtex-generate-url-list
                                (choice (string :tag "Replacement")
 				       (integer :tag "Sub-match")
                                        (function :tag "Filter")))))))
-  :risky t)
+  :risky t
+  :set 'bibtex--generate-url-list)
 
 (defcustom bibtex-cite-matcher-alist
   '(("\\\\cite[ \t\n]*{\\([^}]+\\)}" . 1))
@@ -1838,12 +1846,10 @@ bibtex-font-lock-keywords
               bibtex-cite-matcher-alist))
   "Default expressions to highlight in BibTeX mode.")
 
-(defvar bibtex-font-lock-url-regexp
-  ;; Assume that field names begin at the beginning of a line.
-  (concat "^[ \t]*"
-          (regexp-opt (delete-dups (mapcar #'caar bibtex-generate-url-list)) t)
-          "[ \t\n]*=[ \t\n]*")
-  "Regexp for `bibtex-font-lock-url' derived from `bibtex-generate-url-list'.")
+(defvar bibtex-font-lock-url-regexp nil
+  "Regexp for `bibtex-font-lock-url'.
+Auto-generated from `bibtex-generate-url-list'.
+To change its value, customize `bibtex-generate-url-list'.")
 
 (defvar bibtex-string-empty-key nil
   "If non-nil, `bibtex-parse-string' accepts empty key.")
=====================================

In bibtex.el there are muliple variable like `bibtex-font-lock-url-regexp`, defined 
as nil then populated by other customizables, honestly I don't know if it's 
good or not but it certainly takes a non-trivial patch to remove those variables.




This bug report was last modified 7 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.