Ctrl+K quick switcher and keyboard navigation #287

Closed
opened 2026-10-07 20:43:04 -04:00 by Salastil · 1 comment
Owner

There is no quick switcher and no app-level keyboard navigation; the only key handling outside the composer is the global show/hide hotkey. Discord, Slack and Element all have Ctrl+K. The title bar (TitleBar.tsx:32-43) is mostly empty.

Add:

  • Ctrl+K: a quick switcher with fuzzy search across every account's channels, DMs and rooms, unread first; a search button in the title bar opens it
  • Alt+↑/↓: previous/next channel; Alt+Shift+↑/↓: previous/next unread
  • Ctrl+, : Settings
  • All listed on the new Keybinds settings page.

Measured by the layout check (scripts/ui-check.mjs) like the other popups.

Part of the v1.0 UI pass.

There is no quick switcher and no app-level keyboard navigation; the only key handling outside the composer is the global show/hide hotkey. Discord, Slack and Element all have Ctrl+K. The title bar (TitleBar.tsx:32-43) is mostly empty. **Add:** - Ctrl+K: a quick switcher with fuzzy search across every account's channels, DMs and rooms, unread first; a search button in the title bar opens it - Alt+↑/↓: previous/next channel; Alt+Shift+↑/↓: previous/next unread - Ctrl+, : Settings - All listed on the new Keybinds settings page. Measured by the layout check (`scripts/ui-check.mjs`) like the other popups. _Part of the v1.0 UI pass._
Salastil added this to the v1.0 milestone 2026-10-07 20:43:04 -04:00
Salastil added the feature label 2026-10-07 20:43:04 -04:00
Author
Owner

Finished: 1eef37e.

Title bar - before (top) and after (bottom). The search button opens the switcher; it is only in the main window, since a popout is one conversation:

title bar

Ctrl+K with nothing typed - what is waiting comes first (mentions, then unread), then the most recently active, across every account. Discord channels show their server, IRC ones their account:

switcher open

Typing - every word has to match the name or where it lives; names that start with the word beat ones that merely contain it, exact names beat longer ones, and letters in order still find it (gnrl finds general):

switcher query

Also: Alt+Up / Alt+Down go to the previous / next channel in the list as drawn (collapsed categories skipped), Alt+Shift+Up / Down to the previous / next one with something waiting, and Ctrl+, opens Settings. Ctrl+K works from the message box too.

Checked in the isolated test copy with real key events: Ctrl+K, clips, Enter opened that channel and closed the switcher; Alt+Down and Alt+Up moved one channel each way; Alt+Shift+Down skipped read channels to the next unread; Esc closed the switcher without leaving the channel; Ctrl+, opened Settings. The ranking has 8 unit tests (lib/switcher.test.ts). The Keybinds page (#322) will list these.

Finished: [1eef37e](https://git.salastil.com/Salastil/moho/commit/1eef37ee76569bd93bc631baa5fce01d9e37c877). **Title bar** - before (top) and after (bottom). The search button opens the switcher; it is only in the main window, since a popout is one conversation: ![title bar](https://git.salastil.com/attachments/f4883701-984d-4037-ad13-96258a588391) **Ctrl+K with nothing typed** - what is waiting comes first (mentions, then unread), then the most recently active, across every account. Discord channels show their server, IRC ones their account: ![switcher open](https://git.salastil.com/attachments/928c15ad-473f-4b3b-8d8b-babfdc7ccb96) **Typing** - every word has to match the name or where it lives; names that start with the word beat ones that merely contain it, exact names beat longer ones, and letters in order still find it (`gnrl` finds `general`): ![switcher query](https://git.salastil.com/attachments/331b5b46-32b4-468a-8377-aad96c408a33) Also: **Alt+Up / Alt+Down** go to the previous / next channel in the list as drawn (collapsed categories skipped), **Alt+Shift+Up / Down** to the previous / next one with something waiting, and **Ctrl+,** opens Settings. Ctrl+K works from the message box too. Checked in the isolated test copy with real key events: Ctrl+K, `clips`, Enter opened that channel and closed the switcher; Alt+Down and Alt+Up moved one channel each way; Alt+Shift+Down skipped read channels to the next unread; Esc closed the switcher without leaving the channel; Ctrl+, opened Settings. The ranking has 8 unit tests (`lib/switcher.test.ts`). The Keybinds page (#322) will list these.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Salastil/moho#287