Jump to content

Talon Voice Control: Difference between revisions

From Archive
Add ALL voice commands: macOS nav, spaces, git, directory nav, launchers, line editing
Add prior art references
 
(One intermediate revision by the same user not shown)
Line 4: Line 4:


'''Source code''': [https://github.com/ejfox/dotfiles/tree/main/talon-overrides github.com/ejfox/dotfiles/talon-overrides]
'''Source code''': [https://github.com/ejfox/dotfiles/tree/main/talon-overrides github.com/ejfox/dotfiles/talon-overrides]
== Daily Drivers ==
The commands worth memorizing. Everything else is in the [[#Full Command Reference|full reference]] below.
{| class="wikitable"
|-
! Category !! Say !! Does
|-
| '''Mode''' || cmd / talk || Switch between command and dictation
|-
| '''Enter''' || go ahead / send it || Press Enter
|-
| '''tmux''' || mux one thru mux nine || Jump to window N
|-
| '''tmux''' || mux left / right / up / down || Navigate panes
|-
| '''tmux''' || mux zoom || Toggle pane fullscreen
|-
| '''tmux''' || mux split right / down || Split pane
|-
| '''tmux''' || mux close pane || Close current pane
|-
| '''tmux''' || mux new || New window
|-
| '''tmux''' || mux sessions || Session picker
|-
| '''Terminal''' || wipe || Clear current line
|-
| '''Terminal''' || cancel || Ctrl-C
|-
| '''Terminal''' || again || Re-run last command
|-
| '''Terminal''' || edit || Open nvim
|-
| '''Terminal''' || lazy || Open lazygit
|-
| '''Terminal''' || files || Open yazi
|-
| '''Terminal''' || run claude || Launch Claude Code
|-
| '''Nav''' || go code / go home / go dotfiles || cd to directory
|-
| '''Git''' || git status / push / pull / diff || Git commands
|-
| '''Apps''' || open ghosty / chrome / obsidian / slack || Switch apps
|-
| '''Windows''' || snap left / right / full || Window positioning
|}
'''Tip''': Voice command usage is logged to <code>~/.local/share/usage-logs/talon/</code> — run <code>usage-analyze</code> after a week to see what you actually use most.


== Overview ==
== Overview ==
Line 44: Line 95:
|-
|-
| <code>ejfox_subtitles.py</code> || Right-aligned subtitles below sketchybar || [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/ejfox_subtitles.py github]
| <code>ejfox_subtitles.py</code> || Right-aligned subtitles below sketchybar || [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/ejfox_subtitles.py github]
|-
| <code>usage_logging.py</code> || JSONL command logger for usage analysis || [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/usage_logging.py github]
|-
|-
| <code>vocabulary.talon-list</code> || ~250 custom vocabulary terms || [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/vocabulary.talon-list github]
| <code>vocabulary.talon-list</code> || ~250 custom vocabulary terms || [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/vocabulary.talon-list github]
Line 73: Line 126:
* '''Muted''' (<code>#735865</code>): Sleep mode
* '''Muted''' (<code>#735865</code>): Sleep mode


== Complete Voice Command Reference ==
=== Usage Logging ===
 
Every recognized phrase is logged to <code>~/.local/share/usage-logs/talon/YYYY-MM-DD.jsonl</code> with timestamp, phrase text, word count, and active app. Same format as shell and tmux usage logs — analyze with <code>usage-analyze</code> or <code>jq</code>.
 
== Full Command Reference ==


=== Mode Switching ===
=== Mode Switching ===
Line 141: Line 198:
|}
|}


=== Terminal Launchers ===
=== Terminal ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''


Line 147: Line 204:
|-
|-
! Say !! Does
! Say !! Does
|-
| wipe || Clear line (ctrl-u)
|-
| wipe word || Delete last word (ctrl-w)
|-
| cancel / nope / bail || Ctrl-C
|-
| again || Re-run last command
|-
|-
| clear || Clear terminal
| clear || Clear terminal
Line 154: Line 219:
| lazy / run lazygit || Open lazygit
| lazy / run lazygit || Open lazygit
|-
|-
| files / run yazi || Open yazi file manager
| files / run yazi || Open yazi
|-
|-
| run btop || Open btop system monitor
| run btop || Open btop
|-
|-
| run claude || Launch Claude Code
| run claude || Launch Claude Code
Line 167: Line 232:
|-
|-
| refresh || Source .zshrc
| refresh || Source .zshrc
|}
=== Terminal Line Editing ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
{| class="wikitable"
|-
|-
! Say !! Does
| list files || <code>ls</code>
|-
|-
| wipe || Clear line (ctrl-u)
| list all || <code>ls -la</code>
|-
|-
| wipe word || Delete last word (ctrl-w)
| note <text> || Quick note to Obsidian daily
|-
| cancel / nope / bail || Ctrl-C
|-
| again || Re-run last command (up + enter)
|}
|}


Line 206: Line 261:
| go up || <code>cd ..</code>
| go up || <code>cd ..</code>
|-
|-
| go paperclip || <code>cd ~/code/paperclip</code>
| go paperclip / website / coach / connectology / vulpes / subway / newswell / gem / ddhq || Project directories
|-
| go website || <code>cd ~/code/website</code>
|-
| go coach || <code>cd ~/code/coach</code>
|-
| go connectology || <code>cd ~/code/connectology</code>
|-
| go vulpes || <code>cd ~/code/vulpes-theme-lab</code>
|-
| go subway || <code>cd ~/code/subway-builder</code>
|-
| go newswell || <code>cd ~/code/newswell</code>
|-
| go gem || <code>cd ~/code/gem</code>
|-
| go ddhq || <code>cd ~/code/ddhq</code>
|-
| list files || <code>ls</code>
|-
| list all || <code>ls -la</code>
|}
|}


=== Git Commands ===
=== Git ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''


Line 236: Line 271:
! Say !! Does
! Say !! Does
|-
|-
| git status || <code>git status</code>
| git status / push / pull / log / diff || Standard git commands
|-
| git push || <code>git push</code>
|-
| git pull || <code>git pull</code>
|-
| git log || <code>git log --oneline</code>
|-
| git diff || <code>git diff</code>
|-
|-
| git add all || <code>git add -A</code>
| git add all || <code>git add -A</code>
|-
|-
| git stash || <code>git stash</code>
| git stash / git pop || Stash and pop
|-
| git pop || <code>git stash pop</code>
|}
|}


=== Dev Commands ===
=== Dev ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''


Line 267: Line 292:
|-
|-
| connect VPS / connect || SSH to VPS
| connect VPS / connect || SSH to VPS
|-
| note <text> || Quick note to Obsidian daily
|}
|}


Line 276: Line 299:
<code>open ghosty</code>, <code>open chrome</code>, <code>open safari</code>, <code>open messages</code>, <code>open slack</code>, <code>open discord</code>, <code>open signal</code>, <code>open obsidian</code>, <code>open claude</code>, <code>open figma</code>, <code>open finder</code>, <code>open music</code>, <code>open OBS</code>
<code>open ghosty</code>, <code>open chrome</code>, <code>open safari</code>, <code>open messages</code>, <code>open slack</code>, <code>open discord</code>, <code>open signal</code>, <code>open obsidian</code>, <code>open claude</code>, <code>open figma</code>, <code>open finder</code>, <code>open music</code>, <code>open OBS</code>


=== Window Management (Rectangle Pro) ===
=== Window Management ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''


Line 283: Line 306:
! Say !! Does
! Say !! Does
|-
|-
| snap left / snap right || Half screen left/right
| snap left / right || Half screen
|-
| snap half left / snap half right || Half screen (alias)
|-
|-
| snap up / snap full || Fullscreen
| snap up / snap full || Fullscreen
Line 291: Line 312:
| snap down / snap bottom || Bottom half
| snap down / snap bottom || Bottom half
|-
|-
| window bigger || Grow window (cmd-ctrl-=)
| window bigger / smaller || Resize
|-
| window smaller || Shrink window (cmd-ctrl--)
|-
|-
| window grid || Grid overlay (F1)
| window grid || Grid overlay (F1)
|-
|-
| window cascade || Cascade windows (F12)
| window cascade || Cascade (F12)
|}
 
=== Spaces ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''
 
{| class="wikitable"
|-
! Say !! Does
|-
| space left || Switch to left Space (cmd-ctrl-left)
|-
|-
| space right || Switch to right Space (cmd-ctrl-right)
| space left / space right || Switch Spaces
|}
|}


Line 319: Line 328:
! Say !! Does
! Say !! Does
|-
|-
| hide this || Hide current app (cmd-h)
| hide this / hide others || Hide apps
|-
| hide others || Hide other apps (cmd-alt-h)
|-
|-
| quit this || Quit app (cmd-q)
| quit this || Quit (cmd-q)
|-
|-
| close window || Close window (cmd-w)
| close window / close tab || Close (cmd-w)
|-
|-
| close tab || Close tab (cmd-w)
| new tab / new window || New tab/window
|-
|-
| new tab || New tab (cmd-t)
| next tab / previous tab || Switch tabs
|-
|-
| new window || New window (cmd-n)
| spotlight || cmd-space
|-
|-
| next tab / previous tab || Switch tabs (cmd-shift-]/[)
| undo / redo || cmd-z / cmd-shift-z
|-
|-
| spotlight || Spotlight search (cmd-space)
| save || cmd-s
|-
|-
| undo / redo || Undo/redo (cmd-z / cmd-shift-z)
| select all / copy / paste / cut / find || Standard shortcuts
|-
|-
| save || Save (cmd-s)
| screenshot / screen record || cmd-shift-4 / cmd-shift-5
|-
| select all || Select all (cmd-a)
|-
| copy / paste / cut || Clipboard (cmd-c/v/x)
|-
| find || Find (cmd-f)
|-
| screenshot || Screenshot region (cmd-shift-4)
|-
| screen record || Screen recording (cmd-shift-5)
|}
|}


Line 381: Line 378:
[[Category:Voice]]
[[Category:Voice]]
[[Category:Configuration]]
[[Category:Configuration]]
== Community & Prior Art ==
[https://github.com/talonhub/community talonhub/community] is the canonical voice command set that our custom overrides build on. [https://github.com/cursorless-dev/cursorless Cursorless] is the breakthrough in spoken code editing — a grammar that decorates every token with a hat for rapid structural manipulation. [https://github.com/hands-free-vim/cursorless.nvim cursorless.nvim] brings it into Neovim. [https://github.com/fidgetingbits/talon-vim talon-vim] provides vim-specific voice commands. [https://github.com/fidgetingbits/fidgetingbits-talon fidgetingbits-talon] is one of the most comprehensive personal configs — good reference for a mature voice setup.

Latest revision as of 05:17, 24 February 2026

Talon Voice Control Setup

Custom voice control configuration for macOS using Talon.

Source code: github.com/ejfox/dotfiles/talon-overrides

Daily Drivers

The commands worth memorizing. Everything else is in the full reference below.

Category Say Does
Mode cmd / talk Switch between command and dictation
Enter go ahead / send it Press Enter
tmux mux one thru mux nine Jump to window N
tmux mux left / right / up / down Navigate panes
tmux mux zoom Toggle pane fullscreen
tmux mux split right / down Split pane
tmux mux close pane Close current pane
tmux mux new New window
tmux mux sessions Session picker
Terminal wipe Clear current line
Terminal cancel Ctrl-C
Terminal again Re-run last command
Terminal edit Open nvim
Terminal lazy Open lazygit
Terminal files Open yazi
Terminal run claude Launch Claude Code
Nav go code / go home / go dotfiles cd to directory
Git git status / push / pull / diff Git commands
Apps open ghosty / chrome / obsidian / slack Switch apps
Windows snap left / right / full Window positioning

Tip: Voice command usage is logged to ~/.local/share/usage-logs/talon/ — run usage-analyze after a week to see what you actually use most.

Overview

Voice-driven workflow for terminal (Ghostty + tmux), macOS app switching, and window management. All config lives in ~/.dotfiles/talon-overrides/ (symlinked to ~/.talon/user/ejfox-overrides/).

The TTS feedback script (claude-say) lives at github.com/ejfox/dotfiles/bin/claude-say and the symlink setup is in sync-dotfiles.sh.

Architecture

  • Community scripts: ~/.talon/user/community/ (talonhub/community clone)
  • Custom overrides: ~/.talon/user/ejfox-overrides/ (dotfiles-tracked)
  • Speech engine: Conformer (Talon's built-in, downloaded via Talon menu)

Files

File Purpose Source
settings.talon Global settings (tmux prefix, subtitle config) github
custom_keys.talon Mode switching (cmd/talk) and Enter aliases github
tmux.talon ~30 tmux voice commands (windows, panes, sessions) github
terminal_commands.talon Ghostty-specific: line editing, nav, git, launchers github
macos_nav.talon App switching, Rectangle Pro, Spaces, general macOS github
ghostty.talon Ghostty terminal detection (too new for community) github
cursor.talon Cursor IDE detection github
apps.py App definitions for newer apps not in community github
nato_alphabet.py NATO phonetic alphabet override (Python Context) github
mode_line.py 2px colored bar at screen bottom showing current mode github
ejfox_subtitles.py Right-aligned subtitles below sketchybar github
usage_logging.py JSONL command logger for usage analysis github
vocabulary.talon-list ~250 custom vocabulary terms github

Key Design Decisions

NATO Alphabet via Python Override

The community .talon-list file takes priority over user overrides. The only reliable way to replace the letter list is a Python Context override.

tmux Prefix Timing

tmux needs sleep(100ms) between the prefix key and the command key. Without it, the command fires before tmux registers the prefix.

Anchored Rules for Dictation Mode

Commands must use ^...$ anchors to work in dictation mode. Without anchors, the prose capture engine swallows the command and types it as text.

Custom Subtitles

Community subtitles plugin is center-aligned with no horizontal position setting. Custom ejfox_subtitles.py renders right-aligned text below sketchybar (38px from top).

Mode Line

2px colored line at screen bottom replacing default circle indicator:

  • Pink (#e60067): Command mode
  • Teal (#6eedf7): Dictation mode
  • Muted (#735865): Sleep mode

Usage Logging

Every recognized phrase is logged to ~/.local/share/usage-logs/talon/YYYY-MM-DD.jsonl with timestamp, phrase text, word count, and active app. Same format as shell and tmux usage logs — analyze with usage-analyze or jq.

Full Command Reference

Mode Switching

Source: custom_keys.talon

Say Does
cmd Switch to command mode
talk Switch to dictation mode
go ahead / go head / send it Press Enter

tmux Windows

Source: tmux.talon

Say Does
mux one thru mux nine Jump to window N
mux next / mux previous Next/prev window
mux last Last used window
mux new New window
mux rename Rename window
mux close Close window
mux alert / mux newest Jump to window with bell
mux workspace Session/window picker

tmux Panes

Source: tmux.talon

Say Does
mux left / right / up / down Navigate panes
mux move left / right / up / down Move pane in direction
mux next pane Cycle panes
mux split right / down Split pane
mux pane right / down / left / up Split + auto-focus new pane
mux close pane Close current pane
mux zoom Toggle pane fullscreen
mux sessions Session picker
mux scroll Enter scroll mode
mux detach Detach from session

Terminal

Source: terminal_commands.talon

Say Does
wipe Clear line (ctrl-u)
wipe word Delete last word (ctrl-w)
cancel / nope / bail Ctrl-C
again Re-run last command
clear Clear terminal
edit / run neovim Open nvim
lazy / run lazygit Open lazygit
files / run yazi Open yazi
run btop Open btop
run claude Launch Claude Code
run claude skip Launch Claude Code (skip hooks)
run codex Launch Codex CLI
tips Search tips with fzf
refresh Source .zshrc
list files ls
list all ls -la
note <text> Quick note to Obsidian daily

Directory Navigation

Source: terminal_commands.talon

Say Does
go home cd ~
go code cd ~/code
go smallweb cd ~/smallweb
go clients cd ~/clients
go dotfiles cd ~/.dotfiles
go back cd -
go up cd ..
go paperclip / website / coach / connectology / vulpes / subway / newswell / gem / ddhq Project directories

Git

Source: terminal_commands.talon

Say Does
git status / push / pull / log / diff Standard git commands
git add all git add -A
git stash / git pop Stash and pop

Dev

Source: terminal_commands.talon

Say Does
dev server npm run dev
yarn dev yarn dev
install npm install
connect VPS / connect SSH to VPS

App Switching

Source: macos_nav.talon

open ghosty, open chrome, open safari, open messages, open slack, open discord, open signal, open obsidian, open claude, open figma, open finder, open music, open OBS

Window Management

Source: macos_nav.talon

Say Does
snap left / right Half screen
snap up / snap full Fullscreen
snap down / snap bottom Bottom half
window bigger / smaller Resize
window grid Grid overlay (F1)
window cascade Cascade (F12)
space left / space right Switch Spaces

General macOS

Source: macos_nav.talon

Say Does
hide this / hide others Hide apps
quit this Quit (cmd-q)
close window / close tab Close (cmd-w)
new tab / new window New tab/window
next tab / previous tab Switch tabs
spotlight cmd-space
undo / redo cmd-z / cmd-shift-z
save cmd-s
select all / copy / paste / cut / find Standard shortcuts
screenshot / screen record cmd-shift-4 / cmd-shift-5

claude-say (TTS)

Script at ~/bin/claude-say lets Claude Code speak responses aloud:

  • Mutes mic input before speaking (prevents Talon feedback loop)
  • Restores mic volume after speaking
  • Prefixes with tmux window number for voice navigation
  • Uses macOS say -v Samantha

Lessons Learned

  1. .talon-list overrides don't reliably replace community lists — use Python Context overrides
  2. Ghostty is too new for community scripts — need custom app detection
  3. sleep(100ms) between tmux prefix and command key is essential
  4. ^...$ anchors required for commands to work in dictation mode
  5. Built-in Talon subtitle controlled by speech._subtitles setting (undocumented)
  6. Community subtitles are a separate plugin with their own settings
  7. macOS say triggers Talon — must mute mic first via claude-say wrapper

See Also

  • Dotfiles — full dotfiles setup
  • CLI — terminal workflow
  • Nvim — editor configuration
  • tmux — multiplexer setup

Community & Prior Art

talonhub/community is the canonical voice command set that our custom overrides build on. Cursorless is the breakthrough in spoken code editing — a grammar that decorates every token with a hat for rapid structural manipulation. cursorless.nvim brings it into Neovim. talon-vim provides vim-specific voice commands. fidgetingbits-talon is one of the most comprehensive personal configs — good reference for a mature voice setup.