From ed3bd4249be17be78b4fa67da7c9663d9160c515 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Thu, 8 Oct 2026 19:56:11 +0200 Subject: [PATCH] docs: describe the six-plugin layout after the split README: replace the single-deft.so install instructions with the per-feature plugin table (palette, switch, radial, acme, sam, plumb), a glob install loop, and a note that the plugins cooperate by resolving each other's actions by object name; refresh the layout tree (plugin/ gone, switch/ added, palette/ and radial/ now hold their plugins) and mark milestones 5 and 6 DONE. PLAN.md: add an architecture note at the top flagging the split and that the design prose below refers to the former monolith as historical. --- README.md | 87 ++++++++++++++++++++++++++++++++++++++-------------- docs/PLAN.md | 13 ++++++++ 2 files changed, 77 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 7b78169..c996917 100644 --- a/README.md +++ b/README.md @@ -51,23 +51,41 @@ QT_QPA_PLATFORM=offscreen ./build/bin/test_fuzzyranker # run the matcher tests ctest --test-dir build # or via ctest ``` -## Install the plugin into Kate +## Install the plugins into Kate -The plugin builds to `build/bin/kf6/ktexteditor/deft.so`. Drop it where -Kate scans for KTextEditor plugins (a user path on `QT_PLUGIN_PATH`): +Deft is **one `.so` per feature**, not a monolith. The build produces six +KTextEditor plugins under `build/bin/kf6/ktexteditor/`: + +| Plugin file | Display name | Feature | +|------------------|-----------------------|---------| +| `deft_palette.so`| `[deft:util] palette` | Command palette (`Alt+X` / M-x) over every window action + the `:`-verbs + the switchers, frecency-ranked | +| `deft_switch.so` | `[deft:util] switch` | Project **Go to File** (`Alt+P`) and **Go to Symbol** (`Alt+G`) | +| `deft_radial.so` | `[deft:util] radial` | Radial caret menu (`Alt+R` / right-mouse) | +| `deft_acme.so` | `[deft:nineify] acme` | Acme editing gestures (line keys, pair selection, mouse chords) | +| `deft_sam.so` | `[deft:nineify] sam` | `sam`-style structural regular expressions | +| `deft_plumb.so` | `[deft:nineify] plumb`| Plan 9 plumber (open under cursor) | + +Drop whichever features you want where Kate scans for KTextEditor plugins (a +user path on `QT_PLUGIN_PATH`): ```sh -install -D build/bin/kf6/ktexteditor/deft.so \ - ~/.local/lib/x86_64-linux-gnu/qt6/plugins/kf6/ktexteditor/deft.so +for so in build/bin/kf6/ktexteditor/deft_*.so; do + install -D "$so" ~/.local/lib/x86_64-linux-gnu/qt6/plugins/kf6/ktexteditor/"$(basename "$so")" +done ``` -Then in Kate: Settings → Configure Kate → Plugins → enable -**Deft**. Press **Alt+X** (M-x) to open the command palette; -type to filter, Enter or click to run. Open the editing **radial menu** either -by pressing **Alt+R** (opens at the caret) or by **pressing the right mouse -button** in the editor (opens at the pointer; the normal context menu is -suppressed while this is enabled). Move toward a slice and release — or click; -a branch slice (marked ▸) opens a submenu, the centre hub goes back/cancels. +Then in Kate: Settings → Configure Kate → Plugins → enable each **`[deft:…]`** +plugin you installed. Press **Alt+X** (M-x) to open the command palette; type to +filter, Enter or click to run. Open the editing **radial menu** either by +pressing **Alt+R** (opens at the caret) or by **pressing the right mouse button** +in the editor (opens at the pointer; the normal context menu is suppressed while +this is enabled). Move toward a slice and release — or click; a branch slice +(marked ▸) opens a submenu, the centre hub goes back/cancels. + +The plugins cooperate but do not depend on one another: palette's "Go to +File/Symbol" entries and radial's launcher slices resolve `switch`'s actions by +object name at runtime, so each `.so` works on its own and simply gains those +entry points when its sibling is also enabled. ## Status @@ -79,16 +97,26 @@ See [docs/PLAN.md](docs/PLAN.md) for the full roadmap. - **Milestone 2 — custom palette widget: DONE.** `PaletteModel` + `PaletteWidget` (frameless popup, live filtering, highlighted matches, keyboard + mouse activation). 10 model unit tests, all green. -- Milestone 3 — KTextEditor plugin + M-x: **DONE.** Loadable `deft.so`; - `Alt+X` opens the palette over every action in the window's GUI clients. +- Milestone 3 — KTextEditor plugin + M-x: **DONE.** `Alt+X` opens the palette + over every action in the window's GUI clients. - Milestone 4 — radial caret menu: **DONE (first increment).** Multi-level radial menu at the caret (`Alt+R`) or at the pointer via a **right-mouse gesture**, mouse-driven selection, config tree with per-radial key + mouse triggers. Free-form stroke gestures next. -- Milestone 5 — command vocabulary + project-as-directory + switchers: next. +- Milestone 5 — command vocabulary + project-as-directory + switchers: **DONE.** + `:`-verb pack, project file (`Alt+P`) and symbol (`Alt+G`) switchers over an + async, cached index. +- Milestone 6 — one `.so` per feature: **DONE.** The monolithic plugin is split + into six independent KTextEditor plugins (`palette`, `switch`, `radial`, + `acme`, `sam`, `plumb`), tagged `[deft:util]` / `[deft:nineify]`, cooperating + by resolving each other's actions by object name at runtime. ## Layout +Shared building blocks are static libraries (`fuzzy`, `palette`, `project`, +`commands`, …); each feature is a self-contained KTextEditor plugin that links +the libraries it needs. + ``` CMakeLists.txt top-level KF6/Qt6/ECM project src/ @@ -98,20 +126,33 @@ src/ palette/ palettemodel.{h,cpp} ranked, filterable list model (headless) palettewidget.{h,cpp} frameless command-palette popup - test_palettemodel.cpp QTest suite + frecencystore.{h,cpp} persisted frecency ranking + paletteplugin.{h,cpp} [deft:util] palette — M-x, :-verbs, switcher doors + paletteplugin.json plugin metadata + test_*.cpp QTest suites + switch/ + switchplugin.{h,cpp} [deft:util] switch — Go to File (Alt+P) / Symbol (Alt+G) + switchplugin.json plugin metadata radial/ radialmodel.{h,cpp} radial tree + hit-test geometry (headless) radialmenu.{h,cpp} frameless multi-level radial widget radialconfig.{h,cpp} JSON → radial tree + built-in default - test_radialmodel.cpp QTest suite - test_radialconfig.cpp QTest suite + radialplugin.{h,cpp} [deft:util] radial — caret menu plugin + radialplugin.json plugin metadata + test_*.cpp QTest suites commands/ texttransforms.{h,cpp} pure text transforms (headless) - olliecommands.{h,cpp} ":"-verb KTextEditor::Command pack - test_texttransforms.cpp QTest suite - plugin/ - ollieplugin.{h,cpp} KTextEditor::Plugin + M-x + radial wiring - ollieplugin.json plugin metadata + olliecommands.{h,cpp} ":"-verb KTextEditor::Command pack (used by palette) + test_*.cpp QTest suites + project/ + projectindex / symbolindex / projectindexer / kateprojectbridge + async, cached file & symbol index (used by switch) + acme/ + acmeplugin.{h,cpp,json} [deft:nineify] acme — editing gestures + sam/ + sam* + samplugin.{h,cpp,json} [deft:nineify] sam — structural regexps + plumb/ + plumb* + plumbplugin [deft:nineify] plumb — Plan 9 plumber docs/ PLAN.md goal, constraints, roadmap ``` diff --git a/docs/PLAN.md b/docs/PLAN.md index 755d767..ade20aa 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -1,5 +1,18 @@ # Plan — kate-custom +> **Architecture note (current):** The suite has been split into **one `.so` per +> feature** — `deft_palette`, `deft_switch`, `deft_radial`, `deft_acme`, +> `deft_sam`, `deft_plumb` — each a standalone `KTextEditor::Plugin` tagged +> `[deft:util]` / `[deft:nineify]`. See the README's plugin table for the +> current layout. The design prose below predates that split and still refers to +> the former monolith (`OlliePlugin` / `OllieView`, a single `olliepalette.so`, +> and the `olliepalette/` config dir); read those names as historical. In the +> split suite the palette plugin owns the M-x launcher and the `:`-verbs, the +> switch plugin owns the file/symbol switchers and the project index, each plugin +> keeps its own `FrecencyStore` file under `deft/`, and the doors cooperate by +> resolving each other's actions by object name at runtime rather than by direct +> calls or link dependencies. + ## Goal Build a suite of Kate plugins that make the editor usable without menus, tuned