Subject: [PATCH v2 2/2] merge with Scheme regexp; fix bugs

From: "Scott L. Burson via GitGitGadget" <[email-masked]>
Date: Thu, 27 Nov 2025 02:38:16 +0000

From: "Scott L. Burson" <[email-masked]>

This commit merges (by disjoining) the new generic Lisp regexp into
the existing Scheme regexp.  It also fixes two bugs: the new regexp
was unintentionally allowing tabs, and the matching of "(def" should
be case-insensitive.

Signed-off-by: Scott L. Burson <[email-masked]>
---
 userdiff.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/userdiff.c b/userdiff.c
index e127b4a1f1..b67dfddbef 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -249,14 +249,6 @@ PATTERNS("kotlin",
 	 "|[.][0-9][0-9_]*([Ee][-+]?[0-9]+)?[fFlLuU]?"
 	 /* unary and binary operators */
 	 "|[-+*/<>%&^|=!]==?|--|\\+\\+|<<=|>>=|&&|\\|\\||->|\\.\\*|!!|[?:.][.:]"),
-PATTERNS("lisp",
-	 /* Either an unindented left paren, or a slightly indented line
-	  * starting with "(def" */
-	 "^((\\(|:space:{1,2}\\(def).*)$",
-	 /* Common Lisp symbol syntax allows arbitrary strings between vertical bars */
-	 "\\|([^\\\\]|\\\\\\\\|\\\\\\|)*\\|"
-	 /* All other words are delimited by spaces or parentheses/brackets/braces */
-	 "|([^][(){} \t])+"),
 PATTERNS("markdown",
 	 "^ {0,3}#{1,6}[ \t].*",
 	 /* -- */
@@ -352,14 +344,21 @@ PATTERNS("rust",
 	 "|[0-9][0-9_a-fA-Fiosuxz]*(\\.([0-9]*[eE][+-]?)?[0-9_fF]*)?"
 	 "|[-+*\\/<>%&^|=!:]=|<<=?|>>=?|&&|\\|\\||->|=>|\\.{2}=|\\.{3}|::"),
 PATTERNS("scheme",
-	 "^[\t ]*(\\(((define|def(struct|syntax|class|method|rules|record|proto|alias)?)[-*/ \t]|(library|module|struct|class)[*+ \t]).*)$",
+	 /* A possibly indented left paren followed by a Scheme keyword. */
+	 "^[\t ]*(\\(((define|def(struct|syntax|class|method|rules|record|proto|alias)?)[-*/ \t]|(library|module|struct|class)[*+ \t]).*)$\n"
+	 /*
+	  * For other Lisp dialects: either an unindented left paren, or a
+	  * slightly indented line starting with "(def".
+	  */
+	 "^((\\(| {1,2}\\([Dd][Ee][Ff]).*)$",
 	 /*
-	  * R7RS valid identifiers include any sequence enclosed
-	  * within vertical lines having no backslashes
+	  * The union of R7RS and Common Lisp symbol syntax: allows arbitrary
+	  * strings between vertical bars, including escaped backslashes and
+	  * vertical bars.
 	  */
-	 "\\|([^\\\\]*)\\|"
+	 "\\|([^\\\\]|\\\\\\\\|\\\\\\|)*\\|"
 	 /* All other words should be delimited by spaces or parentheses */
-	 "|([^][)(}{[ \t])+"),
+	 "|([^][)(}{ \t])+"),
 PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$",
 	 "\\\\[a-zA-Z@]+|\\\\.|([a-zA-Z0-9]|[^\x01-\x7f])+"),
 { .name = "default", .binary = -1 },
-- 
gitgitgadget