Emacspeak: An Overview Of Voice-Lock Over The Years
1 Executive Summary
Audio formatted output is provided via
voice-lock in Emacspeak.
The feature was originally implemented in 1994 and significantly
overhauled in 2002 (with no change in functionality). Now, in 2015,
the implementation has been reworked to be once again simpler — but
with the same functionality.
2 1994: Original Implementation
Font-lock was a new feature in Emacs 19 — it was introduced right
around the time the Emacspeak project was started.
At the time, there were multiple font-lock packages in
Emacs. Emacspeak implemented
voice-lock via a stand-alone module
that attached property
personality to buffer contents. The
dtk-speak Text-To-Speech module treated strings annotated with
personality as an aural display list when producing
In the winter of 1995, I implemented Aural CSS in emacspeak, and
this resulted in module
acss.el — that module provides a clean
abstraction for defining values that can be assigned to property
personality. Next, the rest of emacspeak was overhauled to
voice-lock features via the ACSS abstraction.
3 2002 Overhaul
font-lock now mature, Emacs itself converged on a
single font-lock module with
jit-lock.el providing just-in-time font
locking. This meant that Emacspeak's
voice-lock feature could now be
more easily implemented by attaching appropriate advice to lisp
put-text-property and friends — this led to the deletion
voice-lock.el and the creation of module
That module provided multiple options for how faces were mapped to
- Cumulative where property
personalitywas either appended or
prepended to the list of personalities at any given position.
- Simple: where the new personality directly replaced any previously
- None: Where faces were not mapped to personalities.
4 2015 Overhaul
And now, in 2015, the code in module
dtk-speak.el that implements
audio-formatting has been overhauled to directly map faces to
personalities. This implementation can be enabled by setting the
emacspeak-personality-voiceify-faces provided in module
emacspeak-personality.el to All. This means that the new
implementation can co-exist (at least for a while) with the earlier
advice-based implementation from module
once deemed to be stable, the new implementation will become the
default — by changing the default value of
emacspeak-personality-voiceify-faces to none.
From an end-user's perspective, nothing has changed in 21 years. From
the perspective of implementing voice-lock for Emacs modules, nothing
has changed — all that an Emacspeak extension for a specific package
needs to do to enable
voice-lock is to set up a face->personality
mapping as before via function
voice-setup-add-map. Note that
personality will continue to have higher precedence than
face with respect to the audio formatting that gets applied
i.e. Emacspeak first consults value of property
personality, and if
that is not set, but there is a
face property set, then that
face->personality mapping (if defined) is used as the aural style.
Created: 2015-08-21 Fri 10:18