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

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

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, f1f24. Парсер также принимает некоторые алиасы, например escape и pageup, и сохраняет каноническую форму.

4. Команда /keymap

/keymap не принимает inline-аргументы. Она открывает picker, где можно:

  1. выбрать context/action;
  2. установить или заменить primary binding;
  3. добавить альтернативный binding;
  4. отвязать action;
  5. восстановить 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