Этот документ нужен как быстрый вход в проект при следующем запуске: что уже реализовано, как модули связаны между собой и куда смотреть за деталями.
mtrm собран как workspace из независимых Rust-библиотек и одного исполняемого пакета.
Поток работы сверху вниз такой:
appзапускает приложение и главный цикл.inputпреобразует нажатия клавиш в команды приложения или байты для PTY.tabsкоординирует вкладки, раскладки и живые процессы.processуправляет оболочками в псевдотерминалах.uiрисует текущий кадр интерфейса.- слой терминального экрана преобразует байты PTY в экранное состояние панели.
keymapзагружает символьные привязки буквенных горячих клавиш.stateиsessionсохраняют и восстанавливают состояние.configопределяет файловую структуру~/.mtrm.coreзадает общие типы и команды.
Нижний слой:
coreconfiglayoutkeymapclipboardprocessterminal_screeninput
Средний слой:
sessionstatetabsui- терминальный экран панели
Верхний слой:
app
coreни от чего внутри workspace не зависит.configни от чего внутри workspace не зависит.layoutзависит отcore.clipboardне зависит от других модулей workspace.keymapзависит отconfig.processне зависит от других модулей workspace.terminal_screenне зависит от других модулей workspace.inputзависит отcore.sessionзависит отcoreиlayout.stateзависит отconfigиsession.tabsзависит отcore,layout,process,session.uiзависит отcoreиlayout.appзависит от всех прикладных модулей, но сам не должен дублировать их внутреннюю логику.
core: общие идентификаторы, команды приложения и базовые перечисления.config: вычисление и создание~/.mtrmи~/.mtrm/state.yaml.layout: нормализованное n-арное дерево разбиений окон, прямоугольники, фокус, resize pane и сериализуемый снимок раскладки.clipboard: системный буфер обмена и тестовая реализация в памяти.keymap: встроенныйkeymap.toml, автоматическое создание~/.mtrm/keymap.toml, загрузка и валидация символьных привязок клавиш.process: запуск оболочки в PTY, запись, чтение,SIGINT,cwd,resize, завершение.terminal_screen: применение байтов terminal output к экранному состоянию одной панели и управление scrollback на уровне экрана.input: чистое отображениеKeyEvent -> InputActionпо уже загруженномуKeymap.session: чистые сериализуемые структуры снимка состояния и их проверка.state: чтение и атомарная запись снимка состояния на диск в форматеYAML, с legacy fallback чтения изTOMLи приемом старого YAML0.0.1.tabs: живой набор вкладок и окон, связь раскладки с процессами, экранным состоянием панелей, прокруткой истории активной панели и построение снимка.ui: отрисовка полосы вкладок и окон по готовомуFrameView, содержащему уже подготовленные экранные линии и курсор панели.app: главный цикл, маршрутизация событий, сохранение состояния, сборкаFrameView, запуск интерфейса.appбольше не хранит вывод панелей сам и получает представление панели изtabs. При стандартном запускеappподнимает shell по умолчанию в интерактивном режиме. Для Meta-комбинацийappтакже умеет синтезироватьAlt+<буква>из короткойEsc-prefixed последовательности, если внешний терминал присылает именно такой ввод.
- Состояние сохраняется автоматически в
~/.mtrm/state.yaml. - При отсутствии
state.yamlсостояние может быть прочитано из legacy~/.mtrm/state.toml. - Текущая версия формата
state.yaml—0.1.0. layoutвнутриstate.yamlтеперь хранится в n-арной форме черезchildren, а старая бинарная формаfirst/secondчитается как legacy input.- Положение прокрутки истории панели не входит в сохраняемое состояние.
- При восстановлении создаются новые процессы оболочки, а не оживляются старые.
Ctrl+Cиспользуется для копирования, а не для стандартного прерывания.- Прерывание активного процесса идет через
Alt+X. - Изменение размеров pane идет через
Alt+Shift+Arrowи работает шагом в одну ячейку. - При потере фокуса внешнего окна активная вкладка и рамка активной панели подсвечиваются красным.
- Закрытие последнего окна во вкладке запрещено.
- Закрытие последней вкладки запрещено.
- Все библиотеки из workspace реализованы.
- Для каждого модуля есть тесты.
- Для каждого модуля есть свой
README. - Для
appесть интеграционные тесты на восстановление, сохранение, ввод и прерывание.
- Описание исполняемого пакета и жизненного цикла: app/README.md
- Пользовательский обзор проекта: README.md
- Порядок разработки модулей: IMPLEMENTATION_ORDER.md
- Исходная личная идея: idea.preliminary.md
- Инженерное описание: idea.engineering.md
- Заметки по совместимости: PORTABILITY_NOTES.md
- Решение по терминальной эмуляции: TERMINAL_EMULATION.md
- crates/core/README.md
- crates/config/README.md
- crates/layout/README.md
- crates/keymap/README.md
- crates/clipboard/README.md
- crates/process/README.md
- crates/terminal_screen/README.md
- crates/input/README.md
- crates/session/README.md
- crates/state/README.md
- crates/tabs/README.md
- crates/ui/README.md
- app/README.md
- README.md
- Если нужно быстро понять проект, сначала читать этот файл, потом
app/README.md, потомREADMEнужного модуля. - Если нужно менять поведение клавиш, смотреть
crates/inputиapp. - Если нужно менять сохранение и восстановление, смотреть
crates/session,crates/state,crates/tabs. - Если нужно менять поведение окон и фокуса, смотреть
crates/layoutиcrates/tabs. - Если нужно менять UI, смотреть
crates/ui.