Skip to content

Keymaps

Durian uses vim-style key bindings throughout the GUI. The key sequence engine supports chord sequences (e.g. gi, gs, ga), counts (3j, 5n), and modal contexts — bindings can be scoped to “list”, “thread”, “search”, “tag picker”, or “compose normal”, and the same key can do different things in each.

Customize via ~/.config/durian/keymaps.pkl. Run durian validate keymaps to check your overrides. See Custom keymaps below.

Email list (default context)

Active when you’re in the thread list — typically the left/main pane without a thread expanded.

Navigation

KeyAction
j / kNext / previous email (3j for ↓3)
/ Same as j / k
ggJump to first email
GJump to last email
Ctrl-d / Ctrl-uPage down / up
l / EnterOpen thread (enter thread context)
q / EscClose detail

Folders & profiles

KeyAction
giGo to Inbox
gsGo to Sent
gdGo to Drafts
gaGo to Archive
g1g9Go to user folder slot 1–9
J / KNext / previous folder in sidebar
gfFolder picker

Actions

KeyAction
rReply
RReply all
fForward
cCompose new
aArchive
uToggle read / unread
sToggle star
ddDelete (move to trash)
tTag picker
/ (or ⌘/)Search
⌘rReload inbox

Selection mode

KeyAction
vEnter visual mode (range selection)
VEnter toggle mode (multi-pick)
SpaceToggle current row in selection
EscExit visual / toggle mode

Thread (open message)

Active once you’ve opened a thread with l or Enter. The cursor now lives inside the thread — j / k scroll the message body, n / N jump between messages within the thread.

KeyAction
j / kScroll thread body down / up (with count)
Ctrl-d / Ctrl-uPage down / up within the thread
nNext message in the thread (3n jumps 3 forward)
NPrevious message in the thread
ggFirst message in the thread
GLast message in the thread
rReply to the focused message
h / EscClose thread, back to list

n / N move a per-message focus indicator; combined with a count (5n) you skip several messages at once, which is faster than scrolling through a long quote-heavy thread.

Search popup

When the search popup is open (/), navigation keys work differently so they don’t collide with typing the query:

KeyAction
Ctrl-j / Ctrl-kNext / previous result
Ctrl-n / Ctrl-pSame
EnterOpen selected thread
EscClose popup

Tag picker

Same pattern when the tag picker is open (t):

KeyAction
Ctrl-j / Ctrl-kNext / previous tag
Ctrl-n / Ctrl-pSame
EnterApply selected tag
EscClose picker

Compose editor

The compose editor has its own modal vim mode (normal, insert, visual). See Vim compose for the full reference. One handy default:

KeyAction
jk (in insert mode)Exit to normal mode

Custom keymaps

Override any binding in ~/.config/durian/keymaps.pkl. The same key + modifiers + context triple as a default replaces that default; set enabled = false to remove it; any other entry is appended.

import "modulepath:/Keymaps.pkl" as K

keymaps: Listing<K.KeymapEntry> = new {
  // Use Shift-J / Shift-K to jump messages in a thread (instead of n / N)
  new { action = "next_message"; key = "J"; context = "thread"; supports_count = true }
  new { action = "prev_message"; key = "K"; context = "thread"; supports_count = true }

  // Disable the default `dd` delete chord
  new { action = "delete"; key = "dd"; sequence = true; enabled = false }
}

After editing:

durian validate keymaps

The GUI picks up changes on next launch (or via “Reload Keymaps” if you have it bound).

Action reference

The actions available in keymaps.pkl (full list also in schema/Keymaps.pkl):

ActionNotes
next_email / prev_emailList navigation
first_email / last_emailList jump
page_down / page_upBoth contexts
enter_threadOpen focused thread
next_message / prev_messageThread context only
scroll_down / scroll_upThread body
close_detailBack to list
archive, deleteTag mutations
toggle_read, toggle_starFlag toggles
reply, reply_all, forward, composeComposition
go_inbox, go_sent, go_drafts, go_archiveFolder jumps
go_folderUser folder (requires key = "gN")
next_folder / prev_folderSidebar navigation
folder_pickerOpen folder picker
searchOpen search popup
tag_pickerOpen tag picker
enter_visual_mode, enter_toggle_modeSelection modes
toggle_selection, exit_visual_modeSelection control
select_next / select_prevWithin popups (search, tag picker)
exit_insertCompose insert → normal mode
reload_inboxTrigger a sync + reload

All actions accept supports_count = true if they’re motion-style and benefit from a numeric prefix (e.g. 5j, 3n).