12. Горячие клавиши и keymap
AstraCode позволяет переназначить почти все клавиши TUI через секцию [tui.keymap] в config.toml. Управление — через команду /keymap (интерактивно) или прямую правку конфига.
1. Контексты привязок
Каждая привязка живёт в одном из контекстов (поля RuntimeKeymap в keymap.rs):
| Контекст | Где применим |
|---|---|
global |
Действия уровня приложения (transcript, внешний редактор, копирование, очистка терминала) |
chat |
Основной экран чата (reasoning effort, очередь сообщений) |
composer |
Поле ввода (submit, queue, история, подсказки) |
editor |
Текстовый редактор composer'а (перемещение/удаление по тексту) |
pager |
Pager-оверлеи (transcript, статические help-вью) |
list |
Меню выбора из списка (popup, picker) |
approval |
Диалог approval/permission |
Разрешение привязки идёт по приоритету: контекст → (для части действий) global → встроенные дефолты.
2. Дефолтные привязки
Ниже — встроенные дефолты из keymap.rs (built_in_defaults).
global
| Действие | Клавиша(и) |
|---|---|
open_transcript |
ctrl-t |
open_external_editor |
ctrl-g |
copy |
ctrl-o |
clear_terminal |
ctrl-l |
chat
| Действие | Клавиша(и) |
|---|---|
decrease_reasoning_effort |
alt-, |
increase_reasoning_effort |
alt-. |
edit_queued_message |
alt-up, shift-left |
composer
| Действие | Клавиша(и) |
|---|---|
submit |
enter |
queue |
tab |
toggle_shortcuts |
?, shift-? |
history_search_previous |
ctrl-r |
history_search_next |
ctrl-s |
editor
| Действие | Клавиша(и) |
|---|---|
insert_newline |
ctrl-j, ctrl-m, enter, shift-enter |
move_left / move_right |
left/ctrl-b, right/ctrl-f |
move_up / move_down |
up/ctrl-p, down/ctrl-n |
move_word_left / move_word_right |
alt-b/alt-left/ctrl-left, alt-f/alt-right/ctrl-right |
move_line_start / move_line_end |
home/ctrl-a, end/ctrl-e |
delete_backward / delete_forward |
backspace/ctrl-h, delete/ctrl-d |
delete_backward_word / delete_forward_word |
alt-backspace/ctrl-w, alt-delete/alt-d |
kill_line_start / kill_line_end |
ctrl-u, ctrl-k |
yank |
ctrl-y |
pager
| Действие | Клавиша(и) |
|---|---|
scroll_up / scroll_down |
up/k, down/j |
page_up / page_down |
page-up/shift-space/ctrl-b, page-down/space/ctrl-f |
half_page_up / half_page_down |
ctrl-u, ctrl-d |
jump_top / jump_bottom |
home, end |
close |
q, ctrl-c |
close_transcript |
ctrl-t |
list
| Действие | Клавиша(и) |
|---|---|
move_up / move_down |
up/ctrl-p/k, down/ctrl-n/j |
accept |
enter |
cancel |
esc |
approval
| Действие | Клавиша(и) |
|---|---|
open_fullscreen |
ctrl-a, ctrl-shift-a |
open_thread |
o |
approve |
y |
approve_for_session |
a |
approve_for_prefix |
p |
deny |
d |
decline |
esc, n |
cancel |
c |
3. Синтаксис в config.toml
[tui.keymap] # global (часть действий поддерживает global-fallback для контекстов): global.copy = "ctrl-o" global.open_transcript = "ctrl-t" # Контекстные: composer.submit = "enter" composer.queue = "tab" editor.insert_newline = "shift-enter" pager.close = "q"
Значение действия — строка или список строк (несколько привязок), например:
composer.submit = ["ctrl-enter", "alt-enter"]
Пустой список явно снимает привязку с действия (для действий с global-fallback это также отключает fallback).
Формат клавиши:
- Простые: a, 1, space, enter, tab, esc, backspace, delete, home, end, page-up, page-down, up, down, left, right, f1..f12.
- Модификаторы: ctrl-, alt-, shift-. Комбинируются: ctrl-shift-a. Модификаторы cmd-/meta/super не поддерживаются.
- Заглавная буква нормализуется в shift-<буква> (например, A → shift-a).
4. Зарезервированные (fixed) клавиши
Некоторые клавиши закреплены за фиксированными действиями и не переназначаются через keymap; назначение на них пользовательской привязки приводит к ошибке конфликта (MAIN_RESERVED_BINDINGS в keymap.rs):
| Клавиша | Действие |
|---|---|
ctrl-c |
Прервать / выйти |
ctrl-d |
Выйти |
ctrl-v, ctrl-alt-v |
Вставить изображение |
shift-tab |
Переключить режим совместной работы |
esc |
Возврат/backtrack |
alt-left / alt-right |
Предыдущий / следующий агент |
/ |
Slash-команды |
! |
Shell-команда |
@ |
Пути к файлам |
$ |
Меню выбора упоминаний (скиллы, приложения, плагины) |
Символы @ $ ! / — это fixed reserved «триггеры» composer'а, а не переназначаемые composer-биндинги.
В pager дополнительно зарезервированы клавиши transcript-backtrack (TRANSCRIPT_BACKTRACK_RESERVED_BINDINGS): esc, left, right, enter.
5. Команда /keymap
В TUI:
/keymap
Откроет интерактивное меню выбора:
1. Выбрать действие (вкладки: Common / All / Custom / Unbound / по контекстам).
2. Выбрать операцию (задать клавишу, заменить, добавить альтернативу, удалить свою привязку).
3. Нажать новую комбинацию клавиш.
4. AstraCode проверит на конфликт; при конфликте покажет локализованную ошибку и предложит выбрать другую клавишу.
5. Сохранит корневое переопределение tui.keymap.* в config.toml.
Чтобы вернуть привязку по умолчанию, в действии выберите «Удалить свою привязку» (Remove custom binding) — отдельной команды /keymap reset нет.
6. Сбросить к дефолтам
Удалить секцию [tui.keymap] из config.toml или конкретные строки. Через /keymap — пункт «Удалить свою привязку» для нужного действия (удаляет корневое переопределение, возвращая дефолт).
7. Конфликты привязок
При разрешении keymap AstraCode проверяет уникальность клавиш внутри совместно вычисляемых наборов, отсутствие перекрытия (shadowing) между внешними и внутренними обработчиками и отсутствие коллизий с зарезервированными клавишами. Конфликт блокирует применение.
Формат сообщения (keymap.rs; локализация — keymap_setup.rs::localize_keymap_conflict_error):
EN:
Ambiguous `tui.keymap.<ctx>` bindings: `X` and `Y` use the same key. Set unique keys in `~/.astracode/config.toml` and retry. See the AstraCode keymap documentation for supported actions and examples.
RU:
Конфликт привязок `tui.keymap.<ctx>`: `X` и `Y` используют одну и ту же клавишу. Задайте уникальные клавиши в `~/.astracode/config.toml` и повторите. См. документацию по сочетаниям клавиш AstraCode для поддерживаемых действий и примеров.
Варианты сообщения: коллизия (use the same key / используют одну и ту же клавишу), перекрытие (shadows … with the same key / перекрывает … той же клавишей) и зарезервированная клавиша (uses a key reserved by / использует клавишу, зарезервированную за).
8. Файлы кода
- Тип
RuntimeKeymap, дефолты и валидация конфликтов:astracode-rs/tui/src/keymap.rs - Загрузка/редактирование из config, локализация ошибок (
localize_keymap_conflict_error):astracode-rs/tui/src/keymap_setup.rs - Каталог действий и контекстов (
KEYMAP_ACTIONS,binding_slot):astracode-rs/tui/src/keymap_setup/actions.rs - Команда
/keymap:astracode-rs/tui/src/chatwidget/slash_dispatch.rs(веткаSlashCommand::Keymap)