The following notes are derived from the reply to a question about adding an emacspeak interface to Versor.
Most versor commands have a macro wrapped around most of the command,
either versor-as-versor-command or versor-as-motion-command, both
defined in versor-commands.el.
versor-as-versor-command is a recent hack to let me turn versor
off quickly, thus making eligible to be a minor mode; if
versor-mode is nil, it just looks for whatever was previously
on the key that triggered this command, and runs that instead.
More interesting is versor-as-motion-command (probably a bit of
a misnomer by now) which is what updates the versor selection
highlight at the end of each command. To do this, it calls
versor-clear-current-item-indication before running the main
logic of the command, to get rid of the old highlight, then after
running the command-specific code that it is wrapped around, it calls
versor-indicate-current-item, which does the complicated bit.
After that, it runs any functions on versor-post-command-hook.
versor-indicate-current-item is probably the thing to advise,
but I'm happy to include emacspeak-specific code in it. It first
checks whether the internal variables indicating the selection have
been set (by the command-specific logic calling
versor-set-current-item, or versor-set-current-items if
it is a multi-part selection); if they haven't, it uses a heuristic to
set them, again using versor-indicate-current-item, which is
what generates the colourful overlays.
Then it (versor-indicate-current-item) calls
versor-describe-selection on the selection, which gets a
description of the selection, puts it in the echo area, and calls
versor-speak, which is my rudimentary attempt to interface to
emacspeak.
I'm already planning to upgrade versor-describe-selection
(which is part of languide) to give more information. From the versor
/ languide point of view, it is probably the best place to get more
spoken information.
As it stands now, it calls some mode-specific stuff (using
modal-functions.el, which is part of the download) to discover stuff
about the specified part of a buffer. Each mode's definition (see
languide-lisp-like.el, languide-c-like.el for the current support)
defines a function languide-region-type which returns things like
if-then-body, if-then-else-tail, progn-whole, while-do-head,
defun-body, to describe the specified text. languide-region-type can
also set the variable languide-region-detail-string to give more
information. region-type-description converts the result of
languide-region-type into human-readable text.
There is another function which could be used to give more information
that should probably be spoken, which is
establish-current-statement, which works out the statement type
at point. If languide-region-type says that the text is a
single statement, establish-current-statement could be used to
tell you what the statement is; if it is multiple statements, it could
be used several times, to describe the region (or selection when used
by versor) succintly.