0.4.11
12 · Техническая документация

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

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"

Значение действия — строка или список строк (несколько привязок), например:

toml
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-<буква> (например, Ashift-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:

text
/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:

text
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:

text
Конфликт привязок `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)