hjkl-vim 0.6.0

Vim modal state types and grammar primitives for the hjkl editor stack. Pre-1.0 churn.
Documentation
/// Controller commands the host engine implements. hjkl-vim never mutates
/// the editor directly — it emits a command and the host (apps/hjkl) calls
/// the corresponding `Editor` method.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EngineCmd {
    ReplaceChar {
        ch: char,
        count: usize,
    },
    /// Emitted by `PendingState::Find` when the user completes `f<x>` / `F<x>`
    /// / `t<x>` / `T<x>`. The host calls `Editor::find_char`.
    FindChar {
        ch: char,
        forward: bool,
        till: bool,
        count: usize,
    },
    /// Emitted by `PendingState::AfterG` when the user completes `g<x>`. The
    /// host calls `Editor::after_g(ch, count)`.
    AfterGChord {
        ch: char,
        count: usize,
    },
    /// Emitted by `PendingState::AfterZ` when the user completes `z<x>`. The
    /// host calls `Editor::after_z(ch, count)`.
    AfterZChord {
        ch: char,
        count: usize,
    },
    /// `d<motion>` / `y<motion>` / `c<motion>` / `><motion>` / `<<motion>` —
    /// apply operator over a single-key motion. `motion_key` is the raw key
    /// char (e.g. `'w'`, `'$'`, `'G'`). Engine parses via `parse_motion` and
    /// applies. `total_count = count1 * inner_count`.
    ApplyOpMotion {
        op: crate::operator::OperatorKind,
        motion_key: char,
        total_count: usize,
    },
    /// `dd` / `yy` / `cc` / `>>` / `<<` — doubled-letter line op.
    ApplyOpDouble {
        op: crate::operator::OperatorKind,
        total_count: usize,
    },
    /// `di` / `da` — operator-pending text object entry. Engine sets
    /// `Pending::OpTextObj` for the next bracket key. Sub-state lifts in 2c-iii.
    EnterOpTextObj {
        op: crate::operator::OperatorKind,
        count1: usize,
        inner: bool,
    },
    /// `dg` — operator-pending g-chord entry. Engine sets `Pending::OpG`.
    /// Sub-state lifts in 2c-iv.
    EnterOpG {
        op: crate::operator::OperatorKind,
        count1: usize,
    },
    /// `df` / `dF` / `dt` / `dT` — operator-pending find entry. Engine sets
    /// `Pending::OpFind`. Sub-state lifts in 2c-ii.
    EnterOpFind {
        op: crate::operator::OperatorKind,
        count1: usize,
        forward: bool,
        till: bool,
    },
    // Future variants land in chunks 2c–2e: GotoMark, etc.
}