Maintaining the old ada-mode.el formerly distributed with Emacs
I wrote a post about using the old ada-mode.el that used to be distributed with Emacs because I couldn't get the newer, separate package version to work for me.
Well, this morning when I pulled up an Ada file in Emacs version 28 there were two problems:
The information to invoke ada-mode on Ada files was not in the
auto-mode-alistvariable in Emacs. That was easy enough to fix: add .ada, .ads, and .adb to
auto-mode-alist(and .gpr, too, since Ada mode works for gprbuild files as well):
(cl-loop for ext in '("\\.gpr$" "\\.ada$" "\\.ads$" "\\.adb$") do (add-to-list 'auto-mode-alist (cons ext 'ada-mode)))
That was easy enough.
When I tried to do any indentation emacs reported an error, with the error message “End position is smaller than start position”. Eventually I tracked this down to a call to
ada-in-open-paren-p. It turns out that somewhere after Emacs version 27.2 was released the Emacs developers added a check to
parse-partial-sexpto ensure that the
FROMargument (which indicates where in the buffer to start parsing) was less than the
TOargument (which indicates where in the buffer to stop parsing).
Drat. Drat. Drat. Well, looking at the code it was clear that
ada-in-open-paren-p is explicitly searching backwards
TO would always be smaller than
FROM. So I could
just transpose the s-expressions that found those two values. I
tried it, and it worked!
At that point I realized that I had committed to maintain the old version of ada-mode, at least for myself, and that I'd already talked about it on my blog and it was small step from there to setting up a GitHub repository with the old code, adding an issue describing the problem, adding a commit with the fix, and then writing this blog post.
Somewhere, someone is laughing and enjoying the schadenfreude. Maybe this will help someone else.
And since I already have a GitHub repository, I ought to document the first problem and since it is a documentation problem, put a mention in the README.
CommentsComments powered by Disqus