74 lines
2.6 KiB
Markdown
74 lines
2.6 KiB
Markdown
# kate-custom
|
|
|
|
A suite of Kate plugins for people who despise menus. The aim is a text editor
|
|
that is driven by the mouse at the cursor and by plain-letter keyboard input —
|
|
never by hunting through nested menubars or memorizing complex chords.
|
|
|
|
## Design constraints
|
|
|
|
These are hard constraints that shape every decision:
|
|
|
|
- **Mouse-heavy.** The fastest input is the mouse, used *locally* at the caret
|
|
(radial / floating surfaces), not a trek to the menubar.
|
|
- **One-handed typing.** Keyboard input must work comfortably with one hand.
|
|
- **No complex chords.** Single modifier at most (`Ctrl`+letter). No leader-key
|
|
chord trees, no multi-cursor keybinds.
|
|
- **Compact keyboard.** F-keys and nav clusters live on a layer toggle, so they
|
|
carry extra cognitive cost and are avoided as primary triggers.
|
|
- **Emacs/Sublime fluency.** `M-x` (`Alt+x`) is comfortable and welcome as a
|
|
primary keyboard entry point, as is a Sublime-style type-to-filter palette.
|
|
|
|
### Unifying principle
|
|
|
|
> **One action registry. Three doors onto it:**
|
|
> **`M-x` (keyboard), a radial caret menu (mouse), and the `:` command line (optional).**
|
|
> **No action requires an F-key or a chord.**
|
|
|
|
## Why not just use Kate's command bar?
|
|
|
|
Kate's `KCommandBar` is a sealed widget: it accepts a list of actions via
|
|
`setActions()` and exposes **no hook** to customize its matcher. Its matcher,
|
|
`KFuzzyMatcher`, is single-needle, strictly in-order subsequence, with **no typo
|
|
tolerance** — by KDE's own documentation, `"gti"` will not match `"git"`. There
|
|
is no "orderless" (space-separated tokens in any order) and no company-style
|
|
live completion.
|
|
|
|
So the project replaces the palette rather than extending it, built on a custom
|
|
matcher (`FuzzyRanker`).
|
|
|
|
## Environment
|
|
|
|
- Kate 25.12.3, KDE Frameworks 6, Qt 6
|
|
- C++20, CMake, extra-cmake-modules
|
|
- C++ is the only first-class plugin path on this install (no Python/Pâté binding present)
|
|
|
|
## Build
|
|
|
|
```sh
|
|
cmake -B build -S .
|
|
cmake --build build
|
|
QT_QPA_PLATFORM=offscreen ./build/bin/test_fuzzyranker # run the matcher tests
|
|
ctest --test-dir build # or via ctest
|
|
```
|
|
|
|
## Status
|
|
|
|
See [docs/PLAN.md](docs/PLAN.md) for the full roadmap.
|
|
|
|
- **Milestone 1 — FuzzyRanker (keystone): DONE.** Orderless, layered scoring
|
|
(exact / substring / word-initials / subsequence / bounded typo), merged
|
|
highlight ranges. 14 unit tests, all green.
|
|
- Milestone 2 — custom palette widget: next.
|
|
|
|
## Layout
|
|
|
|
```
|
|
CMakeLists.txt top-level KF6/Qt6/ECM project
|
|
src/
|
|
fuzzy/
|
|
fuzzyranker.{h,cpp} orderless + layered fuzzy matcher
|
|
test_fuzzyranker.cpp QTest suite
|
|
docs/
|
|
PLAN.md goal, constraints, roadmap
|
|
```
|