From: Scott L. Burson Date: Mon, 17 Nov 2025 23:23:19 GMT Subject: Re: [PATCH] diff: "lisp" userdiff_driver Message-ID: In-Reply-To: On Sat, Nov 15, 2025 at 9:30 PM Junio C Hamano wrote: > > Johannes Sixt writes: > > >> + /* Either an unindented left paren, or a slightly indented line > >> + * starting with "(def" */ > >> + "^((\\(|:space:{1,2}\\(def).*)$", > > > > Compared to the Scheme driver, this regular expression is > > > > - more restrictive because it does not permit arbitrary indentation; > > > > - less restrictive because it permits everything that begins with "(def". > > > > What would happen if this regular expression were added to the Scheme > > driver? Would it pick up additional and unwanted hunk headers is typical > > Scheme code? Hmm, we haven't heard from Atharva. I'll try asking around in the Scheme community. The regex I proposed has a bug. The use of the Posix character class is incorrect, because that class includes tabs. I will replace it with a literal space. Also, many Lisps, including Common Lisp in its default configuration, are case-insensitive, and at least in the 1970s, it wasn't completely unheard-of to write Lisp code in uppercase; I'll change the entry to use 'IPATTERN'. > As we generally assume that the file being edited is syntactically > sound, even if one lisp variant understands "(deffoo" and others do > not, it should be generally fine for the pattern to say something > like "at the beginning of the line, optionally following a few > spaces, four-letter sequence '(def' is likely to be the beginning of > a function definition", as long as there is some convention that > user defined functions and macros, unless they are to behave > similarly to "(defun", would not be named so confusingly to start > with d-e-f. Agreed, but this is not the most important point. The greater potential for false positives comes from the rule (in my proposal) that a left parenthesis in column 0 is taken as indicating a top-level definition, without even looking at the following characters. Although Lisp dialects certainly vary, I have not seen one in which standard indentation practice does not indent internal expressions; certainly, Lisp mode in Emacs indents them. And, I think the rule really does need to be that broad, because top-level forms don't always begin with "def"; indeed, one can put any executable expression at top level in a source file to perform load-time initializations. It's only when there is some indentation that I think the regex needs to require a word beginning with "def". > It would be nice if a single set of rules can cover what existing > scheme patterns cover, Emacs lisp, and Common lisp. Agreed. I do think it would be a little better for non-Scheme users if the single driver were named "lisp" instead of "scheme". Renaming the driver out from under the Scheme community, though, seems like it would be unfriendly, even after a deprecation period. One solution would be to add an aliasing mechanism to the driver table. Perhaps there would be other use cases for it. If you would consider a patch along these lines, I can code it up.