gutter and keys

This commit is contained in:
2026-10-31 11:20:28 +03:00
parent afd7600150
commit 16e88117d5
14 changed files with 1844 additions and 558 deletions
+24 -12
View File
@@ -11,7 +11,7 @@
| `src/main.rs` | Точка входа, окно, аргументы командной строки |
| `src/constants.rs` | Константы окна, CLI и каталог сценариев |
| `src/editor.rs` | Доменная модель: документы, вкладки, языки |
| `src/api.rs` | `AppApi` / `PanelApi` / `TreeApi` / `ToolbarApi` — единственная поверхность управления |
| `src/api.rs` | `AppApi` / `EditorApi` / `PanelApi` / `TreeApi` / `ToolbarApi` — единственная поверхность управления |
| `src/script.rs` | Lua-движок, `app`, `include`, `require` |
| `src/keymap.rs` | `KeyBinding`, `KeyMap`, встроенные команды и Lua-обработчики |
| `src/app.rs` | GPUI-вид, отрисовка, события, автодополнение |
@@ -19,6 +19,7 @@
| `src/panel.rs` | `PanelState` и блоки панелей |
| `src/toolbar.rs` | Состояние верхней панели: лейблы и кнопки |
| `src/tree.rs` | Абстрактное дерево для панелей |
| `src/gutter.rs` | Иконки на полях слева от редактора |
| `src/icons.rs` | Каталог иконок Lucide |
| `src/lsp.rs` | Менеджер LSP-серверов, JSON-RPC, файловый вотчер |
| `DOCS.md`, `init.lua` | Пользовательская документация и пример конфигурации |
@@ -28,23 +29,29 @@
### 1. `AppApi` — центр приложения
- Документы, вкладки, панели, дерево, окно, подсветка, LSP и привязки клавиш
меняются только через `AppApi` (или `PanelApi` / `TreeApi`).
- Состояние живёт в общих `Rc<RefCell<_>>` / `Arc`, чтобы UI, `AppApi` и Lua
меняются только через `AppApi`, `EditorApi` или `PanelApi` / `TreeApi` /
`ToolbarApi`.
- Всё, что относится к редактору (вкладки, текст, gutter, сохранение, LSP и
привязки редактора), живёт в `app.editor`; окно, панели и глобальные
привязки — в `app`.
- Состояние живёт в общих `Rc<RefCell<_>>` / `Arc`, чтобы UI, API и Lua
видели одни и те же объекты. Второй копии состояния быть не должно.
- Команды окна складываются в очередь и применяются в начале кадра
(`apply_window_commands`); UI и Lua не вызывают `Window` напрямую.
- Если действие пользователя меняет состояние, оно выражается методом
`AppApi`, а не логикой внутри обработчика UI. Отрисовка состояние только
API, а не логикой внутри обработчика UI. Отрисовка состояние только
читает.
- Исключение — системные кнопки окна внутри `gpui-kit::TitleBar`: их
поведение принадлежит библиотеке.
### 2. Lua повторяет возможности API
- Публичные методы `impl AppApi` с `#[mlua::userdata_impl]` доступны как
`app:method(...)`. Добавляя возможность, сразу добавляйте и Lua-метод.
- Публичные методы `impl AppApi` / `impl EditorApi` с `#[mlua::userdata_impl]`
доступны как `app:method(...)` / `app.editor:method(...)`. Добавляя
возможность, сразу добавляйте и Lua-метод.
- Имена — `snake_case`; вкладки и индексы нумеруются с нуля; панели —
`app.left_panel`, `app.right_panel`, `app.bottom_panel`.
`app.left_panel`, `app.right_panel`, `app.bottom_panel`; блоки панелей
получают свои объекты (`tree`).
- Для методов, которые не должны попадать в Lua, используется `#[lua(skip)]`.
Для generic-методов добавляется тонкая не-generic Lua-обёртка.
- `DOCS.md` и комментарии в `init.lua` обновляются в том же изменении, что и
@@ -55,12 +62,17 @@
- Встроенные привязки (`Ctrl/Cmd+S`, `Ctrl/Cmd+Space`, навигация по списку
автодополнения) регистрируются в `KeyMap` и могут быть заменены или удалены
из Lua через `app:map_key` / `app:map_completion_key`.
- `KeyMap` имеет два слоя: глобальный и `completion`. Обработчик может быть
Lua-функцией или встроенной командой.
из Lua через `app:map_key` / `app.editor:map_key` /
`app:map_completion_key`.
- У приложения, редактора и каждого блока панели своя `KeyMap` и свой текущий
режим (один символ; `-` — режим по умолчанию). Привязка хранит строку
режимов, в которых она действует: `""` — все, `"-iv"` — по умолчанию и
`i`/`v`.
- Глобальные привязки обрабатываются всегда; затем, если фокус в редакторе,
дополнительно привязки редактора, а если фокус на блоке панели — привязки
этого блока. Обработчик может быть Lua-функцией или встроенной командой.
- Перехватчик клавиш выполняется раньше действий редактора и используется
только для слоя автодополнения; глобальные привязки обрабатываются на корне
вида. Этот порядок менять нельзя.
только для слоя автодополнения. Этот порядок менять нельзя.
- Текстовый ввод редактора — не привязка клавиши.
### 4. Модель отделена от GPUI