Subject: Re: [PATCH] diff: "lisp" userdiff_driver

From: "Scott L. Burson" <[email-masked]>
Date: Mon, 17 Nov 2025 15:23:19 -0800

On Sat, Nov 15, 2025 at 9:30 PM Junio C Hamano <[email-masked]> wrote:
>
> Johannes Sixt <[email-masked]> 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.