tag:blogger.com,1999:blog-202800422024-03-18T20:54:10.243-07:00EMACSPEAK The Complete Audio DesktopHere is where I plan to Blog Emacspeak tricks and introduce new features as I implement them.T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comBlogger199125tag:blogger.com,1999:blog-20280042.post-55077476412661658932024-03-18T20:53:00.000-07:002024-03-18T20:53:22.701-07:00Smart Media Selector For The Emacspeak Audio Desktop <div id="content" class="content">
<h1 class="title">Smart Media Selector For The Audio Desktop</h1>
<div id="outline-container-org15514aa" class="outline-2">
<h2 id="org15514aa"><span class="section-number-2">1.</span> Overview</h2>
<div class="outline-text-2" id="text-1">
<p>
I have over 60MB of audio content on my laptop spread across 755
subdirecories in over 9100 files. I also have many Internet stream
shortcuts that I listen to on a regular basis.
</p>
<p>
This blog article outlines the media selector implementation in
Emacspeak and shows how a small amount of Lisp code built atop
Emacs' built-in affordances of completion provides a light-weight yet
efficient interface. Notice that the implementation does not involve
fancy things like SQL databases, MP3 tags that one needs to update
etc.; the solution relies on the speed of today's laptops, especially
given the speed of disk access.
</p>
</div>
</div>
<div id="outline-container-org9a3ab1b" class="outline-2">
<h2 id="org9a3ab1b"><span class="section-number-2">2.</span> User Experience</h2>
<div class="outline-text-2" id="text-2">
<p>
As I type this up, the set of requirements as expressed in English
is far more verbose (and likely more complicated) than its
expression in Lisp!
</p>
</div>
<div id="outline-container-org1acff4f" class="outline-3">
<h3 id="org1acff4f"><span class="section-number-3">2.1.</span> Pre-requisites for content selection and playback</h3>
<div class="outline-text-3" id="text-2-1">
<ol class="org-ol">
<li>Launch either MPV (via package <code>empv.el</code>) or <code>mplayer</code> via
Emacspeak's <code>emacspeak-mplayer</code> with a few keystrokes.</li>
<li>Media selection uses <code>ido</code> with <code>fuzzy</code> matching.</li>
<li>Choices are filtered incrementally for efficient eyes-free
interaction; see the relevant blog article on
<a href="https://emacspeak.blogspot.com/2018/06/%20effective-suggest-and-complete-in-eyes.html">Search, Input, Filter, Target</a> for additional background.</li>
<li>Content can be filtered using the directory structure,
where directories conceptually equate to music albums, audio
books or othre logical content groups.Once selected, a directory
and its contents are played as a conceptual <i>play-list</i>.</li>
<li>Searching and filtering can also occur across the list of all
9,100+ media files spread across 700+ directories.</li>
<li>Starting point of the SIFT process should be influenced by one's current context, e.g., default-directory.</li>
<li>Each step of this process should have reasonable fallbacks.</li>
</ol>
</div>
</div>
</div>
<div id="outline-container-orgb044db1" class="outline-2">
<h2 id="orgb044db1"><span class="section-number-2">3.</span> Mapping Design To Implementation</h2>
<div class="outline-text-2" id="text-3">
<ol class="org-ol">
<li>Directory where we start AKA <i>context</i> is selected by function <a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-m-player.el#L357">emacspeak-media-guess-directory</a>.
<ol class="org-ol">
<li>If default directory matches emacspeak-media-directory-regexp,use it.</li>
<li>If default directory contains media files, then use it.</li>
<li>If default directory contains directory emacspeak-media — then use it.</li>
<li>Otherwise use emacspeak-media-shortcuts as the fallback.</li>
</ol></li>
<li>Once we have selected the context, function
<a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-m-player.el#L426">emacspeak-media-read-resource</a>uses <code>ido</code> style interaction with
fuzzy-matching to pick the file to play.</li>
<li>That function uses Emacs' built-in <code>directory-files-recursively</code>
to build the <code>collection</code> to hand-off to <code>completing-read</code>; It
uses an Emacspeak provided function <a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-speak.el#L92">ems–subdirs-recursively</a> to
build up the list of 755+ sub-directories that live under
<span class="underline">$XDG<sub>MUSIC</sub><sub>DIR</sub></span>.</li>
</ol>
</div>
</div>
<div id="outline-container-org471fc48" class="outline-2">
<h2 id="org471fc48"><span class="section-number-2">4.</span> Resulting Experience</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>I can pick the media to play with a few keystrokes.</li>
<li>I use Emacs' <code>repeat-mode</code> to advantage whereby I can quickly
change volume etc once content is playing before going back to work.</li>
<li>There's <b>no</b> media-player UI to get in my way while working, but I
can stop playing media with a single keystroke.</li>
<li>Most importantly, I dont have to tag media, maintain databases or
do other busy work to be able to launch the media that I want!</li>
</ol>
</div>
</div>
<div id="outline-container-org091f582" class="outline-2">
<h2 id="org091f582"><span class="section-number-2">5.</span> The Lisp Code</h2>
<div class="outline-text-2" id="text-5">
<p>
The hyperlinks to the Emacspeak code-base are the source of
truth. I'll include a snapshot of the functions mentioned
above for completeness.
</p>
</div>
<div id="outline-container-org0433a76" class="outline-3">
<h3 id="org0433a76"><span class="section-number-3">5.1.</span> Guess Context</h3>
<div class="outline-text-3" id="text-5-1">
<div class="org-src-container">
<pre class="src src-emacs-lisp"> (<span style="color: #70a0ff; font-weight: bold;">defun</span> <span style="color: #7fce5f;">emacspeak-media-guess-directory</span> ()
<span style="color: #99bfcf; font-style: italic;">"Guess media directory.</span>
<span style="color: #99bfcf; font-style: italic;">1. If default directory matches emacspeak-media-directory-regexp,use it.</span>
<span style="color: #99bfcf; font-style: italic;">2. If default directory contains media files, then use it.</span>
<span style="color: #99bfcf; font-style: italic;">3. If default directory contains directory emacspeak-media --- then use it.</span>
<span style="color: #99bfcf; font-style: italic;">4. Otherwise use emacspeak-media-shortcuts as the fallback."</span>
(<span style="color: #70a0ff; font-weight: bold;">cl-declare</span> (special emacspeak-media-directory-regexp
emacspeak-media emacspeak-m-player-hotkey-p))
(<span style="color: #70a0ff; font-weight: bold;">let</span> ((case-fold-search t))
(<span style="color: #70a0ff; font-weight: bold;">cond</span>
((<span style="color: #70a0ff; font-weight: bold;">or</span> (eq major-mode 'dired-mode) (eq major-mode 'locate-mode)) nil)
(emacspeak-m-player-hotkey-p emacspeak-media-shortcuts)
((<span style="color: #70a0ff; font-weight: bold;">or</span> <span style="color: #eaa4a4; font-style: italic;">; </span><span style="color: #eaa4a4; font-style: italic;">dir contains media:</span>
(string-match emacspeak-media-directory-regexp default-directory)
(directory-files default-directory nil emacspeak-media-extensions))
default-directory)
((file-in-directory-p emacspeak-media default-directory) emacspeak-media)
(t emacspeak-media-shortcuts))))
</pre>
</div>
</div>
</div>
<div id="outline-container-org932506f" class="outline-3">
<h3 id="org932506f"><span class="section-number-3">5.2.</span> Read Resource</h3>
<div class="outline-text-3" id="text-5-2">
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span style="color: #70a0ff; font-weight: bold;">defun</span> <span style="color: #7fce5f;">emacspeak-media-read-resource</span> (<span style="color: #41bf4f;">&optional</span> prefix)
<span style="color: #99bfcf; font-style: italic;">"Read resource from minibuffer.</span>
<span style="color: #99bfcf; font-style: italic;">If a dynamic playlist exists, just use it."</span>
(<span style="color: #70a0ff; font-weight: bold;">cl-declare</span> (special emacspeak-media-dynamic-playlist
emacspeak-m-player-hotkey-p))
(<span style="color: #70a0ff; font-weight: bold;">cond</span>
(emacspeak-media-dynamic-playlist nil) <span style="color: #eaa4a4; font-style: italic;">; </span><span style="color: #eaa4a4; font-style: italic;">do nothing if dynamic playlist</span>
(emacspeak-m-player-hotkey-p (emacspeak-media-local-resource prefix))
(t <span style="color: #eaa4a4; font-style: italic;">; </span><span style="color: #eaa4a4; font-style: italic;">not hotkey, not dynamic playlist</span>
(<span style="color: #70a0ff; font-weight: bold;">let*</span> ((completion-ignore-case t)
(read-file-name-completion-ignore-case t)
(filename
(<span style="color: #70a0ff; font-weight: bold;">when</span> (memq major-mode '(dired-mode locate-mode))
(dired-get-filename 'local 'no-error)))
(dir (emacspeak-media-guess-directory))
(collection
(<span style="color: #70a0ff; font-weight: bold;">or</span>
filename <span style="color: #eaa4a4; font-style: italic;">; </span><span style="color: #eaa4a4; font-style: italic;">short-circuit expensive call</span>
(<span style="color: #70a0ff; font-weight: bold;">if</span> prefix
(ems--subdirs-recursively dir) <span style="color: #eaa4a4; font-style: italic;">;</span><span style="color: #eaa4a4; font-style: italic;">list dirs</span>
(directory-files-recursively dir emacspeak-media-extensions)))))
(<span style="color: #70a0ff; font-weight: bold;">or</span> filename (completing-read <span style="color: #65d5a8;">"Media: "</span> collection))))))
</pre>
</div>
</div>
</div>
<div id="outline-container-org4cb0687" class="outline-3">
<h3 id="org4cb0687"><span class="section-number-3">5.3.</span> Helper: Recursive List Of Sub-directories</h3>
<div class="outline-text-3" id="text-5-3">
<div class="org-src-container">
<pre class="src src-emacs-lisp">
<span style="color: #eaa4a4; font-style: italic;">;;; </span><span style="color: #eaa4a4; font-style: italic;">Helpers: subdirs</span>
(<span style="color: #70a0ff; font-weight: bold;">defconst</span> <span style="color: #2fd0db;">ems--subdirs-filter</span>
(<span style="color: #70a0ff; font-weight: bold;">eval-when-compile</span>
(concat (regexp-opt '(<span style="color: #65d5a8;">"/.."</span> <span style="color: #65d5a8;">"/."</span> <span style="color: #65d5a8;">"/.git"</span>)) <span style="color: #65d5a8;">"$"</span>))
<span style="color: #99bfcf; font-style: italic;">"Pattern to filter out dirs during traversal."</span>)
(<span style="color: #70a0ff; font-weight: bold;">defsubst</span> <span style="color: #7fce5f;">ems--subdirs</span> (d)
<span style="color: #99bfcf; font-style: italic;">"Return list of subdirs in directory d"</span>
(cl-remove-if-not #'file-directory-p (cddr (directory-files d 'full))))
(<span style="color: #70a0ff; font-weight: bold;">defun</span> <span style="color: #7fce5f;">ems--subdirs-recursively</span> (d)
<span style="color: #99bfcf; font-style: italic;">"Recursive list of subdirs"</span>
(<span style="color: #70a0ff; font-weight: bold;">cl-declare</span> (special ems--subdirs-filter))
(<span style="color: #70a0ff; font-weight: bold;">let</span> ((result (list d))
(subdirs (ems--subdirs d)))
(<span style="color: #70a0ff; font-weight: bold;">cond</span>
((string-match ems--subdirs-filter d) nil) <span style="color: #eaa4a4; font-style: italic;">; </span><span style="color: #eaa4a4; font-style: italic;">pass</span>
(t
(<span style="color: #70a0ff; font-weight: bold;">cl-loop</span>
for dir in subdirs
if (not (string-match ems--subdirs-filter dir)) do
(<span style="color: #70a0ff; font-weight: bold;">setq</span> result (nconc result (ems--subdirs-recursively dir))))))
result))
</pre>
</div>
</div>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-65839074086502341232023-12-19T17:58:00.000-08:002023-12-19T17:58:22.407-08:00Emacspeak: Hidden Holiday Gems <div id="content" class="content">
<h1 class="title">Emacspeak HHG: Hidden Holiday Gems</h1>
<div id="outline-container-org00cfc27" class="outline-2">
<h2 id="org00cfc27"><span class="section-number-2">1.</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
<p>
This is an Emacspeak-specific follow-on to my article <a href="https://emacspeak.blogspot.com/2023/12/emacs-hidden-holiday-gems.html">Emacs: Hidden
Holiday Gems</a>. This article extends its predecessor by:
</p>
<ol class="org-ol">
<li>Adding Emacspeak-specific details for each gem; the earlier article
purposely avoided anything Emacspeak-specific.</li>
<li>Where appropriate, I'll point out the importance of choosing a
solution that is appropriate to the user, e.g., low-vision vs
complete eyes-free use. Note that for the most part, Emacspeak is
optimized for the latter case.</li>
<li>As before, the goal is not to be exhaustive; — rather the goal is
to be thought-provoking with respect to encouraging readers to
discover their own optimal solution. The reference section at the
end links to some of the follow-up discussion on the
<a href="https://mail.emacspeak.net/sympa/arc/emacspeak/2023-12/msg00004.html">Emacspeak Mailing List</a>.</li>
<li>All topics covered here are already well-documented in the Emacs
and Emacspeak manuals, and this article will not attempt to replace those.</li>
</ol>
</div>
</div>
<div id="outline-container-org798900a" class="outline-2">
<h2 id="org798900a"><span class="section-number-2">2.</span> Emacspeak: Hidden Holiday Gems</h2>
<div class="outline-text-2" id="text-2">
<dl class="org-dl">
<dt>Selective Display</dt><dd>This expands and collapses content purely
based on indentation. The human eye is very efficient at scanning
down the margin and ignore content indented beyond a given level;
<i>selective-display</i> provides the same affordance when you cannot
see the display.</dd>
<dt>Registers</dt><dd>Easily becomes part of muscle-memory, especially when
moving text around, duplicating content in multiple locations. For
more complex use-cases, I use <i>yasnippets</i>, which is one of Emacs'
many template libraries.</dd>
<dt>Bookmarks</dt><dd>Emacspeak builds heavily on Emacs' built-in
bookmarks to provide:
<ol class="org-ol">
<li>Persistent bookmarks when reading EPub and Bookshare books.</li>
<li>Audio Marks (AMarks) within org-mode buffers for
marking locations in audio streams such as Podcasts.</li>
<li>An Emacspeak <i>browser</i> for browsing saved <i>eww-marks</i> and <i>a-marks</i>.</li>
<li>Together, the above make a very useful <a href="https://emacspeak.blogspot.com/2022/10/learn-smarter-by-taking-rich-hypertext.html">note-taking</a> extension to
org-mode.</li>
</ol></dd>
<dt>Tabulated Lists</dt><dd><p>
Implements tabulated UIs and is speech-enabled by Emacspeak.
</p>
<ul class="org-ul">
<li>Emacspeak augments it with additional keyboard navigation.</li>
<li>This is leveraged in Emacs by a variety of</li>
</ul>
<p>
end-user packages including <i>package.el</i> and its asynchronous cousin <i>paradox.el</i>.
</p>
<ul class="org-ul">
<li>It is also used to advantage by <i>empv</i>, a powerful</li>
</ul>
<p>
interface to the GNU MPv media player.
</p>
<ul class="org-ul">
<li>AMarks mentioned in
the previous item, this is my present means of listening to
tech-talks on Youtube while taking notes using org-mode.</li>
</ul></dd>
<dt>Forms Mode</dt><dd>Forms interface used by Emacspeak to browse BBC programs.</dd>
<dt>Mark Ring</dt><dd>Supported by default in Emacspeak but something I dont
use much. Some of its affordances really shine in
<i>transient-mark-mode</i> but that facility is somewhat counter to
eyes-free use.</dd>
<dt>Undo</dt><dd>Both basic and advanced. However a long series of
undo and redo commands as with <i>tree-undo</i> can get confusing quickly in
eyes-free interaction.</dd>
<dt>Dired</dt><dd>I use <i>dired-mode</i> and its derivatives heavily:
<ul class="org-ul">
<li>To browse the file-system as intended.</li>
<li>With <a href="https://emacspeak.blogspot.com/2023/09/augment-with-zoxide.html">emacspeak-zoxide</a> to rapidly move to far-away portions of
the file system.</li>
<li>With <i>locate</i> to search the file system.</li>
<li>With command <i>emacspeak-m-player-locate-media</i> to find and play
local media.</li>
<li>With <i>flx</i> and <i>fuzzy</i> completion to provide a powerful
interactive UI for finding and playing media such as Internet streams.</li>
</ul></dd>
<dt>- Writeable Dired</dt><dd>Useful to:
<ul class="org-ul">
<li>Consistently rename files, especially when confronted with
filenames with embedded white space.</li>
</ul></dd>
<dt>Org-Mode</dt><dd>This margin is too small to do it justice; see
documentation for module
<span class="underline">emacspeak-org</span> for all that Emacspeak does with org.</dd>
<dt>Magit</dt><dd>As with the previous item, see the associated Emacspeak
documentation for <span class="underline">emacspeak-magit</span>.</dd>
<dt>Forge</dt><dd>I use <span class="underline">forge</span> for issue tracking, but often revert to
old habits and use <span class="underline">gh</span> at the shell inside Emacs.</dd>
<dt>EWW</dt><dd>See the Emacspeak documentation for
<a href="https://emacspeak.blogspot.com/2014/05/emacspeak-eww-updates-for-complete.html"><span class="underline">emacspeak-eww</span></a>. Highlights include:
<ul class="org-ul">
<li>Dom filtering,</li>
<li>XPath filtering,</li>
<li>MPlayer and EMpv integration for playing online media,</li>
<li>EPub and Bookshare books,</li>
<li>And much, much more.</li>
</ul></dd>
<dt>Elfeed</dt><dd>My chosen means of following RSS and Atom feeds.</dd>
<dt>GNUS</dt><dd>For mail, now that Usenet is history.
<ul class="org-ul">
<li>I use gnus as an <i>imap</i> mail reader for GMail.</li>
<li>Emacspeak implements the equivalent of GMail's search operators.</li>
<li>I complement gnus with package <i>vm</i> for reading email delivered
locally; I use <span class="underline">fetchmail</span> to fetch mail and <span class="underline">procmail</span> to sort
mail into folders in the background.</li>
<li>And finally I use <span class="underline">notmuch</span> to search locally saved email.</li>
</ul></dd>
<dt>Tramp</dt><dd>Accessing and working in the Cloud:
<ul class="org-ul">
<li>I use <i>tramp</i> to open remote files.</li>
<li>Emacspeak wizard <i>emacspeak-wizards-tramp-open-location</i> to
quickly open files on servers I access often.</li>
<li>If you <a href="https://emacspeak.blogspot.com/2021/11/emacspeak-in-age-of-cloud-computing.html">work in the Cloud</a>, Emacspeak lets you SSH to your
CloudTop and have Emacs running on the CloudTop speak on your
local machine.</li>
<li>The above can be done using a plain old XTerm with <span class="underline">screen</span>,
<span class="underline">dtach</span>, or <span class="underline">emacs –daemon</span> providing a persistent Emacs
session at the remote end.</li>
<li>Alternatively, you can use wizard
<i>emacspeak-wizards-remote-frame</i> to open a graphical frame on the
remote machine.</li>
</ul></dd>
<dt>Eshell</dt><dd>A Shell that is deeply integrated into Emacs. Fully
speech-enabled by Emacspeak. Well-suited for running compile, grep
and friends for starters.</dd>
<dt>Comint</dt><dd>This is the goto solution for software development in
Emacspeak, be it Common Lisp or Python.</dd>
<dt>Zip Archives</dt><dd>One more reason you dont need to leave Emacs for
a text console.</dd>
<dt>Calculators</dt><dd>From the simple to complex, we have it all!
<ul class="org-ul">
<li>Simple calculations.</li>
<li>Symbolic Algebra.</li>
<li>Calc in <i>embedded mode</i> can directly replace a calculation with
an answer.</li>
<li>For even smarter work-flows, leverage <i>org-mode</i> with <i>calc</i>.</li>
<li>you can even <a href="https://emacspeak.blogspot.com/2022/12/aster-spoken-math-on-emacspeak-audio_21.html">audio-format</a> computations in Calc output as LaTeX
using <a href="https://github.com/tvraman/aster-math">AsTeR</a>.</li>
</ul></dd>
</dl>
</div>
</div>
<div id="outline-container-org6e90c5a" class="outline-2">
<h2 id="org6e90c5a"><span class="section-number-2">3.</span> References</h2>
<div class="outline-text-2" id="text-3">
<ol class="org-ol">
<li><a href="https://mail.emacspeak.net/sympa/arc/emacspeak/2023-12/msg00004.html">Mailing List Discussion</a>.</li>
<li><a href="https://emacspeak.blogspot.com/2023/12/emacs-hidden-holiday-gems.html">Emacs: Hidden Holiday Gems</a>.</li>
<li><a href="https://tvraman.github.io/emacspeak/manual">Emacspeak Manual</a>.</li>
<li><p>
<a href="http://tvraman.github.io/emacspeak/blog/articles.html">Emacspeak Blog Articles</a> as a single page.
</p>
<p>
Note that the Emacspeak blog, the online manual etc., are all
available locally in the Emacspeak Git checkout.
</p></li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-50451721702681107802023-12-15T09:12:00.000-08:002023-12-15T09:12:16.159-08:00Emacs: Hidden Holiday Gems<div id="content" class="content">
<h1 class="title">Emacs HHG: Hidden Holiday Gems</h1>
<div id="outline-container-org0bcc376" class="outline-2">
<h2 id="org0bcc376"><span class="section-number-2">1.</span> Overview</h2>
<div class="outline-text-2" id="text-1">
<p>
The acronym <b>HHG</b> evokes Douglas Adams' <i>Hitch Hikers Guide To The
Galaxy</i> in the minds of most geeks. This article takes a quick
semi-guided tour through some of the gems that are hidden in plain
sight within Emacs. This article was prompted by some recent
discussions on the <i>emacs-devel@gnu.org</i> list which revealed the
somewhat obvious — not everyone uses all available features in Emacs
— if that were even possible.
</p>
<p>
So without further ado, here is a brie list of hidden gems in Emacs as
a teaser — I use many of these on a regular basis, but as you'll see
there are gems that I know of that I haven't managed to integrate
into my workflow, leave alone those gems that I am not even aware of.
</p>
</div>
</div>
<div id="outline-container-org0bc9271" class="outline-2">
<h2 id="org0bc9271"><span class="section-number-2">2.</span> Emacs: Hidden Holiday Gems</h2>
<div class="outline-text-2" id="text-2">
<dl class="org-dl">
<dt>Selective Display</dt><dd>Collapse/Expand content based on
indentation. Useful in browsing code, as well as structured
output from various shell commands.</dd>
<dt>Registers</dt><dd>Quickly save text fragments, buffer locations and
window configurations and restore them easily. I use registers for
saving text fragments, but have never used it as a means to navigate.</dd>
<dt>Bookmarks</dt><dd>Persist various types of locations. Note that
registers can be persisted across Emacs sessions as well.</dd>
<dt>Tabulated Lists</dt><dd>Build up tabulated UIs that behave consistently.</dd>
<dt>Forms Mode</dt><dd>Leverage underlying syntax e.g., field-delimiters, to enable structured
editing via a forms-like interface.</dd>
<dt>Mark Ring</dt><dd>Local and Global mark rings. This is one I've been
aware of for over 30 years but never managed to work into my work-flow.</dd>
<dt>Undo</dt><dd>Both basic and advanced. I myself only use the most
basic form of undo.</dd>
<dt>Dired</dt><dd>Surprisingly not everyone appears to use <i>dired</i>, or at
least as heavily as I expected.</dd>
<dt>Writeable Dired</dt><dd>This became part of Emacs more than a decade
ago — but often remains undiscovered and
under-exploited. Ignorance leads to more complex and error-prone
shell hacks.</dd>
<dt>Org-Mode</dt><dd>Org is often cited as one of the most powerful Emacs
add-ons that makes Emacs attractive to engineers and authors
alike. But the breadth and scope of this package means that not
all of us use all of it. As an example, I use org-mode for all
my writing, but have never used it for todo-list or agenda management.</dd>
<dt>Magit</dt><dd>Another magical gem that I use heavily — but there
are more parts of Magit that I dont use than I use — not due
to any shortcoming in Magit, but more because of the nature of
my typical work-flow vs the myriad work-flows that Git provides
and that Magit makes accessible to the mere mortal.</dd>
<dt>Forge</dt><dd>Interact with Git repositories — a powerful tool where I myself have only scratched the surface.</dd>
<dt>EWW</dt><dd>Hard to believe that <i>shr</i> and <i>eww</i> have now been part
of Emacs for nearly a decade. Though not hidden, they still get
ignored by most users because of the addiction to the
JS-powered Web; EWW does not implement Javascript. But that
shortcoming is a major win, both for efficiency and for
preserving privacy — EWW remains one of the most effective
means of focusing on the real content of Web pages.</dd>
<dt>Elfeed</dt><dd>With EWW for surfacing the content in noisy News
pages, Elfeed provides the complementary functionality of
browsing RSS and Atom Feeds — which together let you focus on
content as opposed to endlessly mnavigating a Web site.</dd>
<dt>GNUS</dt><dd>Gnus remains one of the most powerful email tools, but
its potential as an email-reader often gets overlooked.</dd>
<dt>Tramp</dt><dd>When I first discovered Emacs in Grad School,
<i>ange-ftp</i> for opening files on a remote site was an incredible innovation.
As the Web took over and FTP disappeared, the ability to open
remote files from within Emacs receded into the background —
but that functionality quietly turned into something more
powerful, namely <i>tramp</i>. I myself mostly ignored Tramp until I
discovered about 20 years ago that it was a neat way to edit
files as Root on my laptop; but Tramp really came back into its
own when I started working from home during the pandemic.</dd>
<dt>Eshell</dt><dd>A Shell that is deeply integrated into Emacs. I
believe I would be more productive if I used Eshell all the
time, but despite myself, I'm still using Bash in Emacs
shell-mode!</dd>
<dt>Comint</dt><dd>A Command Interpreter to <i>bind</i> them all! This is a
hidden gem that is a true work-horse when it comes to all Emacs
functionality for interacting with command interpreters. It is a
good example of a mature platform-level affordance, where
<b>Emacs</b> is the platform.</dd>
<dt>Zip Archives</dt><dd>Emacs can open archive files like <i>zip</i>,</dd>
</dl>
<p>
<i>tar.gz</i> and friends and provide an interactive dired-like
interface. It also turns out to be a light-weight way of excavating
XML content from MSFT word-processor files (DocX).
</p>
<dl class="org-dl">
<dt>Calculators</dt><dd>Yes, there is more than 1;-) The built-in
not-so-light-weight <i>calculator</i> and the even more powerful (and
also bundled ) <i>calc</i> package. I still remember the time I was
buying my first home 25+ years ago, and sitting with my
real-estate agent while she educated me on mortgages. She was
looking over my shoulder as I typed in Emacs; what to her looked
like plain text, and what to me was my <i>Scratch</i> Buffer. After
we had considered some options, I typed a few keys to invoke
<i>Calc</i> in <b>embedded-mode</b> and a second later she was looking at
that plain-text display showing the monthly installment for the
mortgage we were discussing!</dd>
</dl>
</div>
</div>
<div id="outline-container-org6f0eda8" class="outline-2">
<h2 id="org6f0eda8"><span class="section-number-2">3.</span> Conclusion</h2>
<div class="outline-text-2" id="text-3">
<ol class="org-ol">
<li>There are clearly a lot more hidden gems than enumerated here;
otherwise they wouldn't be <b>Hidden</b>.</li>
<li>These work best when Emacs provides a cleanly defined platform
that enables the creation of these extensions via Emacs Lisp.</li>
<li>There is an interesting balance between <i>letting a thousand
flowers bloom</i> vs <i>refactoring to create common APIs based on
developer needs</i>. Org is an outstanding example of this, both
with respect to enabling the discovery of such APIs, and an
example of where a good set of platform-level APIs are rich for
plucking; failure to do so means that at present, org-mode is
turning into a platform in its own right atop the Emacs platform.</li>
</ol>
<p>
vHappy Holidays — And Share And Enjoy!
</p>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-71707434143132434292023-11-21T12:14:00.000-08:002023-11-21T12:14:47.578-08:00Announcing Emacspeak 59.0 (VirtualDog)<div id="content" class="content">
<h1 class="title">Announcing Emacspeak 59.0—VirtualDog!</h1>
<div id="org124a4e4" class="figure">
<p><a href="https://tvraman.github.io/tilden-face.jpg" alt="Tilden" height="96" width="59.33"><img src="https://tvraman.github.io/tilden-face.jpg" alt="Tilden" height="96" width="59.33" /></a>
</p>
</div>
<p>
To express oneself well is impactful, but only when one has
something impactful to express! (TVR on Conversational Interfaces)
</p>
<div id="outline-container-org0968c5c" class="outline-2">
<h2 id="org0968c5c"><span class="section-number-2">1.</span> For Immediate Release:</h2>
<div class="outline-text-2" id="text-1">
<p>
San Jose, CA, (November 22, 2023)
</p>
</div>
<div id="outline-container-orgb70489c" class="outline-3">
<h3 id="orgb70489c"><span class="section-number-3">1.1.</span> Emacspeak 59.0 (VirtualDog) Unleashed! 🦮</h3>
<div class="outline-text-3" id="text-1-1">
<p>
— Making Accessible Computing Effortless!
</p>
<p>
Advancing Accessibility In The Age Of User-Aware Interfaces — Zero
cost of Ownership makes priceless software Universally affordable!
</p>
<p>
Emacspeak Inc (NASDOG: ESPK) — <a href="http://github.com/tvraman/emacspeak">http://github.com/tvraman/emacspeak</a>
announces immediate world-wide availability of <a href="https://github.com/tvraman/emacspeak/releases/download/57.0/emacspeak-57.0.tar.bz2">Emacspeak 58.0</a>
(ErgoDog) 🦮 — a non-LLM powered audio desktop that leverages
today's evolving Data, Social and Assistant-Oriented Internet cloud to
enable working efficiently and effectively from anywhere!
</p>
</div>
</div>
</div>
<div id="outline-container-org1c5f25f" class="outline-2">
<h2 id="org1c5f25f"><span class="section-number-2">2.</span> Investors Note:</h2>
<div class="outline-text-2" id="text-2">
<p>
With several prominent tweeters (and mythical elephants) expanding
coverage of <span class="underline">#emacspeak</span>, NASDOG: ESPK has now been consistently
trading over the social net at levels close to that once attained by
DogCom high-fliers—and is trading at levels close to that achieved by
once better known stocks in the tech sector.
</p>
</div>
</div>
<div id="outline-container-org87fe96a" class="outline-2">
<h2 id="org87fe96a"><span class="section-number-2">3.</span> What Is It?</h2>
<div class="outline-text-2" id="text-3">
<p>
Emacspeak is a fully functional audio desktop that provides complete
eyes-free access to all major 32 and 64 bit operating environments. By
seamlessly blending live access to all aspects of the Internet such as
ubiquitous assistance, Web-surfing, blogging, remote software
development, streaming media, social computing and electronic
messaging into the audio desktop, Emacspeak enables spoken access to
local and remote information with a consistent and well-integrated
user interface. A rich suite of task-oriented tools provides efficient
speech-enabled access to the evolving assistant-oriented social
Internet cloud.
</p>
</div>
</div>
<div id="outline-container-org07b2c72" class="outline-2">
<h2 id="org07b2c72"><span class="section-number-2">4.</span> Major Enhancements:</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>Updated Keybindings ⌨</li>
<li>Smart Buffer Selection ⛏</li>
<li>Audio Volume Adjust 🔈</li>
<li>Speech-Rate Adjust🚄</li>
<li>Twitter Support Removed X marks the spot.</li>
<li>BBC Sounds URL Template 📻</li>
<li><a href="https://garfnet.org.uk/cms/2023/10/29/latest-bbc-hls-radio-streams/">BBC
HLS Streams</a> using MPV 📻</li>
<li>ZOxide Integration ⏠ ⏡</li>
<li>emacspeak-pipewire ǁ</li>
</ol>
<p>
— And a lot more than will fit this margin. … 🗞
</p>
<p>
Note: This version <b>requires</b> emacs-29.1 or later.
</p>
</div>
</div>
<div id="outline-container-org7bfa650" class="outline-2">
<h2 id="org7bfa650"><span class="section-number-2">5.</span> Establishing Liberty, Equality And Freedom:</h2>
<div class="outline-text-2" id="text-5">
<p>
Never a toy system, Emacspeak is voluntarily bundled with all
major Linux distributions. Though designed to be modular,
distributors have freely chosen to bundle the fully integrated
system without any undue pressure—a documented success for
the integrated innovation embodied by Emacspeak. As the system
evolves, both upgrades and downgrades continue to be available at
the same zero-cost to all users. The integrity of the Emacspeak
codebase is ensured by the reliable and secure Linux platform
and the underlying GIT versioning software used to develop and distribute the system.
</p>
<p>
Extensive studies have shown that thanks to these features, users
consider Emacspeak to be absolutely priceless. Thanks to this
wide-spread user demand, the present version remains free of cost
as ever—it is being made available at the same zero-cost as
previous releases.
</p>
<p>
At the same time, Emacspeak continues to innovate in the area of
eyes-free Assistance and social interaction and carries forward the
well-established Open Source tradition of introducing user interface
features that eventually show up in luser environments.
</p>
<p>
On this theme, when once challenged by a proponent of a crash-prone
but well-marketed mousetrap with the assertion "Emacs is a system from
the 70's", the creator of Emacspeak evinced surprise at the unusual
candor manifest in the assertion that it would take popular
idiot-proven interfaces until the year 2070 to catch up to where the
Emacspeak audio desktop is today. Industry experts welcomed this
refreshing breath of Courage Certainty and Clarity (CCC) at a time
when users are reeling from the Fear Uncertainty and Doubt (FUD)
unleashed by complex software systems backed by even more convoluted
press releases.
</p>
</div>
</div>
<div id="outline-container-org52fc559" class="outline-2">
<h2 id="org52fc559"><span class="section-number-2">6.</span> Independent Test Results:</h2>
<div class="outline-text-2" id="text-6">
<p>
Independent test results have proven that unlike some modern (and
not so modern) software, Emacspeak can be safely uninstalled without
adversely affecting the continued performance of the computer. These
same tests also revealed that once uninstalled, the user stopped
functioning altogether. Speaking with Aster Labrador, the creator of
Emacspeak once pointed out that these results re-emphasize the
user-centric design of Emacspeak; “It is the user — and not the
computer– that stops functioning when Emacspeak is uninstalled!”.
</p>
</div>
<div id="outline-container-org4e24c50" class="outline-3">
<h3 id="org4e24c50"><span class="section-number-3">6.1.</span> Note from Aster,Bubbles and Tilden:</h3>
<div class="outline-text-3" id="text-6-1">
<p>
UnDoctored Videos Inc. is looking for volunteers to star in a
video demonstrating such complete user failure.
</p>
</div>
</div>
</div>
<div id="outline-container-orgeb0b328" class="outline-2">
<h2 id="orgeb0b328"><span class="section-number-2">7.</span> Obtaining Emacspeak:</h2>
<div class="outline-text-2" id="text-7">
<p>
Emacspeak can be downloaded from GitHub — see
<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a> you can visit Emacspeak on the
WWW at <a href="http://emacspeak.sf.net">http://emacspeak.sf.net</a>. You can subscribe to the emacspeak
mailing list — <a href="http://mail.emacspeak.net">emacspeak@emacspeak.net</a>. The <a href="http://emacspeak.blogspot.com">Emacspeak Blog</a> is a good
source for news about recent enhancements and how to use them.
</p>
<p>
The latest development snapshot of Emacspeak is always available at
<a href="https://github.com/tvraman/emacspeak">GitHub</a>.
</p>
</div>
</div>
<div id="outline-container-org3888f97" class="outline-2">
<h2 id="org3888f97"><span class="section-number-2">8.</span> History:</h2>
<div class="outline-text-2" id="text-8">
<ul class="org-ul">
<li>Emacspeak 59 delivers better ergonomics by minimizing the need for chording, but sadly, with no dog to guide its way.
<ul class="org-ul">
<li>Emacspeak 58 delivers better ergonomics by minimizing the need for chording.</li>
<li>Emacspeak 57.0 is named in honor of <a href="https://tvraman.github.io/tilden-face.jpg">Tilden Labrador</a>.</li>
<li>Emacspeak 56.0 (AgileDog) belies its age to be as agile as Tilden.</li>
<li>Emacspeak 55.0 (CalmDog) attempts to be as calm as Tilden.</li>
<li>Emacspeak 54.0 (EZDog) learns to take it easy from Tilden.</li>
<li>Emacspeak 53.0 (EfficientDog) focuses on efficiency.</li>
<li>Emacspeak 52.0 (WorkAtHomeDog) makes working remotely a pleasurable experience.</li>
<li>Bigger and more powerful than any smart assistAnt, AssistDog provides</li>
</ul></li>
</ul>
<p>
instant access to the most relevant information at all times.
</p>
<ul class="org-ul">
<li>Emacspeak 50.0 (SageDog) embraces the wisdom of stability as
opposed to rapid change and the concomitant creation of bugs.🚭: Naturally Intelligent (NI)™ at how information is spoken, Emacspeak</li>
</ul>
<p>
is entirely free of Artificial Ingredients (AI)™.
</p>
<ul class="org-ul">
<li>Emacspeak 49.0 (WiseDog) leverages the wisdom gleaned from
earlier releases to provide an enhanced auditory experience.</li>
<li>Emacspeak 48.0 (ServiceDog) builds on earlier releases to provide
continued end-user value.</li>
<li>Emacspeak 47.0 (GentleDog) goes the next step in being helpful
while letting users learn and grow.</li>
<li>Emacspeak 46.0 (HelpfulDog) heralds the coming of Smart Assistants.</li>
<li>Emacspeak 45.0 (IdealDog) is named in recognition of Emacs'
excellent integration with various programming language
environments — thanks to this, Emacspeak is the IDE of choice
for eyes-free software engineering.</li>
<li>Emacspeak 44.0 continues the steady pace of innovation on the
audio desktop.</li>
<li>Emacspeak 43.0 brings even more end-user efficiency by leveraging the
ability to spatially place multiple audio streams to provide timely
auditory feedback.</li>
<li>Emacspeak 42.0 while moving to GitHub from Google Code continues to
innovate in the areas of auditory user interfaces and efficient,
light-weight Internet access.</li>
<li>Emacspeak 41.0 continues to improve
on the desire to provide not just equal, but superior access —
technology when correctly implemented can significantly enhance the
human ability.</li>
<li>Emacspeak 40.0 goes back to Web basics by enabling
<a href="http://emacspeak.blogspot.com/2013/11/reading-web-content-efficiently.html">efficient access</a> to large amounts of readable Web content.</li>
<li>Emacspeak 39.0 continues the Emacspeak tradition of increasing the breadth of
user tasks that are covered without introducing unnecessary
bloatware.</li>
<li>Emacspeak 38.0 is the latest in a series of award-winning
releases from Emacspeak Inc.</li>
<li>Emacspeak 37.0 continues the tradition of
delivering robust software as reflected by its code-name.</li>
<li>Emacspeak 36.0 enhances the audio desktop with many new tools including full
EPub support — hence the name EPubDog.</li>
<li>Emacspeak 35.0 is all about
teaching a new dog old tricks — and is aptly code-named HeadDog in
on of our new Press/Analyst contact. emacspeak-34.0 (AKA Bubbles)
established a new beach-head with respect to rapid task completion in
an eyes-free environment.</li>
<li>Emacspeak-33.0 AKA StarDog brings
unparalleled cloud access to the audio desktop.</li>
<li>Emacspeak 32.0 AKA
LuckyDog continues to innovate via open technologies for better
access.</li>
<li>Emacspeak 31.0 AKA TweetDog — adds tweeting to the Emacspeak
desktop.</li>
<li>Emacspeak 30.0 AKA SocialDog brings the Social Web to the
audio desktop—you can't but be social if you speak!</li>
<li>Emacspeak 29.0—AKAAbleDog—is a testament to the resilliance and innovation
embodied by Open Source software—it would not exist without the
thriving Emacs community that continues to ensure that Emacs remains
one of the premier user environments despite perhaps also being one of
the oldest.</li>
<li>Emacspeak 28.0—AKA PuppyDog—exemplifies the rapid pace of
development evinced by Open Source software.</li>
<li>Emacspeak 27.0—AKA
FastDog—is the latest in a sequence of upgrades that make previous
releases obsolete and downgrades unnecessary.</li>
<li>Emacspeak 26—AKA
LeadDog—continues the tradition of introducing innovative access
solutions that are unfettered by the constraints inherent in
traditional adaptive technologies.</li>
<li>Emacspeak 25 —AKA ActiveDog
—re-activates open, unfettered access to online
information.</li>
<li>Emacspeak-Alive —AKA LiveDog —enlivens open, unfettered
information access with a series of live updates that once again
demonstrate the power and agility of open source software
development.</li>
<li>Emacspeak 23.0 — AKA Retriever—went the extra mile in
fetching full access.</li>
<li>Emacspeak 22.0 —AKA GuideDog —helps users
navigate the Web more effectively than ever before.</li>
<li>Emacspeak 21.0
—AKA PlayDog —continued the
Emacspeak tradition of relying on enhanced
productivity to liberate users.</li>
<li>Emacspeak-20.0 —AKA LeapDog —continues
the long established GNU/Emacs tradition of integrated innovation to
create a pleasurable computing environment for eyes-free
interaction.</li>
<li>emacspeak-19.0 –AKA WorkDog– is designed to enhance
user productivity at work and leisure.</li>
<li>Emacspeak-18.0 –code named
GoodDog– continued the Emacspeak tradition of enhancing user
productivity and thereby reducing total cost of
ownership.</li>
<li>Emacspeak-17.0 –code named HappyDog– enhances user
productivity by exploiting today's evolving WWW
standards.</li>
<li>Emacspeak-16.0 –code named CleverDog– the follow-up to
SmartDog– continued the tradition of working better, faster,
smarter.</li>
<li>Emacspeak-15.0 –code named SmartDog–followed up on TopDog
as the next in a continuing series of award-winning audio desktop
releases from Emacspeak Inc.</li>
<li>Emacspeak-14.0 –code named TopDog–was</li>
</ul>
<p>
the first release of this millennium.
</p>
<ul class="org-ul">
<li>Emacspeak-13.0 –codenamed
YellowLab– was the closing release of the
20th. century.</li>
<li>Emacspeak-12.0 –code named GoldenDog– began
leveraging the evolving semantic WWW to provide task-oriented speech
access to Webformation.</li>
<li>Emacspeak-11.0 –code named Aster– went the
final step in making Linux a zero-cost Internet access solution for
blind and visually impaired users.</li>
<li>Emacspeak-10.0 –(AKA
Emacspeak-2000) code named WonderDog– continued the tradition of
award-winning software releases designed to make eyes-free computing a
productive and pleasurable experience.</li>
<li>Emacspeak-9.0 –(AKA
Emacspeak 99) code named BlackLab– continued to innovate in the areas
of speech interaction and interactive accessibility.</li>
<li>Emacspeak-8.0 –(AKA Emacspeak-98++) code named BlackDog– was a major upgrade to
the speech output extension to Emacs.</li>
<li>Emacspeak-95 (code named Illinois) was released as OpenSource on
the Internet in May 1995 as the first complete speech interface
to UNIX workstations. The subsequent release, Emacspeak-96 (code
named Egypt) made available in May 1996 provided significant
enhancements to the interface. Emacspeak-97 (Tennessee) went
further in providing a true audio desktop. Emacspeak-98
integrated Internetworking into all aspects of the audio desktop
to provide the first fully interactive speech-enabled WebTop.</li>
</ul>
</div>
</div>
<div id="outline-container-org6e82691" class="outline-2">
<h2 id="org6e82691"><span class="section-number-2">9.</span> About Emacspeak:</h2>
<div class="outline-text-2" id="text-9">
<p>
Originally based at Cornell (NY) —
<a href="http://www.cs.cornell.edu/home/raman">http://www.cs.cornell.edu/home/raman</a> —home to Auditory User
Interfaces (AUI) on the WWW, Emacspeak is now maintained on GitHub
—<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a>. The system is mirrored
world-wide by an international network of software archives and
bundled voluntarily with all major Linux distributions. On Monday,
April 12, 1999, Emacspeak became part of the <a href="http://tvraman.github.io/emacspeak/blog/smithsonian-study.html">Smithsonian's Permanent
Research Collection</a> on Information Technology at the Smithsonian's
National Museum of American History.
</p>
<p>
The Emacspeak mailing list is archived at
<a href="https://www.emacspeak.net">Emacspeak Mail Archive</a> –the home of the
Emacspeak mailing list– thanks to Greg Priest-Dorman, and provides a
valuable knowledge base for new users.
</p>
</div>
</div>
<div id="outline-container-org2331c32" class="outline-2">
<h2 id="org2331c32"><span class="section-number-2">10.</span> Press/Analyst Contact: Tilden Labrador</h2>
<div class="outline-text-2" id="text-10">
<p>
Going forward, Aster, Hubbell and Tilden acknowledge their exclusive monopoly on
setting the direction of the Emacspeak Audio Desktop (🦮) and
promise to exercise their freedom to innovate and her resulting
power responsibly (as before) in the interest of all dogs.
</p>
<p>
*About This Release:
</p>
<hr />
<p>
Windows-Free (WF) is a favorite battle-cry of The League Against
Forced Fenestration (LAFF). –see
<a href="http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm">http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm</a> for details on
the ill-effects of Forced Fenestration.
</p>
<p>
CopyWrite )C( Aster, Hubbell and Tilden Labrador. All Writes Reserved.
HeadDog (DM), LiveDog (DM), GoldenDog (DM), BlackDog (DM) etc., are Registered
Dogmarks of Aster, Hubbell and Tilden Labrador. All other dogs belong to
their respective owners.
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: T.V Raman</p>
<p class="date">Created: 2023-11-18 Sat 07:56</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-65798632827970381342023-09-26T08:34:00.002-07:002023-09-26T08:34:57.115-07:00Together: The Old And New Work Much Better!<div id="content" class="content">
<h1 class="title">Together: The Old And New Are Much Better!</h1>
<div id="outline-container-org589c8be" class="outline-2">
<h2 id="org589c8be"><span class="section-number-2">1.</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
Emacs has had long-standing features like <code>outline-mode</code> and
<code>outline-minor-mode</code> that often get forgotten in the face of newer
affordances like <code>org-mode</code>. At the same time, Emacs continues to
acquire new features — in this article, I am specifically alluding
to <code>repeat-mode</code>. The combinatorial explosion that is the result of
the various ways of bringing these together is mind-boggling — and
often the result is that one fails to take advantage of what has
become possible. The result is that one ends up sticking to one's
long-established habits at the risk of failing to significantly
enhance one's productivity.
</p>
</div>
</div>
<div id="outline-container-orgaac66c5" class="outline-2">
<h2 id="orgaac66c5"><span class="section-number-2">2.</span> Background</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li>Structured navigation is a significant productivity enhancer —
especially in my case since I rely exclusively on an auditory interface.</li>
<li>The above applies to both textual documents and programming source.</li>
<li>Starting all the way back in 1991, I started using <code>folding-mode</code>
to organize code into hierarchical containers that could be
expanded and collapsed; and this is what makes Emacs' eco-system
amazing; <code>folding-mode</code> still works and is available on melpa in 2023.</li>
<li>About a year ago one of the Emacs maintainers (Stefan Mounier)
helped me update portions of Emacspeak, and in the process pointed
out that I could just use <code>outline-minor-mode</code> to expand and
collapse sections of code in <code>.el</code> files.</li>
<li>At the time I filed this away for <i>later use</i> — I was still
reluctant to abandon the 30+ year investment in <code>folding-mode</code>.</li>
<li>About a year ago, I discovered <code>repeat-mode</code> in Emacs and started
leveraging it for everything — including <code>outline-mode</code> and
<code>org-mode</code> amongst others.</li>
<li>Despite the years of investment in <code>folding-mode</code>, it had one
drawback; keeping the <i>fold-marks</i> (special comments) in sync was
always a bit of a hastle.
<ul class="org-ul">
<li><p>
Bringing The Old And New Together
</p>
<p>
This week I brought all of the above context together to:
</p></li>
</ul></li>
<li>Cut over the Emacspeak codebase to stop using <code>folding-mode</code>.</li>
<li>Turning the <span class="underline">fold-marks</span> to comments that <code>outline-minor-mode</code>
understood was a trivial application of my <a href="https://github.com/tvraman/emacspeak/blob/master/etc/typo.pl#L1">typo.pl</a>Perl script.</li>
<li>I had already set up Emacspeak to use <code>repeat-mode</code> for the
various outline modes.</li>
<li>Another annoyance with <code>outline</code> that I had fixed over 20+ years
ago was to pick an easier to press prefix-key for <code>outline</code>; I use
<span class="underline">C-o</span>.</li>
</ul>
</div>
</div>
<div id="outline-container-org925e227" class="outline-2">
<h2 id="org925e227"><span class="section-number-2">3.</span> The Resulting Experience</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li>I can now skim the Emacspeak sources (as well as the Emacs
sources of course) with very few keystrokes.</li>
<li>Example: Pressing <span class="underline">C-o C-n</span> navigates by section headings; when
skimming, I only need to press <span class="underline">C-o</span> the first time thanks to
<code>repeat-mode</code>.</li>
<li>I also bound <span class="underline">j</span> and <span class="underline">k</span> in the outline-mode keymaps to avoid
having to chord when skimming — <span class="underline">j</span> is easier to press than <span class="underline">C-n</span>.</li>
</ul>
</div>
</div>
<div id="outline-container-org44a3e17" class="outline-2">
<h2 id="org44a3e17"><span class="section-number-2">4.</span> For The Future</h2>
<div class="outline-text-2" id="text-4">
<ul class="org-ul">
<li>Would be nice to enhance <code>outline-minor-mode</code> to understand
sectioning comments in other programming languages.
<ul class="org-ul">
<li>The annoyance with the default (and unusable) prefix key for the
outline modes needs to fix in Emacs core.</li>
</ul></li>
</ul>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-78161697499676435012023-09-16T10:08:00.000-07:002023-09-16T10:08:02.278-07:00Augment With Zoxide<div id="content" class="content">
<h1 class="title">Augmenting Emacs With ZOxide For Efficient File System Navigation</h1>
<div id="outline-container-orgd598038" class="outline-2">
<h2 id="orgd598038"><span class="section-number-2">1.</span> Background</h2>
<div class="outline-text-2" id="text-1">
<p>
Emacs has no shortage of multiple built-in means of navigating the
file system with smart, context-sensitive and fuzzy completion. That
said, there is one tool outside Emacs I have discovered in the last six
months that brings something extra — <a href="https://github.com/ajeetdsouza/zoxide">Zoxide</a>, a smarter <span class="underline">cd</span> built in
Rust.
</p>
</div>
</div>
<div id="outline-container-org72a30ff" class="outline-2">
<h2 id="org72a30ff"><span class="section-number-2">2.</span> Default Usage</h2>
<div class="outline-text-2" id="text-2">
<p>
Once installed, <span class="underline">zoxide</span> works well in Emacs shells, as well as at
terminals inside or outside Emacs. Read the <span class="underline">zoxide</span> docs for more
details, but in a nutshell, this tool remembers directories you work
in, and lets you jump to them by typing short, unique substrings.
</p>
</div>
</div>
<div id="outline-container-orgbf8abf6" class="outline-2">
<h2 id="orgbf8abf6"><span class="section-number-2">3.</span> Working In Emacs</h2>
<div class="outline-text-2" id="text-3">
<p>
So with <span class="underline">zoxide</span> installed, you can:
</p>
<ol class="org-ol">
<li>Switch to a shell buffer,</li>
<li>Execute a <span class="underline">zoxide</span> navigation command, e.g., <span class="underline">z <pattern></span>.</li>
<li><p>
Once there, you can easily open files, launch <span class="underline">dired</span> etc.
</p>
<p>
But given that opening <span class="underline">dired</span> on that target is what I often
want, the above work-flow still involved two steps too many. So
in typical Emacs fashion, I wrote a short function that
short-circuits this process
</p></li>
</ol>
</div>
</div>
<div id="outline-container-orgc58cf4f" class="outline-2">
<h2 id="orgc58cf4f"><span class="section-number-2">4.</span> Command: <code>emacspeak-zoxide</code></h2>
<div class="outline-text-2" id="text-4">
<p>
Note: there is nothing emacspeak specific in what follows.
</p>
<ol class="org-ol">
<li>Interactive command <a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-wizards.el#start-of-content">emacspeak-zoxide</a> prompts for a pattern,
then launches <code>dired</code> on the <span class="underline">zoxide</span> result.</li>
<li>It uses <code>if-let</code> to advantage:
<ul class="org-ul">
<li>If <span class="underline">zoxide</span> is installed,and</li>
<li>There is a <span class="underline">zoxide</span> result for the specified query,</li>
<li>Launch <code>dired</code> on that directory.</li>
<li>Else, signal the appropriate error.</li>
<li>Notice that <code>if-let</code> expresses this clearly.</li>
</ul></li>
</ol>
<div class="org-src-container">
<pre class="src src-emacs-list">(defun emacspeak-zoxide (q)
"Query zoxide and launch dired.
Shell Utility zoxide --- implemented in Rust --- lets you jump to
directories that are used often.
This command does for Emacs, what zoxide does at the shell."
(interactive "sZoxide:")
(if-let
((zoxide (executable-find "zoxide"))
(target
(with-temp-buffer
(if (= 0 (call-process zoxide nil t nil "query" q))
(string-trim (buffer-string))))))
(funcall-interactively #'dired target)
(unless zoxide (error "Install zoxide"))
(unless target (error "No Match"))))
</pre>
</div>
<p>
In my setup, i bind this to <span class="underline">C-; j</span> which is
convenient to press and is a mnemonic for <code>jump</code>.
</p>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-7469131574045815802023-09-08T08:57:00.002-07:002023-09-08T08:57:39.478-07:00Return To Control_Right Using XModmap And XCape<div id="content" class="content">
<h1 class="title">return to control-right using xmodmap and xcape</h1>
<div id="outline-container-org26112df" class="outline-2">
<h2 id="org26112df"><span class="section-number-2">1.</span> background</h2>
<div class="outline-text-2" id="text-1">
<p>
see previous article on
<a href="https://emacspeak.blogspot.com/2023/09/emacs-ergonomics-dont-punish-your.html">dont
punish your finger tips</a> that described how to minimize chording in
emacs. that article alluded to possibly using <span class="underline">return</span> as an
additional <span class="underline">control<sub>right</sub></span> key; this article describes the
implementation and things i discovered in setting it up.
</p>
<p>
the design described here was discovered by <a href="https://www.google.com/search?q=return+control%5fr+xmodmap+xcape&num=25">this google search</a>.
</p>
</div>
</div>
<div id="outline-container-org95477e4" class="outline-2">
<h2 id="org95477e4"><span class="section-number-2">2.</span> overview of changes</h2>
<div class="outline-text-2" id="text-2">
</div>
<div id="outline-container-org48cb184" class="outline-3">
<h3 id="org48cb184"><span class="section-number-3">2.1.</span> xmodmap</h3>
<div class="outline-text-3" id="text-2-1">
<p>
add the following stanza to your xmodmap file to set up the needed
keys:
</p>
<pre class="example">
! ret as ctrl_r
remove control = control_r
keycode 0x69 = return
keycode 0x24 = control_r
add control = control_r
</pre>
</div>
</div>
<div id="outline-container-org9508184" class="outline-3">
<h3 id="org9508184"><span class="section-number-3">2.2.</span> xcape</h3>
<div class="outline-text-3" id="text-2-2">
<p>
next, have xcape emit <span class="underline">control<sub>r</sub></span> when <span class="underline">return</span> is held down:
</p>
<pre class="example">
control_r=return;\
</pre>
<p>
you can find the complete implementation below:
</p>
<ul class="org-ul">
<li><a href="https://github.com/tvraman/emacspeak/blob/master/stumpwm/xmodmap#l11">xmodmap</a> setup.</li>
<li><a href="https://github.com/tvraman/emacspeak/blob/master/tvr/xcape.sh#l21">xcape setup</a>.</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org79a0a89" class="outline-2">
<h2 id="org79a0a89"><span class="section-number-2">3.</span> lessons learn</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li>1. the above works — i can now hold down <span class="underline">return</span> with my
right hand when hitting keys like <span class="underline">a</span> with my left; this makes
my fingers happy.</li>
<li>one issue that i failed to fix — though unimportant except for
my curiosity:</li>
<li>the <span class="underline">control<sub>r</sub></span> key on my laptop has now turned into a <span class="underline">return</span>
key, it produces <span class="underline">return</span> in <b>all cases</b>, i.e., whether tapped or
held-down.</li>
<li>i still continue to find xmodmap confusing — though that is
likely my fault, and not that of xmodmap.</li>
</ul>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="date">date: 2023-09-08 fri 00:00</p>
<p class="author">author: t.v raman</p>
<p class="date">created: 2023-09-08 fri 08:54</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">validate</a></p>
</div> T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-33299321900316517522023-09-02T19:34:00.001-07:002023-09-02T19:34:27.040-07:00Emacs Ergonomics: Dont Punish Your Finger Tips<div id="content" class="content">
<h1 class="title">Emacs Ergonomics: Dont Punish Your Finger Tips</h1>
<div id="outline-container-org099d12d" class="outline-2">
<h2 id="org099d12d"><span class="section-number-2">1.</span> Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
A collection of keybinding changes I have arrived at over time to
protect my fingers.Note that I have now used Emacs for more than 33
years, and some of these changes may well have helped me much earlier;
on the other hand, I likely didn't notice these issues because my
hands then were not the same as what they are now.
</p>
<p>
See earlier articles on this topic for context:
</p>
<ul class="org-ul">
<li><a href="https://emacspeak.blogspot.com/2023/02/enhance-emacs-ergonomics-under-x-happy.html">Minimize chording using XCape</a></li>
<li><a href="https://emacspeak.blogspot.com/2023/07/ergonomic-buffer-selection-on-emacs.html">Ergonomic Buffer Selection</a></li>
</ul>
<p>
So to summarize, my Emacs uses:
</p>
<ol class="org-ol">
<li><b>CapsLock</b> as <i>Control</i>.</li>
<li>Using XCape, quickly releasing <i>Control</i> emits <i>C-e</i> — the
eEmacspeak prefix-key.</li>
</ol>
</div>
</div>
<div id="outline-container-orgd0e879a" class="outline-2">
<h2 id="orgd0e879a"><span class="section-number-2">2.</span> Next, Some Finger Tips</h2>
<div class="outline-text-2" id="text-2">
<p>
Note: I'm not a trained ergonomist; the following are observations
based on my experience and may not apply to everyone; I suspect the
size of one's hands, the width of the keyboard etc., all matter. For
the last 3+ years, I've exclusively used a laptop keyboard, in my case
a Lenovo.
</p>
<ol class="org-ol">
<li>I now find that replacing key-chords by a sequence of non-chords
makes my hands happier. The trick is to replace a chord by no
more than 2 keys.</li>
<li>Since Caps lock (left pinky) is my <i>Control</i> key, <i>C-s</i> is not
as nice as <i>C-l</i>; notice that the former requires chording with
two fingres of the same hand, whereas the lattre spreads the work
among both hands on an English <span class="underline">qwerty</span> keyboard.</li>
<li>One work-around for the above might be to have <span class="underline">RET</span> emit
<i>Control</i> if held down, but I haven't done that (yet).</li>
<li>On the left-hand, chords that require extending or scrunching
one's fingres when hitting a chord are more painful. Thus, <i>C-z</i>
and <i>C-x</i> are more painful to hit than <i>C-d</i>. Emacs hardly uses
<i>C-z</i> and <i>C-c</i>; but unfortunately, <i>C-x</i> is an important prefix key in
stock Emacs.</li>
</ol>
</div>
</div>
<div id="outline-container-org7154a32" class="outline-2">
<h2 id="org7154a32"><span class="section-number-2">3.</span> Now For The Finger Tips</h2>
<div class="outline-text-2" id="text-3">
<ol class="org-ol">
<li>I have <i>left-shift</i> and <i>right-shift</i> emit <i>C-s</i> and <i>C-r</i>
using XCape.</li>
<li>I bound <i>C-l</i> to <span class="underline">ctl-x-map</span> (still experimental). This remapping
fails to take effect in places like <i>Dired</i> and <i>Gnus</i>.</li>
<li>I additionallly bound <i>find-file</i> to <i>C-; o</i>.</li>
<li>A long time ago, I discovered <i>M-m</i> (back-to-indentation) and I
never hit <i>C-a</i> to move to the start of the line.</li>
<li>When I remap things, I <b>never</b> take away the original Emacs
bindings; I only provide alternatives.</li>
<li>I use <i>C-,</i>, <i>C-.</i>, <i>C-;</i>, and <i>C-'</i> as prefix keys. Downside:
these only work under X, but the time where I only ran Emacs in a
terminal are long gone.</li>
</ol>
<p>
See my
<a href="https://github.com/tvraman/emacspeak/blob/master/tvr/emacs-startup.el#L245">Emacs</a> Startup File
for the setup.
</p>
</div>
</div>
<div id="outline-container-org750d581" class="outline-2">
<h2 id="org750d581"><span class="section-number-2">4.</span> Conclusion</h2>
<div class="outline-text-2" id="text-4">
<p>
There's likely a lot more to be discovered in this context; time will
reveal all!
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="date">Date: 2023-09-01 Fri 00:00</p>
<p class="author">Author: T.V Raman</p>
<p class="date">Created: 2023-09-02 Sat 19:28</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-19161152422824149522023-07-14T20:56:00.002-07:002023-07-14T20:56:31.423-07:00Ergonomic Buffer Selection On The Emacs Audio Desktop<div id="content" class="content">
<h1 class="title">An Ergonomic Buffer Select With Minimal Chording</h1>
<div id="outline-container-orgd09ebf6" class="outline-2">
<h2 id="orgd09ebf6"><span class="section-number-2">1.</span> Background</h2>
<div class="outline-text-2" id="text-1">
<p>
Buffers are central to Emacs as is evinced by the various
buffer-selection schemes that have been created over time. As someone
who has lived for over 30 years in Emacs, my own set of
buffer-selection tools have evolved and I've settled on a combination
of <i>ido</i> and <i>fuzzy matching</i> over the last few years. This article
describes a new tool that puts all of these together, but with an emphasis on
ergonomics and minimized chording.
</p>
</div>
</div>
<div id="outline-container-org7ab045c" class="outline-2">
<h2 id="org7ab045c"><span class="section-number-2">2.</span> Setting The Context</h2>
<div class="outline-text-2" id="text-2">
<p>
Buffer selection tools in Emacs vary along the following feature axis,
with many providing enhancements on one ore of these axis:
</p>
<ul class="org-ul">
<li>Match Strategy: Selecting the buffer name from the available choices,</li>
<li>UI: Displaying those matches,</li>
<li><p>
And finally displaying the buffer.
</p>
<p>
Command <i>emacspeak-buffer-select</i> focuses exclusively on invocation
and keyboard commands for moving through the choices and selecting
the buffer.
</p>
<ul class="org-ul">
<li><p>
So Why Is Ido Not Sufficient?
</p>
<p>
Package <i>ido</i> is still my tool of choice and has served me well
over the years. The problem <i>emacspeak-buffer-select</i> solves is along the
invocation axis; it can be traced back to my desire to avoid
chording, and in that context, I found that <span class="underline">C-x b</span> was becoming
particularly irksome. The solution described below is
specifically optimized to my current configuration using
</p></li>
</ul></li>
</ul>
<p>
<a href="https://emacspeak.blogspot.com/2023/02/enhance-emacs-ergonomics-under-x-happy.html">XCape</a>, where a single tap on the <span class="underline">CTRL/Caps<sub>Lock</sub></span> key produces
Emacspeak prefix <span class="underline">C-e</span>.
</p>
</div>
</div>
<div id="outline-container-orgb07cca2" class="outline-2">
<h2 id="orgb07cca2"><span class="section-number-2">3.</span> Design Goals</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li>No chording.</li>
<li>Enable moving through list of buffers with pairs of related keys.</li>
<li>Enable various types of ordering of the available choices e.g.,
navigate by major-mode.</li>
<li>In the spirit of <i>ido</i>, enable falling through to
<span class="underline">switch-to-buffer</span> and <span class="underline">find-file</span> when needed.</li>
<li>Following on from above, enable relevant actions like killing buffers.</li>
</ul>
</div>
</div>
<div id="outline-container-org899800d" class="outline-2">
<h2 id="org899800d"><span class="section-number-2">4.</span> Use <span class="underline">set-transient-map</span> To Implement The Behavior</h2>
<div class="outline-text-2" id="text-4">
<p>
In the past I would have implemented the above using package <i>hydra</i>
or <i>transient</i>; But both felt overweight for this case. My final
solution uses Emacs builtin <span class="underline">set-transient-map</span>.
</p>
</div>
</div>
<div id="outline-container-orgd20f30a" class="outline-2">
<h2 id="orgd20f30a"><span class="section-number-2">5.</span> Final Behavior</h2>
<div class="outline-text-2" id="text-5">
<ul class="org-ul">
<li>Command <span class="underline">emacspeak-buffer-select</span> is invoked via keys <span class="underline">C-e ,</span>,
<span class="underline">C-e .</span>, <span class="underline">C-e n</span>, and <span class="underline">C-e p</span>.</li>
<li>That command moves to the <b>next/previous</b> buffer.</li>
<li>The key pair <span class="underline">, .</span> use Emacs commands <span class="underline">previous-buffer</span> and
<span class="underline">next-buffer</span>; keys <span class="underline">n</span> and <span class="underline">p</span> pick the previous or next buffer
that uses the current buffer's major-mode.</li>
<li>In addition, while active, the transient-map binds:
<ul class="org-ul">
<li>b: _switch-to-buffer</li>
<li>k: <span class="underline">kill-buffer</span></li>
<li>o: <span class="underline">other-window</span></li>
</ul></li>
</ul>
<p>
With the above in place, my most common workflows look like:
</p>
<ul class="org-ul">
<li>Press <span class="underline">,</span> or <span class="underline">.</span> repeatedly to cycles through next/previous buffers.</li>
<li>Press <span class="underline">n</span> or <span class="underline">p</span> repeatedly to cycle through buffers in the same
mode, especially useful when programming, or using EWW to browse
the Web.</li>
<li>Press <span class="underline">b</span> or <span class="underline">f</span> when cycling doesn't yield the target in a couple of steps.</li>
<li>Opportunistically clean up unwanted buffers by pressing <span class="underline">k</span>.</li>
</ul>
<p>
You can see the final implementation at <a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-speak.el#L2839">emacspeak-buffer-select</a>. Note
that despite the naming there is little that is specific to Emacspeak
in the above.
</p>
</div>
<div id="outline-container-org198cdda" class="outline-3">
<h3 id="org198cdda"><span class="section-number-3">5.1.</span> Emacspeak Specific Features</h3>
<div class="outline-text-3" id="text-5-1">
<ul class="org-ul">
<li>Uses Auditory icons to indicate that a transient map is active.</li>
<li>Produces an auditory icon when the transient map goes away</li>
<li>Uses <span class="underline">call-interactively</span> to invoke subcommands so that they
automatically produce auditory feedback via Emacspeak.</li>
</ul>
</div>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-54154141256147304512023-05-03T11:45:00.002-07:002023-05-03T11:45:33.305-07:00Emacspeak 58.0 (ErgoDog) Unleashed<div id="content" class="content">
<h1 class="title">Announcing Emacspeak 58.0—ErgoDog!</h1>
<div id="org7e5c305" class="figure">
<p><a href="https://tvraman.github.io/tilden-face.jpg" alt="Tilden" height="96" width="59.33"><img src="https://tvraman.github.io/tilden-face.jpg" alt="Tilden" height="96" width="59.33" /></a>
</p>
</div>
<p>
To express oneself well is impactful, but only when one has
something impactful to express! (TVR on Conversational Interfaces)
</p>
<div id="outline-container-org11880b3" class="outline-2">
<h2 id="org11880b3"><span class="section-number-2">1.</span> For Immediate Release:</h2>
<div class="outline-text-2" id="text-1">
<p>
San Jose, CA, (May 4, 2023)
</p>
</div>
<div id="outline-container-org5d54451" class="outline-3">
<h3 id="org5d54451"><span class="section-number-3">1.1.</span> Emacspeak 58.0 (ErgoDog) Unleashed! 🦮</h3>
<div class="outline-text-3" id="text-1-1">
<p>
— Making Accessible Computing Effortless!
</p>
<p>
Advancing Accessibility In The Age Of User-Aware Interfaces — Zero
cost of Ownership makes priceless software Universally affordable!
</p>
<p>
Emacspeak Inc (NASDOG: ESPK) — <a href="http://github.com/tvraman/emacspeak">http://github.com/tvraman/emacspeak</a>
announces immediate world-wide availability of <a href="https://github.com/tvraman/emacspeak/releases/download/57.0/emacspeak-57.0.tar.bz2">Emacspeak 58.0</a>
(ErgoDog) 🦮 — a powerful audio desktop that leverages today's
evolving Data, Social and Assistant-Oriented Internet cloud to enable
working efficiently and effectively from anywhere!
</p>
</div>
</div>
</div>
<div id="outline-container-org845efc6" class="outline-2">
<h2 id="org845efc6"><span class="section-number-2">2.</span> Investors Note:</h2>
<div class="outline-text-2" id="text-2">
<p>
With several prominent tweeters (and mythical elephants) expanding
coverage of <span class="underline">#emacspeak</span>, NASDOG: ESPK has now been consistently
trading over the social net at levels close to that once attained by
DogCom high-fliers—and is trading at levels close to that achieved by
once better known stocks in the tech sector.
</p>
</div>
</div>
<div id="outline-container-org08a00ed" class="outline-2">
<h2 id="org08a00ed"><span class="section-number-2">3.</span> What Is It?</h2>
<div class="outline-text-2" id="text-3">
<p>
Emacspeak is a fully functional audio desktop that provides complete
eyes-free access to all major 32 and 64 bit operating environments. By
seamlessly blending live access to all aspects of the Internet such as
ubiquitous assistance, Web-surfing, blogging, remote software
development, social computing and electronic messaging into the audio
desktop, Emacspeak enables spoken access to local and remote
information with a consistent and well-integrated user interface. A
rich suite of task-oriented tools provides efficient speech-enabled
access to the evolving assistant-oriented social Internet cloud.
</p>
</div>
</div>
<div id="outline-container-org923bf90" class="outline-2">
<h2 id="org923bf90"><span class="section-number-2">4.</span> Major Enhancements:</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li><a href="https://emacspeak.blogspot.com/2022/12/aster-spoken-math-on-emacspeak-audio_21.html">AsTeR</a>: Audio System For Technical Readings. 🦮</li>
<li>Updated Keybindings for better <a href="https://emacspeak.blogspot.com/2023/02/enhance-emacs-ergonomics-under-x-happy.html">ergonomics</a>. ⌨</li>
<li>Speech-Enable Package Devdocs. 🗎</li>
<li>Speech-Enable <code>empv</code>. 📺</li>
<li>Speech-Enable Treesitter Navigation. 🐒</li>
<li>Speech-Enable Tabulated-List-Mode. ␋</li>
<li>Speech-Enable FFIP — find file in project. 📁</li>
<li>Speech-Enable EXWM Emacs Window Manager. 🪟</li>
<li>Audio Marks (AMarks). 🔉</li>
<li>Search Wizards. 🪄</li>
<li><p>
Media History browser. ℗
</p>
<p>
— And a lot more than will fit this margin. … 🗞
</p></li>
</ol>
<p>
Note: This version <b>requires</b> emacs-28.2 or later.
</p>
</div>
</div>
<div id="outline-container-orgcd9b218" class="outline-2">
<h2 id="orgcd9b218"><span class="section-number-2">5.</span> Establishing Liberty, Equality And Freedom:</h2>
<div class="outline-text-2" id="text-5">
<p>
Never a toy system, Emacspeak is voluntarily bundled with all
major Linux distributions. Though designed to be modular,
distributors have freely chosen to bundle the fully integrated
system without any undue pressure—a documented success for
the integrated innovation embodied by Emacspeak. As the system
evolves, both upgrades and downgrades continue to be available at
the same zero-cost to all users. The integrity of the Emacspeak
codebase is ensured by the reliable and secure Linux platform
and the underlying GIT versioning software used to develop and distribute the system.
</p>
<p>
Extensive studies have shown that thanks to these features, users
consider Emacspeak to be absolutely priceless. Thanks to this
wide-spread user demand, the present version remains free of cost
as ever—it is being made available at the same zero-cost as
previous releases.
</p>
<p>
At the same time, Emacspeak continues to innovate in the area of
eyes-free Assistance and social interaction and carries forward the
well-established Open Source tradition of introducing user interface
features that eventually show up in luser environments.
</p>
<p>
On this theme, when once challenged by a proponent of a crash-prone
but well-marketed mousetrap with the assertion "Emacs is a system from
the 70's", the creator of Emacspeak evinced surprise at the unusual
candor manifest in the assertion that it would take popular
idiot-proven interfaces until the year 2070 to catch up to where the
Emacspeak audio desktop is today. Industry experts welcomed this
refreshing breath of Courage Certainty and Clarity (CCC) at a time
when users are reeling from the Fear Uncertainty and Doubt (FUD)
unleashed by complex software systems backed by even more convoluted
press releases.
</p>
</div>
</div>
<div id="outline-container-orgda47619" class="outline-2">
<h2 id="orgda47619"><span class="section-number-2">6.</span> Independent Test Results:</h2>
<div class="outline-text-2" id="text-6">
<p>
Independent test results have proven that unlike some modern (and
not so modern) software, Emacspeak can be safely uninstalled without
adversely affecting the continued performance of the computer. These
same tests also revealed that once uninstalled, the user stopped
functioning altogether. Speaking with Aster Labrador, the creator of
Emacspeak once pointed out that these results re-emphasize the
user-centric design of Emacspeak; “It is the user — and not the
computer– that stops functioning when Emacspeak is uninstalled!”.
</p>
</div>
<div id="outline-container-orgba59c61" class="outline-3">
<h3 id="orgba59c61"><span class="section-number-3">6.1.</span> Note from Aster,Bubbles and Tilden:</h3>
<div class="outline-text-3" id="text-6-1">
<p>
UnDoctored Videos Inc. is looking for volunteers to star in a
video demonstrating such complete user failure.
</p>
</div>
</div>
</div>
<div id="outline-container-org37d886c" class="outline-2">
<h2 id="org37d886c"><span class="section-number-2">7.</span> Obtaining Emacspeak:</h2>
<div class="outline-text-2" id="text-7">
<p>
Emacspeak can be downloaded from GitHub — see
<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a> you can visit Emacspeak on the
WWW at <a href="http://emacspeak.sf.net">http://emacspeak.sf.net</a>. You can subscribe to the emacspeak
mailing list — <a href="http://mail.emacspeak.org">emacspeak@emacspeak.org</a>. The <a href="http://emacspeak.blogspot.com">Emacspeak Blog</a> is a good
source for news about recent enhancements and how to use them.
</p>
<p>
The latest development snapshot of Emacspeak is always available at
<a href="https://github.com/tvraman/emacspeak">GitHub</a>.
</p>
</div>
</div>
<div id="outline-container-org5c63405" class="outline-2">
<h2 id="org5c63405"><span class="section-number-2">8.</span> History:</h2>
<div class="outline-text-2" id="text-8">
<ul class="org-ul">
<li>Emacspeak 58 delivers better ergonomics by minimizing the need for chording.</li>
<li>Emacspeak 57.0 is named in honor of <a href="https://tvraman.github.io/tilden-face.jpg">Tilden Labrador</a>.</li>
<li>Emacspeak 56.0 (AgileDog) belies its age to be as agile as Tilden.</li>
<li>Emacspeak 55.0 (CalmDog) attempts to be as calm as Tilden.</li>
<li>Emacspeak 54.0 (EZDog) learns to take it easy from Tilden.</li>
<li>Emacspeak 53.0 (EfficientDog) focuses on efficiency.</li>
<li>Emacspeak 52.0 (WorkAtHomeDog) makes working remotely a pleasurable experience.</li>
<li>Bigger and more powerful than any smart assistAnt, AssistDog provides</li>
</ul>
<p>
instant access to the most relevant information at all times.
</p>
<ul class="org-ul">
<li>Emacspeak 50.0 (SageDog) embraces the wisdom of stability as
opposed to rapid change and the concomitant creation of bugs.🚭: Naturally Intelligent (NI)™ at how information is spoken, Emacspeak</li>
</ul>
<p>
is entirely free of Artificial Ingredients (AI)™.
</p>
<ul class="org-ul">
<li>Emacspeak 49.0 (WiseDog) leverages the wisdom gleaned from
earlier releases to provide an enhanced auditory experience.</li>
<li>Emacspeak 48.0 (ServiceDog) builds on earlier releases to provide
continued end-user value.</li>
<li>Emacspeak 47.0 (GentleDog) goes the next step in being helpful
while letting users learn and grow.</li>
<li>Emacspeak 46.0 (HelpfulDog) heralds the coming of Smart Assistants.</li>
<li>Emacspeak 45.0 (IdealDog) is named in recognition of Emacs'
excellent integration with various programming language
environments — thanks to this, Emacspeak is the IDE of choice
for eyes-free software engineering.</li>
<li>Emacspeak 44.0 continues the steady pace of innovation on the
audio desktop.</li>
<li>Emacspeak 43.0 brings even more end-user efficiency by leveraging the
ability to spatially place multiple audio streams to provide timely
auditory feedback.</li>
<li>Emacspeak 42.0 while moving to GitHub from Google Code continues to
innovate in the areas of auditory user interfaces and efficient,
light-weight Internet access.</li>
<li>Emacspeak 41.0 continues to improve
on the desire to provide not just equal, but superior access —
technology when correctly implemented can significantly enhance the
human ability.</li>
<li>Emacspeak 40.0 goes back to Web basics by enabling
<a href="http://emacspeak.blogspot.com/2013/11/reading-web-content-efficiently.html">efficient access</a> to large amounts of readable Web content.</li>
<li>Emacspeak 39.0 continues the Emacspeak tradition of increasing the breadth of
user tasks that are covered without introducing unnecessary
bloatware.</li>
<li>Emacspeak 38.0 is the latest in a series of award-winning
releases from Emacspeak Inc.</li>
<li>Emacspeak 37.0 continues the tradition of
delivering robust software as reflected by its code-name.</li>
<li>Emacspeak 36.0 enhances the audio desktop with many new tools including full
EPub support — hence the name EPubDog.</li>
<li>Emacspeak 35.0 is all about
teaching a new dog old tricks — and is aptly code-named HeadDog in
on of our new Press/Analyst contact. emacspeak-34.0 (AKA Bubbles)
established a new beach-head with respect to rapid task completion in
an eyes-free environment.</li>
<li>Emacspeak-33.0 AKA StarDog brings
unparalleled cloud access to the audio desktop.</li>
<li>Emacspeak 32.0 AKA
LuckyDog continues to innovate via open technologies for better
access.</li>
<li>Emacspeak 31.0 AKA TweetDog — adds tweeting to the Emacspeak
desktop.</li>
<li>Emacspeak 30.0 AKA SocialDog brings the Social Web to the
audio desktop—you can't but be social if you speak!</li>
<li>Emacspeak 29.0—AKAAbleDog—is a testament to the resilliance and innovation
embodied by Open Source software—it would not exist without the
thriving Emacs community that continues to ensure that Emacs remains
one of the premier user environments despite perhaps also being one of
the oldest.</li>
<li>Emacspeak 28.0—AKA PuppyDog—exemplifies the rapid pace of
development evinced by Open Source software.</li>
<li>Emacspeak 27.0—AKA
FastDog—is the latest in a sequence of upgrades that make previous
releases obsolete and downgrades unnecessary.</li>
<li>Emacspeak 26—AKA
LeadDog—continues the tradition of introducing innovative access
solutions that are unfettered by the constraints inherent in
traditional adaptive technologies.</li>
<li>Emacspeak 25 —AKA ActiveDog
—re-activates open, unfettered access to online
information.</li>
<li>Emacspeak-Alive —AKA LiveDog —enlivens open, unfettered
information access with a series of live updates that once again
demonstrate the power and agility of open source software
development.</li>
<li>Emacspeak 23.0 — AKA Retriever—went the extra mile in
fetching full access.</li>
<li>Emacspeak 22.0 —AKA GuideDog —helps users
navigate the Web more effectively than ever before.</li>
<li>Emacspeak 21.0
—AKA PlayDog —continued the
Emacspeak tradition of relying on enhanced
productivity to liberate users.</li>
<li>Emacspeak-20.0 —AKA LeapDog —continues
the long established GNU/Emacs tradition of integrated innovation to
create a pleasurable computing environment for eyes-free
interaction.</li>
<li>emacspeak-19.0 –AKA WorkDog– is designed to enhance
user productivity at work and leisure.</li>
<li>Emacspeak-18.0 –code named
GoodDog– continued the Emacspeak tradition of enhancing user
productivity and thereby reducing total cost of
ownership.</li>
<li>Emacspeak-17.0 –code named HappyDog– enhances user
productivity by exploiting today's evolving WWW
standards.</li>
<li>Emacspeak-16.0 –code named CleverDog– the follow-up to
SmartDog– continued the tradition of working better, faster,
smarter.</li>
<li>Emacspeak-15.0 –code named SmartDog–followed up on TopDog
as the next in a continuing series of award-winning audio desktop
releases from Emacspeak Inc.</li>
<li>Emacspeak-14.0 –code named TopDog–was</li>
</ul>
<p>
the first release of this millennium.
</p>
<ul class="org-ul">
<li>Emacspeak-13.0 –codenamed
YellowLab– was the closing release of the
20th. century.</li>
<li>Emacspeak-12.0 –code named GoldenDog– began
leveraging the evolving semantic WWW to provide task-oriented speech
access to Webformation.</li>
<li>Emacspeak-11.0 –code named Aster– went the
final step in making Linux a zero-cost Internet access solution for
blind and visually impaired users.</li>
<li>Emacspeak-10.0 –(AKA
Emacspeak-2000) code named WonderDog– continued the tradition of
award-winning software releases designed to make eyes-free computing a
productive and pleasurable experience.</li>
<li>Emacspeak-9.0 –(AKA
Emacspeak 99) code named BlackLab– continued to innovate in the areas
of speech interaction and interactive accessibility.</li>
<li>Emacspeak-8.0 –(AKA Emacspeak-98++) code named BlackDog– was a major upgrade to
the speech output extension to Emacs.</li>
<li>Emacspeak-95 (code named Illinois) was released as OpenSource on
the Internet in May 1995 as the first complete speech interface
to UNIX workstations. The subsequent release, Emacspeak-96 (code
named Egypt) made available in May 1996 provided significant
enhancements to the interface. Emacspeak-97 (Tennessee) went
further in providing a true audio desktop. Emacspeak-98
integrated Internetworking into all aspects of the audio desktop
to provide the first fully interactive speech-enabled WebTop.</li>
</ul>
</div>
</div>
<div id="outline-container-orga64edc1" class="outline-2">
<h2 id="orga64edc1"><span class="section-number-2">9.</span> About Emacspeak:</h2>
<div class="outline-text-2" id="text-9">
<p>
Originally based at Cornell (NY) —
<a href="http://www.cs.cornell.edu/home/raman">http://www.cs.cornell.edu/home/raman</a> —home to Auditory User
Interfaces (AUI) on the WWW, Emacspeak is now maintained on GitHub
—<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a>. The system is mirrored
world-wide by an international network of software archives and
bundled voluntarily with all major Linux distributions. On Monday,
April 12, 1999, Emacspeak became part of the <a href="http://tvraman.github.io/emacspeak/blog/smithsonian-study.html">Smithsonian's Permanent
Research Collection</a> on Information Technology at the Smithsonian's
National Museum of American History.
</p>
<p>
The Emacspeak mailing list is archived at
<a href="https://www.emacspeak.org">Emacspeak Mail Archive</a> –the home of the
Emacspeak mailing list– thanks to Greg Priest-Dorman, and provides a
valuable knowledge base for new users.
</p>
</div>
</div>
<div id="outline-container-orgf2c8d9a" class="outline-2">
<h2 id="orgf2c8d9a"><span class="section-number-2">10.</span> Press/Analyst Contact: Tilden Labrador</h2>
<div class="outline-text-2" id="text-10">
<p>
Going forward, Aster, Hubbell and Tilden acknowledge their exclusive monopoly on
setting the direction of the Emacspeak Audio Desktop (🦮) and
promise to exercise their freedom to innovate and her resulting
power responsibly (as before) in the interest of all dogs.
</p>
<p>
*About This Release:
</p>
<hr />
<p>
Windows-Free (WF) is a favorite battle-cry of The League Against
Forced Fenestration (LAFF). –see
<a href="http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm">http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm</a> for details on
the ill-effects of Forced Fenestration.
</p>
<p>
CopyWrite )C( Aster, Hubbell and Tilden Labrador. All Writes Reserved.
HeadDog (DM), LiveDog (DM), GoldenDog (DM), BlackDog (DM) etc., are Registered
Dogmarks of Aster, Hubbell and Tilden Labrador. All other dogs belong to
their respective owners.
</p>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-8660168390263802672023-03-04T10:11:00.001-08:002023-03-04T10:11:30.165-08:00Training Wheels For Better Ergonomics<div id="content" class="content">
<h1 class="title">Training Wheels For Better Ergonomics</h1>
<div id="outline-container-orgce001e1" class="outline-2">
<h2 id="orgce001e1"><span class="section-number-2">1.</span> Background</h2>
<div class="outline-text-2" id="text-1">
<p>
In my previous article <a href="https://emacspeak.blogspot.com/2023/02/enhance-emacs-ergonomics-under-x-happy.html">Ergonomics Using xcape</a>
I described my setup to minimize chording in Emacs. The setup is
working whell, and in the few weeks of usage, I've reduce the <code>xcape
timeout</code> setting from 250ms to 170ms, this is the timeout that
controls the behavior of modifier keys in xcape.
</p>
</div>
</div>
<div id="outline-container-orgcdb9067" class="outline-2">
<h2 id="orgcdb9067"><span class="section-number-2">2.</span> Training Wheels In Emacs</h2>
<div class="outline-text-2" id="text-2">
<p>
Next, I decided that getting some feedback from Emacs and Emacspeak
when xcape behavior is triggered would act as <i>training wheels</i> while
getting used to the setup.
</p>
<p>
I considered the following:
</p>
<ol class="org-ol">
<li>Adding a feature to <code>xcape</code> that produces a sound cue on triggering modified behavior — would work <i>everywhere</i> in X.</li>
<li>Having Emacs produce some feedback when xcape behavior is triggered.</li>
<li>Asked on <span class="underline">emacs-devel</span> as to how one would do this in Emacsand
was pointed at <code>echo-keystrokes</code> by one of the core Emacs maintainers.</li>
</ol>
</div>
</div>
<div id="outline-container-org507b85d" class="outline-2">
<h2 id="org507b85d"><span class="section-number-2">3.</span> Solution</h2>
<div class="outline-text-2" id="text-3">
<p>
I phrased my question on emacs-devel as <i>is there an elisp hook</i> for
implementing this. Turns out no new code is needed; Emacs has a
<code>echo-keystrokes</code> custom option that controls how long Emacs waits
before displaying an incomplete key-sequence.
</p>
<p>
So now, I have <code>echo-keystrokes</code> set to <span class="underline">0.05</span> — and Emacspeak
speaks the resulting incomplete keystroke that is displayed by
Emacs.
</p>
<p>
Still playing with various values of <code>echo-keystrokes</code> but that is
easy — it's just one custom setting.
</p>
</div>
</div>
<div id="outline-container-orge94514c" class="outline-2">
<h2 id="orge94514c"><span class="section-number-2">4.</span> Conclusion</h2>
<div class="outline-text-2" id="text-4">
<p>
To quote <a href="https://en.wikipedia.org/wiki/Larry_Wall">Larry Wall</a> of Perl fame,
</p>
<pre class="example">
Lazy programmer equals good programmer!
</pre>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-8522902790193777772023-02-13T10:39:00.000-08:002023-02-13T10:39:10.299-08:00Enhance Emacs Ergonomics Under X: Happy Hands!<div id="content" class="content">
<h1 class="title">Enhance Emacs Ergonomics Under X: Happy Hands!</h1>
<div id="outline-container-orgd3a7c7e" class="outline-2">
<h2 id="orgd3a7c7e"><span class="section-number-2">1.</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
Describes customizations under X that makes my hands happier.
Leverages features and (mis-features) of modern-day laptops to break
old habits and reduce chording in common cases.
</p>
</div>
</div>
<div id="outline-container-orge47f788" class="outline-2">
<h2 id="orge47f788"><span class="section-number-2">2.</span> Background</h2>
<div class="outline-text-2" id="text-2">
<p>
I have been using Emacs for 33 years now and at this point, much of my
Emacs usage is based on muscle memory. This has its good and bad
points; the good ones are obvious; I dont need to think about what
keys I press. But it also has some downside; I likely press more keys
than I ought to for a given result.
</p>
<ol class="org-ol">
<li>I learn to use Emacs on a TTY (text console) and all my habits
are driven by the keys available on a terminal.</li>
<li>Under X you have more keys available, but I resisted running X
until around 2008.</li>
<li>Now, I almost never run Emacs on a TTY, except when I need to
rescue a broken X setup.</li>
<li>after turning <code>caps_lock</code> to <code>Control</code> I forgot about the other
modifier keys; I press <code>Escape</code> for Meta.</li>
<li>I also defined <code>C-;</code> and friends as additional Emacs prefix keys.</li>
<li>The above saves your hands because you dont chord using the
modifier keys on the bottom row.</li>
<li>But you waste 6 modifier keys on a
laptop where keys are in short supply.</li>
</ol>
</div>
</div>
<div id="outline-container-orgffeebe8" class="outline-2">
<h2 id="orgffeebe8"><span class="section-number-2">3.</span> Leveraging Current Keyboard</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li>The motivation to leverage the laptop keyboard is higher now,
since with the arrival of the pandemic, that has been my primary
(only) machine.</li>
<li>I can chord without thinking using the modified <code>caps_lock</code>
as <code>Control</code>. But I also noticed that I <b>choard a lot</b>.</li>
<li>Chords I use most often as a prefix:
<ul class="org-ul">
<li><code>C-e</code> — Emacspeak prefix,</li>
<li><code>C-s</code> and <code>C-r</code> — Isearch,</li>
<li><code>C-c</code> and <code>C-x</code> — emacs command prefix.</li>
</ul></li>
<li>Looking at the bottom row of the laptop keyboard, there are three
modifier keys to either side of the spacebar.</li>
<li>Adding the left and right <code>Shift</code> modifiers gives 8 keys that
could do something useful when not used as a modifier key.</li>
</ul>
</div>
</div>
<div id="outline-container-org637e065" class="outline-2">
<h2 id="org637e065"><span class="section-number-2">4.</span> XCAPE: Turn Modifiers Into Buttons</h2>
<div class="outline-text-2" id="text-4">
<p>
I discovered <a href="https://wiki.archlinux.org/title/Xcape">xcape</a> a while ago, but had set it aside for <i>future</i>
exploration; The observations made in the previous section indicated
that that time was now!
</p>
<p>
So here is my <a href="https://github.com/tvraman/emacspeak/blob/master/tvr/xcape.sh">xcape Setup</a> and associated <a href="https://github.com/tvraman/emacspeak/blob/master/stumpwm/xmodmap#L1">XModmap</a> as of the time of
writing:
</p>
</div>
<div id="outline-container-org2373c1b" class="outline-3">
<h3 id="org2373c1b"><span class="section-number-3">4.1.</span> What This Does:</h3>
<div class="outline-text-3" id="text-4-1">
<ol class="org-ol">
<li><code>Control</code> by itself sends <code>C-e</code>,</li>
<li><code>Super</code> by itself sends <code>C-c</code>,</li>
<li><code>Alt</code> by itself sends <code>C-x</code>,</li>
<li><code>Shift_l</code> by itself sends <code>C-s</code>,</li>
<li><code>Shift_R</code> by itself sends <code>C-r</code>.</li>
</ol>
<p>
Note that the <code>XModmap</code> file does the work of changing the <code><print></code>
key on my laptop to be <code>Super_L</code> for symmetry. So the bottom row of
keys now look like this:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<tbody>
<tr>
<td class="org-left">Modifier</td>
<td class="org-left">Control</td>
<td class="org-left">Super</td>
<td class="org-left">Alt</td>
<td class="org-left">Spacebar</td>
<td class="org-left">Alt</td>
<td class="org-left">Super</td>
<td class="org-left">Control</td>
</tr>
<tr>
<td class="org-left">Key</td>
<td class="org-left"><code>C-e</code></td>
<td class="org-left"><code>C-c</code></td>
<td class="org-left"><code>C-x</code></td>
<td class="org-left">Spacebar</td>
<td class="org-left"><code>C-x</code></td>
<td class="org-left"><code>C-c</code></td>
<td class="org-left"><code>C-e</code></td>
</tr>
</tbody>
</table>
<p>
Looking at the above, it's tempting to turn the <code>SpaceBar</code> into a
modifier — but I've resisted doing that for now.
</p>
</div>
</div>
</div>
<div id="outline-container-orge777534" class="outline-2">
<h2 id="orge777534"><span class="section-number-2">5.</span> Observations</h2>
<div class="outline-text-2" id="text-5">
<ol class="org-ol">
<li>A week later, I'm slowly retraining my muscle memory — I use
the new affordances described here about 25% of the time.</li>
<li>I find myself using the new features in the second half of the day
when my hands are more tired.</li>
<li>The effect of <i>thinking</i> before <i>pressing</i> a key reminds me of
the time I learn to use <i>dvorak</i> for text input; I still do so
sometimes to give my hands a break.</li>
<li>The new mappings give some surprizing results <i>e.g.</i>, <code>alt</code>
<code>shift</code> saves the buffer, but buyer beware, <code>alt</code> <code>super</code> quits
Emacs.</li>
<li>Am sure more muscle memory will emerge for oft-repeated tasks.</li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-62469518766593272442022-12-21T07:09:00.002-08:002022-12-21T07:09:29.533-08:00AsTeR: Spoken Math On The Emacspeak Audio Desktop<div id="content" class="content">
<h1 class="title">AsTeR: Spoken Math On The Emacspeak Audio Desktop</h1>
<div id="outline-container-org7428d59" class="outline-2">
<h2 id="org7428d59"><span class="section-number-2">1.</span> Dedication</h2>
<div class="outline-text-2" id="text-1">
<div class="org-center">
<p>
To My Guiding Eyes
</p>
</div>
<p>
In fond memory of <a href="http://emacspeak.sf.net/raman/aster-labrador">Aster</a> who first showed the way for 10 years; to <a href="http://emacspeak.sf.net/raman/hubbell-labrador">Hubbell</a> and
<a href="http://emacspeak.sf.net/raman/tilden-labrador">Tilden</a> who ably followed her lead over the next 22+ years!
</p>
<table>
<tr><td colspan="3">On The Internet</td></tr>
<tr>
<td><strong>No one knows you're not a dog!</strong></td>
<td><strong>Nor if you're the same dog!</strong></td>
<td><strong>Or even the same gender!</strong></td>
</tr>
<tr>
<td><a href="aster-labrador/">
<img src="http://emacspeak.sf.net/raman/aster-labrador/aster-geb-graduation.jpg"
alt="Aster Labrador" width="150" height="216" /></a>
<br/>(2/15/1987—12/05/1999)</td>
<td><a href="hubbell-labrador/">
<img
src="http://emacspeak.sf.net/raman/hubbell-labrador/hubbell-and-raman.jpg" width="150" height="216"
alt=" Hubbell Labrador" /></a>
<br/>(12/21/1997—4/11/2011)</td>
<td><a href="tilden-labrador/">
<img src="http://emacspeak.sf.net/raman/tilden-labrador/raman-and-tilden-geb.jpg"
alt="Tilden Labrador" width="150"
height="216" /></a>
<br/>(8/4/2009—9/3/2022)</td>
</tr>
</table>
</div>
</div>
<div id="outline-container-org86c9bc8" class="outline-2">
<h2 id="org86c9bc8"><span class="section-number-2">2.</span> Overview</h2>
<div class="outline-text-2" id="text-2">
<p>
The work describing Audio System For Technical Readings <a href="https://emacspeak.sourceforge.net/raman/aster/abstract.html">(AsTeR)</a> was
presented to the Faculty of the Graduate School of Cornell University
on Monday, Jan 17, 1994 for my <a href="http://awards.acm.org/award_winners/raman_4110221.cfm">PhD</a>. This release
is an updated version of AsTeR that uses the Software DECTalk.
</p>
</div>
</div>
<div id="outline-container-org30a965c" class="outline-2">
<h2 id="org30a965c"><span class="section-number-2">3.</span> Implementation</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li>AsTeR <i>audio-formats</i> <b>TeX</b> and <b>LaTeX</b> documents.</li>
<li>User interface is implemented in Emacs.</li>
<li>It uses the Emacspeak speech-server <code>dtk-soft</code> to connect to the software DECTalk.</li>
<li>The audio-formatter is implemented in Common Lisp (SBCL).</li>
<li>Emacs commands call Common Lisp via <i>slime</i> to communicate with Aster.</li>
</ul>
</div>
</div>
<div id="outline-container-org8b54678" class="outline-2">
<h2 id="org8b54678"><span class="section-number-2">4.</span> Prerequisites</h2>
<div class="outline-text-2" id="text-4">
<ul class="org-ul">
<li>Install Emacspeak 57.0 or later from Github.</li>
<li>Install <i>slime</i> and <i>auctex</i> using <code>M-x package-install</code>.</li>
<li>Install <i>flex</i>, <i>SBCL</i> and <i>cl-asdf</i> using the linux package manager.</li>
<li>Install <a href="https://github.com/dectalk/dectalk">Software DECTalk</a> from Github.</li>
</ul>
</div>
</div>
<div id="outline-container-org10a0b30" class="outline-2">
<h2 id="org10a0b30"><span class="section-number-2">5.</span> Building AsTeR</h2>
<div class="outline-text-2" id="text-5">
<ol class="org-ol">
<li><code>cd</code> <emacspeak> to change to your <code>emacspeak</code> directory.</li>
<li>Get source via git checkout <a href="https://github.com/tvraman/aster-math">https://github.com/tvraman/aster-math</a></li>
<li><code>cd aster-math/lisp && make</code></li>
</ol>
</div>
</div>
<div id="outline-container-org42bfb20" class="outline-2">
<h2 id="org42bfb20"><span class="section-number-2">6.</span> Usage</h2>
<div class="outline-text-2" id="text-6">
<ul class="org-ul">
<li>Add directory <code>aster-math/ui/</code> to your Emacs <code>load-path</code>.</li>
<li>Run <code>M-x load-library</code> <i>aster</i>; <code>M-x aster</code>.</li>
<li>Aster commands are on Emacs prefix-key
<code>C-; SPC</code> and <code>C-' a</code>.</li>
<li><code>M-x describe-function aster</code> displays help.</li>
<li>To speak math using AsTeR:
<ol class="org-ol">
<li>Send a TeX file.</li>
<li>Send math content from any Emacs buffer.</li>
<li>When editing LaTeX — including from within org-mode buffers.</li>
<li>When browsing Wikipedia pages containing mathematics using Emacs'
EWW browser. (Make sure to first disable <code>shr-discard-aria-hidden</code>).</li>
<li>From Emacs Calculator (calc).</li>
<li>From the Emacs interface to Sage — a symbolic algebra
system.</li>
<li>Papers from <a href="https://arxiv.org/">arxiv.org</a> — see <a href="https://info.arxiv.org/about/accessibility_research_report.html">Arxiv.org Accessibility Report</a></li>
</ol></li>
<li>Once Aster starts speaking, you can use Aster's
browser to move around.</li>
</ul>
</div>
</div>
<div id="outline-container-orgd061514" class="outline-2">
<h2 id="orgd061514"><span class="section-number-2">7.</span> References</h2>
<div class="outline-text-2" id="text-7">
<ol class="org-ol">
<li><a href="https://emacspeak.sourceforge.net/raman/aster/2022-aster.ogg">Demo recorded in October 2022</a>.</li>
<li><a href="https://emacspeak.sourceforge.net/raman/aster/aster-toplevel.html">Demo recorded in 1994</a>.</li>
<li><a href="http://emacspeak.sf.net/raman/amsci-96.pdf">Brian Hayes: Speaking Of Mathematics</a>, American Scientist, March
1996 — An accessible overview of AsTeR.</li>
<li><a href="https://emacspeak.sourceforge.net/raman/sciam-0996profile.html">Envisioning Speech:Scientific American</a>, Wayte Gibbs, September 1996
— Describes AsTeR, Audio-formatting and Emacspeak.</li>
<li><a href="https://emacspeak.sourceforge.net/raman/publications/rfb-math-workshop/">Proceedings: RFB Math & Science Symposium</a>, May 12 – 13 1994.</li>
<li><a href="https://emacspeak.sourceforge.net/raman/phd-thesis/index.html">PHd Thesis</a>, January 1994.</li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-21982615183050093602022-12-20T19:06:00.002-08:002022-12-20T19:06:51.438-08:00Toward Accessible Scientific Documents From Arxiv.Org<div id="content" class="content">
<h1 class="title">Toward Accessible Scientific Documents Via Arxiv.Org</h1>
<div id="outline-container-orga229d1f" class="outline-2">
<h2 id="orga229d1f"><span class="section-number-2">1.</span> Background</h2>
<div class="outline-text-2" id="text-1">
<p>
I access research papers from <a href="https://arxiv.org">arxiv.org</a> multiple times a week. Having
originally worked on access to STEM content for my PhD over 30 years
ago, I find it both encouraging and challenging as I continue to acquire
access to the research materials I need.
</p>
<p>
As the Digital Library of the future, <i>arxiv</i> is committed to
improving the state of STEM Access; see the
<a href="https://info.arxiv.org/about/accessibility_research_report.html">Accessibility</a> report they recently published. A few months
ago after talking to them about their goals, I wrote down some ideas
that would make my own access to <i>arxiv</i> a smoother experience;
posting them here so folks in the STEM Accessibility community can
expand and build on these ideas.
</p>
</div>
</div>
<div id="outline-container-org10567aa" class="outline-2">
<h2 id="org10567aa"><span class="section-number-2">2.</span> Goal</h2>
<div class="outline-text-2" id="text-2">
<p>
Make <a href="http://arxiv.org">Arxiv</a> a destination for Accessible Scientific documents where
blind students and researchers can consume the latest technical
content via alternative modes of interaction that best suit their
individual needs.
</p>
</div>
</div>
<div id="outline-container-org31adab2" class="outline-2">
<h2 id="org31adab2"><span class="section-number-2">3.</span> Making The Portal Easy To Use</h2>
<div class="outline-text-2" id="text-3">
<p>
A <i>REST</i> API to automate the download of multiple formats.
</p>
</div>
</div>
<div id="outline-container-orgfa90fc6" class="outline-2">
<h2 id="orgfa90fc6"><span class="section-number-2">4.</span> Making The Content Progressively Easy To Consume</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>Build PDFs using PDFLaTeX rather than the DVI->PS->PDF pipeline.</li>
<li>Ensure that PDFs are one-column layout.</li>
<li>Build HTML+Math content from LaTeX using TeX4HT and friends.</li>
<li>Build out a collection of high-quality LaTeX macros for specific
sub-domains in CS and Math so authors dont need to invent their
own marcos.</li>
<li>Allow authors to contribute macros for new notation as it gets invented.</li>
<li>Incorporate Speech Rules Engine (SRE) from Volker Sorge.</li>
<li>Explore ChromeBooks where ChromeVox is already built-in.</li>
</ol>
</div>
</div>
<div id="outline-container-orgf3c1c72" class="outline-2">
<h2 id="orgf3c1c72"><span class="section-number-2">5.</span> Target Experience</h2>
<div class="outline-text-2" id="text-5">
<p>
Once we have:
</p>
<ol class="org-ol">
<li>Arxiv: building PDF and HTML the way we desire.</li>
<li>Client-side setup recipe – initially for a ChromeBook or Linux
running my present environment (see final Teaser section).</li>
<li>Mathjax and SRE injected at the right points on the backend at <i>arxiv</i>.</li>
</ol>
<p>
The target audience should be able to:
</p>
<ol class="org-ol">
<li>Search and discover content on arxiv.</li>
<li>View and consume content from Arxiv via the browser of choice with spoken
feedback built-in.</li>
</ol>
</div>
</div>
<div id="outline-container-org0215591" class="outline-2">
<h2 id="org0215591"><span class="section-number-2">6.</span> Iterate And improve</h2>
<div class="outline-text-2" id="text-6">
<ol class="org-ol">
<li>Test the flow with a few initial members of the target audience to discover the pain-points and fix them.</li>
<li>Communicate what we learn via arxiv given the traffic and start
publicizing the solution.</li>
<li>Rinse and repeat ….</li>
</ol>
</div>
</div>
<div id="outline-container-org864b785" class="outline-2">
<h2 id="org864b785"><span class="section-number-2">7.</span> Research Areas</h2>
<div class="outline-text-2" id="text-7">
<ol class="org-ol">
<li>Graphs – start with Graphviz — <i>Dot Graphics</i>.</li>
<li>Graphs as in X-Y plots — there has been some work on
data Sonification — but it's still early and exploratory.</li>
</ol>
</div>
</div>
<div id="outline-container-org656867a" class="outline-2">
<h2 id="org656867a"><span class="section-number-2">8.</span> References</h2>
<div class="outline-text-2" id="text-8">
<ol class="org-ol">
<li><a href="https://github.com/zorkow/speech-rule-engine/releases">Speech Rule Engine </a> from Volker Sorge.</li>
<li><a href="https://www.mathjax.org/">MathJax</a></li>
<li><a href="https://tug.org/tex4ht/">TeX4HT</a> On Debian Linux, this is in package
<code>texlive-plain-generic.list</code> — installed as <code>/usr/bin/xhlatex</code>.</li>
<li><a href="https://github.com/tvraman/emacspeak">Emacspeak</a> — includes support for Math via SRE — AKA poor man's AsTeR.</li>
<li><a href="https://github.com/tvraman/aster-math#start-of-content">Teaser:</a> Heard from a bird: Speaking Of Mathematics: #emacspeak #STEM Again DECTalk → Again AsTeR.</li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-92000442201408935962022-11-23T10:10:00.001-08:002022-11-23T10:10:46.691-08:00Announcing Emacspeak 57.0 (Tilden)<div id="content" class="content">
<h1 class="title">Announcing Emacspeak 57.0—Tilden!</h1>
<div id="org7596bc9" class="figure">
<p><a href="https://tvraman.github.io/tilden-face.jpg" alt="Tilden" height="96" width="59.33"><img src="https://tvraman.github.io/tilden-face.jpg" alt="Tilden" height="96" width="59.33" /></a>
</p>
</div>
<p>
Easy things are often amusing and relaxing, but their value soon
fades. Greater pleasure, deeper satisfaction, and higher wages are
associated with genuine accomplishments, with the successful
fulfillment of a challenging task.
–Donald Knuth
</p>
<div id="outline-container-orge794566" class="outline-2">
<h2 id="orge794566"><span class="section-number-2">1.</span> For Immediate Release:</h2>
<div class="outline-text-2" id="text-1">
<p>
San Jose, CA, (November 23, 2022)
</p>
</div>
<div id="outline-container-orge3efd30" class="outline-3">
<h3 id="orge3efd30"><span class="section-number-3">1.1.</span> Emacspeak 57.0 (Tilden) Unleashed! 🦮</h3>
<div class="outline-text-3" id="text-1-1">
<p>
— Making Accessible Computing Effortless!
</p>
<p>
Advancing Accessibility In The Age Of User-Aware Interfaces — Zero
cost of Ownership makes priceless software Universally affordable!
</p>
<p>
Emacspeak Inc (NASDOG: ESPK) — <a href="http://github.com/tvraman/emacspeak">http://github.com/tvraman/emacspeak</a>
announces immediate world-wide availability of <a href="https://github.com/tvraman/emacspeak/releases/download/57.0/emacspeak-57.0.tar.bz2">Emacspeak 57.0</a>
(Tilden) 🦮 — a powerful audio desktop that leverages today's
evolving Data, Social and Assistant-Oriented Internet cloud to enable
working efficiently and effectively from anywhere!
</p>
</div>
</div>
</div>
<div id="outline-container-orgfa9d08b" class="outline-2">
<h2 id="orgfa9d08b"><span class="section-number-2">2.</span> Investors Note:</h2>
<div class="outline-text-2" id="text-2">
<p>
With several prominent tweeters (and mythical elephants) expanding
coverage of <span class="underline">#emacspeak</span>, NASDOG: ESPK has now been consistently
trading over the social net at levels close to that once attained by
DogCom high-fliers—and is trading at levels close to that achieved by
once better known stocks in the tech sector.
</p>
</div>
</div>
<div id="outline-container-org00a28ff" class="outline-2">
<h2 id="org00a28ff"><span class="section-number-2">3.</span> What Is It?</h2>
<div class="outline-text-2" id="text-3">
<p>
Emacspeak is a fully functional audio desktop that provides complete
eyes-free access to all major 32 and 64 bit operating environments. By
seamlessly blending live access to all aspects of the Internet such as
ubiquitous assistance, Web-surfing, blogging, remote software
development, social computing and electronic messaging into the audio
desktop, Emacspeak enables spoken access to local and remote
information with a consistent and well-integrated user interface. A
rich suite of task-oriented tools provides efficient speech-enabled
access to the evolving assistant-oriented social Internet cloud.
</p>
</div>
</div>
<div id="outline-container-orge274b29" class="outline-2">
<h2 id="orge274b29"><span class="section-number-2">4.</span> Major Enhancements:</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>Speech server for software DECTalk. 📢</li>
<li><a href="https://emacspeak.blogspot.com/2022/10/learn-smarter-by-taking-rich-hypertext.html">Learn Smarter</a> By Taking Rich, Hypertext Notes. 🏫</li>
<li>Integrated Youtube player using <code>mpv</code>. 📹</li>
<li>Leverage Emacs Repeat-Mode to minimize chording. ⌨</li>
<li>Speech-Enable NotMuch mail. 📪</li>
<li>Screen brightness with module <code>light</code>. 🔅</li>
<li>Emacspeak Auditory Display Under Pulseaudio 🔊</li>
<li>Speciality browsers for various types of bookmarks. 📑</li>
<li><p>
Sounds Themes Using OGG. ℗
</p>
<p>
— And a lot more than will fit this margin. … 🗞
</p></li>
</ol>
<p>
Note: This version <b>requires</b> emacs-28.1 or later.
</p>
</div>
</div>
<div id="outline-container-org32935e7" class="outline-2">
<h2 id="org32935e7"><span class="section-number-2">5.</span> Establishing Liberty, Equality And Freedom:</h2>
<div class="outline-text-2" id="text-5">
<p>
Never a toy system, Emacspeak is voluntarily bundled with all
major Linux distributions. Though designed to be modular,
distributors have freely chosen to bundle the fully integrated
system without any undue pressure—a documented success for
the integrated innovation embodied by Emacspeak. As the system
evolves, both upgrades and downgrades continue to be available at
the same zero-cost to all users. The integrity of the Emacspeak
codebase is ensured by the reliable and secure Linux platform
and the underlying GIT versioning software used to develop and distribute the system.
</p>
<p>
Extensive studies have shown that thanks to these features, users
consider Emacspeak to be absolutely priceless. Thanks to this
wide-spread user demand, the present version remains free of cost
as ever—it is being made available at the same zero-cost as
previous releases.
</p>
<p>
At the same time, Emacspeak continues to innovate in the area of
eyes-free Assistance and social interaction and carries forward the
well-established Open Source tradition of introducing user interface
features that eventually show up in luser environments.
</p>
<p>
On this theme, when once challenged by a proponent of a crash-prone
but well-marketed mousetrap with the assertion "Emacs is a system from
the 70's", the creator of Emacspeak evinced surprise at the unusual
candor manifest in the assertion that it would take popular
idiot-proven interfaces until the year 2070 to catch up to where the
Emacspeak audio desktop is today. Industry experts welcomed this
refreshing breath of Courage Certainty and Clarity (CCC) at a time
when users are reeling from the Fear Uncertainty and Doubt (FUD)
unleashed by complex software systems backed by even more convoluted
press releases.
</p>
</div>
</div>
<div id="outline-container-org37e63bc" class="outline-2">
<h2 id="org37e63bc"><span class="section-number-2">6.</span> Independent Test Results:</h2>
<div class="outline-text-2" id="text-6">
<p>
Independent test results have proven that unlike some modern (and
not so modern) software, Emacspeak can be safely uninstalled without
adversely affecting the continued performance of the computer. These
same tests also revealed that once uninstalled, the user stopped
functioning altogether. Speaking with Aster Labrador, the creator of
Emacspeak once pointed out that these results re-emphasize the
user-centric design of Emacspeak; “It is the user — and not the
computer– that stops functioning when Emacspeak is uninstalled!”.
</p>
</div>
<div id="outline-container-orga0b7aa2" class="outline-3">
<h3 id="orga0b7aa2"><span class="section-number-3">6.1.</span> Note from Aster,Bubbles and Tilden:</h3>
<div class="outline-text-3" id="text-6-1">
<p>
UnDoctored Videos Inc. is looking for volunteers to star in a
video demonstrating such complete user failure.
</p>
</div>
</div>
</div>
<div id="outline-container-org1ca0769" class="outline-2">
<h2 id="org1ca0769"><span class="section-number-2">7.</span> Obtaining Emacspeak:</h2>
<div class="outline-text-2" id="text-7">
<p>
Emacspeak can be downloaded from GitHub — see
<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a> you can visit Emacspeak on the
WWW at <a href="http://emacspeak.sf.net">http://emacspeak.sf.net</a>. You can subscribe to the emacspeak
mailing list — <a href="http://mail.emacspeak.org">emacspeak@emacspeak.org</a>. The <a href="http://emacspeak.blogspot.com">Emacspeak Blog</a> is a good
source for news about recent enhancements and how to use them.
</p>
<p>
The latest development snapshot of Emacspeak is always available at
<a href="https://github.com/tvraman/emacspeak">GitHub</a>.
</p>
</div>
</div>
<div id="outline-container-org5701595" class="outline-2">
<h2 id="org5701595"><span class="section-number-2">8.</span> History:</h2>
<div class="outline-text-2" id="text-8">
<ul class="org-ul">
<li>Emacspeak 57.0 is named in honor of <a href="https://tvraman.github.io/tilden-face.jpg">Tilden Labrador</a>.</li>
<li>Emacspeak 56.0 (AgileDog) belies its age to be as agile as Tilden.</li>
<li>Emacspeak 55.0 (CalmDog) attempts to be as calm as Tilden.</li>
<li>Emacspeak 54.0 (EZDog) learns to take it easy from Tilden.</li>
<li>Emacspeak 53.0 (EfficientDog) focuses on efficiency.</li>
<li>Emacspeak 52.0 (WorkAtHomeDog) makes working remotely a pleasurable experience.</li>
<li>Bigger and more powerful than any smart assistAnt, AssistDog provides</li>
</ul>
<p>
instant access to the most relevant information at all times.
</p>
<ul class="org-ul">
<li>Emacspeak 50.0 (SageDog) embraces the wisdom of stability as
opposed to rapid change and the concomitant creation of bugs.🚭: Naturally Intelligent (NI)™ at how information is spoken, Emacspeak</li>
</ul>
<p>
is entirely free of Artificial Ingredients (AI)™.
</p>
<ul class="org-ul">
<li>Emacspeak 49.0 (WiseDog) leverages the wisdom gleaned from
earlier releases to provide an enhanced auditory experience.</li>
<li>Emacspeak 48.0 (ServiceDog) builds on earlier releases to provide
continued end-user value.</li>
<li>Emacspeak 47.0 (GentleDog) goes the next step in being helpful
while letting users learn and grow.</li>
<li>Emacspeak 46.0 (HelpfulDog) heralds the coming of Smart Assistants.</li>
<li>Emacspeak 45.0 (IdealDog) is named in recognition of Emacs'
excellent integration with various programming language
environments — thanks to this, Emacspeak is the IDE of choice
for eyes-free software engineering.</li>
<li>Emacspeak 44.0 continues the steady pace of innovation on the
audio desktop.</li>
<li>Emacspeak 43.0 brings even more end-user efficiency by leveraging the
ability to spatially place multiple audio streams to provide timely
auditory feedback.</li>
<li>Emacspeak 42.0 while moving to GitHub from Google Code continues to
innovate in the areas of auditory user interfaces and efficient,
light-weight Internet access.</li>
<li>Emacspeak 41.0 continues to improve
on the desire to provide not just equal, but superior access —
technology when correctly implemented can significantly enhance the
human ability.</li>
<li>Emacspeak 40.0 goes back to Web basics by enabling
<a href="http://emacspeak.blogspot.com/2013/11/reading-web-content-efficiently.html">efficient access</a> to large amounts of readable Web content.</li>
<li>Emacspeak 39.0 continues the Emacspeak tradition of increasing the breadth of
user tasks that are covered without introducing unnecessary
bloatware.</li>
<li>Emacspeak 38.0 is the latest in a series of award-winning
releases from Emacspeak Inc.</li>
<li>Emacspeak 37.0 continues the tradition of
delivering robust software as reflected by its code-name.</li>
<li>Emacspeak 36.0 enhances the audio desktop with many new tools including full
EPub support — hence the name EPubDog.</li>
<li>Emacspeak 35.0 is all about
teaching a new dog old tricks — and is aptly code-named HeadDog in
on of our new Press/Analyst contact. emacspeak-34.0 (AKA Bubbles)
established a new beach-head with respect to rapid task completion in
an eyes-free environment.</li>
<li>Emacspeak-33.0 AKA StarDog brings
unparalleled cloud access to the audio desktop.</li>
<li>Emacspeak 32.0 AKA
LuckyDog continues to innovate via open technologies for better
access.</li>
<li>Emacspeak 31.0 AKA TweetDog — adds tweeting to the Emacspeak
desktop.</li>
<li>Emacspeak 30.0 AKA SocialDog brings the Social Web to the
audio desktop—you can't but be social if you speak!</li>
<li>Emacspeak 29.0—AKAAbleDog—is a testament to the resilliance and innovation
embodied by Open Source software—it would not exist without the
thriving Emacs community that continues to ensure that Emacs remains
one of the premier user environments despite perhaps also being one of
the oldest.</li>
<li>Emacspeak 28.0—AKA PuppyDog—exemplifies the rapid pace of
development evinced by Open Source software.</li>
<li>Emacspeak 27.0—AKA
FastDog—is the latest in a sequence of upgrades that make previous
releases obsolete and downgrades unnecessary.</li>
<li>Emacspeak 26—AKA
LeadDog—continues the tradition of introducing innovative access
solutions that are unfettered by the constraints inherent in
traditional adaptive technologies.</li>
<li>Emacspeak 25 —AKA ActiveDog
—re-activates open, unfettered access to online
information.</li>
<li>Emacspeak-Alive —AKA LiveDog —enlivens open, unfettered
information access with a series of live updates that once again
demonstrate the power and agility of open source software
development.</li>
<li>Emacspeak 23.0 — AKA Retriever—went the extra mile in
fetching full access.</li>
<li>Emacspeak 22.0 —AKA GuideDog —helps users
navigate the Web more effectively than ever before.</li>
<li>Emacspeak 21.0
—AKA PlayDog —continued the
Emacspeak tradition of relying on enhanced
productivity to liberate users.</li>
<li>Emacspeak-20.0 —AKA LeapDog —continues
the long established GNU/Emacs tradition of integrated innovation to
create a pleasurable computing environment for eyes-free
interaction.</li>
<li>emacspeak-19.0 –AKA WorkDog– is designed to enhance
user productivity at work and leisure.</li>
<li>Emacspeak-18.0 –code named
GoodDog– continued the Emacspeak tradition of enhancing user
productivity and thereby reducing total cost of
ownership.</li>
<li>Emacspeak-17.0 –code named HappyDog– enhances user
productivity by exploiting today's evolving WWW
standards.</li>
<li>Emacspeak-16.0 –code named CleverDog– the follow-up to
SmartDog– continued the tradition of working better, faster,
smarter.</li>
<li>Emacspeak-15.0 –code named SmartDog–followed up on TopDog
as the next in a continuing series of award-winning audio desktop
releases from Emacspeak Inc.</li>
<li>Emacspeak-14.0 –code named TopDog–was</li>
</ul>
<p>
the first release of this millennium.
</p>
<ul class="org-ul">
<li>Emacspeak-13.0 –codenamed
YellowLab– was the closing release of the
20th. century.</li>
<li>Emacspeak-12.0 –code named GoldenDog– began
leveraging the evolving semantic WWW to provide task-oriented speech
access to Webformation.</li>
<li>Emacspeak-11.0 –code named Aster– went the
final step in making Linux a zero-cost Internet access solution for
blind and visually impaired users.</li>
<li>Emacspeak-10.0 –(AKA
Emacspeak-2000) code named WonderDog– continued the tradition of
award-winning software releases designed to make eyes-free computing a
productive and pleasurable experience.</li>
<li>Emacspeak-9.0 –(AKA
Emacspeak 99) code named BlackLab– continued to innovate in the areas
of speech interaction and interactive accessibility.</li>
<li>Emacspeak-8.0 –(AKA Emacspeak-98++) code named BlackDog– was a major upgrade to
the speech output extension to Emacs.</li>
<li>Emacspeak-95 (code named Illinois) was released as OpenSource on
the Internet in May 1995 as the first complete speech interface
to UNIX workstations. The subsequent release, Emacspeak-96 (code
named Egypt) made available in May 1996 provided significant
enhancements to the interface. Emacspeak-97 (Tennessee) went
further in providing a true audio desktop. Emacspeak-98
integrated Internetworking into all aspects of the audio desktop
to provide the first fully interactive speech-enabled WebTop.</li>
</ul>
</div>
</div>
<div id="outline-container-orgcc1b6cb" class="outline-2">
<h2 id="orgcc1b6cb"><span class="section-number-2">9.</span> About Emacspeak:</h2>
<div class="outline-text-2" id="text-9">
<p>
Originally based at Cornell (NY) —
<a href="http://www.cs.cornell.edu/home/raman">http://www.cs.cornell.edu/home/raman</a> —home to Auditory User
Interfaces (AUI) on the WWW, Emacspeak is now maintained on GitHub
—<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a>. The system is mirrored
world-wide by an international network of software archives and
bundled voluntarily with all major Linux distributions. On Monday,
April 12, 1999, Emacspeak became part of the <a href="http://tvraman.github.io/emacspeak/blog/smithsonian-study.html">Smithsonian's Permanent
Research Collection</a> on Information Technology at the Smithsonian's
National Museum of American History.
</p>
<p>
The Emacspeak mailing list is archived at
<a href="https://www.emacspeak.org">Emacspeak Mail Archive</a> –the home of the
Emacspeak mailing list– thanks to Greg Priest-Dorman, and provides a
valuable knowledge base for new users.
</p>
</div>
</div>
<div id="outline-container-orgf126f01" class="outline-2">
<h2 id="orgf126f01"><span class="section-number-2">10.</span> Press/Analyst Contact: Tilden Labrador</h2>
<div class="outline-text-2" id="text-10">
<p>
Going forward, Tilden acknowledges his exclusive monopoly on
setting the direction of the Emacspeak Audio Desktop (🦮) and
promises to exercise this freedom to innovate and her resulting
power responsibly (as before) in the interest of all dogs.
</p>
<p>
*About This Release:
</p>
<hr />
<p>
Windows-Free (WF) is a favorite battle-cry of The League Against
Forced Fenestration (LAFF). –see
<a href="http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm">http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm</a> for details on
the ill-effects of Forced Fenestration.
</p>
<p>
CopyWrite )C( Aster, Hubbell and Tilden Labrador. All Writes Reserved.
HeadDog (DM), LiveDog (DM), GoldenDog (DM), BlackDog (DM) etc., are Registered
Dogmarks of Aster, Hubbell and Tilden Labrador. All other dogs belong to
their respective owners.
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: T.V Raman</p>
<p class="date">Created: 2022-11-23 Wed 10:07</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-72556454722889676582022-10-14T10:38:00.001-07:002022-10-14T10:38:36.767-07:00Learn Smarter By Taking Rich, Hypertext Notes<div id="content" class="content">
<h1 class="title">Learn Smarter By Taking Rich, Hypertext Notes</h1>
<div id="outline-container-orgf7ba2eb" class="outline-2">
<h2 id="orgf7ba2eb"><span class="section-number-2">1.</span> Background</h2>
<div class="outline-text-2" id="text-1">
<p>
As a student, I learned to take <a href="https://www.cs.cornell.edu/info/people/raman/phd-thesis/html/root-thesis.html">notes in Braille</a> while in class and
while learning from audio books. When reviewing the material, reading
the notes was far more efficient than re-listening to the original
recordings; however at the time, I had no means to easily jump to the
original content when perusing my notes.
</p>
<p>
Fast-forward to the age of online computing, a complete audio desktop
in the form of Emacspeak, a wealth of online resources in the form of
E-Books, Audio Books, Podcasts and Blogs, all backed by Universal
Search and accessible from a consistent environment. So I've been
asking myself what <i>note-taking</i> in this environment should look like.
This article summarizes the present state of what I use at present.
</p>
</div>
</div>
<div id="outline-container-org59016b7" class="outline-2">
<h2 id="org59016b7"><span class="section-number-2">2.</span> Use Case Requirements</h2>
<div class="outline-text-2" id="text-2">
<ol class="org-ol">
<li>All of the following should work equally well for locally stored
material, e.g., downloaded E-Books from <a href="https://www.bookshare.org/cms/">Bookshare.org</a> or Project
Gutenberg, as well as material hosted on the Internet in the form of
Blogs and Podcasts.</li>
<li>Create named bookmarks in E-Books (EPub, Daisy).</li>
<li>Create AMarks —bookmarks that point to positions in an audio files.</li>
<li>Above should be possible independent of whether the learning
material is available locally, or accessed via the Internet.</li>
<li>Enable the creation of hyperlinks to such bookmarks.</li>
<li>Enable the easy creation of notes — organized by topic — while
reading E-Books or listening to audio material.</li>
<li>Enable the embedding of hyperlinks to the bookmarks mentioned
earlier within these notes.</li>
<li>Final experience: creation of notes should require minimal
effort; when reding the notes, it should be easy to open the
relevant portion of the content that underlies the notes.</li>
</ol>
<p>
being
</p>
</div>
</div>
<div id="outline-container-org84667ad" class="outline-2">
<h2 id="org84667ad"><span class="section-number-2">3.</span> User Experience</h2>
<div class="outline-text-2" id="text-3">
</div>
<div id="outline-container-org0615ac1" class="outline-3">
<h3 id="org0615ac1"><span class="section-number-3">3.1.</span> Create And Browse Bookmarks In E-Books</h3>
<div class="outline-text-3" id="text-3-1">
<ol class="org-ol">
<li>You can open Project Gutenberg EPubs via the Emacspeak Bookshelf
— see see
<a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002depub.html">Emacspeak Epub</a>.</li>
<li>You can download and open Bookshare books using module
<a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002dbookshare.html">Emacspeak Bookshare</a>.</li>
<li>Both of those modules open books using Emacs' built-in EWW browser.</li>
<li>Module
<a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002deww.html">Emacspeak
eww</a> implements <i>eww-marks</i>, a bookmarking facility that manages
bookmarks in EPub and Daisy books.</li>
</ol>
<p>
With a book open, you can:
</p>
<ol class="org-ol">
<li>Create named bookmarks,</li>
<li>Browse all saved bookmarks in your library,</li>
<li>And open a given bookmark to continue reading.</li>
<li>Bookmarks can also be stored as <i>org-mode links</i> for later
insertion in an <i>org-mode</i> file, this means these hyperlinks
integrate into notes taken in <i>org-mode</i> without any additional work.</li>
</ol>
<p>
See <a href="https://orgmode.org/org.html">Org Mode Manual</a>, <a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002dbookmark.html">Emacspeak Bookmarks</a>, <a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002dbookshare.html">Emacspeak Bookshare</a>, and
<a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002depub.html">Emacspeak EPub</a> for relevant sections of the user manual.
</p>
</div>
</div>
<div id="outline-container-org7f47d14" class="outline-3">
<h3 id="org7f47d14"><span class="section-number-3">3.2.</span> Create And Browse AMarks In Audio Books</h3>
<div class="outline-text-3" id="text-3-2">
<ol class="org-ol">
<li>AMarks are Emacspeak's audio equivalent of traditional bookmarks.</li>
<li>An AMark encapsulates the location of the audio content, a
time-offset, and a bookmark name.</li>
<li>AMarks once created can be navigated to when playing that content
via module <a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002dm_002dplayer.html">Emacspeak MPlayer</a> which provides a rich but seamless
interface — here, <i>seamless</i>
means you can play media content without switching from any
on-going task, and in the context of this article, that means you
can continue taking notes without explicitly switching context to
the media-player.</li>
<li>Emacspeak provides an AMarks Browser that lets you browse and
play any AMark in your library.</li>
<li>Finally, AMarks like bookmarks can be stored as org-mode links
for later insertion into an org-mode file.</li>
</ol>
<p>
See <a href="https://tvraman.github.io/emacspeak/manual/emacspeak_002damark.html">Emacspeak Amarks</a> for the user manual.
</p>
</div>
</div>
<div id="outline-container-orge5d3e22" class="outline-3">
<h3 id="orge5d3e22"><span class="section-number-3">3.3.</span> Create Bookmarks On Web Pages</h3>
<div class="outline-text-3" id="text-3-3">
<p>
See module <code>org-capture</code> for inspiration.
</p>
</div>
</div>
<div id="outline-container-org80c9b25" class="outline-3">
<h3 id="org80c9b25"><span class="section-number-3">3.4.</span> Create Audio Bookmarks In Podcasts</h3>
<div class="outline-text-3" id="text-3-4">
<ol class="org-ol">
<li>Module <code>emacspeak-m-player</code> is used to play Podcasts and other
forms of online audio-content, e.g., talks published on Youtube.</li>
<li>This module can store org-mode links to such content; storing
such a link captures the current time offset into the content
being played.</li>
<li>These stored links can then be inserted into an org-mode file;
opening those links using org-mode hyperlinking facilities lets
you resume playback at the marked position.</li>
</ol>
</div>
</div>
<div id="outline-container-org189d38b" class="outline-3">
<h3 id="org189d38b"><span class="section-number-3">3.5.</span> Create On-Line Notes Using Org-Mode</h3>
<div class="outline-text-3" id="text-3-5">
<ol class="org-ol">
<li>See the <a href="https://orgmode.org/org.html">Org Manual</a> for details on taking notes in org-mode.</li>
<li>Insert Hyperlinks To E-Books And Audio In Org-Mode by first storing
the link as described earlier.</li>
<li>Review Notes, Follow Hyperlinks To Review Original Material by
opening the notes file in <i>org-mode</i>.</li>
</ol>
</div>
</div>
</div>
<div id="outline-container-orgbc8d6e0" class="outline-2">
<h2 id="orgbc8d6e0"><span class="section-number-2">4.</span> Conclusion: Looking Back, Looking Forward</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>This describes a flexible workflow that is built out of multiple
small components.</li>
<li>Illustrating various workflows as above outlines the space
of possible solutions.</li>
<li>Keeping the notes in <i>org-mode</i> ensures that the notes are
long-lived, since <i>org-mode</i> files are essentially plain-text
with an easy to parse syntax for parsing the underlying structure
if needed to implement future extensions.</li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-52776038874390523362022-09-04T07:33:00.002-07:002022-09-04T07:33:32.375-07:00Goodbye To Tilden Labrador, Our Beloved Press/Analyst Contact<h1>Epitaph: Tilden Labrador</h1>
<h2>Epitaph</h2>
<p>Tilden Labrador (TilTil) --- he loved the tinkling of bells --- was
born August 4, 2009. I first
met him on the morning of July 17, 2011
and he graduated from Guiding Eyes (at home) on Aug 5, 2011.</p>
<p>His pet name was Til-Til (he loved the sound of bells and would
jump up shoulder high if you rang a bell) --- and had a very gentle
personality. He worked as a guide-dog for 11 years and 1 month
before going to sleep peacefully on September 3, 2022.</p>
<p>During his career, Tilden worked at Google Mountain View and
travelled to multiple Google offices including Seattle, Cambridge and
NYC to name a few. He also had the privilege of sharing at least 10
different desk locations on the Google MTv campus ranging from main
campus all the way to the far end of the Western Spiral Arm of the
Galaxy (AKA West Campus) and the opposite end on East Charleston. He
travelled around the Google Campus proudly sporting his Google Badge,
but unlike his predecessor Bubbles, would wait if recalcitrant
Googlers blocked his way and look up at them gently as if to say <em>Why
dont you move out of my way please?</em>.
On the other hand, he was also the veritable sphinx in that if he
parked himself outsite the restroom to wait for me, he would look up
at all who came close to say <em>Thou Shall Not Pass</em>.
He worked on a variety of
AI-powered projects including Google Accessibility, Smart Assistant,
and toward the end on Google Translate, all while bringing his
refreshingly Natural Intelligence to his primary job of path planning
and obstacle avoidance on the Google Campus --- and believe you me, it
takes a particularly intelligent dog to avoid obstacles that smart
Googlers can place in your way. He attended most Smart Assistant
offsites with the claim <em>All of you have just a Smart Assistant;
But I'm a Smart AssistDog, and that is better, --- because you know, A
Dog is Bigger Than An Ant!</em>
In addition, Tilden, like Aster and
Bubbles before him, was also the mascot for <a
href="http://emacspeak.sf.net">Emacspeak --- The Complete Audio
Desktop</a>; in addition, he played the vital role of Press/Analyst
contact for just over 11 years.</p>
T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-77880485931336338862022-06-05T09:38:00.003-07:002022-06-05T09:38:42.788-07:00Emacspeak: The Complete Audio Desktop Under Pulseaudio<div id="content" class="content">
<h1 class="title">Emacspeak: The Complete Audio Desktop Under Pulseaudio</h1>
<div id="outline-container-orgfabf488" class="outline-2">
<h2 id="orgfabf488"><span class="section-number-2">1.</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
Porting Emacspeak sound environment to Pulseaudio.
</p>
<p>
Until now, emacspeak features that enhance the auditory display have
relied exclusively on ALSA and avoided Pulseaudio all together. As
Pulseaudio improves, and simultaneously gets harder to get rid of, I
recently ported the required features to work under Pulseaudio, see
below for details.
</p>
</div>
</div>
<div id="outline-container-org0ab1466" class="outline-2">
<h2 id="org0ab1466"><span class="section-number-2">2.</span> Summary Of Auditory Display Enhancements</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li>Notifications, e.g., <i>speaking the time</i>, <i>incoming IM messages</i></li>
</ul>
<p>
etc. are spoken on a separate notification stream.
</p>
<ul class="org-ul">
<li>The above normally plays on the right ear, but enhanced with a
<i>binaural</i> effect.</li>
<li>This can be configured to be on the left ear when running
Emacspeak remotely on a cloud-top.</li>
<li>A <i>Bauer Stereo To Binaural</i> <a href="https://www.google.com/search?num=25&lite=90586&q=bs2b+bauer+Stereo+To+Binaural">(BS2B)</a>
filter is applied to all
output streams to provide an enhanced headphones listening experience.</li>
<li>The <i>outloud</i> server has been updated to request lower latency
from Pulse; Pulseaudio defaults are too high for highly responsive
TTS.</li>
</ul>
<p>
For details on Emacspeak's enhancement to the auditory display, see
prior articles listed in the <i>References</i> section.
</p>
</div>
</div>
<div id="outline-container-orgc514147" class="outline-2">
<h2 id="orgc514147"><span class="section-number-2">3.</span> Configuring Pulseaudio To Enhance The Auditory Display</h2>
<div class="outline-text-2" id="text-3">
<p>
All of these features have been available until now by installing a
custom <code>.asoundrc</code>; these are now available under Pulseaudio by
installing a <code>.config/pulse/default.pa</code> in the user's home directory.
</p>
<pre class="example">
cp EMACSPEAK_DIR/etc/pulse/default.pa ~/.config/pulse; pulseaudio -k
</pre>
<p>
The above is a one-time operation that sets up the audio environment
— see <a href="https://github.com/tvraman/emacspeak/blob/master/etc/pulse/README.org#L42">etc/pulse/README.org</a>.
</p>
</div>
</div>
<div id="outline-container-orgd96e5b7" class="outline-2">
<h2 id="orgd96e5b7"><span class="section-number-2">4.</span> References</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li><a href="https://emacspeak.blogspot.com/2016/02/augmented-headphone-listening-on-linux.html">Augmented Headphone Listening On Linux For The Emacspeak Audio Desktop</a></li>
<li><a href="https://emacspeak.blogspot.com/2015/12/soundscapes-on-emacspeak-audio-desktop.html">Soundscapes On The Emacspeak Audio Desktop</a></li>
<li><a href="https://emacspeak.blogspot.com/2016/11/follow-up-soundscapes-on-emacspeak.html">Follow-Up: Soundscapes on the emacspeak Audio Desktop</a></li>
<li><a href="https://emacspeak.blogspot.com/2015/12/a-ladspa-work-bench-for-emacspeak.html">A Ladspa Work-Bench For The Emacspeak Desktop</a></li>
<li><a href="https://emacspeak.blogspot.com/2015/11/generating-spatialized-auditory-icons.html">Generating Spatialized Auditory Icons Using MPlayer And Ladspa</a></li>
<li><a href="https://emacspeak.blogspot.com/2015/11/listening-to-multiple-media-streams-on.html">Listening To Multiple Media Streams On The Emacspeak Audio Desktop</a></li>
<li><a href="https://emacspeak.blogspot.com/2015/11/using-multiple-tts-streams-on-emacspeak.html">Using Multiple TTS Streams On The emacspeak Audio Desktop</a></li>
<li><a href="https://emacspeak.blogspot.com/2015/02/enhanced-audio-on-emacspeak-desktop.html">Enhanced Audio On The Emacspeak Desktop</a></li>
</ol>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="date">Date: 2022-06-05 Sun 00:00</p>
<p class="author">Author: T.V Raman</p>
<p class="date">Created: 2022-06-05 Sun 09:16</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div> T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-32419330336023343172022-04-30T10:16:00.002-07:002022-04-30T10:16:47.241-07:00Announcing Emacspeak 56.0 (AgileDog)<div id="content" class="content">
<h1 class="title">Announcing Emacspeak 56.0—AgileDog!</h1>
<p>
The enjoyment of one's tools is an essential ingredient of successful work. – Donald E. Knuth
</p>
<div id="outline-container-orgb5e9224" class="outline-2">
<h2 id="orgb5e9224"><span class="section-number-2">1.</span> For Immediate Release:</h2>
<div class="outline-text-2" id="text-1">
<p>
San Jose, CA, (May 1, 2022)
</p>
</div>
<div id="outline-container-org464b166" class="outline-3">
<h3 id="org464b166"><span class="section-number-3">1.1.</span> Emacspeak 56.0 (AgileDog) Unleashed! 🦮</h3>
<div class="outline-text-3" id="text-1-1">
<p>
— Making Accessible Computing Effortless!
</p>
<p>
Advancing Accessibility In The Age Of User-Aware Interfaces — Zero
cost of Ownership makes priceless software Universally affordable!
</p>
<p>
Emacspeak Inc (NASDOG: ESPK) — <a href="http://github.com/tvraman/emacspeak">http://github.com/tvraman/emacspeak</a>
announces immediate world-wide availability of <a href="https://github.com/tvraman/emacspeak/releases/download/56.0/emacspeak-56.0.tar.bz2">Emacspeak 56.0</a>
(AgileDog) 🦮 — a powerful audio desktop that leverages today's
evolving Data, Social and Assistant-Oriented Internet cloud to enable
working efficiently and effectively from anywhere!
</p>
</div>
</div>
</div>
<div id="outline-container-orgbf57205" class="outline-2">
<h2 id="orgbf57205"><span class="section-number-2">2.</span> Investors Note:</h2>
<div class="outline-text-2" id="text-2">
<p>
With several prominent tweeters expanding coverage of <span class="underline">#emacspeak</span>,
NASDOG: ESPK has now been consistently trading over the social net at
levels close to that once attained by DogCom high-fliers—and is
trading at levels close to that achieved by once better known stocks
in the tech sector.
</p>
</div>
</div>
<div id="outline-container-org7b7ae95" class="outline-2">
<h2 id="org7b7ae95"><span class="section-number-2">3.</span> What Is It?</h2>
<div class="outline-text-2" id="text-3">
<p>
Emacspeak is a fully functional audio desktop that provides complete
eyes-free access to all major 32 and 64 bit operating environments. By
seamlessly blending live access to all aspects of the Internet such as
ubiquitous assistance, Web-surfing, blogging, remote software
development, social computing and electronic messaging into the audio
desktop, Emacspeak enables spoken access to local and remote
information with a consistent and well-integrated user interface. A
rich suite of task-oriented tools provides efficient speech-enabled
access to the evolving assistant-oriented social Internet cloud.
</p>
</div>
</div>
<div id="outline-container-org2672b79" class="outline-2">
<h2 id="org2672b79"><span class="section-number-2">4.</span> Major Enhancements:</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>Updated eldoc support 🕮</li>
<li>Updated <code>elpy</code> support 🐍</li>
<li>Updated language switching for Espeak </li>
<li>Updated Transient Support 𝥍</li>
<li>External Browsers From EWW 🕸</li>
<li>Updated wizards and muggles 🧙</li>
<li>Updated <code>url templates</code> for smarter Web access ♅</li>
<li><p>
Fully tested under emacs-28 native compilation 🚄
</p>
<p>
— And a lot more than will fit this margin. … 🗞
</p></li>
</ol>
<p>
Note: This version <b>requires</b> emacs-27.1 or later.
</p>
</div>
</div>
<div id="outline-container-org0ef9910" class="outline-2">
<h2 id="org0ef9910"><span class="section-number-2">5.</span> Establishing Liberty, Equality And Freedom:</h2>
<div class="outline-text-2" id="text-5">
<p>
Never a toy system, Emacspeak is voluntarily bundled with all
major Linux distributions. Though designed to be modular,
distributors have freely chosen to bundle the fully integrated
system without any undue pressure—a documented success for
the integrated innovation embodied by Emacspeak. As the system
evolves, both upgrades and downgrades continue to be available at
the same zero-cost to all users. The integrity of the Emacspeak
codebase is ensured by the reliable and secure Linux platform
and the underlying GIT versioning software used to develop and distribute the system.
</p>
<p>
Extensive studies have shown that thanks to these features, users
consider Emacspeak to be absolutely priceless. Thanks to this
wide-spread user demand, the present version remains free of cost
as ever—it is being made available at the same zero-cost as
previous releases.
</p>
<p>
At the same time, Emacspeak continues to innovate in the area of
eyes-free Assistance and social interaction and carries forward the
well-established Open Source tradition of introducing user interface
features that eventually show up in luser environments.
</p>
<p>
On this theme, when once challenged by a proponent of a crash-prone
but well-marketed mousetrap with the assertion "Emacs is a system from
the 70's", the creator of Emacspeak evinced surprise at the unusual
candor manifest in the assertion that it would take popular
idiot-proven interfaces until the year 2070 to catch up to where the
Emacspeak audio desktop is today. Industry experts welcomed this
refreshing breath of Courage Certainty and Clarity (CCC) at a time
when users are reeling from the Fear Uncertainty and Doubt (FUD)
unleashed by complex software systems backed by even more convoluted
press releases.
</p>
</div>
</div>
<div id="outline-container-org551e6b3" class="outline-2">
<h2 id="org551e6b3"><span class="section-number-2">6.</span> Independent Test Results:</h2>
<div class="outline-text-2" id="text-6">
<p>
Independent test results have proven that unlike some modern (and
not so modern) software, Emacspeak can be safely uninstalled without
adversely affecting the continued performance of the computer. These
same tests also revealed that once uninstalled, the user stopped
functioning altogether. Speaking with Aster Labrador, the creator of
Emacspeak once pointed out that these results re-emphasize the
user-centric design of Emacspeak; “It is the user — and not the
computer– that stops functioning when Emacspeak is uninstalled!”.
</p>
</div>
<div id="outline-container-org7c1ca92" class="outline-3">
<h3 id="org7c1ca92"><span class="section-number-3">6.1.</span> Note from Aster,Bubbles and Tilden:</h3>
<div class="outline-text-3" id="text-6-1">
<p>
UnDoctored Videos Inc. is looking for volunteers to star in a
video demonstrating such complete user failure.
</p>
</div>
</div>
</div>
<div id="outline-container-orgd69c955" class="outline-2">
<h2 id="orgd69c955"><span class="section-number-2">7.</span> Obtaining Emacspeak:</h2>
<div class="outline-text-2" id="text-7">
<p>
Emacspeak can be downloaded from GitHub — see
<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a> you can visit Emacspeak on the
WWW at <a href="http://emacspeak.sf.net">http://emacspeak.sf.net</a>. You can subscribe to the emacspeak
mailing list — <a href="http://mail.emacspeak.org">emacspeak@emacspeak.org</a>. The <a href="http://emacspeak.blogspot.com">Emacspeak Blog</a> is a good
source for news about recent enhancements and how to use them.
</p>
<p>
The latest development snapshot of Emacspeak is always available at
<a href="https://github.com/tvraman/emacspeak">GitHub</a>.
</p>
</div>
</div>
<div id="outline-container-org42c0daf" class="outline-2">
<h2 id="org42c0daf"><span class="section-number-2">8.</span> History:</h2>
<div class="outline-text-2" id="text-8">
<ul class="org-ul">
<li>Emacspeak 56.0 (AgileDog) belies its age to be as agile as Tilden.</li>
<li>Emacspeak 55.0 (CalmDog) attempts to be as calm as Tilden.</li>
<li>Emacspeak 54.0 (EZDog) learns to take it easy from Tilden.</li>
<li>Emacspeak 53.0 (EfficientDog) focuses on efficiency.</li>
<li>Emacspeak 52.0 (WorkAtHomeDog) makes working remotely a pleasurable experience.</li>
<li>Bigger and more powerful than any smart assistAnt, AssistDog provides</li>
</ul>
<p>
instant access to the most relevant information at all times.
</p>
<ul class="org-ul">
<li>Emacspeak 50.0 (SageDog) embraces the wisdom of stability as
opposed to rapid change and the concomitant creation of bugs.🚭: Naturally Intelligent (NI)™ at how information is spoken, Emacspeak</li>
</ul>
<p>
is entirely free of Artificial Ingredients (AI)™.
</p>
<ul class="org-ul">
<li>Emacspeak 49.0 (WiseDog) leverages the wisdom gleaned from
earlier releases to provide an enhanced auditory experience.</li>
<li>Emacspeak 48.0 (ServiceDog) builds on earlier releases to provide
continued end-user value.</li>
<li>Emacspeak 47.0 (GentleDog) goes the next step in being helpful
while letting users learn and grow.</li>
<li>Emacspeak 46.0 (HelpfulDog) heralds the coming of Smart Assistants.</li>
<li>Emacspeak 45.0 (IdealDog) is named in recognition of Emacs'
excellent integration with various programming language
environments — thanks to this, Emacspeak is the IDE of choice
for eyes-free software engineering.</li>
<li>Emacspeak 44.0 continues the steady pace of innovation on the
audio desktop.</li>
<li>Emacspeak 43.0 brings even more end-user efficiency by leveraging the
ability to spatially place multiple audio streams to provide timely
auditory feedback.</li>
<li>Emacspeak 42.0 while moving to GitHub from Google Code continues to
innovate in the areas of auditory user interfaces and efficient,
light-weight Internet access.</li>
<li>Emacspeak 41.0 continues to improve
on the desire to provide not just equal, but superior access —
technology when correctly implemented can significantly enhance the
human ability.</li>
<li>Emacspeak 40.0 goes back to Web basics by enabling
<a href="http://emacspeak.blogspot.com/2013/11/reading-web-content-efficiently.html">efficient access</a> to large amounts of readable Web content.</li>
<li>Emacspeak 39.0 continues the Emacspeak tradition of increasing the breadth of
user tasks that are covered without introducing unnecessary
bloatware.</li>
<li>Emacspeak 38.0 is the latest in a series of award-winning
releases from Emacspeak Inc.</li>
<li>Emacspeak 37.0 continues the tradition of
delivering robust software as reflected by its code-name.</li>
<li>Emacspeak 36.0 enhances the audio desktop with many new tools including full
EPub support — hence the name EPubDog.</li>
<li>Emacspeak 35.0 is all about
teaching a new dog old tricks — and is aptly code-named HeadDog in
on of our new Press/Analyst contact. emacspeak-34.0 (AKA Bubbles)
established a new beach-head with respect to rapid task completion in
an eyes-free environment.</li>
<li>Emacspeak-33.0 AKA StarDog brings
unparalleled cloud access to the audio desktop.</li>
<li>Emacspeak 32.0 AKA
LuckyDog continues to innovate via open technologies for better
access.</li>
<li>Emacspeak 31.0 AKA TweetDog — adds tweeting to the Emacspeak
desktop.</li>
<li>Emacspeak 30.0 AKA SocialDog brings the Social Web to the
audio desktop—you can't but be social if you speak!</li>
<li>Emacspeak 29.0—AKAAbleDog—is a testament to the resilliance and innovation
embodied by Open Source software—it would not exist without the
thriving Emacs community that continues to ensure that Emacs remains
one of the premier user environments despite perhaps also being one of
the oldest.</li>
<li>Emacspeak 28.0—AKA PuppyDog—exemplifies the rapid pace of
development evinced by Open Source software.</li>
<li>Emacspeak 27.0—AKA
FastDog—is the latest in a sequence of upgrades that make previous
releases obsolete and downgrades unnecessary.</li>
<li>Emacspeak 26—AKA
LeadDog—continues the tradition of introducing innovative access
solutions that are unfettered by the constraints inherent in
traditional adaptive technologies.</li>
<li>Emacspeak 25 —AKA ActiveDog
—re-activates open, unfettered access to online
information.</li>
<li>Emacspeak-Alive —AKA LiveDog —enlivens open, unfettered
information access with a series of live updates that once again
demonstrate the power and agility of open source software
development.</li>
<li>Emacspeak 23.0 — AKA Retriever—went the extra mile in
fetching full access.</li>
<li>Emacspeak 22.0 —AKA GuideDog —helps users
navigate the Web more effectively than ever before.</li>
<li>Emacspeak 21.0
—AKA PlayDog —continued the
Emacspeak tradition of relying on enhanced
productivity to liberate users.</li>
<li>Emacspeak-20.0 —AKA LeapDog —continues
the long established GNU/Emacs tradition of integrated innovation to
create a pleasurable computing environment for eyes-free
interaction.</li>
<li>emacspeak-19.0 –AKA WorkDog– is designed to enhance
user productivity at work and leisure.</li>
<li>Emacspeak-18.0 –code named
GoodDog– continued the Emacspeak tradition of enhancing user
productivity and thereby reducing total cost of
ownership.</li>
<li>Emacspeak-17.0 –code named HappyDog– enhances user
productivity by exploiting today's evolving WWW
standards.</li>
<li>Emacspeak-16.0 –code named CleverDog– the follow-up to
SmartDog– continued the tradition of working better, faster,
smarter.</li>
<li>Emacspeak-15.0 –code named SmartDog–followed up on TopDog
as the next in a continuing series of award-winning audio desktop
releases from Emacspeak Inc.</li>
<li>Emacspeak-14.0 –code named TopDog–was</li>
</ul>
<p>
the first release of this millennium.
</p>
<ul class="org-ul">
<li>Emacspeak-13.0 –codenamed
YellowLab– was the closing release of the
20th. century.</li>
<li>Emacspeak-12.0 –code named GoldenDog– began
leveraging the evolving semantic WWW to provide task-oriented speech
access to Webformation.</li>
<li>Emacspeak-11.0 –code named Aster– went the
final step in making Linux a zero-cost Internet access solution for
blind and visually impaired users.</li>
<li>Emacspeak-10.0 –(AKA
Emacspeak-2000) code named WonderDog– continued the tradition of
award-winning software releases designed to make eyes-free computing a
productive and pleasurable experience.</li>
<li>Emacspeak-9.0 –(AKA
Emacspeak 99) code named BlackLab– continued to innovate in the areas
of speech interaction and interactive accessibility.</li>
<li>Emacspeak-8.0 –(AKA Emacspeak-98++) code named BlackDog– was a major upgrade to
the speech output extension to Emacs.</li>
<li>Emacspeak-95 (code named Illinois) was released as OpenSource on
the Internet in May 1995 as the first complete speech interface
to UNIX workstations. The subsequent release, Emacspeak-96 (code
named Egypt) made available in May 1996 provided significant
enhancements to the interface. Emacspeak-97 (Tennessee) went
further in providing a true audio desktop. Emacspeak-98
integrated Internetworking into all aspects of the audio desktop
to provide the first fully interactive speech-enabled WebTop.</li>
</ul>
</div>
</div>
<div id="outline-container-org30cfe3c" class="outline-2">
<h2 id="org30cfe3c"><span class="section-number-2">9.</span> About Emacspeak:</h2>
<div class="outline-text-2" id="text-9">
<p>
Originally based at Cornell (NY) —
<a href="http://www.cs.cornell.edu/home/raman">http://www.cs.cornell.edu/home/raman</a> —home to Auditory User
Interfaces (AUI) on the WWW, Emacspeak is now maintained on GitHub
—<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a>. The system is mirrored
world-wide by an international network of software archives and
bundled voluntarily with all major Linux distributions. On Monday,
April 12, 1999, Emacspeak became part of the <a href="http://tvraman.github.io/emacspeak/blog/smithsonian-study.html">Smithsonian's Permanent
Research Collection</a> on Information Technology at the Smithsonian's
National Museum of American History.
</p>
<p>
The Emacspeak mailing list is archived at
<a href="https://www.emacspeak.org">Emacspeak Mail Archive</a> –the home of the
Emacspeak mailing list– thanks to Greg Priest-Dorman, and provides a
valuable knowledge base for new users.
</p>
</div>
</div>
<div id="outline-container-orgac9045b" class="outline-2">
<h2 id="orgac9045b"><span class="section-number-2">10.</span> Press/Analyst Contact: Tilden Labrador</h2>
<div class="outline-text-2" id="text-10">
<p>
Going forward, Tilden acknowledges his exclusive monopoly on
setting the direction of the Emacspeak Audio Desktop (🦮) and
promises to exercise this freedom to innovate and her resulting
power responsibly (as before) in the interest of all dogs.
</p>
<p>
*About This Release:
</p>
<hr />
<p>
Windows-Free (WF) is a favorite battle-cry of The League Against
Forced Fenestration (LAFF). –see
<a href="http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm">http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm</a> for details on
the ill-effects of Forced Fenestration.
</p>
<p>
CopyWrite )C( Aster, Hubbell and Tilden Labrador. All Writes Reserved.
HeadDog (DM), LiveDog (DM), GoldenDog (DM), BlackDog (DM) etc., are Registered
Dogmarks of Aster, Hubbell and Tilden Labrador. All other dogs belong to
their respective owners.
</p>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-28743066298335749052022-04-09T14:39:00.001-07:002022-04-09T14:39:13.463-07:00Advice On Emacs Advice<div id="content" class="content">
<h1 class="title">Advice On Emacs Advice</h1>
<div id="outline-container-org303b39e" class="outline-2">
<h2 id="org303b39e"><span class="section-number-2">1.</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
<p>
Love it or hate it, lisp <code>advice</code> is powerful and useful. This
article covers some of the places where <code>advice</code> can provide a means
of discovering useful behaviors that can then be later codified
without resorting to advice. Advice can also prove to be a powerful
means of experimentation; these experiments can become permanent, e.g., when the
resulting modifications introduced via <code>advice</code> are only relevant to a small
minority — a good example is package <a href="https://github.com/tvraman/emacspeak">Emacspeak</a>. These are but two
extremes of a continuum and <code>advice</code> enables many possibilities in
that range.
</p>
<p>
This article is written in the light of nearly 28 years of Emacspeak
development, a time during which I have learn some useful lessons on
how to use advice safely and program defensively.
This article itself does not take any position in the <i>Advice is evil,
dont use it</i> debate — it is here to help you if you do decide to use
<code>advice</code> for a given task.
</p>
</div>
</div>
<div id="outline-container-org3b61f06" class="outline-2">
<h2 id="org3b61f06"><span class="section-number-2">2.</span> Where Advice Can Be Useful</h2>
<div class="outline-text-2" id="text-2">
<ol class="org-ol">
<li>Temporarily <i>trace</i> a given function — <code>advice</code> can display
messages on entry and exit to the adviced function. Emacs' own
built-in debug-on-entry mostly obviates the need to do this.</li>
<li>You want custom behavior for some command in a package, where
the package author (hasn't yet) provided an appropriate <i>before</i>
or <i>after</i> hook. Implementing the desired behavior as a <i>before</i>
or <i>after</i> advice is a friction-free means of experimenting with
your idea. Once proven useful, the advice-based prototype can be
used to motivate the introduction of the new hook, and once
implemented, you can eliminate the <code>advice</code>.</li>
<li>Having implemented a custom behavior, you discover that the
author of the package you are extending is unable to incorporate
your suggestion. Advice here can provide a light-weight
alternative to forking the package in question.</li>
<li>The modified behavior you wish to implement is relevant to a
small minority. You need to advice a large number of functions
because the modified behavior you desire requires complete access
to the calling context and environment. A good example is
generating rich contextual spoken feedback — advice is
excellently suited to this task.</li>
</ol>
</div>
</div>
<div id="outline-container-org3ad6e12" class="outline-2">
<h2 id="org3ad6e12"><span class="section-number-2">3.</span> Advice Tips</h2>
<div class="outline-text-2" id="text-3">
<p>
These tips are written in terms of <code>defadvice</code> but apply equally well
to the API introduced in module <code>nadvice</code>.
</p>
<ol class="org-ol">
<li>Use <code>before/after</code> advice as far as possible, and resort to
<code>around</code> advice only when you must.</li>
<li>Name all your <code>advice</code> fragments consistently.</li>
<li>Do not depend on the argument names used in the function being
adviced, instead use <span class="underline">ad-get-arg</span> to positionally access the adviced
function's arguments.</li>
<li>Use lexical scoping in all your functions, and be rigorous in
declaring any special variables using <span class="underline">(cl-declare (special
…))</span> in your code. The byte-compiler is your friend; use this
declaration when you see warnings about special variables.</li>
<li>Except for very simple advice fragments, use a <span class="underline">let</span> form inside
your advice to bind variables.</li>
<li>Within your advice, do not depend on any global state that you
haven't yourself bound within the <span class="underline">let</span> body in your advice.</li>
<li>If you write <code>around</code> advice, ensure that the last form in your
<code>advice</code> is <span class="underline">ad-return-value</span>. Dont modify this value unless you
<b>absolutely</b> must.</li>
<li>Make sure to use <span class="underline">ad-do-it</span> in your <code>around</code> advice so that the
original function gets called — except in the very rare cases
where you want to entirely bypass the original function.</li>
<li>In the rare case where you have multiple <span class="underline">defadvice</span> on the same
function, note that you can specify the order win which these are
called. Use this only when experimenting, and make sure to
clean-up later by combining the advice fragments into a single
call to <code>defadvice</code>.</li>
</ol>
</div>
</div>
<div id="outline-container-orgd77eefa" class="outline-2">
<h2 id="orgd77eefa"><span class="section-number-2">4.</span> Historical Note</h2>
<div class="outline-text-2" id="text-4">
<ul class="org-ul">
<li>Advice was contributed to Emacs in early 1994 by Hans
Chalupsky. I started the Emacspeak project a few months after and
am indebted to him — both for his advice implementation and for
numerous email exchanges with him at the time as I learnt to use
advice.</li>
<li>I released Emacspeak in April 1995. A few days later I was
thrilled to receive a phone call from RMS — where he told me all
the reasons why I shouldn't use advice. This was distressing to
say the least; I had two choices — abandon Emacspeak using
advice, or to ignore his advice. I took the middle-road; I made
careful note of all his admonitions and warnings, and the result
was to program defensively. Many of the tips listed in the
previous section are a direct consequence of keeping an eye out
for the various pitfalls he outlined during that phone call.</li>
<li>I've also garnered useful tips and tricks on the emacs-devel list
over the years from folks like Stefan Mounier — especially as
Emacs transitioned to module <code>nadvice</code> in 2014.</li>
</ul>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-82827004122364786052021-11-25T07:09:00.002-08:002021-11-25T07:09:48.848-08:00Emacspeak In The Age Of Cloud Computing<div id="content" class="content">
<h1 class="title">Emacspeak In The Age Of Cloud Computing</h1>
<div id="outline-container-orgd973121" class="outline-2">
<h2 id="orgd973121"><span class="section-number-2">1.</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
Emacspeak has supported <i>Cloud Computing</i> since 1995, i.e., long
before the term was invented. I have used Emacs with Emacspeak
running on remote servers (called cloud-top in the rest of this
article) since that time, with a local speech server on my client
machine providing spoken feedback. The underlying ssh-based scripts
have changed over time; this article documents what I have been using
for the last 7 years or more. As with everything else Linux, you
should not use this without understanding how it works. All of the
relevant code is checked into GitHub, but if you use it without
understanding, you are likely to get 2 for the price of 1😀.
</p>
</div>
</div>
<div id="outline-container-orgce224d0" class="outline-2">
<h2 id="orgce224d0"><span class="section-number-2">2.</span> The Basics</h2>
<div class="outline-text-2" id="text-2">
<ol class="org-ol">
<li>Emacspeak produces all spoken and non-spoken feedback via a <i>speech
server</i> — see <a href="http://emacspeak.sourceforge.net/raman/publications/bc-emacspeak/">Emacspeak: Beautiful Code</a> for the detailed
architecture overview.</li>
<li>This server runs as a separate process and can either run <b>locally</b>
i.e. on the machine running emacs; it can also run <b>remotely</b>,
e.g. your laptop from which you login to your cloud-top.</li>
<li>Note the <i>local</i> and <i>remote</i> terminology in the above — to
Emacspeak, the machine where Emacs runs is the local machine, so
your machine in the cloud is <b>local</b> to Emacspeak.</li>
<li>Consequently, the machine from where you SSH to the cloud, a
laptop, a Raspberry Pi, or in a future a tin-can that you use as a
client is <b>remote</b> to emacspeak.</li>
</ol>
</div>
</div>
<div id="outline-container-org9d1d106" class="outline-2">
<h2 id="org9d1d106"><span class="section-number-2">3.</span> How It Works</h2>
<div class="outline-text-2" id="text-3">
<ol class="org-ol">
<li>When you start Emacs with Emacspeak loaded, Emacs starts the
speech-server as the first step in the emacspeak startup.
normally this starts the local server for your prefered TTS engine.</li>
<li>See the emacspeak manual for how this speech-server is determined.</li>
<li>When running Emacspeak on a cloud-top, this <i>local speech server</i> is just a
simple shell script that connects to a local port — by default <b>2222</b>.</li>
<li>When you connect to your cloud-top via SSH, you first <i>reverse port
forward</i> port <b>2222</b> from the cloud-top back to your client. This
causes data sent to port <b>2222</b> on the cloud-top by Emacs to show
up on port <b>2222</b> on the local machine where your speech server is listening.</li>
<li>With that reverse port forwarding in place and assuming that
<code>espeak</code> is your TTS engine, running the speech-server
<code>cloud-espeak</code> on the cloud-top connects back to your client to
produce spoken output.</li>
<li>For the previous step to work, something (or someone) needs to be
listening on port <b>2222</b> on your client.</li>
<li><p>
So you need to start the relevant speech server on your client
before you <code>ssh</code> to your cloud-top — in the case of <code>espeak</code>,
this is <code>ssh-espeak</code>.
</p>
<p>
See directory <code>bash-utils</code> in your emacspeak Git checkout for the
relevant Bash scripts.
</p></li>
</ol>
</div>
</div>
<div id="outline-container-org81b1ca8" class="outline-2">
<h2 id="org81b1ca8"><span class="section-number-2">4.</span> Workflow</h2>
<div class="outline-text-2" id="text-4">
<p>
Here is what the workflow looks like, again, use this <b>only if</b>
you have read and understood the previous section.
See<a href="https://github.com/tvraman/emacspeak/blob/master/bash-utils/remote#L8">Bash Utils</a> for the scripts mentioned below. Everything below
assumes a Bash Shell.
</p>
<p>
On your cloud-top, specify the speech-server to use by running
</p>
<pre class="example">
export DTK_PROGRAM=cloud-espeak
</pre>
<p>
You can put the above in your <code>.bash_profile</code> on your cloud-top.
</p>
<p>
On your client device, run
</p>
<pre class="example">
. <emacspeak_dir>/bash-utils/remote
</pre>
<p>
This need be done only once per interactive shell.It defines <code>bash</code>
functions <span class="underline">remote</span> and <span class="underline">rtts</span>.
</p>
<p>
Next, run Bash function <span class="underline">remote</span> defined in the script you just
loaded.
</p>
<pre class="example">
remote host.example.com speech-server espeak
</pre>
<p>
This does the following:
</p>
<ol class="org-ol">
<li>Starts a local speech server for the TTS engine <code>espeak</code>.</li>
<li>Opens an SSH session to the cloud-top host.example.com.</li>
<li>Plays a musical chime (using <code>sox</code>) to cue completion.</li>
<li>Depending on your SSH setup, you may or may not need to type your
ssh password at this point; avoiding having to type a password is
beyond the perview of this article, consult the SSH manual pages.</li>
<li>Now, run Emacs on the cloud-top. Assuming that you have updated
your Emacs initialization to load Emacspeak, this will get
Emacspeak running on the cloud-top talking on your client.</li>
<li>Note that typically, you should run something like <code>screen</code> on the
cloud-top and run Emacs within that <code>screen</code> session; this will let
you persist a running Emacs across multiple login/logout.</li>
</ol>
</div>
</div>
<div id="outline-container-org4676fc9" class="outline-2">
<h2 id="org4676fc9"><span class="section-number-2">5.</span> Experience On A Well-Configured Setup</h2>
<div class="outline-text-2" id="text-5">
<p>
On a well-configured setup, you typically need only do:
</p>
<ol class="org-ol">
<li>Run the bash function that starts the local TTS server, and then
connects to the cloud-top via SSH with reverse-port forwarding active.</li>
<li>Assuming there is an Emacs session running under screen at the
remote end, it'll start talking on your local client.</li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-37400896008947315882021-11-24T08:30:00.000-08:002021-11-24T08:30:02.614-08:00Announcing Emacspeak 55.0 (CalmDog)<div id="content" class="content">
<h1 class="title">Announcing Emacspeak 55.0—CalmDog!</h1>
<p>
The enjoyment of one's tools is an essential ingredient of successful work. – Donald E. Knuth
</p>
<div id="outline-container-org458a930" class="outline-2">
<h2 id="org458a930"><span class="section-number-2">1.</span> For Immediate Release:</h2>
<div class="outline-text-2" id="text-1">
<p>
San Jose, CA, (Nov 24, 2021)
</p>
</div>
<div id="outline-container-orgbf9ddd1" class="outline-3">
<h3 id="orgbf9ddd1"><span class="section-number-3">1.1.</span> Emacspeak 55.0 (CalmDog) Unleashed! 🦮</h3>
<div class="outline-text-3" id="text-1-1">
<p>
— Making Accessible Computing Effortless!
</p>
<p>
Advancing Accessibility In The Age Of User-Aware Interfaces — Zero
cost of Ownership makes priceless software Universally affordable!
</p>
<p>
Emacspeak Inc (NASDOG: ESPK) — <a href="http://github.com/tvraman/emacspeak">http://github.com/tvraman/emacspeak</a>
announces immediate world-wide availability of <a href="https://github.com/tvraman/emacspeak/releases/download/54.0/emacspeak-53.0.tar.bz2">Emacspeak 55.0</a>
(CalmDog) 🦮 — a powerful audio desktop that leverages today's
evolving Data, Social and Assistant-Oriented Internet cloud to enable
working efficiently and effectively from anywhere!
</p>
</div>
</div>
</div>
<div id="outline-container-org648436e" class="outline-2">
<h2 id="org648436e"><span class="section-number-2">2.</span> Investors Note:</h2>
<div class="outline-text-2" id="text-2">
<p>
With several prominent tweeters expanding coverage of <span class="underline">#emacspeak</span>,
NASDOG: ESPK has now been consistently trading over the social net at
levels close to that once attained by DogCom high-fliers—and is
trading at levels close to that achieved by once better known stocks
in the tech sector.
</p>
</div>
</div>
<div id="outline-container-orga01459f" class="outline-2">
<h2 id="orga01459f"><span class="section-number-2">3.</span> What Is It?</h2>
<div class="outline-text-2" id="text-3">
<p>
Emacspeak is a fully functional audio desktop that provides complete
eyes-free access to all major 32 and 64 bit operating environments. By
seamlessly blending live access to all aspects of the Internet such as
ubiquitous assistance, Web-surfing, blogging, remote software
development, social computing and electronic messaging into the audio
desktop, Emacspeak enables spoken access to local and remote
information with a consistent and well-integrated user interface. A
rich suite of task-oriented tools provides efficient speech-enabled
access to the evolving assistant-oriented social Internet cloud.
</p>
</div>
</div>
<div id="outline-container-org32377e2" class="outline-2">
<h2 id="org32377e2"><span class="section-number-2">4.</span> Major Enhancements:</h2>
<div class="outline-text-2" id="text-4">
<ol class="org-ol">
<li>Speech-enable Emacs Application Framework </li>
<li>Updated Soundscapes 🔊</li>
<li>Updated Auditory Icons 🎧</li>
<li>Updated Transient Support 𝥍</li>
<li>Speech-Enabled CalibreDB 📚</li>
<li><p>
External Browsers From EWW 🕸
</p>
<p>
— And a lot more than will fit this margin. … 🗞
</p></li>
</ol>
<p>
Note: This version <b>requires</b> emacs-27.1 or later.
</p>
</div>
</div>
<div id="outline-container-orgba428e9" class="outline-2">
<h2 id="orgba428e9"><span class="section-number-2">5.</span> Establishing Liberty, Equality And Freedom:</h2>
<div class="outline-text-2" id="text-5">
<p>
Never a toy system, Emacspeak is voluntarily bundled with all
major Linux distributions. Though designed to be modular,
distributors have freely chosen to bundle the fully integrated
system without any undue pressure—a documented success for
the integrated innovation embodied by Emacspeak. As the system
evolves, both upgrades and downgrades continue to be available at
the same zero-cost to all users. The integrity of the Emacspeak
codebase is ensured by the reliable and secure Linux platform
and the underlying GIT versioning software used to develop and distribute the system.
</p>
<p>
Extensive studies have shown that thanks to these features, users
consider Emacspeak to be absolutely priceless. Thanks to this
wide-spread user demand, the present version remains free of cost
as ever—it is being made available at the same zero-cost as
previous releases.
</p>
<p>
At the same time, Emacspeak continues to innovate in the area of
eyes-free Assistance and social interaction and carries forward the
well-established Open Source tradition of introducing user interface
features that eventually show up in luser environments.
</p>
<p>
On this theme, when once challenged by a proponent of a crash-prone
but well-marketed mousetrap with the assertion "Emacs is a system from
the 70's", the creator of Emacspeak evinced surprise at the unusual
candor manifest in the assertion that it would take popular
idiot-proven interfaces until the year 2070 to catch up to where the
Emacspeak audio desktop is today. Industry experts welcomed this
refreshing breath of Courage Certainty and Clarity (CCC) at a time
when users are reeling from the Fear Uncertainty and Doubt (FUD)
unleashed by complex software systems backed by even more convoluted
press releases.
</p>
</div>
</div>
<div id="outline-container-org3ac4067" class="outline-2">
<h2 id="org3ac4067"><span class="section-number-2">6.</span> Independent Test Results:</h2>
<div class="outline-text-2" id="text-6">
<p>
Independent test results have proven that unlike some modern (and
not so modern) software, Emacspeak can be safely uninstalled without
adversely affecting the continued performance of the computer. These
same tests also revealed that once uninstalled, the user stopped
functioning altogether. Speaking with Aster Labrador, the creator of
Emacspeak once pointed out that these results re-emphasize the
user-centric design of Emacspeak; “It is the user — and not the
computer– that stops functioning when Emacspeak is uninstalled!”.
</p>
</div>
<div id="outline-container-org3dc256b" class="outline-3">
<h3 id="org3dc256b"><span class="section-number-3">6.1.</span> Note from Aster,Bubbles and Tilden:</h3>
<div class="outline-text-3" id="text-6-1">
<p>
UnDoctored Videos Inc. is looking for volunteers to star in a
video demonstrating such complete user failure.
</p>
</div>
</div>
</div>
<div id="outline-container-org13d725e" class="outline-2">
<h2 id="org13d725e"><span class="section-number-2">7.</span> Obtaining Emacspeak:</h2>
<div class="outline-text-2" id="text-7">
<p>
Emacspeak can be downloaded from GitHub — see
<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a> you can visit Emacspeak on the
WWW at <a href="http://emacspeak.sf.net">http://emacspeak.sf.net</a>. You can subscribe to the emacspeak
mailing list — <a href="http://mail.emacspeak.org">emacspeak@emacspeak.org</a>. The <a href="http://emacspeak.blogspot.com">Emacspeak Blog</a> is a good
source for news about recent enhancements and how to use them.
</p>
<p>
The latest development snapshot of Emacspeak is always available at
<a href="https://github.com/tvraman/emacspeak">GitHub</a>.
</p>
</div>
</div>
<div id="outline-container-org11d427d" class="outline-2">
<h2 id="org11d427d"><span class="section-number-2">8.</span> History:</h2>
<div class="outline-text-2" id="text-8">
<ul class="org-ul">
<li>Emacspeak 55.0 (CalmDog) attempts to be as calm as Tilden.</li>
<li>Emacspeak 54.0 (EZDog) learns to take it easy from Tilden.</li>
<li>Emacspeak 53.0 (EfficientDog) focuses on efficiency.</li>
<li>Emacspeak 52.0 (WorkAtHomeDog) makes working remotely a pleasurable experience.</li>
<li>Bigger and more powerful than any smart assistAnt, AssistDog provides</li>
</ul>
<p>
instant access to the most relevant information at all times.
</p>
<ul class="org-ul">
<li>Emacspeak 50.0 (SageDog) embraces the wisdom of stability as
opposed to rapid change and the concomitant creation of bugs.🚭: Naturally Intelligent (NI)™ at how information is spoken, Emacspeak</li>
</ul>
<p>
is entirely free of Artificial Ingredients (AI)™.
</p>
<ul class="org-ul">
<li>Emacspeak 49.0 (WiseDog) leverages the wisdom gleaned from
earlier releases to provide an enhanced auditory experience.</li>
<li>Emacspeak 48.0 (ServiceDog) builds on earlier releases to provide
continued end-user value.</li>
<li>Emacspeak 47.0 (GentleDog) goes the next step in being helpful
while letting users learn and grow.</li>
<li>Emacspeak 46.0 (HelpfulDog) heralds the coming of Smart Assistants.</li>
<li>Emacspeak 45.0 (IdealDog) is named in recognition of Emacs'
excellent integration with various programming language
environments — thanks to this, Emacspeak is the IDE of choice
for eyes-free software engineering.</li>
<li>Emacspeak 44.0 continues the steady pace of innovation on the
audio desktop.</li>
<li>Emacspeak 43.0 brings even more end-user efficiency by leveraging the
ability to spatially place multiple audio streams to provide timely
auditory feedback.</li>
<li>Emacspeak 42.0 while moving to GitHub from Google Code continues to
innovate in the areas of auditory user interfaces and efficient,
light-weight Internet access.</li>
<li>Emacspeak 41.0 continues to improve
on the desire to provide not just equal, but superior access —
technology when correctly implemented can significantly enhance the
human ability.</li>
<li>Emacspeak 40.0 goes back to Web basics by enabling
<a href="http://emacspeak.blogspot.com/2013/11/reading-web-content-efficiently.html">efficient access</a> to large amounts of readable Web content.</li>
<li>Emacspeak 39.0 continues the Emacspeak tradition of increasing the breadth of
user tasks that are covered without introducing unnecessary
bloatware.</li>
<li>Emacspeak 38.0 is the latest in a series of award-winning
releases from Emacspeak Inc.</li>
<li>Emacspeak 37.0 continues the tradition of
delivering robust software as reflected by its code-name.</li>
<li>Emacspeak 36.0 enhances the audio desktop with many new tools including full
EPub support — hence the name EPubDog.</li>
<li>Emacspeak 35.0 is all about
teaching a new dog old tricks — and is aptly code-named HeadDog in
on of our new Press/Analyst contact. emacspeak-34.0 (AKA Bubbles)
established a new beach-head with respect to rapid task completion in
an eyes-free environment.</li>
<li>Emacspeak-33.0 AKA StarDog brings
unparalleled cloud access to the audio desktop.</li>
<li>Emacspeak 32.0 AKA
LuckyDog continues to innovate via open technologies for better
access.</li>
<li>Emacspeak 31.0 AKA TweetDog — adds tweeting to the Emacspeak
desktop.</li>
<li>Emacspeak 30.0 AKA SocialDog brings the Social Web to the
audio desktop—you cant but be social if you speak!</li>
<li>Emacspeak 29.0—AKAAbleDog—is a testament to the resilliance and innovation
embodied by Open Source software—it would not exist without the
thriving Emacs community that continues to ensure that Emacs remains
one of the premier user environments despite perhaps also being one of
the oldest.</li>
<li>Emacspeak 28.0—AKA PuppyDog—exemplifies the rapid pace of
development evinced by Open Source software.</li>
<li>Emacspeak 27.0—AKA
FastDog—is the latest in a sequence of upgrades that make previous
releases obsolete and downgrades unnecessary.</li>
<li>Emacspeak 26—AKA
LeadDog—continues the tradition of introducing innovative access
solutions that are unfettered by the constraints inherent in
traditional adaptive technologies.</li>
<li>Emacspeak 25 —AKA ActiveDog
—re-activates open, unfettered access to online
information.</li>
<li>Emacspeak-Alive —AKA LiveDog —enlivens open, unfettered
information access with a series of live updates that once again
demonstrate the power and agility of open source software
development.</li>
<li>Emacspeak 23.0 — AKA Retriever—went the extra mile in
fetching full access.</li>
<li>Emacspeak 22.0 —AKA GuideDog —helps users
navigate the Web more effectively than ever before.</li>
<li>Emacspeak 21.0
—AKA PlayDog —continued the
Emacspeak tradition of relying on enhanced
productivity to liberate users.</li>
<li>Emacspeak-20.0 —AKA LeapDog —continues
the long established GNU/Emacs tradition of integrated innovation to
create a pleasurable computing environment for eyes-free
interaction.</li>
<li>emacspeak-19.0 –AKA WorkDog– is designed to enhance
user productivity at work and leisure.</li>
<li>Emacspeak-18.0 –code named
GoodDog– continued the Emacspeak tradition of enhancing user
productivity and thereby reducing total cost of
ownership.</li>
<li>Emacspeak-17.0 –code named HappyDog– enhances user
productivity by exploiting today's evolving WWW
standards.</li>
<li>Emacspeak-16.0 –code named CleverDog– the follow-up to
SmartDog– continued the tradition of working better, faster,
smarter.</li>
<li>Emacspeak-15.0 –code named SmartDog–followed up on TopDog
as the next in a continuing series of award-winning audio desktop
releases from Emacspeak Inc.</li>
<li>Emacspeak-14.0 –code named TopDog–was</li>
</ul>
<p>
the first release of this millennium.
</p>
<ul class="org-ul">
<li>Emacspeak-13.0 –codenamed
YellowLab– was the closing release of the
20th. century.</li>
<li>Emacspeak-12.0 –code named GoldenDog– began
leveraging the evolving semantic WWW to provide task-oriented speech
access to Webformation.</li>
<li>Emacspeak-11.0 –code named Aster– went the
final step in making Linux a zero-cost Internet access solution for
blind and visually impaired users.</li>
<li>Emacspeak-10.0 –(AKA
Emacspeak-2000) code named WonderDog– continued the tradition of
award-winning software releases designed to make eyes-free computing a
productive and pleasurable experience.</li>
<li>Emacspeak-9.0 –(AKA
Emacspeak 99) code named BlackLab– continued to innovate in the areas
of speech interaction and interactive accessibility.</li>
<li>Emacspeak-8.0 –(AKA Emacspeak-98++) code named BlackDog– was a major upgrade to
the speech output extension to Emacs.</li>
<li>Emacspeak-95 (code named Illinois) was released as OpenSource on
the Internet in May 1995 as the first complete speech interface
to UNIX workstations. The subsequent release, Emacspeak-96 (code
named Egypt) made available in May 1996 provided significant
enhancements to the interface. Emacspeak-97 (Tennessee) went
further in providing a true audio desktop. Emacspeak-98
integrated Internetworking into all aspects of the audio desktop
to provide the first fully interactive speech-enabled WebTop.</li>
</ul>
</div>
</div>
<div id="outline-container-orgd434354" class="outline-2">
<h2 id="orgd434354"><span class="section-number-2">9.</span> About Emacspeak:</h2>
<div class="outline-text-2" id="text-9">
<p>
Originally based at Cornell (NY) —
<a href="http://www.cs.cornell.edu/home/raman">http://www.cs.cornell.edu/home/raman</a> —home to Auditory User
Interfaces (AUI) on the WWW, Emacspeak is now maintained on GitHub
—<a href="https://github.com/tvraman/emacspeak">https://github.com/tvraman/emacspeak</a>. The system is mirrored
world-wide by an international network of software archives and
bundled voluntarily with all major Linux distributions. On Monday,
April 12, 1999, Emacspeak became part of the <a href="http://tvraman.github.io/emacspeak/blog/smithsonian-study.html">Smithsonian's Permanent
Research Collection</a> on Information Technology at the Smithsonian's
National Museum of American History.
</p>
<p>
The Emacspeak mailing list is archived at
<a href="https://www.emacspeak.org">Emacspeak Mail Archive</a> –the home of the
Emacspeak mailing list– thanks to Greg Priest-Dorman, and provides a
valuable knowledge base for new users.
</p>
</div>
</div>
<div id="outline-container-org3940d8e" class="outline-2">
<h2 id="org3940d8e"><span class="section-number-2">10.</span> Press/Analyst Contact: Tilden Labrador</h2>
<div class="outline-text-2" id="text-10">
<p>
Going forward, Tilden acknowledges his exclusive monopoly on
setting the direction of the Emacspeak Audio Desktop (🦮) and
promises to exercise this freedom to innovate and her resulting
power responsibly (as before) in the interest of all dogs.
</p>
<p>
*About This Release:
</p>
<hr />
<p>
Windows-Free (WF) is a favorite battle-cry of The League Against
Forced Fenestration (LAFF). –see
<a href="http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm">http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm</a> for details on
the ill-effects of Forced Fenestration.
</p>
<p>
CopyWrite )C( Aster, Hubbell and Tilden Labrador. All Writes Reserved.
HeadDog (DM), LiveDog (DM), GoldenDog (DM), BlackDog (DM) etc., are Registered
Dogmarks of Aster, Hubbell and Tilden Labrador. All other dogs belong to
their respective owners.
</p>
</div>
</div>
</div> T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-62639238506032077952021-09-19T10:49:00.001-07:002021-09-19T10:49:21.997-07:00Generalize Snarf Tool: How The General Can Be Simpler Than The Specific<div id="content">
<h1 class="title">Generalize Snarf Tool: How The General Can Be Simpler Than The Specific</h1>
<div id="outline-container-org4d4e143" class="outline-2">
<h2 id="org4d4e143"><span class="section-number-2">1</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
The
<a href="https://emacspeak.blogspot.com/2021/09/snarfing-string-within-delimiters-with.html">previous article</a> detailed the implementation of a simple function
that lets you snarf the contents within a pair of delimiters. That
version handled a set of generic delimiters, and errored out if
point was not on one of the pre-defined delimiters.
</p>
<p>
This article shows how that solution can be generalized
to cases where point is not on a pre-defined delimiter; in the
process, it weighs the pros and cons of usability vs over-generality
and shows an implementation that attempts to strike a good balance.
</p>
</div>
</div>
<div id="outline-container-org11a0752" class="outline-2">
<h2 id="org11a0752"><span class="section-number-2">2</span> The Updated Implementation</h2>
<div class="outline-text-2" id="text-2">
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span style="color: #b6a0ff;">defun</span> <span style="color: #feacd0;">snarf-sexp</span> (<span style="color: #6ae4b9;">&optional</span> delete)
<span style="color: #b0d6f5;">"Snarf the contents between delimiters at point.</span>
<span style="color: #b0d6f5;">Optional interactive prefix arg deletes it."</span>
(<span style="color: #b6a0ff;">interactive</span> <span style="color: #79a8ff;">"P"</span>)
(<span style="color: #b6a0ff;">let</span> ((orig (point))
(pair nil)
(pairs <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">We keep predefined pairs for usability:</span>
'((?< ?>)
(?\[ ?\])
(?\( ?\))
(?{ ?})
(?\" ?\")
(?' ?')
(?` ?')
(?| ?|)
(?* ?*)
(?/ ?/)
(?- ?-)
(?_ ?_)
(?~ ?~)))
(char (char-after))
(stab nil))
(<span style="color: #b6a0ff;">setq</span> pair <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">But we read a close delimiter for the general case</span>
(<span style="color: #b6a0ff;">or</span> (assq char pairs) <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Predefined delimiter</span>
(list char (read-char <span style="color: #79a8ff;">"Close Delimiter: "</span>)))) <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Generality!</span>
(<span style="color: #b6a0ff;">setq</span> stab (copy-syntax-table))
(<span style="color: #b6a0ff;">with-syntax-table</span> stab
(<span style="color: #b6a0ff;">cond</span>
((= (cl-first pair) (cl-second pair))
(modify-syntax-entry (cl-first pair) <span style="color: #79a8ff;">"\""</span> )
(modify-syntax-entry (cl-second pair) <span style="color: #79a8ff;">"\""</span> ))
(t
(modify-syntax-entry (cl-first pair) <span style="color: #79a8ff;">"("</span>)
(modify-syntax-entry (cl-second pair) <span style="color: #79a8ff;">")"</span>)))
(<span style="color: #b6a0ff;">save-excursion</span>
(forward-sexp)
(<span style="color: #b6a0ff;">cond</span>
(delete
(kill-region (1+ orig) (1- (point))))
(t (kill-ring-save (1+ orig) (1- (point)))))))))
</pre>
</div>
</div>
</div>
<div id="outline-container-org467ac84" class="outline-2">
<h2 id="org467ac84"><span class="section-number-2">3</span> Key Takeaways</h2>
<div class="outline-text-2" id="text-3">
<ol class="org-ol">
<li>The generalized implementation no longer throws an error if point
is not on a pre-defined delimiter.</li>
<li>Instead, it generalizes the implementation to read the close
delimiter from the keyboard if char at point is not in the
pre-defined list.</li>
<li>We could generalize further by entirely dropping the pre-defined
delimiters, but that would hurt usability in the common case where the user would always have to specify the close delimiter.</li>
<li>Note that usability here is not merely to reduce a keystroke;
it's more to reduce the cognitive load on the user with respect
to having to <i>think</i> about the close delimiter in the common
case.</li>
</ol>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-30893331052766886052021-09-18T09:46:00.001-07:002021-09-18T09:46:30.411-07:00Snarfing String Within Delimiters With One Defun<div id="content">
<h1 class="title">Snarfing String Within Delimiters With One Defun</h1>
<div id="outline-container-org86e644c" class="outline-2">
<h2 id="org86e644c"><span class="section-number-2">1</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
I found that I frequently needed to snarf a string enclosed within
delimiters, e.g., URLs in email messages <span class="underline"><url></span>,
bolded, italics and other styled text in org-mode etc. I first tried
package <span class="underline">ciel</span> but found that it did not handle all the delimiters I
wanted. However looking into it further revealed that emacs had all
the tools needed to reduce the task to a single <b>defun</b>!
</p>
</div>
</div>
<div id="outline-container-org56f5525" class="outline-2">
<h2 id="org56f5525"><span class="section-number-2">2</span> The Solution</h2>
<div class="outline-text-2" id="text-2">
<p>
Here is the solution I implemented at
<a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-wizards.el#L3089">emacspeak-wizards-snarf-sexp</a>. invoking this command with point on
the opening delimiter snarfs the enclosed string into the
kill-ring; an optional prefix arg clears it as well.
The code below is the same as in the Emacspeak project, but with
emacspeak-specific calls removed:
</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span style="color: #b6a0ff;">defun</span> <span style="color: #feacd0;">snarf-sexp-contents</span> (<span style="color: #6ae4b9;">&optional</span> delete)
<span style="color: #b0d6f5;">"Snarf the contents between delimiters at point.</span>
<span style="color: #b0d6f5;">Optional interactive prefix arg deletes it."</span>
(<span style="color: #b6a0ff;">interactive</span> <span style="color: #79a8ff;">"P"</span>)
(<span style="color: #b6a0ff;">let</span> ((orig (point))
(pair nil)
(pairs <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">The delimiter pairs:</span>
'((?< ?>)
(?\[ ?\])
(?\( ?\))
(?{ ?})
(?\" ?\")
(?' ?')
(?` ?')
(?| ?|)
(?* ?*)
(?/ ?/)
(?- ?-)
(?_ ?_)
(?~ ?~)))
(char (char-after))
(stab nil)) <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Syntax table we use</span>
(<span style="color: #b6a0ff;">unless</span> (<span style="color: #b6a0ff;">setq</span> pair (assoc char pairs)) <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Not on a delimiter </span>
(<span style="color: #dbbe5f;">error</span> <span style="color: #79a8ff;">"Point is not on a supported delimiter"</span>))
(<span style="color: #b6a0ff;">setq</span> stab (copy-syntax-table))
(<span style="color: #b6a0ff;">with-syntax-table</span> stab
(<span style="color: #b6a0ff;">cond</span>
((= (cl-first pair) (cl-second pair)) <span style="color: #a8a8a8;">;;;</span><span style="color: #a8a8a8;">Like quotes</span>
(modify-syntax-entry (cl-first pair) <span style="color: #79a8ff;">"\""</span> )
(modify-syntax-entry (cl-second pair) <span style="color: #79a8ff;">"\""</span> ))
(t<span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Like parens </span>
(modify-syntax-entry (cl-first pair) <span style="color: #79a8ff;">"("</span>)
(modify-syntax-entry (cl-second pair) <span style="color: #79a8ff;">")"</span>)))
(<span style="color: #b6a0ff;">save-excursion</span><span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">We have our sexp </span>
(forward-sexp) <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Will error out if delims dont match</span>
(<span style="color: #b6a0ff;">cond</span>
(delete <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Clear sexp contents </span>
(kill-region (1+ orig) (1- (point))))
(t <span style="color: #a8a8a8;">;;; </span><span style="color: #a8a8a8;">Copy sexp contents</span>
(kill-ring-save (1+ orig) (1- (point)))))))))
</pre>
</div>
</div>
<div id="outline-container-org828c705" class="outline-3">
<h3 id="org828c705"><span class="section-number-3">2.1</span> Key Take-Aways</h3>
<div class="outline-text-3" id="text-2-1">
<ul class="org-ul">
<li>S-expressions are a key Emacs concept with extensive built-in support.</li>
<li>S-expressions are determined by matching delimiters.</li>
<li>Delimiters are defined by the syntax-table in effect.</li>
<li>Emacs-lisp primitives let us define and manipulate temporary syntax-tables.</li>
<li>Putting it all together, the underlying task of snarfing the
contents within a pair of delimiters reduces to a few calls to
the underlying primitives.</li>
</ul>
</div>
</div>
</div>
</div>T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.comtag:blogger.com,1999:blog-20280042.post-63073000435519345542021-08-01T09:39:00.002-07:002021-08-01T09:39:57.679-07:00Contextual Context Switching For An Efficient Workflow<div id="content">
<h1 class="title">Contextual Context Switching For An Efficient Workflow</h1>
<div id="outline-container-org8f9276d" class="outline-2">
<h2 id="org8f9276d"><span class="section-number-2">1</span> Executive Summary</h2>
<div class="outline-text-2" id="text-1">
<p>
Context switching in an Emacs workflow comes down to switching
buffers — and Emacs provides a large number of
built-ins and extensions packages for <i>switching buffers</i>. One can
put together numerous workflows by picking among these to make
context switching <i>contextual</i> — using the most appropriate
workflow can lead to being able to focus much better on the core
task of creating, editing, reviewing and publishing all forms of
content ranging from research papers and presentations to Open
Source Software.
</p>
<p>
This article summarizes my present workflow — it's entirely
keyboard driven and optimized for
an eyes-free workflow.
</p>
</div>
</div>
<div id="outline-container-orga0534fb" class="outline-2">
<h2 id="orga0534fb"><span class="section-number-2">2</span> Where Does <i>Context</i> Come From?</h2>
<div class="outline-text-2" id="text-2">
<p>
Context as used in this article can be traced back to the current task at
hand — here are some illustrative examples:
</p>
<ol class="org-ol">
<li>Editing a set of related files. (.c, .h)</li>
<li>Switching among a collection of chat buffers. (major-mode)</li>
<li>Switching among a collection of mail folders. (major-mode)</li>
<li>Switching among a collection of open Web pages. (major-mode)</li>
<li>Switching among a <i>small</i> number of recently used buffers. (recency)</li>
<li>Switching among buffers in the same project (project)</li>
<li>Switching between project-specific shells and buffers. (project)</li>
</ol>
</div>
</div>
<div id="outline-container-orgdd9e202" class="outline-2">
<h2 id="orgdd9e202"><span class="section-number-2">3</span> Building Blocks For Context Switching</h2>
<div class="outline-text-2" id="text-3">
<p>
Here are some of the building blocks I use to construct workflows that
meet the use-cases enumerated in the previous section. Many of these
are built into Emacs; some come from extra packages and a few are
implemented in Emacspeak to fill the gaps. See the related article
<a href="https://emacspeak.blogspot.com/2018/06/effective-suggest-and-complete-in-eyes.html">Search, Input, Filter, Target (SIFT)</a> interaction described in a
previous article for a more detailed explanation or properties that
characterize effective eyes-free interaction.
</p>
<ol class="org-ol">
<li>Built-in Command <code>next-buffer</code> and <code>previous-buffer</code> bound to
<code>hyper-,</code> and <code>hyper-.</code>.</li>
<li>Builtin Command ~ <code>other-window</code> bound to <code>C-x o</code>.</li>
<li><a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-wizards.el#L1621">Emacspeak Commands</a> <code>emacspeak-wizards-cycle-to-next-buffer</code> and
<code>emacspeak-wizards-cycle-to-previous-buffer</code>
bound to <code>Alt-n</code> and <code>Alt-p</code>.</li>
<li><a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-wizards.el#L729">Emacspeak Command</a> <code>emacspeak-wizards-shell-toggle</code> bound to <code>Super-,</code>.</li>
<li><a href="https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-wizards.el#L1457">Emacspeak Command</a> <code>emacspeak-wizards-shell-by-key</code> bound to <code>C-c [1-9]</code>.</li>
</ol>
</div>
<div id="outline-container-org903a098" class="outline-3">
<h3 id="org903a098"><span class="section-number-3">3.1</span> Things To Note</h3>
<div class="outline-text-3" id="text-3-1">
<ol class="org-ol">
<li>Notice that many of these commands come in pairs and use
key-bindings that also pair-up with respect to muscle memory; over
time I have found this type of pairing to be essential for them to
become part of one's daily habit.</li>
<li>And when these task-specific commands dont get you the buffer
you want with one or two keystrokes, one can always fallback to <code>switch-to-buffer</code>.</li>
<li>Built-in Command <code>switch-to-buffer</code> bound to <code>C-x b</code> which in my
environment maps to <code>ido-switch-buffer</code> with fuzzy completion.</li>
</ol>
</div>
</div>
<div id="outline-container-org6e43053" class="outline-3">
<h3 id="org6e43053"><span class="section-number-3">3.2</span> Related Packages</h3>
<div class="outline-text-3" id="text-3-2">
<p>
There are of course many alternatives to the building blocks above,
here is a non-exhaustive list:
</p>
<ul class="org-ul">
<li>Package <code>helm</code> with <code>ivy</code>, <code>counsel</code> and friends.</li>
<li>Package <code>selectrum</code>.</li>
<li><p>
Additionally organizing one's workspace using <code>Emacs Frames</code> with
each frame dedicated to tasks like email — visual workspaces.
</p>
<p>
In general, I've not found any of the above adding much in the
context of eyes-free interaction.
</p></li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org7e4aab2" class="outline-2">
<h2 id="org7e4aab2"><span class="section-number-2">4</span> Conclusion</h2>
<div class="outline-text-2" id="text-4">
<p>
Emacs has a large number of facilities that lend themselves to
multiple workflows. Investing some time in putting together
workflows that suit one's needs has a large pay-back over time.
</p>
</div>
</div>
</div> T. V. Ramanhttp://www.blogger.com/profile/03589687652590194428noreply@blogger.com