# TUI key bindings
TUI key bindings are configured under the optional `[keybindings]` table in `tix.toml`. Each mode is independent. Omitted modes and actions inherit the built-in defaults, so existing configurations need no migration.
```toml
[keybindings.board]
new_issue = ["ctrl+n"]
help = ["f1", "?"]
[keybindings.form]
submit = ["ctrl+s"]
cancel = ["esc"]
```
A binding is one terminal key chord, not a key sequence. Every action accepts one or more strings. A user override replaces that action's complete default alias list in that mode.
## Chord grammar
Names are case-insensitive. Supported named keys are `esc`, `enter`, `tab`, `backspace`, `delete`, `insert`, `home`, `end`, `left`, `right`, `up`, `down`, `pgup`, `pgdn`, `f1` through `f12`, and `space`. Use `shift+tab` for BackTab. Supported modifiers are `ctrl` (or `control`), `alt` (or `option`), `shift`, and `super` (or `cmd`). Printable single characters are also accepted, such as `n`, `?`, and `A`. Character bindings do not support modifier combinations.
Bindings must be non-empty. A chord can be assigned to only one action within one mode. The same chord may be reused in different modes. Invalid names, empty lists, and conflicts are rejected when `tix.toml` loads, with the mode and action in the error.
## Text entry and mouse controls
Printable characters typed into forms, comments, assets, filters, planning fields, and inline-create prompts remain text input unless the exact character is configured as an action in that mode. Backspace and other inherent editing behavior are not commands. Mouse controls are not configurable; existing clicks, double-clicks, context menus, scrolling, and drag-and-drop continue to invoke the same logical actions as the keyboard.
## Board
| move up | `Up / k` | `move_up` |
| move down | `Down / j` | `move_down` |
| previous column | `Left / h` | `move_left` |
| next column | `Right / l` | `move_right` |
| next board | `Tab` | `next_board` |
| previous board | `Shift+Tab` | `previous_board` |
| open detail | `Enter` | `open` |
| edit issue | `e` | `edit` |
| open agent | `Shift+A` | `agent` |
| toggle column | `c` | `toggle_column` |
| filter criteria | `f` | `filter_modal` |
| batch select | `Shift+B` | `bulk_modal` |
| triage inbox | `t` | `triage` |
| mark for batch | `Space` | `mark` |
| unmark for batch | `x` | `unmark` |
| move to previous column | `<` | `move_previous` |
| move to next column | `>` | `move_next` |
| scroll up one page | `PgUp` | `scroll_up` |
| scroll down one page | `PgDn` | `scroll_down` |
| new issue | `n` | `new_issue` |
| clone issue | `Shift+C` | `clone_issue` |
| show archived issues | `a` | `toggle_archived` |
| delete issue | `d` | `delete` |
| refresh | `r` | `refresh` |
| settings | `s` | `settings` |
| planning | `m / Shift+M` | `planning` |
| new board | `b` | `new_board` |
| help | `?` | `help` |
| quit | `q / Shift+Q / Esc` | `quit` |
| text filter | `/` | `text_filter` |
| reorder up | `Ctrl+Up` | `reorder_up` |
| reorder down | `Ctrl+Down` | `reorder_down` |
## Detail
| close | `q / Shift+Q / Esc` | `close` |
| edit issue | `e` | `edit` |
| scroll up | `PgUp` | `scroll_up` |
| scroll down | `PgDn` | `scroll_down` |
| help | `?` | `help` |
| comment | `c` | `comment` |
| attach asset | `a` | `asset` |
## Forms and prompts
| `form` | cancel | `Esc` | `cancel` |
| `form` | submit | `Enter` | `submit` |
| `form` | next field/row | `Tab / Down` | `next` |
| `form` | previous field/row | `Shift+Tab / Up` | `previous` |
| `form` | open date/picker | `F2` | `open_picker` |
| `planning_form` | cancel | `Esc` | `cancel` |
| `planning_form` | submit | `Enter` | `submit` |
| `planning_form` | next field | `Tab / Down` | `next` |
| `planning_form` | previous field | `Shift+Tab / Up` | `previous` |
| `planning_form` | open date picker | `F2` | `open_picker` |
| `filter` | cancel | `Esc` | `cancel` |
| `detail` | new relationship | `n` | `new_relationship` |
| `detail` | next relationship | `j / Down` | `next_relationship` |
| `detail` | previous relationship | `k / Up` | `previous_relationship` |
| `detail` | edit relationship | `Shift+E` | `edit_relationship` |
| `detail` | remove relationship | `d` | `remove_relationship` |
| `link_prompt` | submit | `Enter` | `submit` |
| `link_prompt` | cancel | `Esc` | `cancel` |
| `filter` | submit | `Enter` | `submit` |
| `move_into_done` | cancel | `Esc` | `cancel` |
| `move_into_done` | submit | `Enter` | `submit` |
| `comment` | cancel | `Esc` | `cancel` |
| `comment` | submit | `Enter` | `submit` |
| `asset` | cancel | `Esc` | `cancel` |
| `asset` | submit | `Enter` | `submit` |
| `settings_prompt` | cancel | `Esc / q / Shift+Q` | `cancel` |
| `settings_prompt` | submit | `Enter / y / Shift+Y` | `submit` |
| `planning_confirm` | confirm | `y / Shift+Y / Enter` | `confirm` |
| `planning_confirm` | cancel | `Esc` | `cancel` |
## Embedded controls
| `rollover` | submit | `Enter` | `submit` |
| `rollover` | toggle choice | `Left / Right / Tab` | `previous` |
| `rollover` | cancel | `Esc` | `cancel` |
| `confirm_delete` | confirm | `y / Shift+Y` | `confirm` |
| `confirm_delete` | cancel | `Esc` | `cancel` |
| `help_search` | cancel (clears the query) | `Esc` | `cancel` |
| `help_search` | submit (keeps the query) | `Enter` | `submit` |
| `help` | search the keybindings | `/` | `text_filter` |
| `help` | cancel | `Esc / q / ?` | `cancel` |
| `help` | next row | `Down / j` | `next` |
| `help` | previous row | `Up / k` | `previous` |
| `help` | scroll down one page | `PgDn` | `scroll_down` |
| `help` | scroll up one page | `PgUp` | `scroll_up` |
| `help` | submit | `Enter` | `submit` |
| `context_menu` | cancel | `Esc / q / ?` | `cancel` |
| `context_menu` | next | `Down` | `next` |
| `context_menu` | previous | `Up` | `previous` |
| `context_menu` | submit | `Enter` | `submit` |
| `form_picker` | cancel | `Esc / F2` | `cancel` |
| `form_picker` | next | `Up` | `next` |
| `form_picker` | previous | `Down` | `previous` |
| `form_picker` | submit | `Enter` | `submit` |
| `form_picker` | inline create | `+ / Insert` | `create` |
| `date_picker` | move up | `Up / k` | `move_up` |
| `date_picker` | move down | `Down / j` | `move_down` |
| `date_picker` | previous day | `Left / h` | `move_left` |
| `date_picker` | next day | `Right / l` | `move_right` |
| `date_picker` | previous month | `PgUp` | `previous_month` |
| `date_picker` | next month | `PgDn` | `next_month` |
| `date_picker` | previous year | `[` | `previous_year` |
| `date_picker` | next year | `]` | `next_year` |
| `date_picker` | submit | `Enter` | `submit` |
| `date_picker` | clear | `Delete / c / Shift+C` | `reset` |
| `date_picker` | cancel | `Esc / q` | `cancel` |
## Modal management modes
| `filter_modal` | next | `Tab / Down` | `next` |
| `filter_modal` | previous | `Shift+Tab / Up` | `previous` |
| `filter_modal` | reset | `r / Shift+R` | `reset` |
| `filter_modal` | submit | `Enter` | `submit` |
| `filter_modal` | cancel | `Esc` | `cancel` |
| `filter_modal` | open date picker | `F2` | `open_picker` |
| `settings` | previous | `Up / k` | `move_up` |
| `settings` | next | `Down / j` | `move_down` |
| `settings` | next board | `Tab` | `next` |
| `settings` | previous board | `Shift+Tab` | `previous` |
| `settings` | toggle | `Space / Enter` | `toggle` |
| `settings` | add column | `a` | `add_column` |
| `settings` | new board | `n` | `new_board` |
| `settings` | delete board | `x / Shift+X` | `delete` |
| `settings` | close | `q / Shift+Q / Esc` | `close` |
| `planning_management` | previous | `Up / k` | `move_up` |
| `planning_management` | next | `Down / j` | `move_down` |
| `planning_management` | switch segment | `Tab` | `next` |
| `planning_management` | new | `n` | `new_planning_item` |
| `planning_management` | edit | `e` | `edit_planning_item` |
| `planning_management` | delete | `x / Shift+X` | `delete_planning_item` |
| `planning_management` | close | `q / Shift+Q / Esc` | `close` |
| `edit_warning` | re-edit | `r / Shift+R` | `reedit` |
| `edit_warning` | ignore | `i / Shift+I / Enter / Esc` | `ignore` |
`filter`, `move_into_done`, `comment`, `asset`, `link_prompt` and `help_search` are
**free-text** modes: they read
arbitrary text into a buffer, including a filesystem path. `cancel` is bound to `Esc`
alone in those six, and not to `q`, so that every printable character can be typed.
A `q` binding there does not merely fail to type — it resolves to the cancel action's
canonical event, which leaves the mode, so everything typed afterwards is applied as
a command in the mode underneath. `q` still closes `help`, `context_menu`,
`settings`, `date_picker`, and the yes/no `blocked_move` confirmation, none of which
accept text. Override the table in `tix.toml` if you want a different trade.