12. Хоткеи и keymap
AstraCode позволяет переназначать поддерживаемые действия TUI через
[tui.keymap] в config.toml или интерактивную команду /keymap. Контракт
keymap намеренно охватывает не все клавиши приложения: если действия нет в
списке ниже, добавить его произвольным именем нельзя.
1. Контексты и действия
| Контекст | Поддерживаемые action keys |
|---|---|
global |
open_transcript, open_external_editor, copy, clear_terminal, open_last_subagent, submit, queue, toggle_shortcuts |
chat |
decrease_reasoning_effort, increase_reasoning_effort, edit_queued_message |
composer |
submit, queue, toggle_shortcuts, history_search_previous, history_search_next |
editor |
insert_newline, move_left, move_right, move_up, move_down, move_word_left, move_word_right, move_line_start, move_line_end, delete_backward, delete_forward, delete_backward_word, delete_forward_word, kill_line_start, kill_line_end, yank |
pager |
scroll_up, scroll_down, page_up, page_down, half_page_up, half_page_down, jump_top, jump_bottom, close, close_transcript |
list |
move_up, move_down, accept, cancel |
approval |
open_fullscreen, open_thread, approve, approve_for_session, approve_for_prefix, deny, decline, cancel |
Например, global.quit, global.help, composer.newline и pager.quit не
существуют. Для переноса строки используется editor.insert_newline, для
закрытия pager — pager.close.
2. Основные default bindings
| Контекст/action | Клавиши по умолчанию |
|---|---|
global.open_transcript |
ctrl-t |
global.open_external_editor |
ctrl-g |
global.copy |
ctrl-o |
global.clear_terminal |
ctrl-l |
global.open_last_subagent |
f2, alt-a |
chat.decrease_reasoning_effort |
alt-, |
chat.increase_reasoning_effort |
alt-. |
chat.edit_queued_message |
alt-up, shift-left |
composer.submit |
enter |
composer.queue |
tab |
composer.toggle_shortcuts |
?, shift-? |
composer.history_search_previous |
ctrl-r |
composer.history_search_next |
ctrl-s |
editor.insert_newline |
ctrl-j, ctrl-m, enter, shift-enter |
pager.scroll_up / scroll_down |
up, k / down, j |
pager.page_up / page_down |
page-up, shift-space, ctrl-b / page-down, space, ctrl-f |
pager.half_page_up / half_page_down |
ctrl-u / ctrl-d |
pager.jump_top / jump_bottom |
home / end |
pager.close |
q, ctrl-c |
list.move_up / move_down |
up, ctrl-p, k / down, ctrl-n, j |
list.accept / cancel |
enter / esc |
approval.open_fullscreen / open_thread |
ctrl-a, ctrl-shift-a / o |
approval.approve / approve_for_session / approve_for_prefix |
y / a / p |
approval.deny / decline / cancel |
d / esc, n / c |
Editor также использует привычные terminal/emacs bindings: стрелки и
ctrl-b/f/p/n для движения, home/ctrl-a, end/ctrl-e,
backspace/ctrl-h, delete/ctrl-d, ctrl-w, ctrl-u, ctrl-k и
ctrl-y. Полный актуальный набор задаёт RuntimeKeymap::built_in_defaults.
3. Синтаксис config.toml
[tui.keymap] global.open_transcript = "ctrl-t" global.copy = ["ctrl-o", "alt-c"] composer.submit = "enter" editor.insert_newline = ["shift-enter", "ctrl-j"] pager.close = ["q", "ctrl-c"] list.cancel = "esc"
Значение — одна клавиша или массив альтернатив. Пустой массив явно отвязывает action и не даёт ему унаследовать default binding.
Поддерживается ровно одно terminal key event на binding. Строки
"ctrl-x ctrl-s", "esc esc" и "ctrl-c ctrl-c" не являются chords и
отклоняются. Допустимые модификаторы: ctrl, alt, shift; cmd и super
не поддерживаются. Модификаторы нормализуются в порядке
ctrl-alt-shift-<key>.
Канонические имена специальных клавиш: enter, tab, esc, space,
backspace, delete, insert, home, end, page-up, page-down,
up, down, left, right, f1…f24. Парсер также принимает некоторые
алиасы, например escape и pageup, и сохраняет каноническую форму.
4. Команда /keymap
/keymap не принимает inline-аргументы. Она открывает picker, где можно:
- выбрать context/action;
- установить или заменить primary binding;
- добавить альтернативный binding;
- отвязать action;
- восстановить default binding для выбранного action.
Принятая правка сохраняется в config.toml и сразу применяется к текущему TUI.
Команды /keymap reset нет. Для полного сброса удалите секцию [tui.keymap]
при остановленном AstraCode; для одного action используйте пункт восстановления
default в picker или удалите соответствующий override.
5. Конфликты и ограничения
При загрузке и сохранении AstraCode отклоняет неизвестные contexts/actions, некорректные key specs, дубли внутри одновременно активных scopes и bindings, которые перекрываются более ранним app-level handler. Некоторые аппаратные и terminal shortcuts могут быть перехвачены до TUI, даже если строка прошла валидацию.
Хардкодированные последовательности отдельных экранов не становятся настраиваемыми chords только потому, что похожая комбинация видна в интерфейсе.
6. Файлы кода
- Config schema и нормализация:
astracode-rs/config/src/tui_keymap.rs - Runtime defaults и проверка конфликтов:
astracode-rs/tui/src/keymap.rs - Picker и редактирование:
astracode-rs/tui/src/keymap_setup.rs - Интеграция
/keymap:astracode-rs/tui/src/chatwidget/keymap_picker.rs