Some Updates to omn-mode
I have described my experiences of using Emacs for writing ontologies previously [@url:www.russet.org.uk/blog/2161] I was not entirely happy with omn-mode, even after recent changes [@url:www.russet.org.uk/blog/2185] so I have taken the opportunity to update it a little more. This article most describes some implementation changes.
omn-mode was based on
generic.el; this is a package
which enables development of simple major modes. However, the emphasis
was on simple, and my code was getting a little bit complex;
generic.el was starting to get in the way. Moving to the
define-derived-mode was not pain-free; it involved redoing already
functioning code which is always a bit down heartening but probably
One thing that I did have problems with was getting comments to work
properly (Emacs syntax tables are nasty). This never worked properly
anyway, as I had defined "
# " as the comment starter; the reason for
this is that Manchester syntax also uses URIs, within which any
character is basically legal, including "
#" but not a space. I think
I have now found a better workaround for this. Manchester syntax
requires URIs to be <surrounded>. I've now defined "
<" and "
to be string delimiters, which means that I can now use "
#" as a
comment starter without it being recognised in a URI. This isn't
perfect; in particular, Emacs will not recognise "
<" and "
<URI> is equivalent to
>URI>, although only
the former is correct.
I've also update the indentation logic somewhat. This now uses the
syntax-table parser rather than font-lock to work out whether point is
in comment or string. Of course, it should have been this way all along
syntax-ppss function is new to me.
Finally, I have added some electric features. Because the identation engine works on keywords rather than brackets, the identation level really needs to be calculated when a line is finished rather than when it is started; electric mode means that the indentation updates as the user types. It's a little jarring in some ways, although Python does something similar and for the same reason.