Monday, March 18, 2024

Smart Media Selector For The Emacspeak Audio Desktop

Smart Media Selector For The Audio Desktop

1. Overview

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.

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.

2. User Experience

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!

2.1. Pre-requisites for content selection and playback

  1. Launch either MPV (via package empv.el) or mplayer via Emacspeak's emacspeak-mplayer with a few keystrokes.
  2. Media selection uses ido with fuzzy matching.
  3. Choices are filtered incrementally for efficient eyes-free interaction; see the relevant blog article on Search, Input, Filter, Target for additional background.
  4. 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 play-list.
  5. Searching and filtering can also occur across the list of all 9,100+ media files spread across 700+ directories.
  6. Starting point of the SIFT process should be influenced by one's current context, e.g., default-directory.
  7. Each step of this process should have reasonable fallbacks.

3. Mapping Design To Implementation

  1. Directory where we start AKA context is selected by function emacspeak-media-guess-directory.
    1. If default directory matches emacspeak-media-directory-regexp,use it.
    2. If default directory contains media files, then use it.
    3. If default directory contains directory emacspeak-media — then use it.
    4. Otherwise use emacspeak-media-shortcuts as the fallback.
  2. Once we have selected the context, function emacspeak-media-read-resourceuses ido style interaction with fuzzy-matching to pick the file to play.
  3. That function uses Emacs' built-in directory-files-recursively to build the collection to hand-off to completing-read; It uses an Emacspeak provided function ems–subdirs-recursively to build up the list of 755+ sub-directories that live under $XDGMUSICDIR.

4. Resulting Experience

  1. I can pick the media to play with a few keystrokes.
  2. I use Emacs' repeat-mode to advantage whereby I can quickly change volume etc once content is playing before going back to work.
  3. There's no media-player UI to get in my way while working, but I can stop playing media with a single keystroke.
  4. 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!

5. The Lisp Code

The hyperlinks to the Emacspeak code-base are the source of truth. I'll include a snapshot of the functions mentioned above for completeness.

5.1. Guess Context

  (defun emacspeak-media-guess-directory ()
  "Guess media directory.
1. If default directory matches emacspeak-media-directory-regexp,use it.
2.  If default directory contains media files, then use it.
3. If default directory contains directory emacspeak-media --- then use it.
4. Otherwise use emacspeak-media-shortcuts as the fallback."
  (cl-declare (special emacspeak-media-directory-regexp
                       emacspeak-media emacspeak-m-player-hotkey-p))
  (let ((case-fold-search t))
    (cond
     ((or (eq major-mode 'dired-mode) (eq major-mode 'locate-mode)) nil)
     (emacspeak-m-player-hotkey-p   emacspeak-media-shortcuts)
     ((or                               ;  dir  contains media:
       (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))))

5.2. Read Resource

(defun emacspeak-media-read-resource (&optional prefix)
  "Read resource from minibuffer.
If a dynamic playlist exists, just use it."
  (cl-declare (special emacspeak-media-dynamic-playlist
                       emacspeak-m-player-hotkey-p))
  (cond
   (emacspeak-media-dynamic-playlist nil) ; do nothing if dynamic playlist
   (emacspeak-m-player-hotkey-p (emacspeak-media-local-resource prefix))
   (t                               ; not hotkey, not dynamic playlist
    (let* ((completion-ignore-case t)
           (read-file-name-completion-ignore-case t)
           (filename
            (when (memq major-mode '(dired-mode locate-mode))
              (dired-get-filename 'local 'no-error)))
           (dir (emacspeak-media-guess-directory))
           (collection
            (or
             filename                   ; short-circuit expensive call
             (if prefix
                 (ems--subdirs-recursively  dir) ;list dirs
               (directory-files-recursively dir emacspeak-media-extensions)))))
      (or filename (completing-read "Media: "  collection))))))

5.3. Helper: Recursive List Of Sub-directories

  ;;; Helpers: subdirs


(defconst ems--subdirs-filter
  (eval-when-compile
    (concat (regexp-opt '("/.." "/." "/.git")) "$"))
  "Pattern to filter out dirs during traversal.")

(defsubst ems--subdirs (d)
  "Return list of subdirs in directory d"
  (cl-remove-if-not #'file-directory-p (cddr (directory-files d 'full))))

(defun ems--subdirs-recursively (d)
  "Recursive list of  subdirs"
  (cl-declare (special ems--subdirs-filter))
  (let ((result (list d))
        (subdirs (ems--subdirs d)))
    (cond
     ((string-match ems--subdirs-filter d) nil)                              ; pass
     (t
      (cl-loop
       for dir in subdirs
       if (not (string-match ems--subdirs-filter dir)) do
       (setq result  (nconc result (ems--subdirs-recursively dir))))))
    result))


Tuesday, December 19, 2023

Emacspeak: Hidden Holiday Gems

Emacspeak HHG: Hidden Holiday Gems

1. Introduction

This is an Emacspeak-specific follow-on to my article Emacs: Hidden Holiday Gems. This article extends its predecessor by:

  1. Adding Emacspeak-specific details for each gem; the earlier article purposely avoided anything Emacspeak-specific.
  2. 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.
  3. 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 Emacspeak Mailing List.
  4. All topics covered here are already well-documented in the Emacs and Emacspeak manuals, and this article will not attempt to replace those.

2. Emacspeak: Hidden Holiday Gems

Selective Display
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; selective-display provides the same affordance when you cannot see the display.
Registers
Easily becomes part of muscle-memory, especially when moving text around, duplicating content in multiple locations. For more complex use-cases, I use yasnippets, which is one of Emacs' many template libraries.
Bookmarks
Emacspeak builds heavily on Emacs' built-in bookmarks to provide:
  1. Persistent bookmarks when reading EPub and Bookshare books.
  2. Audio Marks (AMarks) within org-mode buffers for marking locations in audio streams such as Podcasts.
  3. An Emacspeak browser for browsing saved eww-marks and a-marks.
  4. Together, the above make a very useful note-taking extension to org-mode.
Tabulated Lists

Implements tabulated UIs and is speech-enabled by Emacspeak.

  • Emacspeak augments it with additional keyboard navigation.
  • This is leveraged in Emacs by a variety of

end-user packages including package.el and its asynchronous cousin paradox.el.

  • It is also used to advantage by empv, a powerful

interface to the GNU MPv media player.

  • AMarks mentioned in the previous item, this is my present means of listening to tech-talks on Youtube while taking notes using org-mode.
Forms Mode
Forms interface used by Emacspeak to browse BBC programs.
Mark Ring
Supported by default in Emacspeak but something I dont use much. Some of its affordances really shine in transient-mark-mode but that facility is somewhat counter to eyes-free use.
Undo
Both basic and advanced. However a long series of undo and redo commands as with tree-undo can get confusing quickly in eyes-free interaction.
Dired
I use dired-mode and its derivatives heavily:
  • To browse the file-system as intended.
  • With emacspeak-zoxide to rapidly move to far-away portions of the file system.
  • With locate to search the file system.
  • With command emacspeak-m-player-locate-media to find and play local media.
  • With flx and fuzzy completion to provide a powerful interactive UI for finding and playing media such as Internet streams.
- Writeable Dired
Useful to:
  • Consistently rename files, especially when confronted with filenames with embedded white space.
Org-Mode
This margin is too small to do it justice; see documentation for module emacspeak-org for all that Emacspeak does with org.
Magit
As with the previous item, see the associated Emacspeak documentation for emacspeak-magit.
Forge
I use forge for issue tracking, but often revert to old habits and use gh at the shell inside Emacs.
EWW
See the Emacspeak documentation for emacspeak-eww. Highlights include:
  • Dom filtering,
  • XPath filtering,
  • MPlayer and EMpv integration for playing online media,
  • EPub and Bookshare books,
  • And much, much more.
Elfeed
My chosen means of following RSS and Atom feeds.
GNUS
For mail, now that Usenet is history.
  • I use gnus as an imap mail reader for GMail.
  • Emacspeak implements the equivalent of GMail's search operators.
  • I complement gnus with package vm for reading email delivered locally; I use fetchmail to fetch mail and procmail to sort mail into folders in the background.
  • And finally I use notmuch to search locally saved email.
Tramp
Accessing and working in the Cloud:
  • I use tramp to open remote files.
  • Emacspeak wizard emacspeak-wizards-tramp-open-location to quickly open files on servers I access often.
  • If you work in the Cloud, Emacspeak lets you SSH to your CloudTop and have Emacs running on the CloudTop speak on your local machine.
  • The above can be done using a plain old XTerm with screen, dtach, or emacs –daemon providing a persistent Emacs session at the remote end.
  • Alternatively, you can use wizard emacspeak-wizards-remote-frame to open a graphical frame on the remote machine.
Eshell
A Shell that is deeply integrated into Emacs. Fully speech-enabled by Emacspeak. Well-suited for running compile, grep and friends for starters.
Comint
This is the goto solution for software development in Emacspeak, be it Common Lisp or Python.
Zip Archives
One more reason you dont need to leave Emacs for a text console.
Calculators
From the simple to complex, we have it all!
  • Simple calculations.
  • Symbolic Algebra.
  • Calc in embedded mode can directly replace a calculation with an answer.
  • For even smarter work-flows, leverage org-mode with calc.
  • you can even audio-format computations in Calc output as LaTeX using AsTeR.

3. References

  1. Mailing List Discussion.
  2. Emacs: Hidden Holiday Gems.
  3. Emacspeak Manual.
  4. Emacspeak Blog Articles as a single page.

    Note that the Emacspeak blog, the online manual etc., are all available locally in the Emacspeak Git checkout.

Friday, December 15, 2023

Emacs: Hidden Holiday Gems

Emacs HHG: Hidden Holiday Gems

1. Overview

The acronym HHG evokes Douglas Adams' Hitch Hikers Guide To The Galaxy 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 emacs-devel@gnu.org list which revealed the somewhat obvious — not everyone uses all available features in Emacs — if that were even possible.

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.

2. Emacs: Hidden Holiday Gems

Selective Display
Collapse/Expand content based on indentation. Useful in browsing code, as well as structured output from various shell commands.
Registers
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.
Bookmarks
Persist various types of locations. Note that registers can be persisted across Emacs sessions as well.
Tabulated Lists
Build up tabulated UIs that behave consistently.
Forms Mode
Leverage underlying syntax e.g., field-delimiters, to enable structured editing via a forms-like interface.
Mark Ring
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.
Undo
Both basic and advanced. I myself only use the most basic form of undo.
Dired
Surprisingly not everyone appears to use dired, or at least as heavily as I expected.
Writeable Dired
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.
Org-Mode
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.
Magit
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.
Forge
Interact with Git repositories — a powerful tool where I myself have only scratched the surface.
EWW
Hard to believe that shr and eww 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.
Elfeed
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.
GNUS
Gnus remains one of the most powerful email tools, but its potential as an email-reader often gets overlooked.
Tramp
When I first discovered Emacs in Grad School, ange-ftp 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 tramp. 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.
Eshell
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!
Comint
A Command Interpreter to bind 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 Emacs is the platform.
Zip Archives
Emacs can open archive files like zip,

tar.gz 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).

Calculators
Yes, there is more than 1;-) The built-in not-so-light-weight calculator and the even more powerful (and also bundled ) calc 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 Scratch Buffer. After we had considered some options, I typed a few keys to invoke Calc in embedded-mode and a second later she was looking at that plain-text display showing the monthly installment for the mortgage we were discussing!

3. Conclusion

  1. There are clearly a lot more hidden gems than enumerated here; otherwise they wouldn't be Hidden.
  2. These work best when Emacs provides a cleanly defined platform that enables the creation of these extensions via Emacs Lisp.
  3. There is an interesting balance between letting a thousand flowers bloom vs refactoring to create common APIs based on developer needs. 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.

vHappy Holidays — And Share And Enjoy!

Tuesday, November 21, 2023

Announcing Emacspeak 59.0 (VirtualDog)

Announcing Emacspeak 59.0—VirtualDog!

Tilden

To express oneself well is impactful, but only when one has something impactful to express! (TVR on Conversational Interfaces)

1. For Immediate Release:

San Jose, CA, (November 22, 2023)

1.1. Emacspeak 59.0 (VirtualDog) Unleashed! ๐Ÿฆฎ

— Making Accessible Computing Effortless!

Advancing Accessibility In The Age Of User-Aware Interfaces — Zero cost of Ownership makes priceless software Universally affordable!

Emacspeak Inc (NASDOG: ESPK) — http://github.com/tvraman/emacspeak announces immediate world-wide availability of Emacspeak 58.0 (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!

2. Investors Note:

With several prominent tweeters (and mythical elephants) expanding coverage of #emacspeak, 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.

3. What Is It?

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.

4. Major Enhancements:

  1. Updated Keybindings ⌨
  2. Smart Buffer Selection ⛏
  3. Audio Volume Adjust ๐Ÿ”ˆ
  4. Speech-Rate Adjust๐Ÿš„
  5. Twitter Support Removed X marks the spot.
  6. BBC Sounds URL Template ๐Ÿ“ป
  7. BBC HLS Streams using MPV ๐Ÿ“ป
  8. ZOxide Integration ⏠ ⏡
  9. emacspeak-pipewire ว

— And a lot more than will fit this margin. … ๐Ÿ—ž

Note: This version requires emacs-29.1 or later.

5. Establishing Liberty, Equality And Freedom:

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.

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.

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.

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.

6. Independent Test Results:

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!”.

6.1. Note from Aster,Bubbles and Tilden:

UnDoctored Videos Inc. is looking for volunteers to star in a video demonstrating such complete user failure.

7. Obtaining Emacspeak:

Emacspeak can be downloaded from GitHub — see https://github.com/tvraman/emacspeak you can visit Emacspeak on the WWW at http://emacspeak.sf.net. You can subscribe to the emacspeak mailing list — emacspeak@emacspeak.net. The Emacspeak Blog is a good source for news about recent enhancements and how to use them.

The latest development snapshot of Emacspeak is always available at GitHub.

8. History:

  • Emacspeak 59 delivers better ergonomics by minimizing the need for chording, but sadly, with no dog to guide its way.
    • Emacspeak 58 delivers better ergonomics by minimizing the need for chording.
    • Emacspeak 57.0 is named in honor of Tilden Labrador.
    • Emacspeak 56.0 (AgileDog) belies its age to be as agile as Tilden.
    • Emacspeak 55.0 (CalmDog) attempts to be as calm as Tilden.
    • Emacspeak 54.0 (EZDog) learns to take it easy from Tilden.
    • Emacspeak 53.0 (EfficientDog) focuses on efficiency.
    • Emacspeak 52.0 (WorkAtHomeDog) makes working remotely a pleasurable experience.
    • Bigger and more powerful than any smart assistAnt, AssistDog provides

instant access to the most relevant information at all times.

  • 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

is entirely free of Artificial Ingredients (AI)™.

  • Emacspeak 49.0 (WiseDog) leverages the wisdom gleaned from earlier releases to provide an enhanced auditory experience.
  • Emacspeak 48.0 (ServiceDog) builds on earlier releases to provide continued end-user value.
  • Emacspeak 47.0 (GentleDog) goes the next step in being helpful while letting users learn and grow.
  • Emacspeak 46.0 (HelpfulDog) heralds the coming of Smart Assistants.
  • 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.
  • Emacspeak 44.0 continues the steady pace of innovation on the audio desktop.
  • Emacspeak 43.0 brings even more end-user efficiency by leveraging the ability to spatially place multiple audio streams to provide timely auditory feedback.
  • 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.
  • 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.
  • Emacspeak 40.0 goes back to Web basics by enabling efficient access to large amounts of readable Web content.
  • Emacspeak 39.0 continues the Emacspeak tradition of increasing the breadth of user tasks that are covered without introducing unnecessary bloatware.
  • Emacspeak 38.0 is the latest in a series of award-winning releases from Emacspeak Inc.
  • Emacspeak 37.0 continues the tradition of delivering robust software as reflected by its code-name.
  • Emacspeak 36.0 enhances the audio desktop with many new tools including full EPub support — hence the name EPubDog.
  • 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.
  • Emacspeak-33.0 AKA StarDog brings unparalleled cloud access to the audio desktop.
  • Emacspeak 32.0 AKA LuckyDog continues to innovate via open technologies for better access.
  • Emacspeak 31.0 AKA TweetDog — adds tweeting to the Emacspeak desktop.
  • Emacspeak 30.0 AKA SocialDog brings the Social Web to the audio desktop—you can't but be social if you speak!
  • 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.
  • Emacspeak 28.0—AKA PuppyDog—exemplifies the rapid pace of development evinced by Open Source software.
  • Emacspeak 27.0—AKA FastDog—is the latest in a sequence of upgrades that make previous releases obsolete and downgrades unnecessary.
  • Emacspeak 26—AKA LeadDog—continues the tradition of introducing innovative access solutions that are unfettered by the constraints inherent in traditional adaptive technologies.
  • Emacspeak 25 —AKA ActiveDog —re-activates open, unfettered access to online information.
  • 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.
  • Emacspeak 23.0 — AKA Retriever—went the extra mile in fetching full access.
  • Emacspeak 22.0 —AKA GuideDog —helps users navigate the Web more effectively than ever before.
  • Emacspeak 21.0 —AKA PlayDog —continued the Emacspeak tradition of relying on enhanced productivity to liberate users.
  • 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.
  • emacspeak-19.0 –AKA WorkDog– is designed to enhance user productivity at work and leisure.
  • Emacspeak-18.0 –code named GoodDog– continued the Emacspeak tradition of enhancing user productivity and thereby reducing total cost of ownership.
  • Emacspeak-17.0 –code named HappyDog– enhances user productivity by exploiting today's evolving WWW standards.
  • Emacspeak-16.0 –code named CleverDog– the follow-up to SmartDog– continued the tradition of working better, faster, smarter.
  • 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.
  • Emacspeak-14.0 –code named TopDog–was

the first release of this millennium.

  • Emacspeak-13.0 –codenamed YellowLab– was the closing release of the 20th. century.
  • Emacspeak-12.0 –code named GoldenDog– began leveraging the evolving semantic WWW to provide task-oriented speech access to Webformation.
  • 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.
  • 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.
  • Emacspeak-9.0 –(AKA Emacspeak 99) code named BlackLab– continued to innovate in the areas of speech interaction and interactive accessibility.
  • Emacspeak-8.0 –(AKA Emacspeak-98++) code named BlackDog– was a major upgrade to the speech output extension to Emacs.
  • 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.

9. About Emacspeak:

Originally based at Cornell (NY) — http://www.cs.cornell.edu/home/raman —home to Auditory User Interfaces (AUI) on the WWW, Emacspeak is now maintained on GitHub —https://github.com/tvraman/emacspeak. 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 Smithsonian's Permanent Research Collection on Information Technology at the Smithsonian's National Museum of American History.

The Emacspeak mailing list is archived at Emacspeak Mail Archive –the home of the Emacspeak mailing list– thanks to Greg Priest-Dorman, and provides a valuable knowledge base for new users.

10. Press/Analyst Contact: Tilden Labrador

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.

*About This Release:


Windows-Free (WF) is a favorite battle-cry of The League Against Forced Fenestration (LAFF). –see http://www.usdoj.gov/atr/cases/f3800/msjudgex.htm for details on the ill-effects of Forced Fenestration.

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.

Author: T.V Raman

Created: 2023-11-18 Sat 07:56

Validate

Tuesday, September 26, 2023

Together: The Old And New Work Much Better!

Together: The Old And New Are Much Better!

1. Executive Summary

Emacs has had long-standing features like outline-mode and outline-minor-mode that often get forgotten in the face of newer affordances like org-mode. At the same time, Emacs continues to acquire new features — in this article, I am specifically alluding to repeat-mode. 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.

2. Background

  • Structured navigation is a significant productivity enhancer — especially in my case since I rely exclusively on an auditory interface.
  • The above applies to both textual documents and programming source.
  • Starting all the way back in 1991, I started using folding-mode to organize code into hierarchical containers that could be expanded and collapsed; and this is what makes Emacs' eco-system amazing; folding-mode still works and is available on melpa in 2023.
  • 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 outline-minor-mode to expand and collapse sections of code in .el files.
  • At the time I filed this away for later use — I was still reluctant to abandon the 30+ year investment in folding-mode.
  • About a year ago, I discovered repeat-mode in Emacs and started leveraging it for everything — including outline-mode and org-mode amongst others.
  • Despite the years of investment in folding-mode, it had one drawback; keeping the fold-marks (special comments) in sync was always a bit of a hastle.
    • Bringing The Old And New Together

      This week I brought all of the above context together to:

  • Cut over the Emacspeak codebase to stop using folding-mode.
  • Turning the fold-marks to comments that outline-minor-mode understood was a trivial application of my typo.plPerl script.
  • I had already set up Emacspeak to use repeat-mode for the various outline modes.
  • Another annoyance with outline that I had fixed over 20+ years ago was to pick an easier to press prefix-key for outline; I use C-o.

3. The Resulting Experience

  • I can now skim the Emacspeak sources (as well as the Emacs sources of course) with very few keystrokes.
  • Example: Pressing C-o C-n navigates by section headings; when skimming, I only need to press C-o the first time thanks to repeat-mode.
  • I also bound j and k in the outline-mode keymaps to avoid having to chord when skimming — j is easier to press than C-n.

4. For The Future

  • Would be nice to enhance outline-minor-mode to understand sectioning comments in other programming languages.
    • The annoyance with the default (and unusable) prefix key for the outline modes needs to fix in Emacs core.

Saturday, September 16, 2023

Augment With Zoxide

Augmenting Emacs With ZOxide For Efficient File System Navigation

1. Background

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 — Zoxide, a smarter cd built in Rust.

2. Default Usage

Once installed, zoxide works well in Emacs shells, as well as at terminals inside or outside Emacs. Read the zoxide 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.

3. Working In Emacs

So with zoxide installed, you can:

  1. Switch to a shell buffer,
  2. Execute a zoxide navigation command, e.g., z <pattern>.
  3. Once there, you can easily open files, launch dired etc.

    But given that opening dired 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

4. Command: emacspeak-zoxide

Note: there is nothing emacspeak specific in what follows.

  1. Interactive command emacspeak-zoxide prompts for a pattern, then launches dired on the zoxide result.
  2. It uses if-let to advantage:
    • If zoxide is installed,and
    • There is a zoxide result for the specified query,
    • Launch dired on that directory.
    • Else, signal the appropriate error.
    • Notice that if-let expresses this clearly.
(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"))))

In my setup, i bind this to C-; j which is convenient to press and is a mnemonic for jump.

Friday, September 08, 2023

Return To Control_Right Using XModmap And XCape

return to control-right using xmodmap and xcape

1. background

see previous article on dont punish your finger tips that described how to minimize chording in emacs. that article alluded to possibly using return as an additional controlright key; this article describes the implementation and things i discovered in setting it up.

the design described here was discovered by this google search.

2. overview of changes

2.1. xmodmap

add the following stanza to your xmodmap file to set up the needed keys:

! ret as ctrl_r
 remove control = control_r
 keycode 0x69 = return
 keycode 0x24 = control_r
 add control = control_r

2.2. xcape

next, have xcape emit controlr when return is held down:

control_r=return;\

you can find the complete implementation below:

3. lessons learn

  • 1. the above works — i can now hold down return with my right hand when hitting keys like a with my left; this makes my fingers happy.
  • one issue that i failed to fix — though unimportant except for my curiosity:
  • the controlr key on my laptop has now turned into a return key, it produces return in all cases, i.e., whether tapped or held-down.
  • i still continue to find xmodmap confusing — though that is likely my fault, and not that of xmodmap.

date: 2023-09-08 fri 00:00

author: t.v raman

created: 2023-09-08 fri 08:54

validate