Terminal Access for NVDA

Terminal Access adds keyboard-driven review navigation, search, bookmarks, and audio cues to 30 Windows terminal applications, including Windows Terminal, PowerShell, Command Prompt, WSL, and popular third-party emulators. It gives you line, word, and character navigation through terminal output without moving the cursor, so you can read command results the way you read a document.

Open this guide any time from inside a terminal by pressing NVDA+Shift+F1.

Table of Contents

  1. Getting Started
  2. Command Layer
  3. Table Mode
  4. Bookmarks
  5. Error and Warning Detection
  6. Gesture Conflict Detection
  7. Application Profiles
  8. Third-Party Terminal Support
  9. Window Definitions
  10. Unicode and CJK Text
  11. Performance
  12. AI CLI Support
  13. Settings
  14. Troubleshooting
  15. Getting Help

Getting Started

Installation

  1. Download the latest .nvda-addon file from the Releases page.
  2. Press Enter on the downloaded file.
  3. Confirm the prompt.
  4. Restart NVDA.

Terminal Access requires Windows 10 or 11 and NVDA 2025.1 or later.

First Steps

Open any supported terminal. When Terminal Access recognizes it, you hear: "Terminal Access support active. Press NVDA+shift+f1 for help."

You read terminal output in two ways:

The command layer is faster for a sequence of commands and avoids clashes with other add-ons. Both routes run the same commands, and you can remap every gesture in NVDA's Input Gestures dialog under "Terminal Access".

Essential Reading Commands

These few commands cover most reading. The first column is the key inside the command layer; the second is the equivalent direct gesture.

Command layer Direct gesture Action
I / O / U NVDA+I / O / U Read current / next / previous line
K / L / J NVDA+K / L / J Read current / next / previous word
, / . / M NVDA+, / . / M Read current / next / previous character
A NVDA+A Continuous reading (say all)
; NVDA+; Announce position (row, column)
Escape Exit the command layer

The full reference for every command is in the next section.


Command Layer

The command layer is a modal input mode that runs Terminal Access commands with single-key presses instead of multi-key NVDA modifier combinations. This avoids conflicts with other NVDA add-ons and makes commands faster to type.

Entering and Exiting

Gesture Action
NVDA+apostrophe Enter the command layer. You hear "Terminal commands" and a high tone.
Escape or NVDA+apostrophe Exit the command layer. You hear "Exit terminal commands" and a low tone.

The layer stays active until you exit. Each command keeps you in the layer so you can chain commands. The layer exits on its own when focus leaves the terminal.

Command Reference

While in the command layer, these keys are active:

Key Action
U / I / O Read previous / current / next line
J / K / L Read previous / current / next word
M / , / . Read previous / current / next character
Home / End Jump to start / end of line
PageUp / PageDown Jump to top / bottom of buffer
Shift+Left / Right Read to start / end of line
Shift+Up / Down Read to top / bottom of buffer

Information and Reading

Key Action
A Continuous reading (say all)
; Announce position (row, column)
Shift+A Read text attributes and colors
I (twice) Announce line indentation
, (twice) Phonetic character reading
, (three times) Character code
K (twice) Spell current word

Selection and Copying

Key Action
R Toggle mark (start/end)
C Copy linear selection
X Clear marks
V Enter copy mode (L=line, S=screen, Esc=cancel)

Window Management

Key Action
W Read window content
Shift+W Set window boundaries
Ctrl+W Clear window
Y Cycle cursor tracking mode

Configuration

Key Action
Q Toggle quiet mode
- / = Decrease / increase punctuation level
D Toggle indentation announcement
P Announce active profile. Press twice to select.

Bookmarks

Key Action
0-9 Jump to bookmark
Shift+0-9 Set bookmark at current line (line text is captured as a label)
B Open bookmark list dialog (shows bookmark number and line content; press Enter to jump, Delete to remove)

Tabs

Key Action
T Create new tab
Shift+T List tabs

Search and URL List

Key Action
E List URLs found in terminal output
F Search terminal output
F3 Next search match
Shift+F3 Previous search match

The search dialog has a text box plus two options: Case sensitive (match letter case exactly) and Regular expression (treat the text as a Python regular expression). Both remember their setting for the next search in the session. If a regular expression is invalid, you hear a short message and the search is not run.

Search opens a results dialog listing every matching line. Activating a result (Enter or the Activate button) closes the dialog and places the review cursor at the beginning of the matched line, the same way a bookmark jump does, so review-current-line reads the match. After the dialog closes, F3 and Shift+F3 continue through the remaining matches, announcing each match's position as "N of M" and saying "Wrapped" when navigation loops back to the start. If a search finds nothing, close fuzzy matches (one typo away) are offered instead.

Search results are taken at the moment you search. If the program then prints more output, the next find-next or find-previous re-runs the search against the current buffer so the results stay accurate, keeping your place on the same matched line where possible. Results are remembered per terminal window for the current NVDA session; they are not saved across an NVDA restart.

Table Mode

Key Action
G Toggle table mode on the table under the review cursor

Help and Settings

Key Action
F1 Open user guide
S Open Terminal Access settings
Escape Exit command layer

Copy Mode Within the Layer

When you press V in the command layer, you enter copy mode. The keys L (copy line), S (copy screen), and Escape (cancel) temporarily override their layer bindings. When copy mode exits, those bindings are restored.

Customizing Gestures

All Terminal Access commands, both layer and direct, are registered under the "Terminal Access" category in NVDA's Input Gestures dialog. You can remap any gesture.

URL List

Press E in the command layer (or NVDA+Alt+U directly) to scan the terminal buffer for URLs. An interactive dialog opens with:

Control Description
Filter box Type to narrow results
URL list Shows each URL, its line number, and surrounding text
Open (Alt+O) Opens the selected URL in your default browser
Copy URL (Alt+C) Copies the URL to the clipboard
Move to line (Alt+M) Announces the line containing the URL
Close (Escape) Closes the dialog

Supported URL types: HTTP/HTTPS, FTP, www-prefixed, and OSC 8 terminal hyperlinks. Duplicate URLs are removed automatically.

Security note: URLs with file://, javascript:, or other non-web schemes are detected and listed but cannot be opened from the dialog. Attempting to open one produces the spoken message "Cannot open this URL type for security reasons." This stops malicious terminal output from tricking you into launching dangerous local resources.


Table Mode

Terminal programs often print tabular output such as docker ps, kubectl get pods, ls -l, psql result grids, and Markdown pipe tables. Read as plain lines, these become long run-on strings where a value is hard to match to its column. Table mode reads the output column by column and announces the header for each cell, so you always know which column you are in.

Entering and Exiting

Move the review cursor onto any line of the table, then press G in the command layer (or NVDA+Alt+G directly). If a table is detected at that position, table mode activates and the arrow keys navigate cells. If no table is found, you hear "No table at this position".

Press Escape or toggle the command again to leave table mode. Table mode also exits on its own when focus leaves the terminal.

While table mode is active, these keys navigate the detected table:

Key Action
Up / Down Arrow Previous / next row
Left / Right Arrow Previous / next column
Home / End First / last column in the row
Ctrl+Up Arrow Announce the header of the current column
Space Read a summary of the current row
Escape Exit table mode

Each cell is announced with its column header followed by the cell value, so you can move down a column and compare values without losing track of what they mean.

Supported Table Shapes

Table mode recognizes two shapes:

Shape Examples
Aligned columns Space-padded output such as docker ps, kubectl get pods, and ls -l
Pipe tables Markdown-style tables and psql grids that use | separators

Column Detection Is Heuristic (Experimental)

Table mode's column detection is heuristic. It infers where columns begin and end from the alignment of spaces and pipe characters in the visible text, because terminal output carries no structural markup describing its columns. This works well for the common tools listed above, but unusual spacing, wrapped lines, cells that contain multiple spaces, or wide (CJK) characters can place a column boundary in the wrong spot.

This behavior will be refined in future updates as we gather testing results and user reports of tables that are not detected or split correctly. If you hit a table that reads incorrectly, please report it with a sample of the output so the detection can be improved.


Bookmarks

Bookmarks let you save and revisit specific lines in the terminal buffer.

Setting Bookmarks

Press Shift+0 through Shift+9 in the command layer (or NVDA+Alt+0 through NVDA+Alt+9 directly) to set a bookmark at the current line. The line's text is captured as a label so you can identify it later.

Jumping to Bookmarks

Press 0-9 in the command layer (or Alt+0 through Alt+9 directly) to jump to that bookmark.

Bookmark List Dialog

Press B in the command layer (or NVDA+Shift+B directly) to open an interactive list. The dialog shows two columns: bookmark number and line content. Press Enter to jump to the selected bookmark, or Delete to remove it.

Bookmarks are kept per terminal window and persist while that window is open, including when focus leaves and returns. Separate terminal windows keep their own bookmarks. Note that several tabs inside a single Windows Terminal window share one window, so they share the same bookmarks. Bookmarks are held for the current NVDA session only; they are not saved across an NVDA restart. Up to 50 bookmarks are kept per window; once that limit is reached, setting a new one announces "Bookmark limit reached" until you delete one.

Because terminal output scrolls, a bookmark points at a line by its content. Jumping to a bookmark re-finds that line, which is reliable while the line is still in the buffer; if the line has scrolled out of the terminal's history, the jump may not land.


Error and Warning Detection

Terminal Access plays audio cues when you navigate to lines that contain errors or warnings. This helps you scan build output, test results, or log files by ear.

The detector recognizes common patterns from compilers, linters, and shell output, such as error:, ERROR, warning:, and WARN.

Audio Cue Settings

Setting Type Default Description
Error Audio Cues boolean True Play tones on error/warning lines during navigation.
Error Audio Cues in Quiet Mode boolean False Play error/warning tones on caret events while quiet mode is active.
Output Activity Tones boolean False Play two ascending tones (600+800 Hz) when new program output appears.
Output Activity Debounce integer 1000 ms Minimum interval between activity tones. Range: 100 to 10000 ms.

Configure these in NVDA menu > Preferences > Settings > Terminal Settings.

Gesture Scoping

Terminal Access gestures only activate inside supported terminals. Outside a terminal the gestures pass through to NVDA or other add-ons. Terminal detection uses an exact match on the process name.


Gesture Conflict Detection

Terminal Access detects when its keyboard shortcuts conflict with other installed NVDA add-ons. When it finds a conflict, it warns you so you can decide which binding to keep.

To resolve conflicts:

  1. Open NVDA menu > Preferences > Settings > Terminal Settings.
  2. In the "NVDA Gesture Conflicts" section, uncheck any gesture you want to disable.
  3. Disabled direct gestures remain accessible through the command layer (NVDA+apostrophe).

The command layer and help gestures (NVDA+Shift+F1) cannot be disabled.


Application Profiles

Application profiles adjust Terminal Access settings based on the terminal application you are using. Each profile can customize punctuation levels, cursor tracking modes, and window regions for specialized behavior.

Understanding Profiles

Terminal Access ships with default profiles for popular applications:

Managing Profiles

View, export, import, and delete profiles from NVDA menu > Preferences > Settings > Terminal Settings > Application Profiles. The "Installed profiles" dropdown lists default profiles first, then custom profiles alphabetically.

Profile Setting Overrides

When a profile is active, its settings override the global Terminal Access settings. For example, if the less profile sets key echo off, key echo is disabled while less runs, regardless of the global setting.

If you toggle a setting such as quiet mode while a profile is active, the change is saved to that profile's overrides rather than the global settings. When you switch to a different application, the global settings return.

Creating Custom Profiles

Create a custom profile by exporting an existing one as a template, editing the JSON, and importing it back:

{
  "appName": "myapp",
  "displayName": "My Application",
  "punctuationLevel": 2,
  "cursorTrackingMode": 1,
  "quietMode": false,
  "keyEcho": true,
  "linePause": true,
  "repeatedSymbols": true,
  "windows": [
    {
      "name": "status",
      "top": 9999,
      "bottom": 9999,
      "left": 1,
      "right": 9999,
      "mode": "silent",
      "enabled": true
    }
  ]
}

Third-Party Terminal Support

Terminal Access supports 30 terminals: the 5 built-in Windows terminals, WSL, and 24 third-party emulators. It detects them automatically when you switch to them, and each has a default profile tuned for common use.

Built-in Windows Terminals

Windows Terminal, cmd (Command Prompt), powershell (Windows PowerShell), pwsh (PowerShell Core), and conhost (Console Host).

Third-Party Terminal Emulators

Cmder, ConEmu, mintty (Git Bash and Cygwin), PuTTY and KiTTY, Terminus, Hyper, Alacritty, WezTerm, Tabby, FluentTerminal, Ghostty, Rio, Wave Terminal, Contour, Cool Retro Term, MobaXterm, SecureCRT, Tera Term, mRemoteNG, and Royal TS.

Default Profiles by Category

Category Terminals Punctuation Cursor tracking
General Cmder, ConEmu, Terminus, Hyper, Tabby, FluentTerminal SOME STANDARD
Development mintty (Git Bash) MOST STANDARD
Remote access PuTTY, KiTTY SOME STANDARD
High performance Alacritty, WezTerm SOME STANDARD

All Terminal Access features work with third-party terminals: navigation, selection, cursor tracking, punctuation levels, and window definitions. To customize a terminal, use it, open NVDA Settings > Terminal Access, adjust settings, and export the profile for backup or sharing.


Window Definitions

Window definitions mark regions of the terminal screen with different speech behaviors. This helps with applications that have status bars, command areas, or split panes.

Basics

Each window definition has a name, coordinates (top, bottom, left, right), a mode, and an enabled flag.

Coordinates are 1-based, so row 1, column 1 is the top-left. The value 9999 means "last row or column".

Window Modes

Mode Behavior
announce Read content normally (default)
silent Suppress all speech for this region
monitor Track changes but announce differently

Example: Vim Status Line

[
  {
    "name": "editor",
    "top": 1,
    "bottom": 9998,
    "left": 1,
    "right": 9999,
    "mode": "announce"
  },
  {
    "name": "status",
    "top": 9999,
    "bottom": 9999,
    "left": 1,
    "right": 9999,
    "mode": "silent"
  }
]

This reads all lines except the last (the editor region) normally and silences the last line (the status bar). Common uses include silencing status bars, defining tmux or screen panes, handling htop headers, and monitoring command input regions.


Unicode and CJK Text

Terminal Access handles double-width characters, right-to-left text, and complex emoji sequences.

CJK Characters

Chinese, Japanese, and Korean characters count as 2 columns, so column-based operations line up correctly. Zero-width combining marks are handled properly.

Hello世界   # "Hello" = 5 columns, "世界" = 4 columns, total = 9 columns

Right-to-Left Text

Terminal Access detects Arabic and Hebrew by character range and applies the Unicode bidirectional algorithm (UAX #9), including Arabic contextual reshaping and mixed RTL/LTR text.

For full RTL support, install the optional libraries:

pip install python-bidi arabic-reshaper

Without them, Terminal Access falls back to basic Unicode support.

Emoji

Terminal Access handles zero-width joiner sequences (family and profession emoji), skin tone modifiers, variation selectors, and flag sequences. Emoji are typically 2 columns wide.

For full emoji support, install the optional library:

pip install emoji

Performance

Terminal Access includes optimizations for large terminal buffers.


AI CLI Support

Terminal Access detects AI command-line tools and adds navigation for conversational workflows. Supported tools: Claude, Aider, ChatGPT CLI, GitHub Copilot CLI, Gemini CLI, OpenAI Codex CLI, and Ollama.

Experimental: turn and code-block detection is heuristic. It infers boundaries from each tool's prompt markers, so a tool with unusual output can split turns in the wrong place or miss a code block. If a conversation reads incorrectly, please report it with a sample so the detection can be improved.

Turn Navigation

Terminal Access splits the buffer into turns based on the role markers each AI CLI uses (user prompts and assistant responses).

Command layer Direct gesture Action
Ctrl+T NVDA+Alt+T Jump to next turn
Ctrl+Shift+T NVDA+Alt+Shift+T Jump to previous turn

When you land on a turn, Terminal Access announces the role (user or assistant) and the first line. If no more turns exist in that direction, you hear "No more turns."

Code Block Navigation

Terminal Access scans for fenced code blocks (triple backtick delimiters) and tracks the language, start line, end line, and content of each.

Command layer Direct gesture Action
Ctrl+B NVDA+Alt+B Next code block
Ctrl+Shift+B NVDA+Alt+Shift+B Previous code block
Ctrl+L NVDA+Alt+L Announce code block (language and line count)
Ctrl+C NVDA+Alt+C Copy code block to clipboard
Ctrl+E NVDA+Alt+E Explain code block

The explain command gives a brief offline explanation of the block. It is gated by the "Allow Code Explain" privacy setting, which is off by default.

Streaming Delta

Press NVDA+Shift+D to hear only what changed since the last check while an AI assistant is streaming its response. Terminal Access diffs the current buffer against a stored snapshot to find the new content.

Press Ctrl+F in the command layer to search within the current AI turn only. Standard search (F in the command layer) still searches the full buffer.

AI Error Detection

Terminal Access recognizes AI-specific error patterns in addition to standard compiler and shell errors.

Pattern type Examples
Rate limit "rate limit exceeded", "429 Too Many Requests"
Token limit "token limit reached", "message was truncated"
API error "invalid API key", "authentication failed"
Connection "unable to reach API endpoint"

Rate limit and token limit errors produce a pulsing low tone (two quick 220 Hz beeps). Other API errors produce a single low tone.

Verbosity Level

The verbosity level controls how much optional context Terminal Access speaks. Press Shift+V in the command layer (or NVDA+Shift+V) to cycle through the levels, or set it in NVDA menu > Preferences > Settings > Terminal Settings.

Level Behavior
Quiet Only errors and turn boundaries are announced
Normal Standard announcements (default)
Verbose Extra context such as the section category on a jump, the search match count, and profile override detail

Privacy Settings

Two settings control AI features that send terminal content to an external service. Both are off by default.

Setting Default Description
Allow Code Explain Off Permits sending code blocks to the AI for summarization.
Allow Summarization Off Permits automatic summarization of long AI responses.

When you invoke a privacy-gated feature while it is disabled, Terminal Access explains that the feature is off and how to enable it. To enable, open NVDA Settings > Terminal Access > Privacy and check the setting.


Settings

Open settings from NVDA menu > Preferences > Settings > Terminal Settings.

Setting Description
Key Echo Hear characters as you type in terminals, spoken at your punctuation level and with repeated symbols condensed ("dash 4 times"). See the note below on how this relates to NVDA's own typing echo.
Cursor Tracking Announce cursor movements.
Punctuation Level Control symbol verbosity (None, Some, Most, All).
Indentation Announce indentation for code automatically.
Error Audio Cues Play tones on error/warning lines during navigation. On by default.
Error Audio Cues in Quiet Mode Play error/warning tones on caret events while quiet mode is active. Off by default.
Output Activity Tones Play two ascending tones (600+800 Hz) when new program output appears. Off by default.
Output Activity Debounce Minimum interval between activity tones in milliseconds (100 to 10000, default 1000).

The settings panel also has a "NVDA Gesture Conflicts" section for disabling conflicting gestures and an "Application Profiles" section for managing profiles.

Key Echo and NVDA's Typing Echo

NVDA has two typing-echo settings of its own in NVDA menu > Preferences > Settings > Keyboard: "Speak typed characters" and "Speak typed words". Terminal Access's Key Echo and those settings all announce typing, but they are not the same feature, and only one echoes at a time:

In short: for the full terminal experience, leave both of NVDA's typing-echo settings off and use Terminal Access's Key Echo; turn on NVDA's settings only if you want the same echo in every application, in which case Terminal Access's Key Echo does nothing.


Troubleshooting

The add-on does not activate

Commands do not respond


Getting Help