Default key bindings
Synopsis
/bind
/bind -defaults
These are the core bindings created at client startup and rebuilt by bind -defaults. Terminal capability bindings are then added, and startup scripts can replace them. The bindings active in an ordinary configured session can therefore differ from these initial defaults. Use bind to inspect the current map.
^A means Control-A; ^[ means Escape; ^? means DEL, byte 127. Characters following Escape are a sequence, not necessarily simultaneous keystrokes. Ordinary letter case matters in sequences: Escape followed by lowercase b is different from Escape followed by uppercase B.
Single-character bindings
Printable ASCII characters, including space, initially use self_insert. DEL is subsequently rebound to backspace. Non-ASCII input characters use the input system's Unicode insertion path rather than an ordinary byte-sequence binding.
| Sequence | Bound action |
|---|---|
^A |
beginning_of_line |
^B |
bold |
^C |
self_insert |
^D |
delete_character |
^E |
end_of_line |
^F |
blink |
^G |
self_insert |
^H |
backspace |
^I |
toggle_insert_mode |
^J |
send_line |
^K |
erase_to_end_of_line |
^L |
refresh_screen |
^M |
send_line |
^O |
highlight_off |
^Q |
quote_character |
^U |
erase_line |
^V |
reverse |
^W |
next_window |
^X |
switch_channels |
^Y |
yank_from_cutbuffer |
^_ |
underline |
^? |
backspace |
Tab is ^I, so its core action toggles insert mode rather than performing completion. Enter commonly sends ^M or ^J, both bound to send_line. A physical Backspace key can send ^H or DEL; both erase backward here. A terminal's separate Delete key may have a multi-character sequence mapped to forward deletion instead.
Control-C has a self_insert binding if that character reaches the binding system. Fullscreen terminal setup normally leaves Control-C as the terminal's interrupt signal, so the binding should not be interpreted as a guarantee that pressing Control-C inserts text. Control-G inserts the bell character. Neither action itself submits the line.
No core action is assigned to Control-N, Control-P, Control-R, Control-S, Control-T, or Control-Z. In particular, there is no default stop-screen, transpose, or process-suspend action on those keys. Scripts can assign other behavior.
Escape sequences
| Sequence | Bound action |
|---|---|
^[. |
clear_screen |
^[< |
scroll_start |
^[> |
scroll_end |
^[b |
backward_word |
^[d |
delete_next_word |
^[e |
scroll_end |
^[f |
forward_word |
^[h |
delete_previous_word |
^[n |
scroll_forward |
^[p |
scroll_backward |
^[^? |
delete_previous_word |
Fixed terminal-style sequences
The following byte sequences are also installed directly. Their physical key names depend on the terminal or emulator; the sequence spelling is the reliable identifier.
| Sequence | Bound action |
|---|---|
^[OC, ^[[C |
forward_character |
^[OD, ^[[D |
backward_character |
^[OF, ^[[F, ^[O4~, ^[[4~ |
scroll_end |
^[OG, ^[[G, ^[O6~, ^[[6~ |
scroll_forward |
^[OH, ^[[H, ^[O1~, ^[[1~ |
scroll_start |
^[OI, ^[[I, ^[O5~, ^[[5~ |
scroll_backward |
^[On, ^[[n |
next_window |
^[Op, ^[[p |
previous_window |
The core table does not assign Up/Down history actions. The supplied history script can install history navigation, while completion scripts can replace Tab and other keys. An external terminal or multiplexer can intercept a key before EPIC receives it.
Terminal-derived bindings
After core setup, init_termkeys uses terminal capabilities to add these mappings when the corresponding capability exists:
| Terminal capability | Action |
|---|---|
key_ppage |
scroll_backward |
key_npage |
scroll_forward |
key_home |
scroll_start |
key_end |
scroll_end |
key_ic |
toggle_insert_mode |
key_dc |
delete_character |
These can overlap or replace fixed sequences. Correct TERM and terminal capability data matter; not every keyboard sends the same sequence for Home, End, Insert, Delete, or Page Up/Down. The terminal setup disables XON/XOFF flow control in fullscreen mode, but surrounding terminal or session configuration can still affect delivery.
Resetting and customizing
bind -defaults removes existing binding actions, recreates built-in actions, constructs the default keymap, and reapplies terminal-capability mappings. It does not rerun your startup scripts to reinstall history, completion, or custom key actions. Script-created bind functions and prior assignments are not automatically restored.
To make a single change, bind just the desired key rather than resetting all bindings. For example:
/bind ^I self_insert
This makes Tab insert a literal tab if it reaches EPIC. Individual action pages describe cursor movement, cutbuffer changes, formatting insertion, window switching, and message submission. A key binding has no general function-return value; its effects come from its assigned action. Core bindings need no optional script package or server extension, though actions involving a target can depend on connection state.
Source references
source/keys.c:init_binds,init_keys,init_termkeys, key-sequence parsing, andbind -defaultsreset path.source/term.c: terminal capabilities, interrupt-key setup, and flow-control handling.source/input.c: character insertion, cursor editing, and submission.script/history: startup-script history bindings beyond the core defaults.