All my code is stored in various Git repositories. When Git formats a diff between two objects, it generates a list of hunks, or groups of changes.
Each hunk can be displayed with a title which is automatically extracted. Git ships with support for multiple languages, but Lisp dialects are not part of it. Fortunately Git lets users configure their own extraction.
The first step is to identify the language using a pattern applied to the
filename. Edit your Git attribute file at $HOME/.gitattributes
and add
entries for both Emacs Lisp and Common Lisp:
*.lisp diff=common-lisp
*.el diff=elisp
Then edit your Git configuration file at $HOME/.gitconfig
and configure the
path of the Git attribute file:
[core]
attributesfile = ~/.gitattributes
Finally, set the regular expression used to match a top-level function name:
[diff "common-lisp"]
xfuncname="^\\((def\\S+\\s+\\S+)"
[diff "elisp"]
xfuncname="^\\((((def\\S+)|use-package)\\s+\\S+)"
For Lisp dialects, we do not just identify function names: it is convenient to identify hunks for all sorts of top-level definitions. We use a regular expression which captures the first symbol of the form and the name that follows.
Of course you can modifiy these expressions to identify more complex top-level
forms. For example, for Emacs Lisp, I also want to identify use-package
expressions.
You can see the result in all tools displaying Git diffs, for example in Magit with Common Lisp code:
Or for my Emacs configuration file:
Hunk titles, highlighted in blue, now contain the type and name of the top-level construction the changes are associated with.
A simple change, but one which really helps reading diffs.