JAWS Scripts For Slack
Doug Lee
Last Revised May, 2024
This document describes the scripts for Slack and provides
tips for using this application with JAWS.
The scripts will load and run when focus is in either the web portal for Slack or the Windows Desktop
Slack application. The Desktop application is recommended for the additional keyboard shortcuts and is
the best tested with these scripts as of this writing.
This document can be opened from within the application via a double press
of JAWSKey+F1 (or Insert+F1)
when the scripts are running.
For advice on how to use Slack with a screen reader, see the Slack-hosted article
"Use a screen
reader with Slack's desktop app."
For an alternative, gentle introduction to using Slack with a screen reader, see
J.J. Meddaugh's August, 2019 AccessWorld article,
"An Introduction to Slack, A Popular Chat App for Teams and
Workplaces."
Table of Contents
System Requirements For JAWS Users
In addition to any system requirements for the application, the following
apply for JAWS users:
- The computer should be running Windows 10 or later.
Earlier Windows versions may work but have not been tested.
- JAWS 2019 or later should be used. The scripts will not
work with or install into older JAWS versions.
Script Installation Instructions
To install these scripts on a new system:
- Load JAWS if this has not already been done. This will require
administrative privileges on the computer.
- Run JAWS as the user for whom the scripts are to be installed.
This and the following steps must be performed for each user of the computer
who will be using JAWS with these scripts.
- Download and run, or run directly, the installer for
these scripts; and follow the on-screen
directions. Be sure to install the scripts in the currently running
JAWS version if a JAWS version list is presented.
- To verify successful installation, type Insert+Q from
within the application. Part of the JAWS spoken response should be a
revision number. If you do not hear a revision number, the scripts are
not correctly loaded.
In some cases, restarting JAWS may fix this issue.
Key Sequences
These scripts incorporate commands that consist of sequences of keystrokes, all beginning with a common prefix, or "command keystroke."
This approach allows many script commands without the risk of conflicting with application keystrokes.
See the "Multi-Key Command Sequences" section of the "Common Script Elements" document for further details, including
how to explore the available script commands (similar to exploring a menu system),
and how to change the Command keystroke if necessary.
By default, the Command keystroke for these scripts is [.
This document may refer to this keystroke as [ or Command;
so, for example, [ Tab and Command Tab both refer to typing the prefix keystroke, then separately the Tab key.
Some sequences may consist of more than two keystrokes, or "levels"; for example, [ d r would refer to typing [, then d, then finally r.
Script Commands and Features
These scripts provide the following commands beyond those provided by the application itself:
- The key sequence [ B brings up a list of buttons for selection. Press Enter on a
button's name to click the button, or press Esc to close the list without activating any buttons.
This command is especially useful for call management, as a quick way to find Accept, Leave Call, etc.
- The key sequence [ C copies the current item to the Windows clipboard, if text can be found to copy.
This is intended for copying chat messages to the clipboard.
The exact format of copied material will vary depending on what Slack presents on screen for the message; e.g.,
the name of the message sender may and may not be included.
- The key sequences [ N and [ P duplicate the native F6 and Shift+F6
keystrokes, for users whose preferred keyboards do not make typing F6 convenient.
- There is a system for improving the reading of messages. See The Message Reading System
for details and relevant commands.
- JAWSKey+Q, along with announcing the active configuration name, will announce the revision number
of these scripts.
- Insert+F1, typed twice in quick succession, opens this document in the default browser.
These scripts also provide the following features:
- Better naming of some fields.
This includes values of menu button controls on Settings pages.
- Arrows and the JAWS
SayLine
command read very long messages without truncating them as JAWS
can natively do.
- JAWSKey+T, the standard JAWS "say title" command, also says any of the following where applicable:
- The name of the currently displayed chat or channel. This includes the status of a DM contact when shown
(e.g., Away).
- The names of any other displayed lists, such as Unreads, Threads, a thread in a particular channel,
Activity, etc.
- In an active call, the on/off state of the microphone, camera, and screen sharing.
- JAWSKey+B, the command for reading dialog controls in tab order, works as expected.
- Typing Ctrl+JAWSKey+V three times in quick succession brings up a JAWS virtual view
listing all application versions seen
on this machine while JAWS and these scripts were running over time.
(JAWS itself makes a single press of this command speak version information and a double press virtualize it.)
Each version is shown with the date on which it was first seen by the scripts.
This can help in diagnosing problems and establishing whether they
represent script bugs or problems caused by a silent application update to a not-yet supported version.
- These scripts work in parallel with the Slack scripts that come with JAWS itself starting in
JAWS version 2019,
so that the native JAWS commands and features will work as expected.
Exactly which features are added by the standard JAWS scripts will of course depend on the JAWS version being used.
Examples:
- Better support for Ctrl+Backspace starting in JAWS 2020.
- Showing of the Sound Mixer Discovery dialog starting in JAWS 2022.
Tips, Tricks, and Tactics
This section presents some tricks for using Slack efficiently, according to this script author's experience.
Finding Keyboard Shortcuts
Use the Ctrl+/ Slack command to move to a list of keyboard shortcuts. Up and Down
arrows can then move through available shortcuts.
Settings
Settings can be reached quickly in Slack by typing Ctrl+Comma.
Settings appear in tabs reachable with Up and Down arrow keys and activated by
Enter or Space.
Do not use Left or Right arrows to move among these tabs; this will send focus elsewhere
instead (tested August 27, 2020 against Slack 4.8.0).
The following settings may be of use to JAWS users:
- Sidebar tab, Show All Unreads:
This collects all the messages you've missed in one place. As of this writing, this option is not checked by
default. Checking this option will add an item to the list of available displays (Threads, Channel Browser, etc.).
Handling Calls
The pick-button command sequence, [ B, is especially helpful for finding call control buttons such
as Accept and Leave Call quickly. When many buttons appear in the list, type the first letter or few letters
of the desired
name in order to find it more immediately.
In an active call, use the Slack native commands M and V to toggle the microphone or video
(camera) on and off. If JAWS does not announce the new state, use the SayWindowTitle
command,
JAWSKey+T, to determine what is on and what is off.
Navigation Script Command Sequences
The scripts include a set of command sequences for moving quickly to specific screen areas.
As of this writing (August, 2020), this system is experimental but functional in at least Slack 4.8.0.
All of these sequences begin with [ G and terminate with a digit.
The following command sequences are available:
- [ G 1: Move to the page list, after which Up and Down arrows and
Enter will switch to a specific page.
- [ G 2: Move to the channel tree, after which Up and Down arrows will move
through channels and Enter will open a channel.
- [ G 3: Move to the primary display area, which contains the current page - unread messages,
threads, channel browser, etc.
If this is not possible, JAWS will announce "not found" or read any message shown in that area, such as "all
caught up" for the All Unreads area.
- [ G 4: Move to the secondary display area, which often contains the last expanded thread but
may be used for other purposes.
Caveats:
- [ G 1 may sometimes move first to the channel tree rather than the page list, depending on recent
actions, due to Slack behavior. Typing the sequence a second time should move to the list if this occurs,
according to testing performed in Slack 4.8.0 in August, 2020.
- The sequences [ G 3 and [ G 4 do not work for all possible content types in the two
respective screen areas at this time.
They are mostly intended to work with All Unreads and Threads pages as well as with a channel when it is open.
The Message Reading System
A Slack text message can include several types of information: content, reactions, reply count, list of reply
authors, attachments, flags such as Edited or Pinned, etc. The message reading system described in this section can
simplify accessing specific parts of a message. This is accomplished in two ways:
- Automatic: By default, the scripts reformat messages so as to present information in an order that is more
efficient, at least in the view of this author. The scripted command sequence [ F will cycle among
available message formats.
See below for information on the available message formats.
The current message format will govern how each message is read during navigation with arrows through a
message list.
- Manual: Typing [ followed by a number between 1 and 7, inclusive, will
read a specific portion of the current message.
Some of these commands will read more information than may be presented in any available automatic message
reading format;
for example, the sequence [ 7, for reading reactions, will include a list of the reaction icons
attached to the message. See below for more specifics.
Message Reading Format Customization
The key sequence [ F will cycle between available message formats. The default format is "Default
custom," which rearranges information in messages in a way pleasing at least to this script author. The "Native"
option reverts message reading to the native format presented by Slack itself.
The "Default custom" message format presents message information in the following order:
- The message date if present.
- Any flags, such as reaction and reply counts. This includes the number of attachments if any are included.
- The message time.
- The message sender.
- The message content. Special notes on this field:
- For call entries, this field can include information about the call duration, ending time, and number of
people who joined.
- For messages containing files, content can include information for the files uploaded into the message;
usually the file name.
- For messages that reply belatedly to a thread and thus have their own entries in the thread list, the
original thread-starter message text is skipped in this field, in order to make reading
the new threaded message easier. The messages affected by this script design choice are those that say "replied
to a thread."
To find the original thread starter message, use the Right arrow to move from the "replied to a
thread" message to the thread itself. Focus will land on the thread starter.
Note though that the Left arrow from there will return not to the "replied to a thread" message but
to the thread itself. Usually, the original "replied to a thread" message will be a few Down arrows
from there.
- Any attachment information, including a repeat of the attachment count in some cases.
Note that any change to the message reading format via [ F will remain in effect until changed again,
even if JAWS is restarted.
Reading Specific Parts of a Message On Demand
Sequences consisting of [ followed by a digit between 1 and 7 will read specific
portions of the current message:
- [ 1 reads the date of the current message. If the current message does not include a date, this
command will search for the effective date by scanning backward for the next date separator in the message list.
This helps on a busy day with many messages, so that there is a way to check the date of a message other than
the first or last from that day.
Warning: Strange results may occur if this command is used inside a thread, rather than at
the outer message level, because date separators may not be found there.
- [ 2 reads the time that the current message was written.
- [ 3 reads the name of the sender of the message.
- [ 4 reads the content of the message.
- [ 5 reads any "flags" associated with the message. Some possible flags, as defined by these scripts:
- Edited: The message has been altered since first being sent.
- Pinned: The message is pinned to its channel, making it permanently available regardless of message scroll.
- Special Slack notices such as "First unread message."
- Replies: A count of the replies to the message.
When there are replies, the [ 5 sequence also lists the authors of those replies
- Reactions: A count of the reactions to the message. This is not the same as either the number of reaction
icons or the number of people who reacted; in Slack, a person may post multiple reaction icons on a single message,
and of course one reaction icon may be used by several people for the same message.
See the [ 7 sequence below for how to get a list of the reaction icons and how to find out who
reacted with which.
- [ 6 reads any attachment info for the current message.
This can include more information than presented in the message itself, such as size and URL of attachment.
- [ 7 reads a list of the types of reactions left by people on the message.
Each icon will also appear as a tab stop for the message. To find out in turn who applied which icon, Tab
through the icons. As each icon gains focus, JAWS will announce the list of people who used that icon to
react. Note that one person may apply multiple icons to a single message in Slack.
Also note that the list of people for each icon is not available, even to JAWS scripts, until the icon receives
focus; this is why there is no script command to summarize this information without requiring tabbing.
Unrecognized Message Formats
From time to time, a message may appear that the scripts are unable to recognize for format alterations,
separation into parts, etc. This can occur because
- The message is system-generated and neither has nor needs all of the normal elements of a user-generated
message.
- Slack has changed since the scripts were written, and the message format has changed such that the scripts
no longer recognize it.
Messages with an unrecognized format are always presented as if the "Native" message reading format is in effect;
that is, without alteration from what Slack natively presents.
Command sequences for reading portions of a message may produce error messages instead of information when
applied to a Slack message with an unrecognized format.
Staying Up To Date With Unread Messages and Activities
This author uses several means to keep up to date with new messages and activities across many channels and
threaded conversations. Each method has pros and cons. A combination of methods will most likely be beneficial in a
large or very busy Slack workspace.
By Notifications
Slack can send notifications for nothing, just mentions and direct messages, or all messages. In practice,
this author finds that "all messages" might mean "most messages," though that may somehow be pilot error.
Slack can also separate how to handle notifications for different devices, though this is not default behavior.
Finally, Slack can include message text in notifications or, for increased privacy (and less verbosity), just
notify of new messages without displaying their content.
See the Settings > Notifications page for the available options.
By the "All Unreads" Pseudo-Channel
Note that the following feature must be enabled before it becomes operational. It is not enabled by default. Enable
it by checking "Show All Unreads" in Preferences > Sidebar.
Typing Ctrl+Shift+A in Slack will display and update a "channel" containing all unread message threads,
sorted by channel. Press Tab once after typing this native Slack command to focus the list of
threads, then go up with the Up arrow as necessary to be sure to start at the top of the list. On
encountering a thread with replies, use the Right arrow to move into the replies so that Up
and Down arrows will move among its replies instead of among threads. The Left arrow will
return to the thread list.
If new messages arrive while you are navigating the "All Unreads" list, they will be represented by buttons like
"1 new message"; the new messages will not actually join the list unless you press the button. This is probably
to prevent loss of messages while reading.
Typing Ctrl+Shift+A a second time will also add such messages to the list without removing any
messages that are not marked as read.
On finishing the reading of all messages from a particular chat or channel in the All Unreads list, press
Esc to mark them all as read. Messages from other channels and chats that appear in the list will not be
marked.
Typing Shift+Esc marks all messages shown in the All Unreads list as read at once. This commonly
causes the announcement of a "You're all caught up" message, the wording of which may
change, sometimes through amusing alternatives.
While the pseudo-channel is called "All Unreads," this author finds that it really means "All Unread Threads." Some
replies to threads you've already seen may not be included. This gives rise to the next suggestion.
By the "Threads" Pseudo-Channel
Typing Ctrl+Shift+T will display a list of threads sorted by date, newest first. As with the "All
Unreads" option, be sure after typing this command to Tab to and go up to the top of the list as
necessary.
This view displays threads across channels, sorted by time of last post. Within each thread, all messages are
shown unless there are many messages, in which case the original thread-starter messages and the new replies are
shown along with an expandable indication of how many more replies are available between the two.
The Down arrow is a sufficient means of reading new messages in this view. Using the Down
arrow will cause focus to pass through these elements, in this useful though unusual order:
- From the first thread into its replies.
- To an edit box for typing a response to that thread at its current end.
- To the next thread's starter message, then through its replies and its final edit box. This repeats until
all threads with new messages have been seen.
- To a "You're up to date," element. Many users will stop there.
- To further threads that do not contain unread messages, traveling as before from starter message, through
replies, to the final edit box.
By Channel Directly
Slack includes an Alt+Shift+Down command to move to the next channel containing unread messages. This
command places focus in the channel's new-message box, from which (with default settings) the Up
arrow will move to the last thread in the channel. Exploration of recent additions then just consists of using
the four arrows to explore threads and their replies normally for a channel.
Note that typing Alt+Shift+Down while in a channel's message entry box will change to the next channel
with unread messages (if there is one) but may say nothing. This is because focus is not moved out of the edit
box; the box is simply repurposed to apply to the new channel. To avoid this issue, be sure to have focus on
a message in the current channel before typing the Alt+Shift+Down command.
When there are no more channels with unread messages, the command will still move focus to the input box but
will not leave the current channel.
By Activity
The Ctrl+Shift+M command brings up a list of activities, sorted by date, newest first. "Activities"
here are those relevant to you, the logged-in Slack user, rather than all activities across all channels.
The activities included are
- Replies to messages you posted.
- Posts that mention you.
- Reaction emojis attached by others to your posts.
This view is the only one this author has found that presents reactions as entries in a list of events.
The Activities view is a good final check to make sure you did not miss anything directly applying to you in Slack.
Known Issues
The following issues are known and may be encountered during use of the application with these JAWS scripts.
These issues may be fixed in a future update to the scripts or to the application itself.
It may sometimes be necessary to type Ctrl+Shift+A twice to get focus into the correct list. This
is assumed to be a Slack issue.
The JAWS touch cursor sometimes provides more information than the PC cursor, especially in Settings pages
where it can find hints for fields, group headings, etc.
Braille support is not well tested and is likely incomplete.
Revision History
This is the revision history of these scripts, most recent revision first:
Revision 129, released May 6, 2024, tested against application version
4.38.115
Warning: Do not use the BX Update method of updating to this script version. Run the
installer as you would for a new script installation.
- The minimum supported JAWS version is changed from 18.0 to 2019, in order to permit the next feature.
- These scripts will work
alongside the Slack scripts that come with JAWS versions 2019 and later,
rather than replacing them.
This change is the reason that a full script installer run, rather than BX Update, is necessary.
- The sequence [ G 3 again speaks the full message on an attempt to focus the Unreads pseudo
channel when there are no more items left unread.
In some recent Slack versions, this key sequence only spoke the description of an icon that appeared as part
of that notification.
- Notable effort has gone in to speeding up field identification and naming code, with the hope of reducing
the chance of lost characters during typing into edit fields.
This problem is reported by users both with and without these Slack scripts, however.
- The UIA support is refactored significantly and updated to account for recent increases in JAWS' UIA support.
A JAWS restart after installing this script update is recommended, though not required.
This refactor is being applied to several projects.
Users who use several of this author's script sets may notice a slight reduction in JAWS' memory consumption as
these updates progress.
- Old history entries in this document section are now hidden inside a
details
tag
that may be expanded to show them. Among the benefits of this, heading count is reduced and text searches won't
match very old material.
Translators: No substantive changes to the xml files except that slack_lang.xml is now named
slack_dgl_lang.xml.
Revision 110, released June 11, 2022, tested against application version 4.25.2
- Typing indicator sound and announcement are supported and can be toggled from Quick Settings.
Both default to On.
Typing indicators for an open thread, as opposed to a channel or DM, may not be supported at this time.
- Fixed entries in the list of channels (Ctrl+Shift+L) starting with a comma (,).
- Fixed [ G 2 so it can find the channel tree under Slack 4.18.0 and later.
- The scripts attempt to prevent typed characters from being lost when typed rapidly into a Slack edit box.
The script author has seen this personally but does not recall receiving reports of it recently.
- The Insert+Z command for toggling the virtual PC cursor speaks its normal messages.
This feature will not activate via a BX update or simple unzip of the scripts into the JAWS user folder but
will require a run of the Slack script installer.
Where this is not practical, manually add the following line to the
[HTML]
section of
slack.jcf
instead:
VirtualCursorIsTabSpecific=0
- The pronunciation of the emoji named "yeahthat" ("yeah that") is improved.
- The sequence [ G 3 for focusing the primary display area will again announce when the "All Unreads"
page is open and there are no more messages to read.
This is an adjustment for cases seen in Slack 4.12.2 and 4.15.0.
- Code is included to try to prevent the scripts from saving settings like
TypingSounder
to
.jcf
files other than the one for these scripts.
This problem has been seen in various Electron apps, so this remedy is being applied to all script sets
produced for Electron apps by this author.
Revision 88, released January 08, 2021, tested against application version 4.10.0
- Slack 4.11.2 and later no longer cause announcement of huge blocks of code as part of a focus switch within
or into Slack.
- The key sequence [ C copies the current item to the Windows clipboard, if text can be found to copy.
This is intended for copying chat messages to the clipboard.
The exact format of copied material will vary depending on what Slack presents on screen for the message; e.g.,
the name of the message sender may and may not be included.
- The feature of announcing microphone, video, and screen share statuses on Insert+T should work
in Slack 4.10.0 and later.
- Entries for a past call in a channel message list under Slack 4.10 and later should again read call end
time and other displayed information.
- Fixed a very rarely triggered bug that could cause Slack messages containing certain word combinations to
be replaced by "ChromeLegacyWindow" durring navigation through messages.
- Some very old code for supporting JAWS 11 and 12 is removed, and there are a few updates to improve support
for JAWS 2021.
Revision 78, released September 28, 2020, tested against application versions 4.8.0 and 4.9.0
- The [ G 1 and [ G 2 commands for moving focus to the page list and channel tree should
now work with more recent Slack 4.8.0 and 4.9.0 structures that join these two controls into a single treeView
control. In
this case, the two commands normally go to the same control. If one doesn't work though, try the other.
- JAWS announces Slack 4.9.0 channel tree options properly when they are incompletely named by Slack itself.
Specifically, when an item has a name like "Additional options available in the context menu," JAWS prepends
that name with the name of the first item inside the treeView item, such as "All direct messages."
8 older revisions back through March 18, 2020
Revision 76, released September 01, 2020, tested against application version 4.8.0
- There is a new set of command sequences for jumping to specific screen areas and elements,
such as the page list, channel tree, and the panels of material shown for the current page.
This navigation system is experimental but appears to work well enough in Slack 4.8.0.
- Tab and Shift+Tab should less often read the names of Minimize, Maximize, and Close
buttons along with other unnecessary material.
- The [ 7 sequence for reading reactions works in Slack 4.8.0 and includes counts for each reaction
when available.
- Added to the Settings section of this document a mention of the
Show All Unreads item in the Slack Settings dialog.
- Added the virtualized version list feature to the scripts.
- The installer contains version and product information visible from the Details tab in Windows Explorer,
to better identify its contents. This update is being applied to all projects.
- A "directives" text file is included that provides information on how to install this set of scripts manually.
See "Handling Directives Files" in the "Common
Script Elements" document for further information.
- For those who need to change the Command key, the left bracket ([) by default, the system is
significantly improved, so that you need not type the key or key combination out as a name or string of key
names. You may
edit the keystroke names before accepting them, but JAWS will type them out for you now.
The system is documented in more detail in the Multi-Key
Command Sequence section of my Common Script Elements page.
- Keystroke names in this document are more consistent, and there are other minor documentation improvements,
including corrections to older entries in this Revision History section.
- Fixed a bug that could cause some localized strings not to be spoken where expected.
Revision 59, April 21, 2020, tested against application version 4.4.2
- Screen readers respond better to activation of Table of Contents links in this document.
- The sequence [ 6, for reading attachment information, is enhanced to include more information
about an attachment when possible, such as size and URL of attachment.
- The messages for these scripts are now distributed in XML files so that translators can create translations
with no need for script source recompilation.
See the Script Translation Procedure document for details on
how to translate these scripts, including how to update the XML message file.
A bit of an apology to translators though: These scripts make extensive use of "regular expressions." To those
unfamiliar with these, they can look rather messy. In simple terms, they allow the scripts to detect patterns in
text. Making these patterns work in another language may prove a little more challenging than mere translation.
Revision 54, April 14, 2020, tested against application version 4.4.0
- Fixed cases where JAWS said "Chrome Legacy Window" instead of reading a long message.
- Fixed [ 5 reporting of reply authors for messages with attachments and/or links.
Revision 50, March 29, 2020, tested against application version 4.4.0
- Improved keyboard help for the [ 1-7 sequences that read parts of a message.
- Significantly updated this documentation.
Revision 48, March 26, 2020, tested against application version 4.4.0
- The sequence [ B brings up a list of buttons for selection. Press Enter on a button's
name to click the button, or press Esc to close the list without activating any buttons.
This command is especially useful for call management, as a quick way to find Accept, Leave Call, etc.
- JAWSKey+T includes the on/off states of microphone, video (camera), and screen sharing in an
active call.
- Tabbing through an active call screen is far less unnecessarily verbose.
- The [ 5 sequence for announcing flags for the current message, including reply count, will also
include a list of the authors of the replies.
- Improved the presentation of messages that start with "Replied to a thread" when the thread already had
multiple replies.
Revision 40, March 21, 2020, tested against application version 4.4.0
- Fix to a problem that prevented the sequence [ 7 from working as expected in some places to read
reaction types.
(This was actually released as revision 33 immediately after revision 32 went out.)
- The "Default Custom" message format includes extra information about call entries in a message list, and
also information for files uploaded into a message.
- Enhanced the JAWSKey+T ("say title") command to include more information about the current screen.
- The sequence [ 1, for reporting the current message's date, works when the current message itself
does not indicate a date but the date separator above it is available.
This helps on a busy day with many messages, so that there is a way to check the date of a message other than
the first or last from that day.
Revision 32, March 20, 2020, tested against application version 4.3.2
- Keys that work on Chrome pages work here as well.
- Ctrl+Backspace reads what is being deleted more accurately.
- The sequence [ 7 reads the types of reactions left by people on the current message.
- Altered the "Default custom" presentation of "replied to a thread" messages so that the quoted original
thread-starter message text is omitted and thus the new message content is much more readily apparent.
To find the original thread starter message, use the Right arrow to move from the "replied to a
thread" message to the thread itself. Focus will land on the thread starter.
Note however that the Left arrow from there will return not to the "replied to a thread" message
but to the thread itself. Usually, the original "replied to a thread" message will be a few Down arrows
from there.
- Significant additions to the user guide, to describe how to perform various tasks in Slack.
Revision 27, March 18, 2020, tested against application version 4.3.2