head	1.7;
access;
symbols
	pkgsrc-2026Q1:1.5.0.2
	pkgsrc-2026Q1-base:1.5;
locks; strict;
comment	@# @;


1.7
date	2026.04.09.17.16.54;	author pin;	state Exp;
branches;
next	1.6;
commitid	JtuIBrRIXK4C7jBG;

1.6
date	2026.04.02.14.11.48;	author pin;	state Exp;
branches;
next	1.5;
commitid	4PvoXzJ706AVjoAG;

1.5
date	2026.01.15.18.43.43;	author pin;	state Exp;
branches;
next	1.4;
commitid	CsCtIS4azceJiwqG;

1.4
date	2026.01.15.18.23.44;	author pin;	state Exp;
branches;
next	1.3;
commitid	BkU4IYTXd2hWbwqG;

1.3
date	2026.01.05.18.45.08;	author pin;	state Exp;
branches;
next	1.2;
commitid	9dZCIIEpVmu4DepG;

1.2
date	2026.01.05.06.07.16;	author pin;	state Exp;
branches;
next	1.1;
commitid	FBbLmzU8n8narapG;

1.1
date	2025.12.31.21.36.36;	author pin;	state Exp;
branches;
next	;
commitid	1M2vs0vIjlE0KBoG;


desc
@@


1.7
log
@editors/reovim: update to 0.14.4

v0.14.4
Highlights
Rope Buffer Migration (#711)

The core Buffer storage has been replaced from Vec<String> to a custom rope data structure — a B-tree with Arc structural sharing. This is the biggest internal change since the kernel architecture rewrite.

    O(1) clone — Buffer::clone() drops from ~8ms to ~16ns for a 100K-line buffer
    O(1) snapshots — BufferSnapshot and block::Snapshot use structural sharing instead of deep copy
    O(log n) edits — insert/delete operate on the tree, no full-line reallocation
    O(log n) position conversion — search and session hot paths eliminate O(n) content() materializations
    Zero external dependencies — custom implementation in mm/rope.rs
    All public Buffer API signatures unchanged — modules work without modification

11 Bug Fixes (#709, #712–#722)

Memory leaks, race conditions, silent failures, and incorrect behavior — all found via systematic verification and fixed:

    Memory leaks: Box::leak removed from CommandId, OperatorId, and input handling
    Race condition: TOCTOU in OptionRegistry::register fixed with held write lock
    Silent failures: LSP saturator panic detection, personality manifest error propagation, profiling filter usage
    Incorrect behavior: ge/gE word boundary dispatch, window close stale index, CJK display width, VFS error paths
    Testing: register queries now work via gRPC in IntegrationTest and StepTest

100% Code Coverage

    Full line, branch, and MC/DC coverage across kernel crates
    CI enforces both line AND branch coverage thresholds
    Dead branches eliminated or annotated with justification

v0.14.3
Highlights

This is the first release since v0.8.0 — 763 commits covering a complete architecture rewrite from monolithic editor to Linux kernel-inspired server/client architecture with gRPC v2 protocol.
Architecture (v0.9.0)

    Linux kernel-inspired architecture — Mechanism (kernel/drivers) vs Policy (modules) separation
    gRPC v2 protocol — Multi-client support with per-client viewports and cursors
    Server/client split — TUI, CLI, and Web clients connect to shared server
    Dynamic module loading — FFI with .so modules, declare_module! proc macro
    Event-driven kernel — EventBus, kernel events, flexible mode system

Client Layer Model (v0.12.0)

    Platform-agnostic ClientModule trait — Unified interface for TUI/Web/future clients
    Chrome compositor — Layout-aware rendering with priority and z-index
    ClientModule SDK — Testing utilities, ScopedSurface, error types for external module development
    FFI trampolines — 16 event dispatch + role declaration entry points
    Web CLM — TypeScript interfaces mirroring Rust traits, DOM render surface

SDK & Integration (v0.13.0)

    Content Codec Pipeline — Pluggable encoding (UTF-8, hex, CJK, PDF, ELF/ZIP, CSV)
    Module manifest system — Personality manifests, capability matching, dependency resolution
    Configuration profiles — Save/load named profiles, :profile commands

Feature Parity & Polish (v0.14.0)

    Marks and jump list — m, ', `, Ctrl-O, Ctrl-I
    Treesitter semantic text objects — if/af, ic/ac, ia/aa, io/ao, il/al
    Syntax highlight pipeline — End-to-end incremental tree-sitter parsing
    Client-side animations — Yank flash, landing screen breathing animation
    Rich statusline — Lualine-style sections with git, diagnostics, file info
    Tab/buffer bar — Pin, diagnostics, modified indicators
    Leap-style jump motions — s/S bidirectional with viewport scanning
    Format-on-save — External formatters (rustfmt, prettier) + LSP formatting
    Diagnostics panel — Trouble-style navigable panel with filtering/sorting
    Git hunk operations — Stage, reset, preview, ]h/[h navigation
    Word reference highlight — Illuminate-style cursor-hold highlighting
    H/M/L screen motions — Viewport-relative cursor positioning
    Core vim operators — :s substitute, gu/gU/~ case, R replace mode

Latest (v0.14.3)

    Injection decorations — Doc comments inherit markdown syntax (#696)
    Hover markdown rendering — Bold, italic, code, headings in hover popups (#697)
    Microscope preview syntax — Tree-sitter highlighting in fuzzy finder preview (#698)
    Bare code block inheritance — Fenced blocks in doc comments default to parent language (#701)
    LSP progress notifications — Producer-grouped notification UX (#691)
    LeaderKeyProvider — Personality binding infrastructure (#700)
    Diagnostic navigation — ]d/[d, ]e/[e, ]w/[w (#699)
    Non-blocking hover — Fire-and-forget async with ArcSwap cache
    100% MC/DC coverage — Full branch+condition coverage across kernel (#694)

Infrastructure

    Multi-client presence — Colorblind-friendly cursor labels
    OT-lite conflict resolution — Per-client undo isolation
    Completion engine — LSP source with nucleo fuzzy matching
    Range-finder — Jump navigation + code folding
    File explorer — Tree view with gitignore filtering
    Microscope fuzzy finder — Files, buffers, grep, git pickers
    Which-key — Keybinding popup with category grouping
    Snippet expansion — TextMate/LSP compatible with tab stops and transforms
    LSP client — Hover, signature help, diagnostics, go-to-definition, references, formatting
    Theme system — 3 builtin themes, 73 highlight groups, TOML overrides
    Health check — :checkhealth diagnostic system
    CI/CD — Branch + MC/DC coverage enforcement, sharded tests

Stats

    763 commits since v0.8.0
    ~136 workspace crates (kernel, 24 drivers, 59 modules, 3 clients, shared libs)
    100% MC/DC coverage on kernel crates
    Rust 2024 edition, minimum version 1.92
@
text
@# $NetBSD: Makefile,v 1.6 2026/04/02 14:11:48 pin Exp $

DISTNAME=	reovim-0.14.4
CATEGORIES=	editors
MASTER_SITES=	${MASTER_SITE_GITHUB:=ds1sqe/}
GITHUB_TAG=	v${PKGVERSION_NOREV}

MAINTAINER=	pkgsrc-users@@NetBSD.org
HOMEPAGE=	https://github.com/ds1sqe/reovim/
COMMENT=	Rust-powered neovim-like text editor
LICENSE=	gnu-agpl-v3

.include "cargo-depends.mk"

RUST_REQ=	1.92.0

INSTALLATION_DIRS=	bin

do-install:
	${INSTALL_PROGRAM} ${WRKSRC}/target/release/reovim \
		${DESTDIR}${PREFIX}/bin

.include "../../lang/rust/cargo.mk"
.include "../../devel/protobuf/buildlink3.mk"
.include "../../mk/bsd.pkg.mk"
@


1.6
log
@editors/reovim: cannot be updated

Rust-1.91.1 is too old.
@
text
@d1 1
a1 1
# $NetBSD: Makefile,v 1.5 2026/01/15 18:43:43 pin Exp $
d3 1
a3 3
DISTNAME=	reovim-0.8.1
# The MSRV relaxing patch no longer works.
# reovim v0.14.x requires Rust >= 1.92.
d15 2
d24 1
@


1.5
log
@reovim: reflect license change
@
text
@d1 1
a1 1
# $NetBSD: Makefile,v 1.4 2026/01/15 18:23:44 pin Exp $
d4 2
@


1.4
log
@editors/reovim: update to 0.8.1

## [0.8.1] - Unreleased

### Changed

- **Screen module reorganization** - Better separation of concerns
  - Created `render/` submodule: chrome (status/tab/cmd line), line, pipeline, separator
  - Created `layout/` submodule: split tree, tab management
  - Created `WindowStore` as single source of truth for windows
  - Simplified `Window` struct from 14 fields to 8 fields:
    - `bounds: WindowRect` (combines x, y, width, height)
    - `viewport: Viewport` (combines scroll, cursor, desired_col)
    - `config: WindowConfig` (groups line_number, scrollbar, sign_column, border)
    - `id: WindowId` (type-safe wrapper instead of raw usize)

### Added

- **Enhanced Markdown Decorations** (Epic #89) - Complete markdown rendering overhaul
  - **Phase 1: Heading Decorations** (#90)
    - Heading indentation by level (H1=0, H2=1 space, H3=2 spaces, etc.)
    - Inline code span background styling with backtick concealment
    - Link background styling for distinct link appearance
    - Strikethrough styling with `~~` marker concealment
  - **Phase 2: Horizontal Rules and Blockquotes** (#91)
    - Horizontal rules: `---`/`***`/`___` → full-width `────────` line
    - Blockquotes: `>` → `│ ` vertical bar with background color
  - **Phase 3: Table Border Decorations** (#92)
    - Visual unicode borders (─│┌┐└┘├┤┬┴┼) around markdown tables
    - Cells expand to uniform width with proper padding
    - New `MarkdownTableBorderStage` render stage
    - `virtual_lines` system in RenderData for rendering lines above/below content

- **% motion for matching bracket navigation** (Issue #123) - Jump between matching brackets
  - Supports `()`, `[]`, `{}` bracket pairs
  - Vim-compatible behavior: cursor on bracket jumps to match, otherwise searches forward on line
  - Inclusive motion for operator support (`d%`, `y%`, `c%`)
  - Added `Motion::MatchingBracket` variant to core motion system
  - Added `CursorMatchingBracketCommand` with `%` keybinding

- **Backtick auto-pair completion** (Issue #124) - Auto-close backticks when typing
  - Typing `` ` `` now auto-completes to ``` `` ``` with cursor between
  - Useful for markdown inline code, JavaScript template literals, shell command substitution
  - Added to pair plugin rainbow bracket highlighting

- **Explorer backspace and dot navigation** (Issue #128) - Navigate directories with Backspace and dot
  - `<Backspace>` in explorer navigates up to parent directory (changes root)
  - `.` sets current selection as new root directory
  - Matches nvim-tree behavior (navigate up with backspace, set root with dot)
  - Backspace still works for text deletion in input mode (create/rename/filter)

- **Sticky context headers** (Issue #88) - Overlay at viewport top showing enclosing scopes
  - Displays 1-3 parent scope headers as user scrolls through files
  - Works with both markdown headings and code scopes (functions, classes, impl blocks)
  - Uses same ContextProvider infrastructure as statusline breadcrumbs (#130, #131, #132)
  - Buffer content passed via EditorContext (same pattern as #133) for markdown support
  - Settings: `sticky_headers_enabled`, `sticky_headers_max_count`, `sticky_headers_show_separator`
  - z-order 125 overlay window using PluginWindow trait
  - Auto-queries context at top visible line

- **TreesitterContextProvider** - AST-based scope detection for breadcrumb navigation (#132)
  - Detects code hierarchy (functions, classes, impl blocks, methods) by analyzing treesitter parse tree
  - Multi-language support: Rust, Python, JavaScript, C, C++, Go, Java
  - Provides context at cursor position: e.g., `> mod.rs > impl Screen > fn render_windows`
  - Phase 3 of context provider system, enables statusline breadcrumb integration

- **Core ContextProvider trait and registry** (Issue #130) - Foundation for plugin-based context/scope detection
  - `ContextProvider` trait with `get_context()`, `name()`, `supports_buffer()` methods
  - `ContextItem` struct for representing individual context levels (text, line range, kind, level)
  - `ContextHierarchy` struct with helper methods (`to_breadcrumb()`, `current_scope()`, `at_level()`)
  - Multi-provider registry in `PluginStateRegistry` with priority-based resolution
  - Enables future implementations: markdown headings, treesitter AST nodes, LSP symbols

- **Markdown Context Provider** (Issue #131) - Detect heading hierarchy in markdown files
  - `MarkdownContextProvider` implementation with tree-sitter parsing
  - Supports H1-H6 ATX-style headings (`#`, `##`, `###`, etc.)
  - Smart caching with content hash for performance (>95% cache hit rate)
  - Stack-based hierarchy algorithm for nested headings
  - Returns breadcrumb format: `> CLAUDE.md > Architecture > Workspace Structure`
  - Extended `ContextProvider` trait API to pass `content: &str` parameter
  - 7 comprehensive unit tests covering edge cases

- **Context breadcrumb in statusline** (Issue #133) - Shows current scope hierarchy in statusline
  - Displays breadcrumb like: ` > CLAUDE.md > Section > Subsection > `
  - Works with markdown headings via `MarkdownContextProvider`
  - Works with code scopes via `TreesitterContextProvider` (Rust, Python, JS, C, etc.)
  - Smart truncation for long names and deep nesting
  - Settings: `context_breadcrumb_enabled`, `context_separator`, `context_max_items`
  - Extended `StatuslineRenderContext` to include active buffer content, ID, and cursor position
  - Completes Epic #129 (Context Provider Trait System)

- **Scope navigation commands** (Issue #133) - Jump between scope headers with keyboard shortcuts
  - `gu` - Jump to parent scope (go up)
  - `[s` - Jump to previous scope header (placeholder - TODO)
  - `]s` - Jump to next scope header (placeholder - TODO)
  - Works across all languages with context providers
  - Commands registered in treesitter plugin with keybindings

- **File explorer visual enhancements** (Issue #127) - nvim-tree style coloring and tree structure
  - **Dedicated FileExplorerStyles** in theme system with distinct colors for each file category:
    - Directories: blue (bold)
    - Source files: orange (for .rs, .py, .js, etc.)
    - Config files: gray/dimmed (for .toml, .yaml, .json)
    - Documentation: cyan (for README, .md)
    - Data files: magenta (for .csv, .sql, .db)
    - Media files: pink (for images, audio, video)
    - Special files: yellow (for LICENSE, .gitignore)
    - Lock files: dimmed yellow (for Cargo.lock, package-lock.json)
    - Executable files: green (for shell scripts, binaries)
    - Hidden files: dimmed gray
  - Box-drawing characters (│, ├, └) for visual tree hierarchy
  - Three tree styles: None (indent only), Simple (ASCII ">"), BoxDrawing (Unicode)
  - Hidden items count display at bottom: "(N hidden)" when hidden files are not shown
  - Explorer settings section with options:
    - `explorer.enable_colors` - Toggle file type coloring (default: true)
    - `explorer.tree_style` - Choose tree drawing style (default: "box_drawing")
    - `explorer.show_hidden` - Toggle hidden files visibility (default: false)
    - `explorer.show_sizes` - Toggle file size display (default: false)

### Enhanced

- **Bidirectional multi-char search** (Issue #125) - `s` key now searches both directions simultaneously
  - Added `Direction::Both` variant to support bidirectional search
  - Labels prioritize by distance (Manhattan distance from cursor)
  - Closest matches get simpler labels (s, f, n, j, k...)
  - Works with operators: `dsab` deletes to closest match in either direction

- **Viewport-limited jump labels** (Issue #126) - Range-finder labels now only appear within visible viewport
  - Added `active_window_height` field to EditorContext
  - Jump labels filtered by viewport boundaries in render
  - Dramatically reduces visual clutter in large files (100+ matches → ~50 visible labels)
  - Labels update automatically when scrolling

### Fixed

- **Cursor no longer moves into padding areas in decorated tables** (#89)
  - Added `col_mapping` to `DecorationKind::Conceal` for buffer→visual column translation
  - Position-based mapping algorithm that skips padding areas
  - Cursor stays on content characters, jumps directly to trailing space/pipe

- **Visual mode now disables decorations on selected lines** (#89)
  - Replaced single-line `is_insert_mode` with `skip_decoration_lines: HashSet<usize>`
  - In visual mode, all selected lines show raw markdown (like insert mode)
  - Works with visual (`v`), visual line (`V`), and visual block (`Ctrl-V`) modes

- **Multiple Conceal decorations per line now render correctly** (Issue #143)
  - Changed from single-index iterator to multi-decoration lookup
  - Now finds ALL decorations covering each character position
  - Conceal decorations can now apply background styles when both are present
  - Enables proper rendering of markdown table pipes and other multi-conceal scenarios

### Changed

- **reo-cli**: Changed default output format for `keys` command from `plain_text` to `raw_ansi` for better visual feedback (Issue #134)
- **reo-cli**: Added `--format` flag to `keys` command to allow choosing output format (raw_ansi, plain_text, cell_grid)

## [0.8.0] - 2026-01-09

### Fixed

- **tokio::spawn panics in EventBus handlers** (Issue #120) - Fix plugins using `tokio::spawn()` after PR #85 moved EventBus to std::thread
  - Capture `tokio::runtime::Handle::current()` at `subscribe()` start (runs in tokio context)
  - Use `handle.spawn()` instead of `tokio::spawn()` in EventBus handlers
  - Affected: completion (BufferModified), LSP (GotoDefinition, GotoReferences, ShowHover)

### Performance

- **Priority channels for user input events** (Issue #95, #86) - Dual-channel architecture for responsive user experience
  - Separates high-priority user input from low-priority background events
  - `hi_tx/hi_rx` (64 capacity): user input, mode changes, text insertion
  - `lo_tx/lo_rx` (255 capacity): render signals, plugins, background tasks
  - Biased `select!` ensures high-priority events processed first
  - `MAX_LO_DRAIN=16` provides fairness for background events
  - Auto-pair latency reduced from ~100ms to ~92us (1000x improvement, closes #86)

### Added

- **GitHub Actions CI pipeline** (Issue #121) - Automated code quality checks on PRs and pushes to develop
  - Format check with `cargo fmt --all --check`
  - Clippy with zero-warning enforcement (`-D warnings`)
  - Build verification for entire workspace
  - Unit tests and doc tests
  - Rust cache for faster subsequent builds

- **Dynamic content in DisplayRegistry** (Issue #57) - Allow plugins to show contextual status line info
  - `DisplayContext` struct for render context with `PluginStateRegistry` access
  - `DynamicDisplayFn` type alias for dynamic display callbacks
  - `DisplayInfo::with_dynamic()` method for fluent configuration
  - `DisplayInfoBuilder::dynamic()` builder method
  - `DisplayRegistry::display_string()` now takes `PluginStateRegistry` and invokes dynamic callbacks
  - Enables dynamic status like "Explorer (3 files)" or "Telescope (42 results)"

- **Window resize operations** (Issue #54) - Implement direction-specific window resizing
  - `SplitNode::adjust_ratio_in_direction()` - Find innermost split matching direction and adjust ratio
  - `Screen::resize_window(direction, delta)` - Public API for resizing active window
  - `WindowAction::Resize` handler now functional (5% ratio change per unit delta)
  - Vertical direction adjusts width, Horizontal direction adjusts height

- **Mouse click and scroll support** (Issue #59) - Basic mouse interaction for cursor positioning and scrolling
  - Left click: Move cursor to clicked position and focus window if different
  - Scroll wheel: Move viewport up/down by 3 lines, cursor adjusts to stay visible
  - Coordinate translation: Screen position to buffer position with gutter and scrollbar awareness
  - Server mode support: Mouse events forwarded in dual-output mode

- **Theme customization/override system** (Issue #55) - Allow users to override individual colors/styles in TOML config
  - `ThemeOverrides` struct for storing style path -> override mappings
  - `StyleOverride` struct with fg, bg, underline_color, and attribute options
  - `parse_color()` function supporting hex, rgb(), ansi:N, and named color formats
  - `Theme::from_name_with_overrides()` and `Theme::apply_overrides()` methods
  - `editor.theme_overrides` field in profile config schema
  - Example config:
    ```toml
    [editor.theme_overrides]
    "statusline.background" = { bg = "#1a1b26" }
    "gutter.line_number" = { fg = "#565f89" }
    "statusline.mode.normal" = { fg = "#1a1b26", bg = "#7aa2f7", bold = true }
    ```

- **Consolidated mode display logic into DisplayRegistry** (Issue #53) - Centralize all mode display logic in one place
  - New `display/icons.rs` module for icon constants
  - `DisplayRegistry::mode_icon()` - Get icon for current mode state
  - `DisplayRegistry::mode_style()` - Get style for current mode from theme
  - `DisplayRegistry::mode_name()` - Get display name ("Normal", "Insert", etc.)
  - `DisplayRegistry::short_mode_name()` - Get short name ("NORMAL", "INSERT", etc.)
  - `DisplayRegistry::hierarchical_display()` - Build "Kind | Mode | SubMode" string
  - Removed duplicate logic from `Screen` (was `get_mode_style()`, `get_mode_name()`)
  - Removed `ModeState::hierarchical_display()` - use `DisplayRegistry` instead
  - `ModeSnapshot::from_mode()` added for RPC serialization with display registry

- **Metadata-driven interactor input behavior** (Issue #46) - Refactored `accepts_char_input()` to use registry instead of hardcoded checks
  - `InteractorConfig` struct for configuring input behavior per interactor
  - `InteractorRegistry` for storing and querying interactor configurations
  - `accepts_char_input_with(registry)` method on `ModeState` for registry-based lookup
  - `PluginContext::register_interactor()` for plugins to register their input behavior
  - Window mode registered via `InteractorConfig::using_keymap()` instead of hardcoded exclusion
  - Default behavior: unregistered interactors accept character input (safe default)

- **HandlerContext mode change helpers** (Issue #44) - Reduce mode change boilerplate
  - `enter_interactor_mode(component_id)` - Enter interactor sub-mode for text input
  - `exit_to_normal()` - Return to normal editor mode
  - `set_mode(mode)` - Set arbitrary mode state for edge cases
  - Updated Range-Finder plugin: 5 mode changes simplified
  - Updated Microscope plugin: 1 mode change simplified

- **Subscription helper macros** (Issue #41) - Reduce plugin boilerplate with three new macros
  - `subscribe_state!` - Simple state mutation + render pattern (4 variants)
  - `subscribe_state_mode!` - State mutation + mode change + render (2 variants)
  - `subscribe_state_conditional!` - Conditional render based on return value (4 variants)
  - Migrated Explorer plugin: 23 subscription blocks (~180 lines saved)
  - Migrated Range-Finder plugin: 5 subscription blocks (~30 lines saved)
  - Total: ~210 lines of boilerplate removed across 28 subscription blocks

- **`subscribe_targeted()` API for EventBus** (Issue #45) - New method to automatically filter events by component ID
  - `TargetedEvent` trait for events with a `target: ComponentId` field
  - Implemented for `PluginTextInput`, `PluginBackspace`, and `RequestFocusChange`
  - Eliminates boilerplate target-checking code in plugin event handlers
  - Migrated 7 subscriptions across 4 plugins (Explorer, Microscope, Range-finder, Which-key)

### Changed

- **Remove dead status line code** (Issue #50) - Delete unused `StatusLineComponent` and consolidate duplicates
  - Deleted `lib/core/src/component/status_line.rs` (303 lines) - `StatusLineComponent` was never instantiated
  - Deleted `lib/core/src/screen/status_line.rs` (256 lines) - `StatusLineRenderer` trait was never called
  - Removed `impl StatusLineRenderer for Screen` (31 lines) - Only consumer of deleted functions
  - Active rendering uses `Screen::render_status_line_to_buffer()` which remains unchanged
  - Fixes OperatorPending style bug (was in dead code path using wrong style)

- **Remove unused cursor and animation theme features** (Issue #49) - Dead code cleanup
  - Removed `CursorStyles` struct (line, column, glow, pulse fields never accessed)
  - Removed `EffectConfig` struct (never instantiated)
  - Removed `AnimationConfig` struct (actual animation system uses hardcoded frame rate)
  - Removed `HighlightGroup::CursorEffect` enum variant (never applied)
  - Updated docs/animation-system.md to remove future config section

- **RAII-based cursor synchronization** (Issue #48) - Centralize cursor sync between windows and buffers
  - Added `Screen::save_cursor_to_active_window()` for pre-split cursor save
  - Added `Screen::switch_active_window()` for full cursor handoff during navigation
  - Refactored `handle_window_split()` to use centralized API (15 lines → 1 call)
  - Refactored `handle_window_navigate()` to use centralized API (50 lines → direction lookup + 1 call)
  - Eliminates manual cursor sync scattered across handlers, reducing error risk

- **Split large subscribe() methods** (Issue #52) - Improve plugin maintainability by splitting monolithic subscribe() methods
  - Explorer plugin: Split 426-line method into 9 focused sub-methods (raw_input, navigation, tree_operations, clipboard, file_operations, input_handling, visual_mode, focus_visibility, popup)
  - Range-Finder plugin: Split 191-line method into 5 focused sub-methods (jump_mode_handlers, jump_input_handler, fold_handlers, cleanup)
  - Removed `#[allow(clippy::too_many_lines)]` pragmas from both plugins

- **Decomposed window render_to_buffer() method** (Issue #51) - Extract focused helper methods for better testability
  - `compute_line_number_width()` - Calculate line number column width
  - `render_fold_marker_to_buffer()` - Render collapsed fold indicators
  - `render_empty_lines_to_buffer()` - Fill viewport with tilde markers
  - Main method reduced from ~106 to ~82 lines with clearer separation of concerns

- **Declarative mode metadata** (Issue #42) - Replace hardcoded `mode_for_command()` with `resulting_mode()` trait method
  - Added `resulting_mode()` method to `CommandTrait` with default `None` return
  - Implemented for 32 mode-changing commands (mode, window, operator, command-line)
  - Replaced 60-line string matching function with 6-line trait-based lookup
  - Provides compile-time safety: no more missing match arms causing flaky tests
  - Fixed bug: `enter_visual_line_mode` was missing from old implementation

- **Unified active buffer tracking** (Issue #47) - Removed redundant `active_buffer_id` field from Runtime
  - Screen is now the single source of truth for active buffer ID
  - `Runtime::active_buffer_id()` method derives value from `Screen::active_buffer_id()`
  - Eliminates dual tracking and manual synchronization between Runtime and Screen
  - Simplifies buffer switching, file opening, and window navigation code

- **Window move commands use SwapDirection** (Issue #54) - 8 move commands now use `SwapDirection` instead of `MoveDirection`
  - `WindowMoveLeft/Down/Up/Right` commands and their window-mode variants now perform actual swaps
  - Consistent behavior between move and swap operations

### Removed

- **`WindowAction::MoveDirection`** (Issue #54) - Removed redundant enum variant
  - Was identical in purpose to existing `SwapDirection` but never implemented
  - 8 commands updated to use `SwapDirection` directly

### Fixed

- **Light theme syntax highlighting** (Issue #43) - Light theme now uses proper One Light colors
  - Added `light_palette` module with Atom One Light colors (red, blue, purple, green, cyan, orange, yellow)
  - Created `TreesitterTheme::light()` with comprehensive capture mappings
  - Fixed `from_theme_name()` to correctly return light theme instead of dark
  - 3 new tests for light theme functionality

- **RegisterOption events not processed** (Issue #39) - Options registered via `bus.emit(RegisterOption)` are now properly added to the option registry
  - `:set` commands now work for all core options (signcolumn, number, tabwidth, etc.)
  - Fix: Create OptionRegistry before plugins subscribe and add event handler

## [0.7.10] - 2026-01-06

### Fixed

- **reo-cli REPL help text** (Issue #36) - Help text now auto-generated from clap definitions
  - Fixed incorrect `screen` command description (said "dimensions" but returned content)
  - Removed non-existent `screen-content` command from help
  - Added `screen-size` command for getting dimensions
  - Added `capture` as visible alias for `screen` command
  - Help text now always matches implementation (single source of truth)
  - Added 10 unit tests for command parsing and help generation

### Added

- **Sign column and virtual text configuration** (Issue #29) - Phase 3 of diagnostics system (#21)
  - Sign column modes: `auto`, `yes`, `no`, `number`
    - `auto`: Show sign column only when signs are present (width 2)
    - `yes`: Always show sign column (default, width 2)
    - `no`: Never show sign column
    - `number`: Display signs as background color on line numbers
  - Virtual text options: `:set virtual_text`, `virtual_text_prefix`, `virtual_text_max_length`, `virtual_text_show`
    - `virtual_text` (bool): Enable/disable virtual text display
    - `virtual_text_prefix` (string): Custom prefix (empty = use severity icons)
    - `virtual_text_max_length` (number): Maximum length before truncation (default: 80)
    - `virtual_text_show` (string): "first", "highest", or "all" mode
  - Settings menu integration for all new options under "Diagnostics" section
  - 14 new tests for sign column modes and virtual text configuration

- **Virtual text system for inline diagnostics** (Issue #28) - Display diagnostic messages after line content
  - `VirtualTextEntry` type with text, style, and priority fields
  - `VirtualTextStyles` in theme for severity-based styling (error, warn, info, hint)
  - Rendering with automatic truncation and ellipsis when exceeding viewport
  - LSP integration: severity icons (● error, ◐ warning, ⓘ info, · hint) + message
  - Priority-based resolution (ERROR 404 > WARNING 403 > INFO 402 > HINT 401)
  - 44 new tests covering all virtual text functionality

- **Multi-instance server support** (Issue #19) - Multiple reovim servers can now run concurrently
  - Port fallback: When default port (12521) is in use, server automatically tries 12522, 12523, etc.
  - Port files: Each server writes `~/.local/share/reovim/servers/<pid>.port` for discovery
  - `reo-cli list` command: Lists all running reovim server instances with PID and port
  - Auto-discovery: `reo-cli` auto-connects to single server, prompts when multiple servers running
  - Clean shutdown: Port files automatically removed when server exits

- **Ex-command registry system** - Plugins can now register custom ex-commands dynamically
  - `ExCommandRegistry` for thread-safe command registration and dispatch
  - `RegisterExCommand` event for plugin-based command registration
  - Support for three command patterns: zero-arg, single-arg, and subcommand
  - All handlers include descriptions for help/completion systems
- **Profile trait system** - Framework for extensible configuration profiles
  - `Configurable` trait for components that participate in profile save/load
  - `ProfileRegistry` for coordinating serialization across all registered components
  - `RegisterConfigurable` event for plugin components to register for profile management
  - Profile events: `ProfileLoadEvent`, `ProfileSaveEvent`, `ProfileListEvent`
- **ProfilesPlugin** - New plugin for profile command handling
  - `:profile list` - Open profile picker
  - `:profile load <name>` - Load a profile by name
  - `:profile save <name>` - Save current settings as a profile
- **Health check system** - Diagnostic system for verifying core and plugin status
  - `:health` and `:checkhealth` commands to open health check modal
  - Modal UI (z-order 700) with category grouping and navigation (j/k, r, q/Esc)
  - Expandable details view - press Space/Enter to toggle full details for selected check
  - `RegisterHealthCheck` event for plugins to register custom health checks
  - Built-in checks for runtime, plugin system, event bus, terminal, and keybindings
  - Plugin-decoupled architecture - zero core modifications using v0.7.9+ ex-command registry
- **Plugin-specific status line styling** - Plugins can now provide custom colors for status line
  - Each plugin defines its own `Style` with custom fg/bg colors
  - Visual identity: Explorer (orange), Microscope (blue), Settings (gray), Leap (green), Health (teal), Jump (gold)
  - Status line shows `[INTERACTOR][MODE]` as separate colored sections
  - `Color` type exported from `reovim_core::highlight` for plugin use
- **LSP debugging tools** (Issue #26) - Tools for debugging LSP communication
  - LSP health check: Shows server status, document count, diagnostic stats, and timestamps in `:health` modal
  - `:LspLog` command to open the latest LSP log file directly in the editor
  - Dedicated LSP log: `--lsp-log` flag for capturing JSON-RPC messages to separate file
    - `--lsp-log=default` creates timestamped `lsp-<timestamp>.log` in data directory
    - `--lsp-log=/path/to/file.log` for custom path
    - `--lsp-log=default:LEVEL` or `--lsp-log=/path:LEVEL` for configurable verbosity
    - Supported levels: error, warn, info, debug, trace (default: trace)
    - Logs show `->` for outgoing and `<-` for incoming messages
- **Request-driven cursor movement with operator support** - Plugin-to-runtime communication for cursor positioning
  - `RequestCursorMove` event allows plugins to request cursor movement
  - `Motion::JumpTo { line, column }` variant for absolute positioning
  - `InnerEvent::MoveCursor` for runtime event loop handling
  - Automatic operator integration: `d`/`y`/`c` + jump creates `OperatorMotionAction`
  - Runtime detects `OperatorPending` mode and applies operators to jump targets
  - Enables jump navigation, LSP goto-definition, and other plugin-driven navigation with full vim operator semantics

### Fixed

- **LSP diagnostics not received after opening files** (Issue #26)
  - rust-analyzer uses LSP 3.17 "pull diagnostics" instead of push notifications
  - Now request diagnostics immediately after `textDocument/didOpen`
  - Handle `workspace/diagnostic/refresh` requests from server

### Changed

- **DisplayInfo API (BREAKING)** - Simplified and made styling mandatory
  - `DisplayInfo::new()` now requires `style: Style` parameter
  - Removed `EditModeKey`, `SubModeKey` enums (mode-specific displays removed)
  - Removed `DisplayInfoBuilder::when_mode()` and `when_sub_mode()` methods
  - `DisplayRegistry` simplified to single HashMap lookup
  - `register_builtins()` now requires `theme` parameter
  - Plugins must update to provide styles when registering display info

- **Ex-command architecture refactored** - Full decoupling of core from plugin-specific commands (Issue #13)
  - Removed `Settings`, `ProfileLoad`, `ProfileSave`, `ProfileList` variants from `ExCommand` enum
  - Added generic `Plugin { command: String }` variant for all plugin-registered commands
  - Settings menu now registers `:settings` command via `RegisterExCommand` event
  - Profile commands now handled by dedicated ProfilesPlugin
  - Core handlers dispatch to registry instead of hardcoded match arms
- **Paste animation** - Visual pulse animation feedback for paste operations
  - Cyan pulsing glow (600ms, 2 cycles) when pasting with `p` or `P`
  - Distinct from yank's gold fade animation
  - Works with both characterwise and linewise paste
  - Helps locate pasted content in large files
- **Performance logging reduced** - [RTT] performance logs lowered from debug to trace level
  - Render timing, event loop, pipeline execution now require TRACE log level
  - Reduces noise in DEBUG logs while still available for performance analysis
  - Affects 10+ log statements across runtime, screen, and render modules

### Fixed

- **Yank animation for linewise motions** - `yj` and `yk` now correctly highlight entire lines
  - Previously only highlighted partial lines (current line for `yj`, upper line for `yk`)
  - Now properly animates all yanked lines from start to end
  - Affects all linewise motions: `j`, `k`, `gg`, `G`
- **Markdown decorations update immediately on insert/change** - Fixed stale cache bug in saturator
  - Saturator now calls `decorator.refresh()` before `decoration_range()` to update cached parse tree
  - Mirrors the pattern from syntax highlighting (`update_highlights()`)
  - Heading icons, bullets, checkboxes, and emphasis concealment now update in real-time
- **Decorations disabled on cursor line in insert mode** - Show raw markdown syntax while typing
  - When in insert mode, decorations are filtered out on the current line
  - Allows seeing raw markers (`# Heading`, `**bold**`, etc.) while editing
  - Decorations reappear when returning to normal mode

### Changed

- **Code cleanup in markdown plugin** - Removed dead code and streamlined query loading
  - Deleted `markdown/mod.rs` (685 lines of dead code, obsolete LanguageRenderer implementation)
  - Converted embedded query constants to `.scm` files via `include_str!()` (57 lines → 2 lines)
  - Queries now editable in `.scm` files with syntax highlighting support
  - Total reduction: ~740 lines

- **Range-Finder plugin** - Merged Leap and Fold plugins into unified navigation system
  - Combined jump navigation and code folding into single `reovim-plugin-range-finder` plugin
  - New architecture: `src/jump/` (navigation subsystem) + `src/fold/` (visibility subsystem)
  - Multi-char search: `s` + 2 chars + label to jump (leap-style navigation)
  - Enhanced f/t motions: `f`/`F`/`t`/`T` now use label selection for multiple matches
  - Smart auto-jump: 1 match → instant, 2-676 matches → show labels, >676 → cancel
  - Code folding: `za`/`zo`/`zc`/`zR`/`zM` (unchanged functionality)
  - Home row priority labels: `sfnjklhodweimbuyvrgtaqpcxz`
  - Single-char labels for <=26 matches, two-char labels for >26 matches (up to 676)
  - Two-char label input: first character validates, second completes the jump
  - Label overlay rendering with z-order 200 (above editor, below popups)
  - **BREAKING**: `f`/`F`/`t`/`T` keys now trigger leap-style label selection (replaces default vim single-char find/till)
  - Removed separate `reovim-plugin-leap` and `reovim-plugin-fold` plugins
  - Total plugin size: ~2,000 lines (vs 2,295 lines for separate plugins)
  - `[text](url)` → `text` (brackets and URL hidden)

- **Table rendering** - Header and delimiter row styling
  - Header row background highlighting
  - Delimiter row dimmed styling via `pipe_table*` node captures

- **Style system enhancements** - Added new text attributes
  - Added `BLINK` and `DIM` attribute constants
  - Added `blink()` and `dim()` builder methods to `Style`

- **Conceal style merging** - Fixed replacement character styling
  - Conceal replacement chars now use conceal's style merged with syntax highlights
  - Heading icons display with proper bold + color styling

- **Insert mode raw display** - Show raw markdown when editing
  - Decorations disabled in insert mode for accurate cursor positioning
  - Raw `#`, `*`, `**`, `[]()` markers visible during editing
  - Returns to concealed view on mode exit

- `lib/core/src/component/mod.rs` - Component module exports
- `lib/core/src/component/display.rs` - DisplayComponent trait + RenderContext
- `lib/core/src/component/status_line.rs` - StatusLineComponent
- `lib/core/src/component/tab_line.rs` - TabLineComponent

### Testing

- 318 unit tests passing
- All integration tests passing
@
text
@d1 1
a1 1
# $NetBSD: Makefile,v 1.3 2026/01/05 18:45:08 pin Exp $
d11 1
a11 1
LICENSE=	mit #gnu-agpl-v3
@


1.3
log
@editors/reovim: update to 0.7.9

Thanks ti wiz@@ for testing the patch reducing MSRV.

[0.7.9]
Added

    Microscope syntax highlighting - Preview panels now show syntax-highlighted code
        File picker (Space f f) previews display full syntax highlighting
        Grep picker (Space f g) shows highlighted matches with context
        Recent files picker (Space f r) includes syntax highlighting
        Language injection support (markdown code blocks, etc.)
        On-demand highlighting via SyntaxFactory integration (no background tasks)
        Graceful degradation when treesitter unavailable (plain text fallback)
        New syntax_helper module in pickers crate for highlight computation
        Updated Picker::preview() trait to accept PickerContext with factories

    Landing page animation (WIP) - Animated ASCII lion on startup dashboard
        Three size variants: Large (roar), Medium (sleep), Small (breathing)
        Responsive size selection based on terminal dimensions
        Animation controller with Loop, PingPong, Once modes
        This is the initial implementation; more dashboard enhancements planned

    Reo color system - 45-color HSL-organized palette (Tokyo Night + Catppuccin + One Dark)

    Extended Rust highlighting - Pattern types, operator expressions, async/unsafe, type syntax captures

    Documentation - docs/color-system.md, docs/syntax-highlighting.md

Fixed

    Characterwise paste positioning - Fixed p command to paste AFTER cursor for characterwise yanks
        Y (yank to end of line) followed by p now correctly pastes after cursor position
        Previously pasted at cursor position instead of after it (breaking Vim compatibility)
        Added cursor movement logic (buf.cur.x += 1) before characterwise paste when before=false
        All yank operations now properly track yank type (linewise vs characterwise)

    Linewise paste behavior - Fixed dd/yy paste to use proper linewise semantics
        p now pastes BELOW current line (Vim behavior)
        P now pastes ABOVE current line (Vim behavior)
        Previously pasted at cursor position, corrupting text for linewise operations
        Added insert_linewise() method to buffer for proper linewise paste handling

    Yank type tracking - Extended yank/delete operators to track linewise vs characterwise
        Added YankType enum and RegisterContent struct to register system
        Updated Delete operator to detect linewise motions (dj, dk, dd)
        Updated Change operator to detect linewise motions (cj, ck, cc)
        Extended CommandResult::ClipboardWrite with yank_type field
        All 26 operator tests pass with correct yank/paste behavior

    Yank animations - Added visual feedback for Y and yy commands

    Terminal cleanup on exit - Fixed afterimage and "%" marker issues when closing reovim
        Implemented RAII TerminalGuard to guarantee cleanup even on panic
        Now uses alternate screen mode to isolate editor UI from shell
        Cursor is properly restored and final newline printed on exit
        Terminal state is always restored, preventing broken terminal after crashes
        Added lib/core/src/command/terminal/terminal_guard.rs with Drop trait implementation
        Y (yank to end) now highlights from cursor to end of line
        yy (yank line) now highlights entire current line
        Extended CommandResult::ClipboardWrite with yank_range field for animation support
        Animation start position adjusted (x+1) to avoid highlighting extra character on left
        Visual feedback matches Vim's yank highlight feature

    Jump list navigation (Ctrl+O/Ctrl+I) - Fixed non-functional jump navigation (#4)
        Added Tab as fallback keybinding for jump-newer (works in all terminals)
        Enabled Kitty keyboard enhancement protocol for modern terminals (kitty, WezTerm, foot)
        Added Ctrl+O/Ctrl+I/Tab bindings to insert mode (jump navigation works during editing)
        Jump points recorded when leaving insert mode (records where editing finished, not started)
        Fixed current_index calculation bug where first Ctrl+O did nothing
        Fixed duplicate detection causing current_index to become invalid
        Fixed duplicate detection truncating jump history (entries were lost on subsequent pushes)
        Fixed INSERT LEAVE truncating all previous jump entries (now preserves full history)
        Fixed Ctrl+O requiring double press (now automatically skips current position)
        Marked LSP goto definition/references commands as jumps (gd, gr)
        Marked leap and buffer navigation commands as jump-recording actions (s/S, H/L)
        Root cause: Ctrl+I was indistinguishable from Tab in traditional terminals
        UX improvement: Jump back to where you finished editing, not where you started

    Landing page animation alignment - All frame lines now have consistent widths to prevent horizontal shifting during animation

    Landing page size thresholds - Adjusted thresholds so "Large" requires actually large terminals (50×24+), "Medium" for normal windows (35×16+)

    Notification tests failing locally - LSP plugin now skips auto-start when REOVIM_TEST env var is set, preventing progress notifications from polluting test state

    Tree-sitter Rust query errors - Fixed invalid node types (rest_pattern, type_bound_list, etc.)
@
text
@d1 1
a1 1
# $NetBSD: Makefile,v 1.1 2025/12/31 21:36:36 pin Exp $
d3 1
a3 1
DISTNAME=	reovim-0.7.9
d11 1
a11 1
LICENSE=	mit
@


1.2
log
@editors/reovim: add note on MSRV
@
text
@d3 1
a3 2
DISTNAME=	reovim-0.7.8
# reovim >= 0.7.9 requires Rust >= 1.92
@


1.1
log
@editors/reovim: add package

A Rust-powered neovim-like text editor.

Project Goals

- Fastest-reaction editor: Minimal latency, instant response
- Scalability: Handles large files and complex operations
- Zero-warning policy: All code must compile warning-free
@
text
@d1 1
a1 1
# $NetBSD$
d4 1
@

