Add project documentation adapted from gerbil-emacs
ober
fdf49193f788b3b5ecf7ab1e20474a8839a52d75
--- a/README.md +++ b/README.md @@ -188,3 +188,12 @@ The Gerbil form `(with-output-to-string "" thunk)` is not valid in Chez. | `GHERKIN` | `~/mine/gherkin/src` | gherkin library path | Override on the command line: `make SCHEME=/usr/local/bin/chez build` + +## Documentation + +| Document | Description | +|----------|-------------| +| [docs/jemacs-vs-emacs.md](docs/jemacs-vs-emacs.md) | Feature comparison with GNU Emacs (48 categories, 2168+ commands) | +| [docs/helm.md](docs/helm.md) | Helm narrowing framework — architecture, matching engine, sources | +| [docs/shell.md](docs/shell.md) | Shell integration plan — jsh POSIX shell embedding | +| [docs/repl-server.md](docs/repl-server.md) | TCP debug REPL server for live introspection | new file mode 100644 --- /dev/null +++ b/docs/helm.md @@ -0,0 +1,493 @@ +# Helm for Jemacs — Implementation Plan + +## Overview + +Port the core Emacs Helm experience to Jemacs: an incremental narrowing framework with multi-source composition, rich action system, and live preview. This replaces the current minibuffer Tab-cycling completion with a full candidate-list UI. + +## Current State — COMPLETE ✅ + +All planned features have been implemented. + +### What's implemented ✅ + +- **Core framework** (`helm.ss`): `helm-source`, `helm-session`, `helm-candidate` structs; multi-match engine; filtering + scoring; session management; action dispatch; match position highlighting; `*helm-current-pattern*` for volatile sources +- **Multi-match engine**: Space-separated AND tokens, `!` negation, `^` prefix matching, fuzzy mode per-source +- **TUI renderer** (`helm-tui.ss`): Candidate list in auto-resizing bottom rows (4–12), C-n/C-p/C-v/M-v navigation, RET/C-g/C-j, typing updates pattern, follow mode (C-c C-f), action menu (TAB), M-a mark-all, match character highlighting (yellow), styled source headers +- **Qt renderer** (`qt/helm-qt.ss`): Narrowing-based candidate panel, same navigation keys, echo-area integration +- **16 commands** registered in both TUI and Qt: helm-M-x, helm-mini, helm-buffers-list, helm-find-files, helm-occur, helm-imenu, helm-show-kill-ring, helm-bookmarks, helm-mark-ring, helm-register, helm-apropos, helm-grep, helm-man, helm-resume, helm-mode, toggle-helm-mode +- **14 built-in sources** (`helm-sources.ss`): commands, buffers, recent-files, buffer-not-found (create), files, occur, imenu, kill-ring, bookmarks, mark-ring, registers, apropos, grep, man +- **Follow mode**: Toggle with C-c C-f; auto-runs persistent action on C-n/C-p; per-source `follow?` flag; initialized from source's follow? field +- **Action menu**: TAB shows numbered action list from current source; pick by number or RET for default; C-g to cancel; executes on marked candidates if any +- **Candidate highlighting**: Matched characters shown in yellow (#xffcc00); brighter when selected; works for substring, prefix, and fuzzy matches +- **Auto-resize**: Helm window grows/shrinks between 4–12 rows based on candidate count + source headers +- **Source headers**: Styled separator lines with `─── Source Name ───` format, distinct background color +- **helm-grep**: Volatile source using `rg` (fallback `grep`); helm pattern becomes the search query (≥3 chars); results as `file:line:content` +- **helm-man**: Cached `man -k` results (up to 2000 entries); fuzzy filtering +- **helm-find-files (Qt)**: Full helm file browser using helm-source-files (no longer delegates to find-file) +- **Session resume**: `helm-resume` restores last session with pattern and candidates +- **Helm-mode toggle**: Rebinds M-x, C-x b, C-x C-b, M-y, C-x r b to helm equivalents +- **Functional tests**: 37 checks in TUI (`functional-test.ss`), 9 checks in Qt (`qt-functional-test.ss`) + +--- + +## Architecture + +### New Files + +| File | Purpose | Lines (est.) | +|------|---------|-------------| +| `helm.ss` | Core framework: sources, matching, actions, session state | ~600 | +| `helm-tui.ss` | TUI renderer: candidate list in terminal rows | ~400 | +| `qt/helm-qt.ss` | Qt renderer: QListWidget or custom painting in a panel | ~500 | +| `helm-sources.ss` | Built-in sources: buffers, recentf, commands, files, imenu, bookmarks, kill-ring, marks | ~800 | +| `helm-commands.ss` | TUI `cmd-helm-*` command functions | ~500 | +| `qt/helm-commands.ss` | Qt `cmd-helm-*` command functions | ~500 | + +### Core Data Model (`helm.ss`) + +``` +helm-source + name : string ; display header + candidates : (-> list) ; thunk producing candidates + match-fn : (-> string candidate bool) ; custom match (default: multi-match) + filter-fn : (-> string list list) ; custom filter+sort + actions : alist ; ((label . procedure) ...) + persistent-action : (or procedure #f) ; C-j preview + display-fn : (or (-> candidate string) #f) ; custom display + real-fn : (or (-> candidate any) #f) ; display->real for actions + fuzzy? : bool ; enable fuzzy matching + volatile? : bool ; rebuild candidates on every pattern change + candidate-limit : integer ; max candidates (default 100) + keymap : (or keymap #f) ; source-local keymap override + +helm-session + sources : list ; active helm-source objects + pattern : string ; current input + candidates : vector ; filtered candidates (with source tags) + selected : integer ; cursor index + marked : set ; marked candidate indices + buffer-name : string ; for resume + actions : alist ; current action list (from selected source) + scroll-offset : integer ; visible window start + follow? : bool ; auto-preview on navigate + alive? : bool ; session running + +helm-candidate + display : string ; what the user sees + real : any ; what actions receive + source : helm-source ; which source produced this +``` + +### Matching Engine + +The default matching mode is **multi-match**: space-separated tokens, all must match (AND logic). + +``` +Pattern Behavior +───────────────────────────────────────────── +"foo bar" AND: both "foo" and "bar" must match +"!test" NOT: exclude candidates matching "test" +"^init" PREFIX: must start with "init" +"foo !test ^s" Combined: starts with "s", contains "foo", excludes "test" +``` + +When `fuzzy?` is `#t` on a source, each token uses `fuzzy-match?` instead of substring. + +Implementation: extend `fuzzy-filter-sort` in `core.ss` with `helm-multi-match` that parses tokens and applies the matching rules. + +### Action System + +``` +RET Execute default action (first in alist) on selected/marked candidates +TAB Show action menu in minibuffer — pick an alternative action +C-j Execute persistent-action (preview) — session stays open +C-SPC Mark/unmark candidate +M-a Mark all visible +C-g Quit — restore original state +``` + +### Session Lifecycle + +1. `helm-run` called with sources, buffer-name, optional initial-input +2. Candidates computed for each source +3. Filtered by pattern; grouped by source with headers +4. Rendered in candidate list UI (TUI: terminal rows; Qt: widget panel) +5. User types → pattern updates → re-filter → re-render (debounced) +6. Navigation: C-n/C-p move cursor; C-v/M-v page; C-o next source +7. On RET: run default action on selected (or all marked); close session +8. On C-j: run persistent-action; keep session open +9. On C-g: abort; cleanup +10. Session stored in `*helm-sessions*` for `helm-resume` + +### Rendering + +#### TUI (`helm-tui.ss`) + +Use the bottom N rows of the terminal (configurable, default: 10). Layout: + +``` +────────────────────────────────────── + Buffers: ← source header + > *scratch* ← selected (highlighted) + main.ss + core.ss + Recent Files: ← source header + ~/notes.org + ~/.jemacs-init +────────────────────────────────────── + Pattern: scr [2/47] ← minibuffer + count +``` + +Rendering uses `tui-print!` at absolute row positions. The editor viewport shrinks by N rows during a helm session. + +#### Qt (`qt/helm-qt.ss`) + +Use a QListWidget (or custom-painted QWidget) docked below the editor area, above the echo line. Source headers are non-selectable list items with distinct styling. Selected candidate highlighted with cursor color. + +Layout mirrors TUI but uses Qt stylesheets for coloring and font. + +--- + +## Implementation Phases + +### Phase 1: Core Framework + M-x (MVP) ✅ DONE + +**Goal**: Replace M-x with a helm-style candidate list. This validates the entire rendering pipeline. + +#### 1.1 Core data model (`helm.ss`) ✅ + +- Define `helm-source`, `helm-session`, `helm-candidate` structs +- `helm-multi-match`: parse space-separated tokens with `!`/`^` prefixes +- `helm-filter`: apply match to candidates, score, sort, limit +- `helm-run`: main entry point — create session, invoke renderer, handle result +- `helm-resume`: restore last session + +#### 1.2 TUI renderer (`helm-tui.ss`) ✅ + +- `helm-tui-render!`: draw candidate list in bottom rows +- `helm-tui-input-loop!`: key handling (C-n, C-p, C-v, M-v, RET, C-g, C-j, TAB, C-SPC, typing) +- `helm-tui-resize!`: adjust editor viewport when helm opens/closes +- Input debouncing: re-filter after short delay (or on every keystroke if fast enough) + +#### 1.3 Qt renderer (`qt/helm-qt.ss`) ✅ + +- `helm-qt-render!`: draw candidate list in a QWidget panel +- `helm-qt-input-loop!`: key handling via Qt event filter +- `helm-qt-resize!`: adjust splitter/layout when helm opens/closes + +#### 1.4 helm-M-x ✅ + +- Source: `helm-source-commands` — candidates from `*all-commands*` hash, MRU ordered +- Display: command name + key binding (if any) +- Action: `execute-command!` +- Persistent action: show command docstring in echo area +- Register as `helm-M-x` command; optionally bind to `M-x` when helm-mode is on + +### Phase 2: Buffers + Recent Files + Mini ✅ DONE + +**Goal**: The quintessential Helm experience — multiple sources in one session. + +#### 2.1 Buffer source ✅ + +- `helm-source-buffers`: candidates from `*buffer-list*` in MRU order +- Display: buffer name + modified indicator + mode + file path +- Filters: `*mode` (major mode), `@text` (buffer content search), `/path` (directory), `!exclude` +- Actions: switch-to-buffer (default), kill-buffer, save-buffer, diff +- Persistent action: show buffer in other window (preview) + +#### 2.2 Recent files source ✅ + +- `helm-source-recentf`: candidates from `*recent-files*` +- Display: abbreviated file path +- Actions: find-file (default), find-file-other-window +- Persistent action: preview file content + +#### 2.3 Create buffer source ✅ + +- `helm-source-buffer-not-found`: dummy source — user input becomes a new buffer name +- Action: echoes creation intent; when no candidates match, RET returns pattern text for create-buffer handling + +#### 2.4 Compose ✅ + +- `helm-mini`: combines buffers + recentf + create-buffer +- `helm-buffers-list`: buffers source only (replaces current stub) + +### Phase 3: File Navigation ✅ DONE + +**Goal**: Replace `find-file` with a helm-style file browser. + +#### 3.1 File source ✅ + +- `helm-source-files`: candidates from directory listing +- Display: filename (dirs with trailing `/`) +- Navigation: C-j descends into directory, C-l / DEL ascends to parent +- Fuzzy matching on filenames +- Tilde expansion, environment variables +- Wildcard support: `*.ss` glob filtering +- Actions: find-file (default), find-file-other-window, dired +- Persistent action: preview file content (first N lines in echo or split) + +#### 3.2 Integration ✅ + +- `helm-find-files`: entry point with initial directory from current buffer (TUI and Qt) +- Bind to `C-x C-f` when helm-mode is on + +### Phase 4: Search Commands ✅ DONE + +**Goal**: Interactive search and navigation within and across buffers. + +#### 4.1 helm-occur ✅ + +- `helm-source-occur`: candidates = lines of current buffer, numbered +- Live narrowing: re-filter lines as you type +- Actions: goto-line (default), save-occur-buffer +- Persistent action: jump to line without closing +- Follow mode natural here — navigate lines, see cursor move in buffer + +#### 4.2 helm-imenu ✅ + +- `helm-source-imenu`: candidates = definitions in current buffer (functions, variables, classes) +- Parse via existing highlighting/definition infrastructure or simple regex +- Display: symbol name + kind tag (`[fn]`, `[var]`, `[struct]`) +- Actions: goto-definition (default) +- Persistent action: jump to definition without closing + +#### 4.3 helm-grep ✅ + +- `helm-source-grep`: volatile source — runs `rg` (fallback `grep`) as subprocess +- Pattern typed in helm becomes the grep pattern via `*helm-current-pattern*` +- Candidates rebuild on every pattern change (volatile source, ≥3 chars) +- Display: `file:line: content` +- Actions: open-file-at-line (default) +- Uses synchronous `open-process` + `read-line` (fast enough with `--max-count=200`) + +### Phase 5: Utility Commands ✅ DONE + +**Goal**: Common Emacs Helm commands for daily use. + +#### 5.1 helm-show-kill-ring ✅ + +- `helm-source-kill-ring`: candidates from kill ring +- Display: truncated text with line count indicator +- Actions: insert-at-point (default), append-to-kill-ring +- Multi-line candidate display for readability + +#### 5.2 helm-bookmarks ✅ + +- `helm-source-bookmarks`: candidates from `*bookmarks*` hash +- Display: bookmark name + file path + position +- Actions: jump (default), delete-bookmark, rename-bookmark + +#### 5.3 helm-mark-ring ✅ + +- `helm-source-mark-ring`: candidates from buffer mark ring and global mark ring +- Display: line content at mark position +- Actions: jump-to-mark (default) +- Persistent action: show mark position + +#### 5.4 helm-register ✅ + +- `helm-source-registers`: candidates from register hash +- Display: register char + content preview +- Actions: insert (default), jump (for position registers) + +#### 5.5 helm-apropos ✅ + +- Combines: command source + variable source + function source +- Multi-source: all matching symbols across categories +- Actions: describe (default), execute (commands), set (variables) + +#### 5.6 helm-man ✅ + +- `helm-source-man`: candidates from cached `man -k .` output (up to 2000 entries) +- Fuzzy filtering on man page names +- Actions: open man page (default) — parses "name (section)" format + +### Phase 6: Follow Mode + Resume + Polish ✅ DONE + +**Goal**: Advanced Helm features that complete the experience. + +#### 6.1 Follow mode ✅ + +- Toggle with `C-c C-f` during any helm session +- When on: persistent-action fires automatically on C-n/C-p navigation +- Configurable delay (`*helm-follow-delay*`) to avoid thrashing +- Per-source `follow?` slot; session inherits from source + +#### 6.2 helm-resume ✅ + +- Store sessions in `*helm-sessions*` alist (buffer-name → session snapshot) +- `helm-resume`: reopen last session with pattern and cursor position intact +- `C-c n` during session: cycle through resumable sessions +- Limit stored sessions (default: 10) + +#### 6.3 Polish ✅ + +- Candidate highlighting: matched characters shown in yellow (#xffcc00), brighter when selected +- Source headers: styled `─── Source Name ───` separators with distinct background color +- Candidate count in prompt: `[3/47]` +- Auto-resize: helm window grows/shrinks between 4–12 rows based on candidate + source count +- Mode-line integration: `*helm-mode*` flag in core.ss +- Filtering on every keystroke (fast for sync sources; volatile sources rebuild on pattern change) + +--- + +## Key Bindings + +When `helm-mode` is active, these bindings override defaults: + +| Binding | Command | Replaces | +|---------|---------|----------| +| `M-x` | `helm-M-x` | `execute-extended-command` | +| `C-x b` | `helm-mini` | `switch-buffer` | +| `C-x C-f` | `helm-find-files` | `find-file` | +| `C-x C-b` | `helm-buffers-list` | `list-buffers` | +| `M-y` | `helm-show-kill-ring` | `yank-pop` | +| `C-x r b` | `helm-bookmarks` | `bookmark-jump` | +| `C-c h o` | `helm-occur` | — | +| `C-c h i` | `helm-imenu` | `imenu` | +| `C-c h a` | `helm-apropos` | `apropos-command` | +| `C-c h g` | `helm-grep` | `grep` | +| `C-c h m` | `helm-man` | `man` | +| `C-c h b` | `helm-resume` | — | +| `C-c h SPC` | `helm-mark-ring` | — | +| `C-c h r` | `helm-register` | — | + +### Inside a Helm Session + +| Key | Action | +|-----|--------| +| `C-n` / `<down>` | Next candidate | +| `C-p` / `<up>` | Previous candidate | +| `C-v` / `<next>` | Page down | +| `M-v` / `<prior>` | Page up | +| `M-<` | First candidate | +| `M->` | Last candidate | +| `C-o` | Next source | +| `RET` | Default action + close | +| `C-j` | Persistent action (keep open) | +| `TAB` | Action menu | +| `C-SPC` | Mark/unmark candidate | +| `M-a` | Mark all | +| `C-g` | Quit | +| `C-c C-f` | Toggle follow mode | + +--- + +## Feature Parity: TUI and Qt + +Per project rules, every helm feature must work in both TUI and Qt. The architecture achieves this through: + +1. **Shared core** (`helm.ss`): All data model, matching, filtering, session management, action dispatch +2. **Renderer interface**: TUI and Qt each implement `helm-render!`, `helm-input-loop!`, `helm-resize!` +3. **Shared sources** (`helm-sources.ss`): Source definitions are backend-agnostic; they reference `*buffer-list*`, `*recent-files*`, `*all-commands*` etc. from `core.ss` +4. **Separate command files**: `helm-commands.ss` (TUI) and `qt/helm-commands.ss` (Qt) wire sources to their respective renderers + +--- + +## Dependencies on Existing Code + +| Existing module | What helm uses | +|----------------|----------------| +| `core.ss` | `fuzzy-match?`, `fuzzy-score`, `*all-commands*`, `*buffer-list*`, `buffer-by-name`, `execute-command!`, `keymap-*`, `echo-state` | +| `echo.ss` / `qt/echo.ss` | Echo area for messages during helm (e.g. action descriptions) | +| `persist.ss` | `*recent-files*`, `*bookmarks*`, `*kill-ring*`, `*mark-ring*` | +| `editor-core.ss` / `qt/commands-core.ss` | Existing buffer/file operations called by helm actions | +| `highlight.ss` | Definition parsing for imenu source | + +--- + +## Estimated Effort by Phase + +| Phase | What | New LOC | Complexity | +|-------|------|---------|-----------| +| 1 | Core + M-x | ~1500 | High (framework + two renderers) | +| 2 | Buffers + Recentf + Mini | ~400 | Medium | +| 3 | Find-files | ~500 | Medium-High (directory navigation state) | +| 4 | Occur + Imenu + Grep | ~600 | Medium-High (grep needs async) | +| 5 | Kill-ring, Bookmarks, Marks, Registers, Apropos, Man | ~500 | Low-Medium | +| 6 | Follow + Resume + Polish | ~300 | Medium | +| **Total** | | **~3800** | | + +--- + +## Design Decisions + +### 1. Rendering approach + +**TUI**: Reserve bottom N terminal rows. The editor viewport (`tui-draw!`) must account for reduced height. This is the simplest approach — no popup windows, no separate buffer. + +**Qt**: Insert a QWidget (QListWidget or custom) between the editor area and the echo line. Use a QVBoxLayout with show/hide. This avoids creating separate windows. + +### 2. Input handling + +Helm takes over the keyboard during a session. Both TUI and Qt must intercept all keystrokes and route them through the helm keymap before falling through to normal editing. The helm session runs a modal input loop that blocks normal editing until completion. + +### 3. Async sources + +For grep/locate/find, use Chez Scheme's `open-process` + green threads. A reader thread populates candidates incrementally; the renderer polls for new candidates on a timer. This avoids blocking the UI. + +### 4. Candidate storage + +For sync sources: plain list filtered on each keystroke (fast for <10K candidates). +For in-buffer sources: string buffer with line-based search (for very large candidate sets like locate results). +For async sources: growing list appended by reader thread. + +### 5. Multi-match as default + +Unlike Emacs Helm where multi-match is opt-out, here it's always on. Space separates AND tokens. This is the most useful default. Fuzzy matching is opt-in per source. + +### 6. No helm-mode complexity + +Rather than a full `helm-mode` that overrides all completion, implement individual `helm-*` commands that can be bound to keys. The `helm-mode` toggle simply rebinds the standard keys to their helm equivalents. This is simpler and less error-prone. + +--- + +## Testing Strategy + +### Unit tests (in `emacs-test.ss`) + +- `helm-multi-match` parsing and matching logic +- `helm-filter` with various patterns and source types +- Source candidate generation (buffers, commands, files) +- Action dispatch (default, persistent, marked) +- Session create/resume lifecycle + +### Functional tests (in `functional-test.ss` and `qt-functional-test.ss`) + +Per CLAUDE.md rules, all tests go through `execute-command!`: + +```scheme +;; Test helm-M-x dispatches correctly +(set! *test-helm-responses* '("switch-buffer")) +(execute-command! app 'helm-M-x) +;; Verify the command was executed + +;; Test helm-mini with buffer switching +(set! *test-helm-responses* '("*scratch*")) +(execute-command! app 'helm-mini) +;; Verify buffer switched +``` + +### Manual testing + +- Verify rendering in both TUI (terminal) and Qt (window) +- Test with large candidate sets (1000+ commands, 100+ buffers) +- Test async grep with large codebases +- Test follow mode responsiveness + +--- + +## Out of Scope (Future Work) + +These Helm features are not included in this plan but could be added later: + +- **helm-find-files file operations**: Copy, rename, delete, symlink from the file browser +- **helm-top**: Process management UI +- **helm-google-suggest**: Web search integration +- **helm-colors / helm-ucs**: Color/unicode pickers +- **Childframe display**: Floating popup frame (Qt could do this with QDialog) +- **helm-org**: Org-specific navigation (headings, agenda) +- **Async candidate highlighting**: Highlighting match chars in async sources in real-time +- **helm-descbinds**: Searchable key binding reference +- **Project-wide sources**: helm-projectile equivalent (project files, project buffers) new file mode 100644 --- /dev/null +++ b/docs/jemacs-vs-emacs.md @@ -0,0 +1,1274 @@ +# Jemacs vs GNU Emacs — Feature Comparison + +> **Last updated:** 2026-03-10 +> **Jemacs version:** master (262cd55) +> **Compared against:** GNU Emacs 29.x / 30.x feature set +> **Command parity:** 2168+ commands registered in both TUI and Qt layers (zero gap) + +## Status Legend + +| Symbol | Meaning | +|---------------------|----------------------------------------------------------------------| +| :white_check_mark: | **Full** — Feature-complete, comparable to Emacs | +| :large_blue_circle: | **Substantial** — Most functionality works, some gaps | +| :yellow_circle: | **Partial** — Core works, significant gaps remain | +| :orange_circle: | **Minimal** — Basic scaffolding, limited use | +| :red_circle: | **Stub/Missing** — Registered but non-functional, or absent entirely | + +--- + +## Table of Contents + +1. [Core Editing](#1-core-editing) +2. [Navigation](#2-navigation) +3. [Search & Replace](#3-search--replace) +4. [Kill, Yank & Clipboard](#4-kill-yank--clipboard) +5. [Undo System](#5-undo-system) +6. [Marks & Regions](#6-marks--regions) +7. [Registers & Bookmarks](#7-registers--bookmarks) +8. [Rectangle Operations](#8-rectangle-operations) +9. [Keyboard Macros](#9-keyboard-macros) +10. [Minibuffer & Completion](#10-minibuffer--completion) +11. [Buffer Management](#11-buffer-management) +12. [Window Management](#12-window-management) +13. [Frame / Display Management](#13-frame--display-management) +14. [File Operations](#14-file-operations) +15. [Dired (Directory Editor)](#15-dired-directory-editor) +16. [Version Control / Magit](#16-version-control--magit) +17. [Org-mode](#17-org-mode) +18. [Programming Support](#18-programming-support) +19. [LSP (Language Server Protocol)](#19-lsp-language-server-protocol) +20. [Syntax Highlighting & Themes](#20-syntax-highlighting--themes) +21. [Completion Frameworks](#21-completion-frameworks) +22. [Shell & Terminal](#22-shell--terminal) +23. [Spell Checking](#23-spell-checking) +24. [Text Transformation & Formatting](#24-text-transformation--formatting) +25. [S-expression / Paredit](#25-s-expression--paredit) +26. [Diff & Ediff](#26-diff--ediff) +27. [Project Management](#27-project-management) +28. [Help System](#28-help-system) +29. [Customization & Configuration](#29-customization--configuration) +30. [Package Management & Extensibility](#30-package-management--extensibility) +31. [Remote Editing (TRAMP)](#31-remote-editing-tramp) +32. [EWW (Web Browser)](#32-eww-web-browser) +33. [Calendar & Diary](#33-calendar--diary) +34. [Email (Gnus / mu4e / notmuch)](#34-email) +35. [IRC / Chat](#35-irc--chat) +36. [PDF / Document Viewing](#36-pdf--document-viewing) +37. [Treemacs / File Tree](#37-treemacs--file-tree) +38. [Multiple Cursors / iedit](#38-multiple-cursors--iedit) +39. [Snippets (YASnippet)](#39-snippets-yasnippet) +40. [Tab Bar & Workspaces](#40-tab-bar--workspaces) +41. [Accessibility](#41-accessibility) +42. [Performance & Large Files](#42-performance--large-files) +43. [AI / LLM Integration](#43-ai--llm-integration) +44. [Multi-Terminal (vterm)](#44-multi-terminal-vterm) +45. [Key Input Remapping](#45-key-input-remapping) +46. [DevOps / Infrastructure Modes](#46-devops--infrastructure-modes) +47. [Helm / Narrowing Framework](#47-helm--narrowing-framework) +48. [Personal Workflow Gap Analysis](#personal-workflow-gap-analysis) + +--- + +## 1. Core Editing + +| Feature | Status | Notes | +|--------------------------------|---------------------|-------------------------------------------------| +| Self-insert characters | :white_check_mark: | Full Unicode support via Scintilla | +| Delete / Backspace | :white_check_mark: | `C-d`, `DEL`, `C-h` | +| Kill line (`C-k`) | :white_check_mark: | Kill to EOL, empty line kills newline | +| Open line (`C-o`) | :white_check_mark: | | +| Newline & indent (`C-j`) | :white_check_mark: | | +| Transpose chars (`C-t`) | :white_check_mark: | | +| Transpose words (`M-t`) | :white_check_mark: | | +| Transpose lines (`C-x C-t`) | :white_check_mark: | | +| Transpose sexps | :white_check_mark: | | +| Join line (`M-j` / `M-^`) | :white_check_mark: | | +| Quoted insert (`C-q`) | :white_check_mark: | | +| Overwrite mode | :white_check_mark: | Toggle via `<insert>` | +| Auto-fill mode | :white_check_mark: | Automatic line wrapping at fill-column | +| Electric pair mode | :large_blue_circle: | Auto-pairing brackets/quotes, toggleable | +| Indent line / region | :white_check_mark: | TAB dispatches: indent, complete, or org-expand | +| Aggressive indent mode | :white_check_mark: | Auto-reindent on closing delimiters and newlines | +| Universal argument (`C-u`) | :white_check_mark: | Numeric prefix for repeat/modify commands | +| Digit arguments (`M-0`..`M-9`) | :white_check_mark: | | +| Negative argument (`M--`) | :white_check_mark: | | +| Repeat (`C-x z`) | :white_check_mark: | | +| Repeat-mode (transient maps) | :large_blue_circle: | 6 maps: window, buffer, error, undo, page, resize | + +**Summary:** Core editing is feature-complete. All standard Emacs editing primitives work. + +--- + +## 2. Navigation + +| Feature | Status | Notes | +|-----------------------------|---------------------|----------------------------------------------| +| Char/word/line movement | :white_check_mark: | `C-f/b/n/p`, `M-f/b`, arrows | +| Beginning/end of line | :white_check_mark: | `C-a/e`, `Home/End` | +| Beginning/end of buffer | :white_check_mark: | `M-<`, `M->` | +| Page up/down | :white_check_mark: | `C-v`, `M-v`, PgUp/PgDn | +| Scroll other window | :white_check_mark: | `M-g v`, `M-g V` | +| Recenter (`C-l`) | :white_check_mark: | Cycles top/center/bottom | +| Goto line (`M-g g`) | :white_check_mark: | | +| Goto char (`M-g c`) | :white_check_mark: | | +| Goto column | :white_check_mark: | | +| Goto matching paren | :white_check_mark: | `M-g m` | +| Goto percent | :white_check_mark: | `M-g %` — jump to N% of buffer | +| Forward/backward sentence | :white_check_mark: | `M-a`, `M-e` | +| Forward/backward paragraph | :white_check_mark: | `M-{`, `M-}` | +| Forward/backward sexp | :white_check_mark: | `M-g f/b` | +| Back to indentation (`M-m`) | :white_check_mark: | | +| Imenu symbol navigation | :large_blue_circle: | Works for many languages, no sidebar | +| Which-function-mode | :large_blue_circle: | Multi-language: Scheme, Python, C, Go, Rust, JS/TS | +| Avy jump (char/line/word) | :large_blue_circle: | `avy-goto-char`, `avy-goto-line` | +| Xref go-to-definition | :large_blue_circle: | Works via grep fallback; LSP backend partial | +| Xref find references | :large_blue_circle: | Grep-based | +| Next/previous error | :white_check_mark: | `M-g n/p` navigates compilation errors | +| Ace-window | :large_blue_circle: | Jump to window by label | +| Pop mark / mark ring | :large_blue_circle: | Mark stack navigation | + +**Summary:** Navigation is comprehensive. All standard movement commands plus extras like avy and ace-window. + +--- + +## 3. Search & Replace + +| Feature | Status | Notes | +|-------------------------------|--------------------|--------------------------------------------| +| Isearch forward/backward | :white_check_mark: | `C-s`, `C-r` with wrap-around | +| Isearch regexp | :white_check_mark: | `C-M-s` | +| Query replace | :white_check_mark: | `M-%` with y/n/!/q responses | +| Query replace regexp | :white_check_mark: | `C-M-%` | +| Replace all (non-interactive) | :white_check_mark: | | +| Occur | :white_check_mark: | `M-s o` — results buffer with line numbers | +| Multi-file occur | :white_check_mark: | | +| Grep (project-wide) | :white_check_mark: | `rgrep`, `project-grep`, `counsel-grep` | +| Grep results buffer | :white_check_mark: | With next/prev error navigation | +| Wgrep (edit grep results) | :white_check_mark: | Edit matches in-place, save back to files | +| Keep/flush lines | :white_check_mark: | `M-s k`, `M-s f` | +| Count matches | :white_check_mark: | `M-s c` | +| Isearch word mode | :large_blue_circle: | `isearch-forward-word` searches for word at point | +| Isearch symbol mode | :large_blue_circle: | `isearch-forward-symbol` searches for symbol at point | +| Search highlight all matches | :green_circle: | Qt: highlights all matches during isearch (current=cyan, others=yellow) | + +**Summary:** Search is strong. Isearch with live multi-match highlighting, query-replace, occur, grep, and wgrep all work well. + +--- + +## 4. Kill, Yank & Clipboard + +| Feature | Status | Notes | +|---------|--------|-------| +| Kill line / region / word | :white_check_mark: | Full kill ring integration | +| Kill ring | :white_check_mark: | Stores history of kills | +| Yank (`C-y`) | :white_check_mark: | | +| Yank pop (`M-y`) | :white_check_mark: | Cycle through kill ring | +| Kill ring save (`M-w`) | :white_check_mark: | Copy without killing | +| Append next kill | :white_check_mark: | | +| Browse kill ring | :white_check_mark: | Interactive selection | +| System clipboard integration | :large_blue_circle: | Qt layer has clipboard; TUI limited | +| Zap to char (`M-z`) | :white_check_mark: | | +| Zap up to char | :white_check_mark: | | +| Kill whole line | :white_check_mark: | | +| Copy from above/below | :white_check_mark: | Copy character from line above/below | + +**Summary:** Kill/yank system is complete with kill ring cycling and browsing. + +--- + +## 5. Undo System + +| Feature | Status | Notes | +|---------|--------|-------| +| Undo (`C-/`, `C-_`) | :white_check_mark: | | +| Redo (`M-_`) | :white_check_mark: | Linear redo | +| Undo grouping | :white_check_mark: | Consecutive edits grouped | +| Undo boundaries | :white_check_mark: | Commands create boundaries | +| Undo tree visualization | :white_check_mark: | `M-x undo-tree-visualize` with snapshot history | +| Persistent undo (across sessions) | :white_check_mark: | `undo-history-save` / `undo-history-load` to `~/.jemacs-undo/` | +| Selective undo (region) | :white_check_mark: | Undo within region, falls back to normal undo | + +**Summary:** Undo/redo with tree visualization (`M-x undo-tree-visualize`), timestamped snapshots (`M-x undo-history`), and snapshot restore. No persistent undo or selective region undo. + +--- + +## 6. Marks & Regions + +| Feature | Status | Notes | +|---------|--------|-------| +| Set mark (`C-SPC`) | :white_check_mark: | | +| Exchange point and mark (`C-x C-x`) | :white_check_mark: | | +| Mark word / paragraph / defun / sexp | :white_check_mark: | | +| Select all (`C-x h`) | :white_check_mark: | | +| Narrow to region / widen | :white_check_mark: | | +| Transient mark mode | :large_blue_circle: | Region highlighting | +| Pop mark | :large_blue_circle: | Mark ring navigation | +| Rectangle mark mode | :white_check_mark: | Toggle with `C-x SPC` | + +**Summary:** Mark and region system is solid. + +--- + +## 7. Registers & Bookmarks + +| Feature | Status | Notes | +|---------|--------|-------| +| Text to register | :white_check_mark: | `C-x r s` / `C-x r i` | +| Point to register / jump | :white_check_mark: | `C-x r SPC` / `C-x r j` | +| Window config to register | :white_check_mark: | Full multi-window state save/restore | +| Rectangle to register | :white_check_mark: | | +| Number registers (increment) | :white_check_mark: | `C-x r +` | +| Append/prepend to register | :white_check_mark: | | +| File to register | :large_blue_circle: | Save file path to register, jump back with `jump-to-register` | +| List registers | :large_blue_circle: | | +| Bookmark set / jump | :white_check_mark: | `C-x r m` / `C-x r b` | +| Bookmark list | :white_check_mark: | | +| Bookmark persistence | :white_check_mark: | `~/.jemacs-bookmarks` | +| Bookmark delete / rename | :white_check_mark: | | + +**Summary:** Registers and bookmarks are comprehensive. All core types work including window configurations. + +--- + +## 8. Rectangle Operations + +| Feature | Status | Notes | +|---------|--------|-------| +| Kill rectangle | :white_check_mark: | `C-x r k` | +| Delete rectangle | :white_check_mark: | `C-x r d` | +| Yank rectangle | :white_check_mark: | `C-x r y` | +| Open rectangle | :white_check_mark: | `C-x r o` | +| String rectangle | :white_check_mark: | `C-x r t` — fill column with text | +| Number lines | :white_check_mark: | `C-x r n` | +| Clear rectangle | :white_check_mark: | | +| Rectangle to register | :white_check_mark: | | + +**Summary:** Rectangle operations are feature-complete. + +--- + +## 9. Keyboard Macros + +| Feature | Status | Notes | +|---------|--------|-------| +| Start recording (`F3` / `C-x (`) | :white_check_mark: | | +| Stop recording (`F4` / `C-x )`) | :white_check_mark: | | +| Execute last macro (`F4` / `C-x e`) | :white_check_mark: | | +| Named macros | :white_check_mark: | `M-x name-last-kbd-macro`, `M-x call-named-kbd-macro` with narrowing | +| Macro counter | :white_check_mark: | `M-x kbd-macro-counter-insert` / `kbd-macro-counter-set` | +| Edit macro | :large_blue_circle: | `M-x edit-kbd-macro` shows macro events in buffer (TUI) | +| Save macros to file | :white_check_mark: | `M-x save-kbd-macros` / `load-kbd-macros` persists to `~/.jemacs-macros` | +| Execute with count prefix | :large_blue_circle: | `C-u` prefix arg for navigation (char/word/line), `universal-argument`, digit arguments | + +**Summary:** Feature-rich macro system: recording/playback, named macros with save/load persistence, counter insert/set, macro viewer. Qt uses narrowing for macro selection. + +--- + +## 10. Minibuffer & Completion + +| Feature | Status | Notes | +|---------|--------|-------| +| M-x (execute-extended-command) | :white_check_mark: | Fuzzy matching command names | +| File name completion | :white_check_mark: | Tab completion in find-file | +| Buffer name completion | :white_check_mark: | Fuzzy matching in switch-buffer | +| Minibuffer history | :white_check_mark: | `M-p` / `M-n` in minibuffer | +| Recursive minibuffer | :white_check_mark: | `toggle-enable-recursive-minibuffers` flag | +| Vertico / Selectrum | :white_check_mark: | Mode toggles, uses narrowing framework for vertical completion | +| Orderless matching | :large_blue_circle: | Multi-match engine: space-separated AND tokens, `!` negation, `^` prefix | +| Marginalia (annotations) | :white_check_mark: | Annotator registry with `marginalia-annotate!`, command/buffer/file categories | +| Embark (actions on candidates) | :white_check_mark: | Action registry with `embark-define-action!`, describe/execute/find-file actions | +| Consult (enhanced commands) | :large_blue_circle: | `consult-ripgrep` (M-s r, narrowing), `consult-line`, `consult-buffer`, `consult-bookmark` | +| Icomplete / Fido mode | :white_check_mark: | `icomplete-mode` / `fido-mode` toggles | +| Savehist (persist history) | :large_blue_circle: | `~/.jemacs-history` | + +**Summary:** Full completion framework: fuzzy matching, Vertico/Selectrum vertical modes, Marginalia annotations, Embark actions, Icomplete/Fido. Uses narrowing framework for candidate selection. + +--- + +## 11. Buffer Management + +| Feature | Status | Notes | +|---------|--------|-------| +| Switch buffer (`C-x b`) | :white_check_mark: | With fuzzy matching | +| Kill buffer (`C-x k`) | :white_check_mark: | Prompts to save modified | +| List buffers (`C-x C-b`) | :white_check_mark: | | +| Next/previous buffer | :white_check_mark: | `C-x <left>/<right>` | +| Bury buffer | :white_check_mark: | | +| Rename buffer | :white_check_mark: | | +| Clone buffer | :white_check_mark: | | +| Scratch buffer | :white_check_mark: | | +| Messages buffer | :white_check_mark: | `*Messages*` equivalent | +| ibuffer (advanced list) | :large_blue_circle: | Interactive: mark/delete/save/execute, filter by name, sort, goto buffer | +| Uniquify buffer names | :white_check_mark: | Emacs-style `filename<dir>` — renames both old and new same-name buffers | +| Indirect buffers | :large_blue_circle: | `clone-indirect-buffer` creates text copy with `<clone>` suffix | +| Buffer-local variables | :large_blue_circle: | `buffer-local-set!/get` per-buffer hash, used for major-mode, dir-locals, org settings | + +**Summary:** Core buffer management works well. IBBuffer provides interactive mark/execute/filter/sort. + +--- + +## 12. Window Management + +| Feature | Status | Notes | +|---------|--------|-------| +| Split horizontal (`C-x 2`) | :white_check_mark: | | +| Split vertical (`C-x 3`) | :white_check_mark: | | +| Delete window (`C-x 0`) | :white_check_mark: | | +| Delete other windows (`C-x 1`) | :white_check_mark: | | +| Other window (`C-x o`) | :white_check_mark: | | +| Balance windows (`C-x +`) | :white_check_mark: | | +| Resize windows (`C-x ^`, `C-x {`, `C-x }`) | :white_check_mark: | | +| Windmove (directional) | :white_check_mark: | `S-left/right/up/down` arrow key navigation between windows | +| Winner mode (undo/redo) | :white_check_mark: | `winner-undo`, `winner-redo` | +| Ace-window (jump by label) | :large_blue_circle: | | +| Swap buffers between windows | :white_check_mark: | | +| Golden ratio mode | :white_check_mark: | Auto-resize focused window | +| Dedicated windows | :white_check_mark: | `M-x toggle-window-dedicated` prevents buffer replacement | +| Side windows | :white_check_mark: | Toggle side panel via split (display-buffer-in-side-window) | +| Window purpose | :white_check_mark: | `set-window-dedicated`, `toggle-window-dedicated` with buffer-type dedication | +| Follow mode | :white_check_mark: | Synchronized scrolling across windows | + +**Summary:** Window management is strong. Splitting, resizing, winner-mode, ace-window, window purpose/dedication all work. + +--- + +## 13. Frame / Display Management + +| Feature | Status | Notes | +|---------|--------|-------| +| Single frame (Qt window) | :white_check_mark: | | +| Multiple frames | :large_blue_circle: | Virtual frame management: `make-frame`/`delete-frame`/`other-frame`/`suspend-frame`, frame count tracking | +| Fullscreen toggle | :large_blue_circle: | Real toggle via window-state detection (fullscreen ↔ normal) | +| Font size (zoom) | :white_check_mark: | `C-=`, `C--`, `C-x C-0` | +| Font family selection | :large_blue_circle: | Configurable | +| Menu bar | :large_blue_circle: | Qt menu bar with File/Edit/View/etc | +| Tool bar | :yellow_circle: | `tool-bar-mode` registered; uses M-x for commands | +| Scroll bar | :large_blue_circle: | Real toggle via Scintilla SCI_SETVSCROLLBAR/SCI_SETHSCROLLBAR | +| Mode line (status bar) | :white_check_mark: | Shows mode, file, position, modified status | +| Tab bar | :green_circle: | Qt visual buffer tab bar + workspace tabs (both layers) | +| Header line | :white_check_mark: | Toggle header line display (file path breadcrumb) | +| Fringe indicators | :large_blue_circle: | Git-gutter fringe markers (green=add, blue=mod, red=del) via Scintilla margin, both TUI + Qt | +| Display tables | :white_check_mark: | `set-display-table-entry` / `describe-display-table` | +| Fill-column indicator | :white_check_mark: | Visual vertical line via Scintilla edge mode (TUI + Qt) | +| Goto-address-mode | :white_check_mark: | URL detection and highlighting with Scintilla indicators (TUI + Qt) | +| Subword-mode | :white_check_mark: | CamelCase-aware word navigation: forward, backward, kill (TUI + Qt) | +| Rainbow delimiters | :white_check_mark: | Color-coded parentheses/brackets via Scintilla indicators | +| Pulse-on-jump | :white_check_mark: | Auto-flash landing line after >5-line jumps (INDIC_FULLBOX), toggleable | +| Visual-line-mode | :white_check_mark: | Word wrap via Scintilla SCI_SETWRAPMODE (TUI + Qt) | +| Whitespace-mode | :white_check_mark: | Show/hide whitespace and EOL markers via Scintilla (TUI + Qt) | +| Which-key mode | :white_check_mark: | Shows available keybindings after prefix key delay (TUI + Qt) | + +**Summary:** Single-frame Qt application. No multi-frame support. Display features work well including fill-column indicator, URL highlighting, pulse-on-jump, visual-line-mode, whitespace display, and which-key hints. + +--- + +## 14. File Operations + +| Feature | Status | Notes | +|---------|--------|-------| +| Find file (`C-x C-f`) | :white_check_mark: | With completion | +| Find file other window (`C-x 4 f`) | :white_check_mark: | | +| Save buffer (`C-x C-s`) | :white_check_mark: | | +| Save as (`C-x C-w`) | :white_check_mark: | | +| Save some buffers (`C-x s`) | :white_check_mark: | Prompts for each modified | +| Revert buffer | :white_check_mark: | Reload from disk | +| Auto-revert mode | :white_check_mark: | Auto-reverts unmodified buffers when files change on disk | +| Auto-save mode | :white_check_mark: | 30s timer writes to `#file#`, per-buffer toggle, recover-file | +| Backup files | :large_blue_circle: | Creates `file~` backup on first save, toggle with `M-x toggle-backup-files` | +| Recent files (`C-x C-r`) | :white_check_mark: | | +| Find file at point | :white_check_mark: | | +| Find alternate file | :white_check_mark: | | +| Insert file | :white_check_mark: | | +| Copy/rename file | :white_check_mark: | | +| Sudo write | :white_check_mark: | Write as root | +| File local variables | :large_blue_circle: | Dir-locals via `.jemacs-config` | +| Find file literally | :large_blue_circle: | Opens file with syntax highlighting disabled (SCLEX_NULL) | +| File encoding detection | :large_blue_circle: | UTF-8 default; `set-buffer-file-coding-system` with 15 encodings, `revert-buffer-with-coding-system`, per-buffer encoding storage | +| Line ending conversion | :white_check_mark: | Unix/DOS/Mac detection and conversion | +| Desktop save/restore | :white_check_mark: | Persist and restore session (open buffers, positions) across restarts | + +**Summary:** File operations are comprehensive. Find, save, revert, auto-revert, recent files, desktop save/restore all work. + +--- + +## 15. Dired (Directory Editor) + +| Feature | Status | Notes | +|---------|--------|-------| +| Directory listing | :white_check_mark: | File metadata, permissions, sizes | +| Open file/directory | :white_check_mark: | Enter to open | +| Navigate up (`^`) | :white_check_mark: | | +| Create directory | :white_check_mark: | | +| Mark / unmark files | :white_check_mark: | Mark by regexp | +| Delete single file | :white_check_mark: | With confirmation | +| Rename single file | :white_check_mark: | | +| Copy single file | :white_check_mark: | | +| Chmod | :white_check_mark: | | +| Sort toggle | :white_check_mark: | Name/date | +| Hide details | :white_check_mark: | | +| Hide dotfiles | :white_check_mark: | | +| Refresh | :white_check_mark: | | +| Batch delete (marked) | :white_check_mark: | Delete all marked files with confirmation | +| Batch rename (marked) | :white_check_mark: | Move/rename marked files to destination | +| Batch copy (marked) | :white_check_mark: | Copy marked files to destination | +| Mark by regexp | :white_check_mark: | Mark files matching pattern | +| Shell command on file | :large_blue_circle: | Runs command, shows output in buffer | +| Wdired (edit filenames) | :white_check_mark: | Edit mode with rename-on-commit | +| Image thumbnails | :white_check_mark: | `image-dired-display-thumbnail` / `image-dired-show-all-thumbnails` | +| Dired-x extensions | :large_blue_circle: | `find-dired` (custom args), `find-name-dired` (by filename pattern) — real `find` subprocess | +| Async operations | :white_check_mark: | `dired-async-copy`, `dired-async-move` | +| Virtual dired | :white_check_mark: | `virtual-dired` from file list, `dired-from-find` from glob | +| Dired subtree | :white_check_mark: | `M-x dired-subtree-toggle` for inline expansion | + +**Summary:** Dired is **substantially complete**. Full listing with permissions/sizes, single-file and batch operations on marked files, wdired for inline renaming, find integration, inline subtree expansion, async copy/move. Missing: image thumbnails. + +--- + +## 16. Version Control / Magit + +| Feature | Status | Notes | +|---------|--------|-------| +| Git status display | :large_blue_circle: | Interactive status with inline diffs per file | +| Stage / unstage hunks | :large_blue_circle: | Hunk-level staging via `git apply --cached` | +| Stage / unstage files | :white_check_mark: | `s` to stage, `u` to unstage in status buffer | +| Commit with message | :large_blue_circle: | Dedicated `*Magit: Commit*` buffer with diff preview, C-c C-c / C-c C-k | +| Amend commit | :large_blue_circle: | `a` in magit opens commit buffer pre-filled with previous message | +| Push / pull | :large_blue_circle: | Upstream detection, auto-set with `-u`, remote selection via narrowing | +| Log viewing | :large_blue_circle: | Interactive log with date/author, Enter shows commit diff | +| Diff viewing | :large_blue_circle: | Shows staged + unstaged diffs for file at point | +| Branch operations | :large_blue_circle: | Checkout/create/delete with narrowing selection | +| Tag management | :large_blue_circle: | Create/list/delete/push tags with completion | +| Stash | :large_blue_circle: | Stash create + list + pop + show diff | +| Blame | :large_blue_circle: | `magit-blame`, `show-git-blame`, `vc-annotate` — real `git blame` with async output | +| Interactive rebase | :large_blue_circle: | Rebase with narrowing branch selection | +| Merge UI | :large_blue_circle: | Merge with narrowing branch selection | +| Cherry-pick | :large_blue_circle: | Interactive commit selection with narrowing | +| Revert commit | :large_blue_circle: | Interactive commit selection, `--no-edit` | +| Forge (PR/issue management) | :large_blue_circle: | List/view PRs and issues, create PRs via `gh` CLI | +| Diff-hl (gutter marks) | :large_blue_circle: | Git diff gutter indicators | +| Wgrep on grep results | :white_check_mark: | Edit and save back | +| Magit keymap | :white_check_mark: | 20 bindings: s/S/u/c/d/l/g/n/p/q/b/B/f/F/P/r/m/z/Z/k | +| VC generic backend | :white_check_mark: | Git backend: real `vc-annotate` (blame), `vc-diff-head`, `vc-log-file` (--follow), `vc-stash`/`vc-stash-pop`, `vc-revert`, `vc-dir` | + +**Summary:** Magit has been significantly enhanced. The status buffer shows **inline diffs** per file. **Hunk-level staging/unstaging** works via `git apply --cached`. Branch operations (checkout, merge, rebase) use the **narrowing framework** for interactive selection. 20+ single-key bindings in the magit keymap. **Commit composition** uses a dedicated `*Magit: Commit*` buffer with diff preview and `C-c C-c`/`C-c C-k` keybindings. **Interactive log** shows date/author/subject with graph; pressing Enter shows the full commit diff with highlighting. Forge integration provides PR/issue listing and creation via `gh` CLI. + +--- + +## 17. Org-mode + +| Feature | Status | Notes | +|---------|--------|-------| +| Heading hierarchy | :white_check_mark: | `* / ** / ***` levels | +| Heading folding / cycling | :white_check_mark: | TAB cycles visibility | +| TODO states | :white_check_mark: | TODO/DONE cycling, custom keywords | +| Priority (`[#A]`, `[#B]`, `[#C]`) | :white_check_mark: | Set and cycle priorities | +| Tags | :white_check_mark: | Per-heading tags | +| Timestamps | :white_check_mark: | Active/inactive, SCHEDULED/DEADLINE | +| Properties | :white_check_mark: | Property drawers | +| Lists (ordered, unordered) | :large_blue_circle: | | +| Checkboxes | :white_check_mark: | Toggle `[ ]`/`[X]` | +| Links | :white_check_mark: | `[[url][description]]` format | +| Footnotes | :large_blue_circle: | `org-footnote-new` (insert ref+def), `org-footnote-goto-definition` (jump between ref/def) | +| **Tables** | :white_check_mark: | Create, align, row/col operations, sort, sum | +| Table formulas | :large_blue_circle: | Basic recalculate | +| Table CSV import/export | :white_check_mark: | | +| **Agenda** | :large_blue_circle: | Daily/weekly views, date filtering, tag search | +| Agenda interactive commands | :large_blue_circle: | Jump to source, toggle TODO from agenda | +| **Capture** | :large_blue_circle: | Templates with `%?/%U/%T/%f`, template selection, `*Org Capture*` buffer | +| Capture buffer (C-c C-c / C-c C-k) | :white_check_mark: | Interactive capture with finalize/abort keybindings | +| Refile | :large_blue_circle: | `M-x org-refile` with narrowing target selection (Qt) | +| **Babel** (code blocks) | :large_blue_circle: | 8 languages, execution, tangling | +| Babel session persistence | :white_check_mark: | `:session name` keeps persistent process, sentinel-based I/O | +| Babel :var evaluation | :white_check_mark: | Resolves named src blocks (executes) and tables (converts to data) | +| Babel :noweb expansion | :white_check_mark: | `<<block-name>>` refs expanded when `:noweb yes` | +| **Export** | :large_blue_circle: | HTML, Markdown, LaTeX, ASCII | +| Export footnotes/cross-refs | :white_check_mark: | `[fn:name]` refs, `<<target>>`/`[[#target]]` cross-refs, all 4 backends | +| Custom export backends | :white_check_mark: | Register via `org-export-register-backend!`, list with `org-export-list-backends` | +| **Clock tracking** | :large_blue_circle: | Clock-in/out, goto |