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-alist
variable in Emacs. That was easy enough to fix: add .ada, .ads, and .adb toauto-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
parse-partial-sexp
inada-in-open-paren-p
. It turns out that somewhere after Emacs version 27.2 was released the Emacs developers added a check toparse-partial-sexp
to ensure that theFROM
argument (which indicates where in the buffer to start parsing) was less than theTO
argument (which indicates where in the buffer to stop parsing).
Drat. Drat. Drat. Well, looking at the code it was clear that
since ada-in-open-paren-p
is explicitly searching backwards
that 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.
Comments
Comments powered by Disqus