Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

keybinds.toml

Keyboard shortcuts, organized into three sections by priority. You can edit this file directly (then .reload keybinds) or use the in-app editor (.keybinds to browse, .addkeybind to add).

File Structure

The file maps keys to actions in three sections:

[app]      # Always active, highest priority (quit, search, close)
quit = "ctrl+c"
start_search = "ctrl+f"
close_window = "esc"

[menu]     # Active inside menus, forms, browsers, editors
navigate_up = "up"
select = "enter"
save = "ctrl+s"

[user]     # Game mode only — your customizations go here
enter = "send_command"
up = "previous_command"
"ctrl+r" = "send_last_command"
num_8 = { macro_text = "n\r" }

Note the orientation differs: [app] and [menu] are action = "key", while [user] is "key" = "action".

Key Names

Combine modifiers with +: "ctrl+shift+a", "alt+page_up". Quote any name containing + or symbols.

GroupNames
Modifiersctrl, alt, shift
Function keysf1f12
Arrowsup, down, left, right
Navigationhome, end, page_up, page_down
Editinginsert, delete, backspace, enter, tab, esc, space
Numpadnum_0num_9, num_plus, num_minus, num_multiply, num_divide, num_decimal, num_enter

Numpad keys accept any modifier combination — ctrl+num_8, alt+num_divide, ctrl+alt+shift+num_plus. They use word-form names because a literal + in a key name would collide with the + that separates modifiers. The older symbol spellings ("num_+", "num_.", …) are still read, so existing files keep working, but they cannot take modifiers — switch to word form if you want chords.

Shift+numpad on Windows: Windows temporarily overrides NumLock while Shift is held, so the numpad reports its navigation twin. VellumFE recovers the numpad identity, so shift+num_8 does bind — but it is indistinguishable from pressing that same physical key with NumLock off.

Tip: If backspace doesn’t work, your terminal may send delete instead. Run with RUST_LOG=debug and check the log for KEY EVENT lines to see what your terminal actually sends.

Actions

Bind any of these in [user]:

ActionDescription
send_commandSend the input line to the game
previous_command / next_commandCommand history
send_last_command / send_second_last_commandRepeat recent commands
cursor_left / cursor_right / cursor_home / cursor_endMove cursor
cursor_word_left / cursor_word_rightMove by word
cursor_backspace / cursor_deleteDelete characters
switch_current_windowFocus next window
scroll_current_window_up_page / ..._down_pageScroll by page
scroll_current_window_up_one / ..._down_oneScroll by line
start_search / next_search_match / prev_search_match / clear_searchIn-window search
toggle_performance_statsPerformance overlay
stop_travelCancel the active .go2 trip (while traveling, Esc does this by default)
interact_modeToggle interact mode (GUI; default F6)
tts_next / tts_previous / tts_next_unread / tts_stopText-to-speech navigation
tts_mute_toggle / tts_increase_volume / tts_decrease_volume / tts_increase_rate / tts_decrease_rateTTS controls

Controller Bindings

Controller (gamepad) configuration lives in its own file — see controller.toml. It was split out of keybinds.toml so a controller setup is one shareable, version-controllable file and a bad edit there can’t take keyboard input down with it.

Macros

Send text with a keypress using the inline-table form. \r presses Enter:

[user]
num_8 = { macro_text = "n\r" }              # north
num_2 = { macro_text = "s\r" }              # south
f5 = { macro_text = "stance defensive\r" }
f6 = { macro_text = "hide\r" }              # omit \r to just type it

The default file ships numpad movement macros (num_1num_9 for directions, num_0 down, num_decimal up, num_plus look, and so on).

A macro can chain several commands with \r between them, and pause between commands with a sleep segment: a segment that is just s followed by seconds (s0.5, s2, s90 — decimals fine, no upper bound). Everything after the sleep goes out when the pause elapses; consecutive sleeps add up. Spaces around segments are ignored, and a bare s is still south.

f7 = { macro_text = "stand\rs1.5\rout\r" }   # stand, wait 1.5s, leave
f8 = { macro_text = "prep 101\r s3.2 \rcast\r" }

Sleep segments work anywhere command text is dispatched — keyboard macros, controller binds, hotbar buttons, macro buttons (including taps from the phone client), and wheel slices.

While interact mode is focused on an entity, macros may reference it with <target_id> (exist id) and <target_noun>:

[controller]
west = { macro_text = "target #<target_id>\rincant 611\r" }

A placeholder macro pressed with nothing focused is dropped (with a message) rather than sent literally. Exits have no exist id.

Keybind Profiles

Save and swap whole keybind sets:

.savekeybinds hunting
.loadkeybinds hunting
.keybindprofiles          # list saved profiles