Re: [PATCH] diff: "lisp" userdiff_driver
- From
Scott L. Burson <scott@sympoiesis.com>
- Date
- Nov 17, 2025, 23:23 UTC
- Message-ID
- <CAF5LJ4CMtEaJgDYRHXvCTUm9Pjpv2GAsMQN9D-DL-Ric3ADMXQ@mail.gmail.com>
- In-Reply-To
- <xmqqbjl2ee8t.fsf@gitster.g>
On Sat, Nov 15, 2025 at 9:30 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 16 quoted lines
>
> Johannes Sixt <j6t@kdbg.org> 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'.
Show 9 quoted lines
> 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.