These are wtf's defaults. ? in the window shows the keys of where you are; [keys] and [leader] in the config file change them (see the names below).

In the waveforms

Move

KeysDoes
h lcursor left / right
w bnext / prev change
gg Gstart / end
z xzoom in / out
ccenter the cursor
H Lscreen left / right
Ctrl-d/uhalf a screen

Rows

KeysDoes
j kselect a row
Ctrl-f/ba screen of rows
Enterfold a group or bus
ethe whole value
yy ytcopy value / time

Change

KeysDoes
aadd signals
ddremove
J Kmove down / up
Vselect rows; Esc ends
rnext radix
u Ctrl-rundo / redo
KeysDoes
/search
n Nnext / previous match

Marks

KeysDoes
m Mput / remove a mark
Tab/S-Tabnext / previous mark
'2..'9jump to a mark
''back before the jump

Other

KeysDoes
:command
Spaceleader menu
5l 3wa count repeats a key
qquit

Search expressions

TypeFinds
/0x40the selected row's value, in any radix
/x /zunknown, high impedance
/valid && ready && data == 0x40several signals at once
/@clk fell(valid) && !past(ready)sampled at clk; also rose() stable()

In the signal panel

a opens the panel: the trace's scopes and signals as a tree.

Move

KeysDoes
j kmove
l hopen / close a scope
gg Gfirst / last line
/search paths
n Nnext / previous match

Mark

KeysDoes
Spacemark a signal or scope
Vmark a range
Ctrl-amark all matches

Add

KeysDoes
Enteradd as rows
Ctrl-gadd as a group
u Ctrl-rundo / redo
aclose
Escclear marks / close

New signals go below the selected row, at the accent line.

In the records table

:records opens it on a set of streams. The keys are fixed.

KeysDoes
j kmove
Ctrl-f Ctrl-ba screen of records
g Gfirst / last record
h lscroll the columns
/filter; Enter or Esc stops, Ctrl-u clears
s Ssort by the next column / reverse
=group by the sorted field; again to ungroup
Tab Shift-Tabnext / previous set
Enterjump to a record; on a group, keep its records
Esc qclose

In the picker

:pick <source> opens it: typing edits the query. The keys are fixed.

KeysDoes
Ctrl-n Ctrl-p Down Upmove
PageDown PageUpa box of entries
Backspacedelete a character of the query
Tabmark the signal and move on
Ctrl-snext source
Enterpick and close
Escclose

The Space menu

Space opens a menu of everything that has no key of its own. Groups open with their key; Backspace goes back up.

KeysDoesRuns
Space ffind a signal:pick signals
Space mmarks:pick marks
Space rrecords:pick records
Space :commands:pick commands
Space nmessages:messages
Space ?keys:help

Space v view

KeysDoesRuns
Space v ggroup the selection…:group
Space v rrename the group…:rename
Space v uungroup:ungroup
Space v ccolour…:color
Space v xradix…:radix

Space t time

KeysDoesRuns
Space t fzoom to fit:fit
Space t zzoom to…:zoom
Space t mmark at a time…:cursor

Space d decode

KeysDoesRuns
Space d ddecode an interface: the ones found in the trace, each with its line:pick interfaces
Space d Ddecode by hand…:decode
Space d pprotocol…:protocol
Space d scomputed signal…:signal
Space d nname values…:names
Space d rrecords where…:records

Space a agent

KeysDoesRuns
Space a ffollow…: the window shows its workspace as it works:follow
Space a Fstop following: your own view back:follow off
Space a ttrail: its steps; Enter jumps to one's time:pick trail
Space a jjoin a session…: the agents working on this machine:pick sessions
Space a sthe agent's session: what it left while no window was open:agent

Space q session

KeysDoesRuns
Space q wsave: rows, marks and decodes, beside the trace:w
Space q ereload the trace: after the simulation ran again:e
Space q qquit: refused with unsaved changes:q
Space q xsave and quit:wq
Space q Qquit without saving: unsaved changes are lost:q!

Commands

: opens the command line; Tab completes, and the card above it says what each command does.

CommandDoes
:<time>Move the cursor to a time, e.g. :2000ns
:zoom <time>Set the time per column, e.g. :zoom 1ns
:add <path|pattern>...Add signals below the selected row (after a selected group); a scope becomes a group, e.g. :add top.cpu.*
:rm [path|pattern]...Remove matching rows, or the selected row; :rm ** removes all
:signal <name> = <signal>Name a computed signal, e.g. :signal op = cmd[7:0] or :signal hdr = {a, b}
:decode <name> <protocol> <role>=<signal>...Decode a protocol into streams, e.g. :decode rx axis clock=clk tvalid=rx_tvalid tready=rx_tready tdata=rx_tdata tlast=rx_tlast
:protocol <name> roles=<a,b> when=<expr> <field>=<expr>...Define a protocol on its roles, a record per cycle where when holds, e.g. :protocol cmd roles=valid,ready,data when=valid && ready op=data[7:0]; :decode puts it on signals
:names <signal> <value>=<name>...Name a signal's values, shown by the enum radix and searched by name, e.g. :names state 0=IDLE 1=BUSY; off removes them
:records <streams> [where <expr>]Browse records as a table: a stream, a decode's results (:records bus), a glob; / filters, s sorts, = groups
:scope [path]Resolve names under a scope first, e.g. :scope top.cpu makes state top.cpu.state; none without a path
:radix <name>Set the radix: hex bin dec sdec oct ascii float enum, q4.12 / uq4.12 fixed point
:color <name|off>Colour the selected row or group: red orange yellow green cyan blue magenta gray; off for the theme's
:group <name>Group the selected rows (V selects them)
:rename <name>Rename the group the selected row is in
:ungroupDissolve the group the selected row is in, keeping its signals
:select <row> [<last row>]Select a signal or group by name, or the rows from one to another
:pick <source>A fuzzy list with a preview: signals, marks, records , commands, sessions, trail, interfaces; Ctrl-s goes to the next
:messagesEvery message so far, with its time and who caused it: you or an agent
:trailThe agent's steps; Enter jumps to a step's time
:cursor <n> [time|off] [name=] [note=]Put mark n at a time (1: the cursor), name it, remove it, or jump to it, e.g. :cursor 2 120ns name=bad write
:undoUndo the last change to the rows
:redoRedo a change undone with :undo
:fit [<from> <to>]Zoom to the whole simulation, or between cursors or times, e.g. :fit '2 '3 or :fit 10ns 20ns
:agentShow the session an agent left for this trace when no window was open
:follow [<id>|off]Follow an agent working on this trace: show its workspace and each change it makes
:eReload the trace, keeping signals, groups, cursor and zoom
:w [file]Save the session
:wqSave the session and quit
:help [topic]Show the keys of the current mode (also ?), or a topic: names times radix expressions decode records workspace commands
:qQuit; refuses if the session has unsaved changes
:q!Quit without saving

Names for [keys]

Each key's name in the config file's [keys] table, with its default. A count before a key marked count repeats it (5l), or numbers a mark (3m).

[keys]
zoom_in = "i"       # z
start = "<C-g>"     # gg
NameDefaultDoes
lefthcursor left, count
rightlcursor right, count
next_changewnext change, count
prev_changebprevious change, count
downjnext row, count
upkprevious row, count
fold<CR>open / fold the row
examineethe whole value
startggstart of the trace
endGend of the trace
half_right<C-d>half a screen right, count
half_left<C-u>half a screen left, count
screen_leftHscreen left, count
screen_rightLscreen right, count
centerccenter the cursor
page_down<C-f>a screen of rows down, count
page_up<C-b>a screen of rows up, count
zoom_inzzoom in, count
zoom_outxzoom out, count
panelaadd signals
removeddremove the row
move_downJmove the row down, count
move_upKmove the row up, count
rangeVselect rows
radixrnext radix
undouundo
redo<C-r>redo
copy_valueyycopy the value
copy_timeytcopy the cursor's time
search/search a value
next_matchnnext match, count
prev_matchNprevious match, count
markmput mark N, count
unmarkMremove mark N, count
next_mark<Tab>next mark
prev_mark<S-Tab>previous mark
jump'jump to a cursor
jump_back''back before the jump
command:command
help?keys
quitqquit
leader<Space>the leader menu