rwb-codemirror-helix 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +331 -0
- package/dist/index.cjs +3849 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +150 -0
- package/dist/index.d.ts +150 -0
- package/dist/index.js +3859 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/state.ts","../src/cursor.ts","../src/keymap.ts","../src/motion.ts","../src/edit.ts","../src/search.ts","../src/multiselect.ts","../src/jumplist.ts","../src/goto-word.ts"],"sourcesContent":["/**\n * index.ts – Public API for codemirror-helix\n *\n * Usage:\n * import { helixKeymap } from \"codemirror-helix\";\n *\n * const view = new EditorView({\n * extensions: [helixKeymap(), ...],\n * });\n */\n\nimport { type Extension, EditorState } from \"@codemirror/state\";\nimport { history } from \"@codemirror/commands\";\nimport { helixStateField, lastModPosField, type HelixMode } from \"./state.js\";\nimport { blockCursorPlugin, helixBaseTheme, modeClassPlugin } from \"./cursor.js\";\nimport { buildHelixKeymap, statusBarExtension } from \"./keymap.js\";\nimport {\n searchStateField,\n searchMatchPlugin,\n searchPanelExtension,\n searchTheme,\n} from \"./search.js\";\nimport { gotoWordPlugin, gotoWordTheme } from \"./goto-word.js\";\nimport {\n multiSelectStateField,\n multiSelectPanelExtension,\n multiSelectTheme,\n} from \"./multiselect.js\";\nimport { jumpListField } from \"./jumplist.js\";\n\nexport { type HelixMode, helixStateField } from \"./state.js\";\nexport {\n searchStateField,\n openSearchForward,\n openSearchBackward,\n gotoNextMatch,\n gotoPrevMatch,\n} from \"./search.js\";\n\nexport interface HelixKeymapOptions {\n /**\n * Default mode when the editor is created.\n * @default \"normal\"\n */\n defaultMode?: HelixMode;\n\n /**\n * Whether to show the status bar at the bottom of the editor.\n * @default true\n */\n statusBar?: boolean;\n}\n\n/**\n * Returns a CodeMirror extension that implements Helix keybindings.\n *\n * Supported features\n * ──────────────────\n * • Normal / Insert / Select modes\n * • Block cursor with per-mode CSS classes (helix-mode-normal, etc.)\n * • All basic motions: h j k l w b e W B E f F t T ; ,\n * • g-prefix (goto): gg ge gh gl gs gt gc gb gj gk g.\n * • z-prefix (view): zz zt zb zj zk; Z sticky view mode\n * • m-prefix (match): mm ms mr md mi ma\n * • [ / ] bracket-next/prev prefixes: ]p [p ]Space [Space\n * • Editing: d c y p P R r ~ ` Alt-` > < J . u U Ctrl-a Ctrl-x & (align)\n * • Multi-selection: s S Alt-s K Alt-K C Alt-c V\n * • Insert mode: normal character input, Ctrl-w Ctrl-u Ctrl-k Ctrl-r Enter\n * • Search: / ? n N * Alt-* (inline panel, regex-capable)\n * • Count prefixes: 1-9 before any motion\n * • Surround: ms<c> mr<from><to> md<c>\n * • Text objects: mi<obj> ma<obj> (w W p ( [ { < \" ' `)\n * • Block comment toggle: Ctrl-c\n * • Jump list: Ctrl-s (save), Ctrl-o (back), Ctrl-i (forward)\n */\nexport function helixKeymap(options: HelixKeymapOptions = {}): Extension {\n const { defaultMode = \"normal\", statusBar = true } = options;\n\n const extensions: Extension[] = [\n // Core state\n EditorState.allowMultipleSelections.of(true),\n helixStateField,\n searchStateField,\n multiSelectStateField,\n jumpListField,\n lastModPosField,\n history(),\n\n // Visual\n helixBaseTheme,\n searchTheme,\n gotoWordTheme,\n multiSelectTheme,\n modeClassPlugin,\n blockCursorPlugin,\n searchMatchPlugin,\n gotoWordPlugin,\n\n // Panels\n searchPanelExtension,\n multiSelectPanelExtension,\n\n // Keybindings + input blocking\n ...buildHelixKeymap(),\n ];\n\n if (statusBar) {\n extensions.push(statusBarExtension);\n }\n\n return extensions;\n}\n\n/**\n * Read the current Helix mode from an EditorState.\n */\nexport function getHelixMode(state: EditorState): HelixMode {\n return state.field(helixStateField).mode;\n}\n","import {\n Annotation,\n StateEffect,\n StateField,\n type EditorState,\n type Transaction,\n} from \"@codemirror/state\";\n\n// ── Mode ─────────────────────────────────────────────────────────────────────\n\nexport type HelixMode = \"normal\" | \"insert\" | \"select\";\n\n// ── Pending operations (multi-key sequences) ──────────────────────────────────\n//\n// When a prefix key is pressed (g, z, m, f, t, F, T, r, [, ]) we store what\n// we're waiting for so the next keystroke can be interpreted correctly.\n\nexport type PendingOp =\n | { type: \"goto\" }\n | { type: \"view\" }\n | { type: \"match\" }\n | { type: \"window\" }\n | { type: \"space\" }\n | { type: \"bracket_next\" } // ] prefix\n | { type: \"bracket_prev\" } // [ prefix\n | { type: \"find_forward\" }\n | { type: \"find_backward\" }\n | { type: \"till_forward\" }\n | { type: \"till_backward\" }\n | { type: \"replace_char\" }\n | { type: \"surround_add\" }\n | { type: \"surround_replace\"; char: string }\n | { type: \"surround_delete\" }\n | { type: \"select_inside\" }\n | { type: \"select_around\" }\n | { type: \"register_select\" }\n | { type: \"goto_word\"; input: string }\n | { type: \"view_sticky\" }\n | { type: \"insert_register\" };\n\n// ── Named registers ───────────────────────────────────────────────────────────\n\nexport type Registers = Record<string, string>;\n\n// ── Last change (for dot-repeat) ─────────────────────────────────────────────\n\nexport interface LastChange {\n // A re-runnable command. We store it outside state (module-level) because\n // CodeMirror state must be serialisable.\n fn: (view: import(\"@codemirror/view\").EditorView) => boolean;\n}\n\n// Module-level mutable cell for dot-repeat (cannot live in immutable state).\nexport const lastChange: { current: LastChange | null } = { current: null };\n\n// Module-level cell to record insert-mode text for dot-repeat.\nexport const insertRecord: {\n active: boolean;\n changes: Array<{ from: number; to: number; insert: string }>;\n} = { active: false, changes: [] };\n\n// ── Core Helix state ─────────────────────────────────────────────────────────\n\nexport interface HelixState {\n mode: HelixMode;\n /** Accumulating digit prefix, e.g. \"12\" before 12j */\n count: string;\n /** Waiting for next char(s) in a multi-key sequence */\n pendingOp: PendingOp | null;\n /** Named registers */\n registers: Registers;\n /** Active register name ('\"' = unnamed) */\n currentRegister: string;\n /** Last search (for n/N) */\n lastSearch: { pattern: string; forward: boolean } | null;\n /** Last f/F/t/T char find (for Alt-.) */\n lastCharFind: { char: string; type: \"f\" | \"F\" | \"t\" | \"T\" } | null;\n}\n\n// ── State effects ────────────────────────────────────────────────────────────\n\nexport const setModeEffect = StateEffect.define<HelixMode>();\nexport const setCountEffect = StateEffect.define<string>();\nexport const appendCountEffect = StateEffect.define<string>();\nexport const clearCountEffect = StateEffect.define<null>();\nexport const setPendingOpEffect = StateEffect.define<PendingOp | null>();\nexport const setRegisterEffect = StateEffect.define<{\n name: string;\n value: string;\n}>();\nexport const setCurrentRegisterEffect = StateEffect.define<string>();\nexport const setLastSearchEffect = StateEffect.define<{\n pattern: string;\n forward: boolean;\n} | null>();\nexport const setLastCharFindEffect = StateEffect.define<{\n char: string;\n type: \"f\" | \"F\" | \"t\" | \"T\";\n} | null>();\n\n// ── Annotation to mark our own transactions ───────────────────────────────────\n//\n// We annotate every transaction we dispatch so the transaction filter can\n// distinguish them from raw user-input (typing) transactions.\n\nexport const helixAnnotation = Annotation.define<true>();\n\n// ── State field ───────────────────────────────────────────────────────────────\n\nconst initialState: HelixState = {\n mode: \"normal\",\n count: \"\",\n pendingOp: null,\n registers: {},\n currentRegister: '\"',\n lastSearch: null,\n lastCharFind: null,\n};\n\nexport const helixStateField = StateField.define<HelixState>({\n create(): HelixState {\n return initialState;\n },\n\n update(state: HelixState, tr: Transaction): HelixState {\n let next = state;\n for (const effect of tr.effects) {\n if (effect.is(setModeEffect)) {\n next = { ...next, mode: effect.value };\n } else if (effect.is(setCountEffect)) {\n next = { ...next, count: effect.value };\n } else if (effect.is(appendCountEffect)) {\n next = { ...next, count: next.count + effect.value };\n } else if (effect.is(clearCountEffect)) {\n next = { ...next, count: \"\" };\n } else if (effect.is(setPendingOpEffect)) {\n next = { ...next, pendingOp: effect.value };\n } else if (effect.is(setRegisterEffect)) {\n next = {\n ...next,\n registers: { ...next.registers, [effect.value.name]: effect.value.value },\n };\n } else if (effect.is(setCurrentRegisterEffect)) {\n next = { ...next, currentRegister: effect.value };\n } else if (effect.is(setLastSearchEffect)) {\n next = { ...next, lastSearch: effect.value };\n } else if (effect.is(setLastCharFindEffect)) {\n next = { ...next, lastCharFind: effect.value };\n }\n }\n return next;\n },\n});\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nexport function getHelixState(state: EditorState): HelixState {\n return state.field(helixStateField);\n}\n\nexport function getCount(state: EditorState, fallback = 1): number {\n const raw = state.field(helixStateField).count;\n if (!raw) return fallback;\n const n = parseInt(raw, 10);\n return isNaN(n) || n === 0 ? fallback : n;\n}\n\nexport function getRegister(state: EditorState): string {\n const hs = getHelixState(state);\n const name = hs.currentRegister;\n return hs.registers[name] ?? \"\";\n}\n\n// ── Last-modification position (for g.) ───────────────────────────────────────\n//\n// Tracks the document position of the most recent edit. Updated on every\n// transaction that changes the document so it works with undo, paste, etc.\n// Value is -1 when no modification has occurred in this session.\n\nexport const lastModPosField = StateField.define<number>({\n create: () => -1,\n update(pos, tr) {\n if (!tr.docChanged) return pos;\n // Find the position of the first change in the *new* document.\n let firstFrom = pos;\n let seen = false;\n tr.changes.iterChanges((_fromA, _toA, fromB) => {\n if (!seen) { firstFrom = fromB; seen = true; }\n });\n return firstFrom;\n },\n});\n","/**\n * cursor.ts\n *\n * Visual layer for Helix mode:\n * - In normal / select mode the cursor is rendered as a filled block.\n * - A CSS class is added to the editor root so that themes can react to the\n * current mode.\n * - In insert mode CodeMirror's default bar cursor is used.\n */\n\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n} from \"@codemirror/view\";\nimport { getHelixState, helixStateField } from \"./state.js\";\n\n// ── Decoration for the block cursor ─────────────────────────────────────────\n\nconst blockCursorMark = Decoration.mark({ class: \"helix-block-cursor\" });\n\nfunction buildBlockCursorDecorations(view: EditorView): DecorationSet {\n const state = view.state;\n const hs = getHelixState(state);\n if (hs.mode === \"insert\") return Decoration.none;\n\n const builder = new RangeSetBuilder<Decoration>();\n const doc = state.doc;\n\n for (const range of state.selection.ranges) {\n const from = range.head;\n if (from < doc.length) {\n const ch = doc.sliceString(from, from + 1);\n if (ch !== \"\\n\") {\n builder.add(from, from + 1, blockCursorMark);\n }\n }\n }\n\n return builder.finish();\n}\n\n// ── Block cursor plugin ───────────────────────────────────────────────────────\n\nexport const blockCursorPlugin = ViewPlugin.fromClass(\n class BlockCursorPlugin {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildBlockCursorDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (\n update.docChanged ||\n update.selectionSet ||\n update.startState.field(helixStateField) !==\n update.state.field(helixStateField)\n ) {\n this.decorations = buildBlockCursorDecorations(update.view);\n }\n }\n },\n { decorations: (v) => v.decorations },\n);\n\n// ── Mode class plugin ─────────────────────────────────────────────────────────\n\nexport const modeClassPlugin = ViewPlugin.fromClass(\n class ModeClassPlugin {\n lastMode = \"\";\n\n constructor(view: EditorView) {\n this.applyClass(view, getHelixState(view.state).mode);\n }\n\n update(update: ViewUpdate) {\n const mode = getHelixState(update.state).mode;\n if (mode !== this.lastMode) {\n this.applyClass(update.view, mode);\n }\n }\n\n applyClass(view: EditorView, mode: string) {\n view.dom.classList.remove(\n \"helix-mode-normal\",\n \"helix-mode-insert\",\n \"helix-mode-select\",\n );\n view.dom.classList.add(`helix-mode-${mode}`);\n this.lastMode = mode;\n }\n },\n);\n\n// ── Base theme ───────────────────────────────────────────────────────────────\n\nexport const helixBaseTheme = EditorView.baseTheme({\n // Hide the default blinking caret in normal/select mode.\n \"&.helix-mode-normal .cm-cursor, &.helix-mode-select .cm-cursor\": {\n display: \"none !important\",\n },\n\n // Block-cursor highlight\n \"& .helix-block-cursor\": {\n background: \"rgba(130, 170, 255, 0.4)\",\n borderRadius: \"1px\",\n },\n\n // Slightly different colour in select mode\n \"&.helix-mode-select .helix-block-cursor\": {\n background: \"rgba(255, 200, 100, 0.4)\",\n },\n\n // Status bar — inherits the editor background/foreground so it blends in\n // regardless of whether the editor theme is light or dark.\n \"& .helix-status-bar\": {\n padding: \"2px 8px\",\n fontSize: \"0.85em\",\n fontFamily: \"monospace\",\n background: \"var(--helix-status-bg, inherit)\",\n color: \"var(--helix-status-fg, inherit)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n userSelect: \"none\",\n borderTop: \"1px solid var(--helix-status-border, #999)\",\n opacity: \"0.9\",\n },\n \"& .helix-status-mode\": {\n fontWeight: \"bold\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n },\n \"& .helix-status-mode-normal\": { color: \"var(--helix-normal-color, #0080e0)\" },\n \"& .helix-status-mode-insert\": { color: \"var(--helix-insert-color, #008c20)\" },\n \"& .helix-status-mode-select\": { color: \"var(--helix-select-color, #c05800)\" },\n \"& .helix-status-count\": { color: \"var(--helix-count-color, inherit)\" },\n \"& .helix-status-pending\": {\n color: \"var(--helix-pending-color, inherit)\",\n fontStyle: \"italic\",\n opacity: \"0.7\",\n },\n \"& .helix-status-register\": { color: \"var(--helix-register-color, #7000c0)\" },\n});\n","/**\n * keymap.ts\n *\n * Assembles the full Helix keymap extension.\n *\n * Architecture:\n * 1. A high-priority keymap handles mode-specific keys.\n * 2. Every key handler checks the current mode and returns false if it\n * doesn't apply, allowing the event to fall through.\n * 3. A transaction filter blocks raw user-input text insertion in normal /\n * select mode.\n * 4. A DOM event handler intercepts \"any char\" presses when a pending\n * operation is waiting for a follow-up character (f/F/t/T/r/m).\n * 5. A digit handler accumulates count prefixes.\n */\n\nimport { Prec, Transaction } from \"@codemirror/state\";\nimport { keymap, EditorView, type KeyBinding } from \"@codemirror/view\";\nimport {\n getCount,\n getHelixState,\n helixAnnotation,\n helixStateField,\n setModeEffect,\n appendCountEffect,\n clearCountEffect,\n setPendingOpEffect,\n setCurrentRegisterEffect,\n type PendingOp,\n} from \"./state.js\";\n\nimport * as motion from \"./motion.js\";\nimport * as edit from \"./edit.js\";\nimport * as search from \"./search.js\";\nimport * as multiselect from \"./multiselect.js\";\nimport * as jumplist from \"./jumplist.js\";\nimport { computeGotoWordLabels, gotoWordStore } from \"./goto-word.js\";\n\n// ── Helper: check mode before running a command ───────────────────────────────\n\ntype Cmd = (view: EditorView) => boolean;\n\nfunction inMode(modes: Array<\"normal\" | \"insert\" | \"select\">, cmd: Cmd): Cmd {\n return (view) => {\n const hs = getHelixState(view.state);\n if (!modes.includes(hs.mode)) return false;\n // Block all \"normal\" commands when a pending op is waiting for a sub-key.\n // The specific pending-op subkey handlers (gotoSubkey, viewSubkey, etc.)\n // are listed BEFORE these general bindings in the keymap array.\n if (hs.pendingOp !== null) return false;\n return cmd(view);\n };\n}\n\nfunction normal(cmd: Cmd): Cmd {\n return inMode([\"normal\"], cmd);\n}\n\nfunction normalOrSelect(cmd: Cmd): Cmd {\n return inMode([\"normal\", \"select\"], cmd);\n}\n\nfunction insertOnly(cmd: Cmd): Cmd {\n return inMode([\"insert\"], cmd);\n}\n\n// Clears pendingOp after the command (used for goto/view/etc subkeys)\nfunction clearsPending(cmd: Cmd): Cmd {\n return (view) => {\n const result = cmd(view);\n if (result) {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n }\n return result;\n };\n}\n\n// ── Helpers for pendingOp subkeys ─────────────────────────────────────────────\n\nfunction gotoSubkey(key: string, cmd: Cmd): KeyBinding {\n return {\n key,\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (!hs.pendingOp || hs.pendingOp.type !== \"goto\") return false;\n return cmd(view);\n },\n };\n}\n\nfunction viewSubkey(key: string, cmd: Cmd): KeyBinding {\n return {\n key,\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n const opType = hs.pendingOp?.type;\n if (opType !== \"view\" && opType !== \"view_sticky\") return false;\n const sticky = opType === \"view_sticky\";\n const result = cmd(view);\n // In sticky view mode, the cmd dispatches setPendingOpEffect.of(null); restore it.\n if (sticky && result) {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"view_sticky\" })],\n annotations: helixAnnotation.of(true),\n });\n }\n return result;\n },\n };\n}\n\nfunction matchSubkey(key: string, cmd: Cmd): KeyBinding {\n return {\n key,\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (!hs.pendingOp || hs.pendingOp.type !== \"match\") return false;\n return cmd(view);\n },\n };\n}\n\nfunction bracketNextSubkey(key: string, cmd: Cmd): KeyBinding {\n return {\n key,\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (!hs.pendingOp || hs.pendingOp.type !== \"bracket_next\") return false;\n return cmd(view);\n },\n };\n}\n\nfunction bracketPrevSubkey(key: string, cmd: Cmd): KeyBinding {\n return {\n key,\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (!hs.pendingOp || hs.pendingOp.type !== \"bracket_prev\") return false;\n return cmd(view);\n },\n };\n}\n\n// ── Count digit handler ───────────────────────────────────────────────────────\n\nfunction makeDigitBinding(digit: string): KeyBinding {\n return {\n key: digit,\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp !== null) return false;\n // 0 with no count in progress = line start; otherwise it's a digit\n if (digit === \"0\" && hs.count === \"\") {\n return motion.moveToLineStart(view);\n }\n view.dispatch({\n effects: [appendCountEffect.of(digit)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n };\n}\n\nconst digitBindings: KeyBinding[] = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\"].map(\n makeDigitBinding,\n);\n\n// ── Main keymap ───────────────────────────────────────────────────────────────\n\nconst helixBindings: KeyBinding[] = [\n // ── Mode transitions ────────────────────────────────────────────────────────\n { key: \"Escape\", run: edit.returnToNormal },\n { key: \"i\", run: normal((view) => {\n const hs = getHelixState(view.state);\n if (hs.pendingOp) return false;\n return edit.enterInsertMode(view);\n }) },\n { key: \"a\", run: normal((view) => {\n const hs = getHelixState(view.state);\n if (hs.pendingOp) return false;\n return edit.enterInsertModeAfter(view);\n }) },\n { key: \"I\", run: normalOrSelect(edit.enterInsertModeLineStart) },\n { key: \"A\", run: normalOrSelect(edit.enterInsertModeLineEnd) },\n { key: \"o\", run: normalOrSelect(edit.openLineBelow) },\n { key: \"O\", run: normalOrSelect(edit.openLineAbove) },\n { key: \"v\", run: normal((view) => {\n const hs = getHelixState(view.state);\n if (hs.pendingOp) return false;\n return edit.enterSelectMode(view);\n }) },\n { key: \"V\", run: normal((view) => {\n const hs = getHelixState(view.state);\n if (hs.pendingOp) return false;\n // Select the current line, then enter select mode.\n motion.selectLine(view);\n return edit.enterSelectMode(view);\n }) },\n\n // ── Basic movement ──────────────────────────────────────────────────────────\n { key: \"h\", run: normalOrSelect(motion.moveLeft) },\n { key: \"ArrowLeft\", run: normalOrSelect(motion.moveLeft) },\n { key: \"j\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.moveDown(view);\n }},\n { key: \"ArrowDown\", run: normalOrSelect(motion.moveDown) },\n { key: \"k\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.moveUp(view);\n }},\n { key: \"ArrowUp\", run: normalOrSelect(motion.moveUp) },\n { key: \"l\", run: normalOrSelect(motion.moveRight) },\n { key: \"ArrowRight\", run: normalOrSelect(motion.moveRight) },\n\n // ── Word movement ───────────────────────────────────────────────────────────\n { key: \"w\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.moveToNextWordStart(view);\n }},\n { key: \"b\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.moveToPrevWordStart(view);\n }},\n { key: \"e\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.moveToNextWordEnd(view);\n }},\n { key: \"W\", run: normalOrSelect(motion.moveToNextWORDStart) },\n { key: \"B\", run: normalOrSelect(motion.moveToPrevWORDStart) },\n { key: \"E\", run: normalOrSelect(motion.moveToNextWORDEnd) },\n\n // ── Char find ───────────────────────────────────────────────────────────────\n { key: \"f\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.startFindForward(view);\n }},\n { key: \"F\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.startFindBackward(view);\n }},\n { key: \"t\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.startTillForward(view);\n }},\n { key: \"T\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.startTillBackward(view);\n }},\n { key: \"Alt-.\", run: normalOrSelect(motion.repeatLastCharFind) },\n\n // ── Line boundaries ─────────────────────────────────────────────────────────\n // Note: 0 is handled in the digit bindings\n { key: \"Home\", run: normalOrSelect(motion.moveToLineStart) },\n { key: \"End\", run: normalOrSelect(motion.moveToLineEnd) },\n\n // ── File boundaries ─────────────────────────────────────────────────────────\n // G with count = go to line\n {\n key: \"G\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n const count = getCount(view.state, 0);\n if (count > 0) {\n // nG = go to line n\n return motion.moveToLine(view);\n }\n // G with no count = go to start of last line\n return motion.moveToLastLine(view);\n },\n },\n\n // ── Scrolling ───────────────────────────────────────────────────────────────\n { key: \"Ctrl-d\", run: normalOrSelect(motion.scrollHalfPageDown) },\n { key: \"Ctrl-u\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n return motion.scrollHalfPageUp(view);\n }},\n { key: \"Ctrl-f\", run: normalOrSelect(motion.scrollPageDown) },\n { key: \"PageDown\", run: normalOrSelect(motion.scrollPageDown) },\n { key: \"Ctrl-b\", run: normalOrSelect(motion.scrollPageUp) },\n { key: \"PageUp\", run: normalOrSelect(motion.scrollPageUp) },\n\n // ── Select line / all ───────────────────────────────────────────────────────\n { key: \"x\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return motion.selectLine(view);\n }},\n { key: \"X\", run: normalOrSelect(motion.extendToLineBounds) },\n { key: \"Alt-x\", run: normalOrSelect(motion.shrinkToLineContent) },\n { key: \"%\", run: normalOrSelect(motion.selectAll) },\n\n // ── Selection collapsing ────────────────────────────────────────────────────\n { key: \";\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n return motion.collapseSelection(view);\n }},\n { key: \"Alt-;\", run: normalOrSelect(motion.flipSelection) },\n { key: \"Alt-:\", run: normalOrSelect(motion.ensureForwardSelection) },\n { key: \",\", run: normalOrSelect(motion.keepPrimarySelection) },\n\n // ── Multi-selection ─────────────────────────────────────────────────────────\n { key: \"s\", run: normalOrSelect(multiselect.openSelectWithin) },\n { key: \"S\", run: normalOrSelect(multiselect.openSplitOn) },\n { key: \"Alt-s\", run: normalOrSelect(multiselect.splitSelectionOnNewlines) },\n { key: \"K\", run: normalOrSelect(multiselect.openKeepMatching) },\n { key: \"Alt-K\", run: normalOrSelect(multiselect.openRemoveMatching) },\n { key: \"C\", run: normalOrSelect(multiselect.copySelectionToNextLine) },\n\n // ── Paragraph movement ──────────────────────────────────────────────────────\n // (also accessible via ]p and [p — see bracket handlers below)\n\n // ── Editing operations ──────────────────────────────────────────────────────\n // ── Register selection ──────────────────────────────────────────────────────\n // \" sets pending op; the next printable char selects the register (handled\n // in pendingCharHandler below). Resets to '\"' (unnamed) on Escape.\n {\n key: '\"',\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"register_select\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n\n { key: \"d\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.deleteSelection(view);\n }},\n { key: \"Alt-d\", run: normalOrSelect(edit.deleteSelectionNoYank) },\n { key: \"c\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.changeSelection(view);\n }},\n { key: \"Alt-c\", run: normalOrSelect(edit.changeSelectionNoYank) },\n { key: \"Alt-C\", run: normalOrSelect(multiselect.copySelectionToPrevLine) },\n { key: \"y\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.yankSelection(view);\n }},\n { key: \"p\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.pasteAfter(view);\n }},\n { key: \"P\", run: normalOrSelect(edit.pasteBefore) },\n { key: \"R\", run: normalOrSelect(edit.replaceWithYanked) },\n { key: \"r\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.startReplaceChar(view);\n }},\n { key: \"u\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\") return false;\n return edit.undoCommand(view);\n }},\n { key: \"U\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\") return false;\n return edit.redoCommand(view);\n }},\n { key: \"J\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.joinLines(view);\n }},\n { key: \">\", run: normalOrSelect(edit.indentSelection) },\n { key: \"<\", run: normalOrSelect(edit.unindentSelection) },\n { key: \"~\", run: normalOrSelect(edit.switchCase) },\n { key: \"`\", run: normalOrSelect(edit.lowercaseSelection) },\n { key: \"Alt-`\", run: normalOrSelect(edit.uppercaseSelection) },\n { key: \".\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\") return false;\n if (hs.pendingOp) return false;\n return edit.dotRepeat(view);\n }},\n { key: \"Ctrl-a\", run: normalOrSelect(edit.incrementNumber) },\n { key: \"Ctrl-x\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n return edit.decrementNumber(view);\n }},\n { key: \"&\", run: normalOrSelect(edit.alignSelections) },\n\n // ── Comment ──────────────────────────────────────────────────────────────────\n { key: \"Ctrl-c\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n return edit.toggleLineComment(view);\n }},\n\n // ── Trim selection whitespace ───────────────────────────────────────────────\n { key: \"_\", run: normalOrSelect(edit.trimSelectionWhitespace) },\n\n // ── Selection rotation / merging ────────────────────────────────────────────\n { key: \"Alt-,\", run: normalOrSelect(motion.removePrimarySelection) },\n { key: \")\", run: normalOrSelect(motion.rotateSelectionForward) },\n { key: \"(\", run: normalOrSelect(motion.rotateSelectionBackward) },\n { key: \"Alt-)\", run: normalOrSelect(edit.rotateSelectionContentsForward) },\n { key: \"Alt-(\", run: normalOrSelect(edit.rotateSelectionContentsBackward) },\n { key: \"Alt--\", run: normalOrSelect(motion.mergeAllSelections) },\n { key: \"Alt-_\", run: normalOrSelect(motion.mergeConsecutiveSelections) },\n\n // ── Alt-J join lines and select space ────────────────────────────────────────\n { key: \"Alt-J\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return edit.joinLinesAndSelectSpace(view);\n }},\n\n // ── Search ───────────────────────────────────────────────────────────────────\n { key: \"/\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n return search.openSearchForward(view);\n }},\n { key: \"?\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n return search.openSearchBackward(view);\n }},\n { key: \"n\", run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n return search.gotoNextMatch(view);\n }},\n { key: \"N\", run: normalOrSelect(search.gotoPrevMatch) },\n { key: \"*\", run: normalOrSelect(search.searchCurrentSelection) },\n { key: \"Alt-*\", run: normalOrSelect(search.searchCurrentSelectionNoWB) },\n\n // ── g prefix (goto mode) ────────────────────────────────────────────────────\n {\n key: \"g\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp?.type === \"goto\") {\n // gg = go to file start\n view.dispatch({\n effects: [setPendingOpEffect.of(null), clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return motion.gotoFileStart(view);\n }\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"goto\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n gotoSubkey(\"e\", motion.gotoFileEnd),\n gotoSubkey(\"h\", motion.gotoLineStart),\n gotoSubkey(\"l\", motion.gotoLineEnd),\n gotoSubkey(\"s\", motion.gotoFirstNonWS),\n gotoSubkey(\"t\", motion.gotoScreenTop),\n gotoSubkey(\"c\", motion.gotoScreenMiddle),\n gotoSubkey(\"b\", motion.gotoScreenBottom),\n gotoSubkey(\"j\", (view) => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return motion.moveDown(view);\n }),\n gotoSubkey(\"k\", (view) => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return motion.moveUp(view);\n }),\n gotoSubkey(\".\", motion.gotoLastModification),\n gotoSubkey(\"|\", motion.gotoColumn),\n gotoSubkey(\"w\", (view) => {\n // Compute labels for all visible word starts, then enter goto_word mode.\n gotoWordStore.labels = computeGotoWordLabels(view);\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"goto_word\", input: \"\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }),\n\n // ── z prefix (view mode) ────────────────────────────────────────────────────\n {\n key: \"z\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp?.type === \"view\") {\n // zz = center, exits view mode\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return motion.centerViewOnCursor(view);\n }\n if (hs.pendingOp?.type === \"view_sticky\") {\n // Zz = center, stays in sticky view mode; restore sticky op after cmd clears it\n const result = motion.centerViewOnCursor(view);\n if (result) {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"view_sticky\" })],\n annotations: helixAnnotation.of(true),\n });\n }\n return result;\n }\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"view\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n // Z – sticky view mode: stays active until Escape\n {\n key: \"Z\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"view_sticky\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n viewSubkey(\"c\", motion.centerViewOnCursor),\n viewSubkey(\"t\", motion.scrollCursorToTop),\n viewSubkey(\"b\", motion.scrollCursorToBottom),\n viewSubkey(\"j\", (view) => {\n view.scrollDOM.scrollTop += view.defaultLineHeight || 16;\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }),\n viewSubkey(\"k\", (view) => {\n view.scrollDOM.scrollTop -= view.defaultLineHeight || 16;\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }),\n viewSubkey(\"ArrowDown\", (view) => {\n view.scrollDOM.scrollTop += view.defaultLineHeight || 16;\n view.dispatch({ effects: [setPendingOpEffect.of(null)], annotations: helixAnnotation.of(true) });\n return true;\n }),\n viewSubkey(\"ArrowUp\", (view) => {\n view.scrollDOM.scrollTop -= view.defaultLineHeight || 16;\n view.dispatch({ effects: [setPendingOpEffect.of(null)], annotations: helixAnnotation.of(true) });\n return true;\n }),\n\n // ── m prefix (match mode) ───────────────────────────────────────────────────\n {\n key: \"m\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp?.type === \"match\") {\n // mm = jump to matching bracket\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return motion.jumpToMatchingBracket(view);\n }\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"match\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n matchSubkey(\"m\", motion.jumpToMatchingBracket),\n matchSubkey(\"s\", (view) => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"surround_add\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }),\n matchSubkey(\"d\", (view) => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"surround_delete\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }),\n matchSubkey(\"r\", (view) => {\n view.dispatch({\n // char: \"\" is the sentinel meaning \"waiting for the from-char\"\n effects: [setPendingOpEffect.of({ type: \"surround_replace\", char: \"\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }),\n matchSubkey(\"i\", edit.startSelectInside),\n matchSubkey(\"a\", edit.startSelectAround),\n\n // ── ] prefix (bracket-next mode) ───────────────────────────────────────────\n {\n key: \"]\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp?.type === \"bracket_next\") {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return false; // ]] not bound, cancel\n }\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"bracket_next\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n bracketNextSubkey(\"p\", motion.moveToNextParagraph),\n bracketNextSubkey(\"ArrowRight\", motion.moveToNextParagraph),\n bracketNextSubkey(\" \", (view) => {\n // ]Space – add newline below\n const state = view.state;\n const pos = state.doc.lineAt(state.selection.main.head).to;\n view.dispatch(\n state.update({\n changes: { from: pos, insert: \"\\n\" },\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n }),\n\n // ── [ prefix (bracket-prev mode) ───────────────────────────────────────────\n {\n key: \"[\",\n run: (view) => {\n const hs = getHelixState(view.state);\n if (hs.mode !== \"normal\" && hs.mode !== \"select\") return false;\n if (hs.pendingOp?.type === \"bracket_prev\") {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return false; // [[ not bound, cancel\n }\n if (hs.pendingOp) return false;\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"bracket_prev\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n },\n },\n bracketPrevSubkey(\"p\", motion.moveToPrevParagraph),\n bracketPrevSubkey(\"ArrowLeft\", motion.moveToPrevParagraph),\n bracketPrevSubkey(\" \", (view) => {\n // [Space – add newline above\n const state = view.state;\n const pos = state.doc.lineAt(state.selection.main.head).from;\n view.dispatch(\n state.update({\n changes: { from: pos, insert: \"\\n\" },\n selection: { anchor: pos },\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n }),\n\n // ── Jump list ───────────────────────────────────────────────────────────────\n { key: \"Ctrl-s\", run: normalOrSelect(jumplist.saveSelection) },\n { key: \"Ctrl-o\", run: normalOrSelect(jumplist.jumpBack) },\n { key: \"Ctrl-i\", run: normalOrSelect(jumplist.jumpForward) },\n\n // ── Insert mode ─────────────────────────────────────────────────────────────\n { key: \"Ctrl-w\", run: insertOnly(edit.insertDeletePrevWord) },\n { key: \"Alt-Backspace\", run: insertOnly(edit.insertDeletePrevWord) },\n { key: \"Alt-d\", run: insertOnly(edit.insertDeleteNextWord) },\n { key: \"Alt-Delete\", run: insertOnly(edit.insertDeleteNextWord) },\n { key: \"Ctrl-h\", run: insertOnly(edit.insertDeletePrevChar) },\n { key: \"Ctrl-d\", run: insertOnly(edit.insertDeleteNextChar) },\n { key: \"Delete\", run: insertOnly(edit.insertDeleteNextChar) },\n { key: \"Ctrl-u\", run: insertOnly(edit.insertDeleteToLineStart) },\n { key: \"Ctrl-k\", run: insertOnly(edit.insertDeleteToLineEnd) },\n { key: \"Enter\", run: insertOnly(edit.insertNewline) },\n { key: \"Ctrl-j\", run: insertOnly(edit.insertNewline) },\n { key: \"Ctrl-s\", run: insertOnly(edit.insertCommitUndoCheckpoint) },\n { key: \"Ctrl-r\", run: insertOnly((view) => {\n // Enter insert_register mode: next char selects which register to paste\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"insert_register\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }) },\n];\n\n// ── DOM event handler for pending operations ──────────────────────────────────\n//\n// When a pending op is waiting for a \"any character\" press (f, F, t, T, r,\n// surround operations), we capture the next keydown here.\n\nconst pendingCharHandler = EditorView.domEventHandlers({\n keydown(e, view) {\n const hs = getHelixState(view.state);\n if (!hs.pendingOp) return false;\n const op = hs.pendingOp;\n\n // Only handle single printable characters\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return false;\n\n const ch = e.key;\n\n switch (op.type) {\n case \"find_forward\":\n case \"find_backward\":\n case \"till_forward\":\n case \"till_backward\":\n e.preventDefault();\n e.stopPropagation();\n motion.executeFindChar(view, op.type, ch);\n return true;\n\n case \"replace_char\":\n e.preventDefault();\n e.stopPropagation();\n edit.executeReplaceChar(view, ch);\n return true;\n\n case \"surround_add\":\n e.preventDefault();\n e.stopPropagation();\n edit.executeSurroundAdd(view, ch);\n return true;\n\n case \"surround_delete\":\n e.preventDefault();\n e.stopPropagation();\n edit.executeSurroundDelete(view, ch);\n return true;\n\n case \"surround_replace\": {\n e.preventDefault();\n e.stopPropagation();\n if (op.char === \"\") {\n // First char received: store it as the \"from\" char and wait for \"to\"\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"surround_replace\", char: ch })],\n annotations: helixAnnotation.of(true),\n });\n } else {\n // Second char received: op.char is \"from\", ch is \"to\"\n edit.executeSurroundReplace(view, op.char, ch);\n }\n return true;\n }\n\n case \"select_inside\":\n e.preventDefault();\n e.stopPropagation();\n edit.executeSelectObject(view, ch, true);\n return true;\n\n case \"select_around\":\n e.preventDefault();\n e.stopPropagation();\n edit.executeSelectObject(view, ch, false);\n return true;\n\n case \"register_select\":\n e.preventDefault();\n e.stopPropagation();\n view.dispatch({\n effects: [\n setCurrentRegisterEffect.of(ch),\n setPendingOpEffect.of(null),\n ],\n annotations: helixAnnotation.of(true),\n });\n return true;\n\n case \"insert_register\": {\n e.preventDefault();\n e.stopPropagation();\n const regValue = hs.registers[ch] ?? \"\";\n const changes = view.state.selection.ranges.map((r) => ({\n from: r.from,\n to: r.to,\n insert: regValue,\n }));\n view.dispatch({\n changes,\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }\n\n case \"goto_word\": {\n e.preventDefault();\n e.stopPropagation();\n const newInput = op.input + ch;\n\n if (newInput.length === 1) {\n // First char typed: narrow the label set.\n const remaining = gotoWordStore.labels.filter((l) =>\n l.label.startsWith(newInput),\n );\n if (remaining.length === 0) {\n // Nothing matches — cancel.\n gotoWordStore.labels = [];\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n } else {\n // Update the input in state; plugin will re-render filtered labels.\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"goto_word\", input: newInput })],\n annotations: helixAnnotation.of(true),\n });\n }\n } else {\n // Second char typed: resolve the label and jump.\n const match = gotoWordStore.labels.find((l) => l.label === newInput);\n gotoWordStore.labels = [];\n if (match) {\n view.dispatch({\n selection: { anchor: match.pos },\n effects: [setPendingOpEffect.of(null), clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n } else {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n }\n }\n return true;\n }\n\n default:\n return false;\n }\n },\n});\n\n// ── mr requires TWO chars: first stored, second replaces ─────────────────────\n\nconst surroundReplaceHandler = EditorView.domEventHandlers({\n keydown(e, view) {\n const hs = getHelixState(view.state);\n if (!hs.pendingOp || hs.pendingOp.type !== \"match\") return false;\n // \"r\" was pressed inside match mode; handled by keymap\n return false;\n },\n});\n\n// ── Transaction filter: block raw user-input in normal/select mode ────────────\n\nconst inputBlocker = EditorView.domEventHandlers({\n beforeinput(e, view) {\n const hs = getHelixState(view.state);\n if (hs.mode === \"insert\") return false;\n // Block all text insertion events in normal/select mode\n e.preventDefault();\n return true;\n },\n});\n\n// ── Status bar panel ──────────────────────────────────────────────────────────\n\nimport { showPanel } from \"@codemirror/view\";\n\nfunction createStatusBar(view: EditorView): import(\"@codemirror/view\").Panel {\n const dom = document.createElement(\"div\");\n dom.className = \"helix-status-bar\";\n\n const modeEl = document.createElement(\"span\");\n modeEl.className = \"helix-status-mode\";\n\n const countEl = document.createElement(\"span\");\n countEl.className = \"helix-status-count\";\n\n const pendingEl = document.createElement(\"span\");\n pendingEl.className = \"helix-status-pending\";\n\n const registerEl = document.createElement(\"span\");\n registerEl.className = \"helix-status-register\";\n\n const posEl = document.createElement(\"span\");\n posEl.className = \"helix-status-pos\";\n posEl.style.marginLeft = \"auto\";\n\n dom.appendChild(modeEl);\n dom.appendChild(countEl);\n dom.appendChild(pendingEl);\n dom.appendChild(registerEl);\n dom.appendChild(posEl);\n\n function update(v: EditorView) {\n const hs = getHelixState(v.state);\n const sel = v.state.selection.main;\n const doc = v.state.doc;\n const line = doc.lineAt(sel.head);\n\n modeEl.className = `helix-status-mode helix-status-mode-${hs.mode}`;\n modeEl.textContent = hs.mode.toUpperCase();\n\n countEl.textContent = hs.count ? `${hs.count}×` : \"\";\n\n const pendingNames: Partial<Record<PendingOp[\"type\"], string>> = {\n goto: \"goto\",\n view: \"view\",\n view_sticky: \"view(s)\",\n match: \"match\",\n find_forward: \"find→\",\n find_backward: \"find←\",\n till_forward: \"till→\",\n till_backward: \"till←\",\n replace_char: \"replace\",\n surround_add: \"surround-add\",\n surround_replace: \"surround-rep\",\n surround_delete: \"surround-del\",\n select_inside: \"select-inner\",\n select_around: \"select-around\",\n bracket_next: \"]\",\n bracket_prev: \"[\",\n register_select: \"register\",\n insert_register: \"ins-reg\",\n goto_word: \"jump\",\n };\n pendingEl.textContent = hs.pendingOp\n ? `[${pendingNames[hs.pendingOp.type] ?? hs.pendingOp.type}]`\n : \"\";\n\n registerEl.textContent =\n hs.currentRegister !== '\"' ? `\"${hs.currentRegister}` : \"\";\n\n const col = sel.head - line.from + 1;\n posEl.textContent = `${line.number}:${col}`;\n }\n\n update(view);\n\n return {\n dom,\n top: false,\n update(u) {\n update(u.view);\n },\n };\n}\n\nexport const statusBarExtension = showPanel.of(createStatusBar);\n\n// ── Full plugin export ────────────────────────────────────────────────────────\n\nexport function buildHelixKeymap() {\n return [\n Prec.highest(pendingCharHandler),\n Prec.highest(inputBlocker),\n Prec.high(keymap.of([...digitBindings, ...helixBindings])),\n ];\n}\n","/**\n * motion.ts\n *\n * All cursor-movement commands for Normal and Select modes.\n *\n * Every public function is a CodeMirror Command (EditorView → boolean).\n *\n * In Select mode (helixState.mode === \"select\") motions extend the selection\n * rather than moving the cursor. The helper `applyMotion` handles this\n * uniformly.\n */\n\nimport {\n EditorSelection,\n type SelectionRange,\n type Text,\n} from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\nimport {\n clearCountEffect,\n getCount,\n getHelixState,\n helixAnnotation,\n lastModPosField,\n setPendingOpEffect,\n setLastCharFindEffect,\n type PendingOp,\n} from \"./state.js\";\n\n// ── Character classification (Helix word model) ───────────────────────────────\n//\n// Helix has three character categories:\n// word = [A-Za-z0-9_]\n// punct = printable, non-word, non-whitespace\n// space = whitespace (including newlines)\n\nexport function isWordChar(ch: string): boolean {\n return /[\\w]/.test(ch); // \\w = [A-Za-z0-9_]\n}\n\nexport function isPunctChar(ch: string): boolean {\n // Anything that has a visible glyph but is not word or space\n return ch.length > 0 && !isWordChar(ch) && !/\\s/.test(ch);\n}\n\nexport function isSpaceChar(ch: string): boolean {\n return /\\s/.test(ch);\n}\n\nfunction charAt(doc: Text, pos: number): string {\n if (pos < 0 || pos >= doc.length) return \"\";\n return doc.sliceString(pos, pos + 1);\n}\n\n// ── Word movement helpers ─────────────────────────────────────────────────────\n\n/** Next word start (Helix `w`). */\nexport function nextWordStart(doc: Text, pos: number, count = 1): number {\n for (let i = 0; i < count; i++) {\n pos = _nextWordStart(doc, pos);\n }\n return pos;\n}\n\nfunction _nextWordStart(doc: Text, pos: number): number {\n const len = doc.length;\n if (pos >= len) return len;\n\n const ch = charAt(doc, pos);\n\n if (isWordChar(ch)) {\n while (pos < len && isWordChar(charAt(doc, pos))) pos++;\n } else if (isPunctChar(ch)) {\n while (pos < len && isPunctChar(charAt(doc, pos))) pos++;\n }\n // skip whitespace\n while (pos < len && isSpaceChar(charAt(doc, pos))) pos++;\n\n return Math.min(pos, len);\n}\n\n/** Previous word start (Helix `b`). */\nexport function prevWordStart(doc: Text, pos: number, count = 1): number {\n for (let i = 0; i < count; i++) {\n pos = _prevWordStart(doc, pos);\n }\n return pos;\n}\n\nfunction _prevWordStart(doc: Text, pos: number): number {\n if (pos <= 0) return 0;\n\n pos--; // step back at least once\n\n // skip whitespace\n while (pos > 0 && isSpaceChar(charAt(doc, pos))) pos--;\n\n const ch = charAt(doc, pos);\n if (isWordChar(ch)) {\n while (pos > 0 && isWordChar(charAt(doc, pos - 1))) pos--;\n } else if (isPunctChar(ch)) {\n while (pos > 0 && isPunctChar(charAt(doc, pos - 1))) pos--;\n }\n\n return pos;\n}\n\n/** Next word end (Helix `e`). */\nexport function nextWordEnd(doc: Text, pos: number, count = 1): number {\n for (let i = 0; i < count; i++) {\n pos = _nextWordEnd(doc, pos);\n }\n return pos;\n}\n\nfunction _nextWordEnd(doc: Text, pos: number): number {\n const len = doc.length;\n if (pos >= len - 1) return len;\n\n pos++; // always advance at least one\n\n // skip whitespace\n while (pos < len && isSpaceChar(charAt(doc, pos))) pos++;\n if (pos >= len) return len;\n\n const ch = charAt(doc, pos);\n let last = pos;\n\n if (isWordChar(ch)) {\n while (pos < len && isWordChar(charAt(doc, pos))) {\n last = pos;\n pos++;\n }\n } else {\n while (pos < len && isPunctChar(charAt(doc, pos))) {\n last = pos;\n pos++;\n }\n }\n\n return last;\n}\n\n/** Next WORD start — whitespace-delimited only (Helix `W`). */\nexport function nextWORDStart(doc: Text, pos: number, count = 1): number {\n for (let i = 0; i < count; i++) {\n const len = doc.length;\n while (pos < len && !isSpaceChar(charAt(doc, pos))) pos++;\n while (pos < len && isSpaceChar(charAt(doc, pos))) pos++;\n }\n return Math.min(pos, doc.length);\n}\n\n/** Previous WORD start (Helix `B`). */\nexport function prevWORDStart(doc: Text, pos: number, count = 1): number {\n for (let i = 0; i < count; i++) {\n if (pos <= 0) break;\n pos--;\n while (pos > 0 && isSpaceChar(charAt(doc, pos))) pos--;\n while (pos > 0 && !isSpaceChar(charAt(doc, pos - 1))) pos--;\n }\n return pos;\n}\n\n/** Next WORD end (Helix `E`). */\nexport function nextWORDEnd(doc: Text, pos: number, count = 1): number {\n for (let i = 0; i < count; i++) {\n const len = doc.length;\n if (pos >= len - 1) break;\n pos++;\n while (pos < len && isSpaceChar(charAt(doc, pos))) pos++;\n while (pos < len && !isSpaceChar(charAt(doc, pos))) pos++;\n pos--;\n }\n return pos;\n}\n\n// ── Line-start helpers ────────────────────────────────────────────────────────\n\nexport function lineStart(doc: Text, pos: number): number {\n return doc.lineAt(pos).from;\n}\n\nexport function lineEnd(doc: Text, pos: number): number {\n const line = doc.lineAt(pos);\n // End is before the newline (stay on the last character)\n return Math.max(line.from, line.to - 1);\n}\n\nexport function lineEndInclusive(doc: Text, pos: number): number {\n return doc.lineAt(pos).to;\n}\n\nexport function firstNonWS(doc: Text, pos: number): number {\n const line = doc.lineAt(pos);\n let p = line.from;\n while (p < line.to && isSpaceChar(charAt(doc, p))) p++;\n return p;\n}\n\n// ── Char find helpers ─────────────────────────────────────────────────────────\n\nexport function findCharForward(\n doc: Text,\n pos: number,\n ch: string,\n till: boolean,\n count = 1,\n): number {\n let found = pos;\n let remaining = count;\n let p = pos + 1;\n while (p < doc.length && remaining > 0) {\n if (charAt(doc, p) === ch) {\n found = p;\n remaining--;\n }\n p++;\n }\n if (remaining > 0) return pos; // not found – stay\n return till ? Math.max(pos, found - 1) : found;\n}\n\nexport function findCharBackward(\n doc: Text,\n pos: number,\n ch: string,\n till: boolean,\n count = 1,\n): number {\n let found = pos;\n let remaining = count;\n let p = pos - 1;\n while (p >= 0 && remaining > 0) {\n if (charAt(doc, p) === ch) {\n found = p;\n remaining--;\n }\n p--;\n }\n if (remaining > 0) return pos; // not found – stay\n return till ? Math.min(pos, found + 1) : found;\n}\n\n// ── Paragraph helpers ─────────────────────────────────────────────────────────\n\nexport function nextParagraphStart(doc: Text, pos: number): number {\n const line = doc.lineAt(pos);\n let lineNum = line.number;\n const totalLines = doc.lines;\n\n // Skip to end of current non-empty block\n while (lineNum <= totalLines && doc.line(lineNum).text.trim() !== \"\") {\n lineNum++;\n }\n // Skip empty lines\n while (lineNum <= totalLines && doc.line(lineNum).text.trim() === \"\") {\n lineNum++;\n }\n\n if (lineNum > totalLines) return doc.length;\n return doc.line(lineNum).from;\n}\n\nexport function prevParagraphStart(doc: Text, pos: number): number {\n const line = doc.lineAt(pos);\n let lineNum = line.number;\n\n // If at start of a non-empty block, go up\n if (lineNum > 1) lineNum--;\n // Skip empty lines going up\n while (lineNum > 1 && doc.line(lineNum).text.trim() === \"\") lineNum--;\n // Skip to start of non-empty block\n while (lineNum > 1 && doc.line(lineNum - 1).text.trim() !== \"\") lineNum--;\n\n return doc.line(lineNum).from;\n}\n\n// ── Core motion dispatcher ────────────────────────────────────────────────────\n//\n// In normal mode: replaces selection with a cursor at the new head.\n// In select mode: extends selection (keeps anchor, moves head).\n\nfunction applyMotion(\n view: EditorView,\n getNewHead: (range: SelectionRange) => number,\n extraEffects: import(\"@codemirror/state\").StateEffect<unknown>[] = [],\n inclusive = false,\n): boolean {\n const state = view.state;\n const hs = getHelixState(state);\n\n view.dispatch(\n state.update({\n selection: EditorSelection.create(\n state.selection.ranges.map((range) => {\n const newHead = getNewHead(range);\n if (hs.mode === \"select\") {\n // For \"inclusive\" motions (e, E, f) the char at newHead is part of\n // the selection. Extend by 1 when moving forward so that the CM\n // exclusive-end range covers that character.\n const selectHead =\n inclusive && newHead >= range.anchor ? newHead + 1 : newHead;\n return EditorSelection.range(range.anchor, selectHead);\n }\n return EditorSelection.cursor(newHead);\n }),\n state.selection.mainIndex,\n ),\n effects: [clearCountEffect.of(null), ...extraEffects],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n}\n\n// ── Exported commands ─────────────────────────────────────────────────────────\n\nexport const moveLeft = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) => Math.max(0, r.head - count));\n};\n\nexport const moveRight = (view: EditorView): boolean => {\n const count = getCount(view.state);\n const len = view.state.doc.length;\n return applyMotion(view, (r) => Math.min(len, r.head + count));\n};\n\nexport const moveUp = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) => {\n const doc = view.state.doc;\n const line = doc.lineAt(r.head);\n const col = r.head - line.from;\n const targetLineNum = Math.max(1, line.number - count);\n const targetLine = doc.line(targetLineNum);\n return Math.min(targetLine.from + col, targetLine.to);\n });\n};\n\nexport const moveDown = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) => {\n const doc = view.state.doc;\n const line = doc.lineAt(r.head);\n const col = r.head - line.from;\n const targetLineNum = Math.min(doc.lines, line.number + count);\n const targetLine = doc.line(targetLineNum);\n return Math.min(targetLine.from + col, targetLine.to);\n });\n};\n\nexport const moveToNextWordStart = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) =>\n nextWordStart(view.state.doc, r.head, count),\n );\n};\n\nexport const moveToPrevWordStart = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) =>\n prevWordStart(view.state.doc, r.head, count),\n );\n};\n\nexport const moveToNextWordEnd = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) => nextWordEnd(view.state.doc, r.head, count), [], true);\n};\n\nexport const moveToNextWORDStart = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) =>\n nextWORDStart(view.state.doc, r.head, count),\n );\n};\n\nexport const moveToPrevWORDStart = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) =>\n prevWORDStart(view.state.doc, r.head, count),\n );\n};\n\nexport const moveToNextWORDEnd = (view: EditorView): boolean => {\n const count = getCount(view.state);\n return applyMotion(view, (r) => nextWORDEnd(view.state.doc, r.head, count), [], true);\n};\n\nexport const moveToLineStart = (view: EditorView): boolean =>\n applyMotion(view, (r) => lineStart(view.state.doc, r.head));\n\nexport const moveToLineEnd = (view: EditorView): boolean =>\n applyMotion(view, (r) => lineEnd(view.state.doc, r.head));\n\nexport const moveToFirstNonWS = (view: EditorView): boolean =>\n applyMotion(view, (r) => firstNonWS(view.state.doc, r.head));\n\nexport const moveToFileStart = (view: EditorView): boolean => {\n const n = getCount(view.state, 0);\n if (n > 0) {\n const targetLine = Math.min(n, view.state.doc.lines);\n return applyMotion(view, () => view.state.doc.line(targetLine).from);\n }\n return applyMotion(view, () => 0);\n};\n\nexport const moveToFileEnd = (view: EditorView): boolean => {\n const n = getCount(view.state, 0);\n if (n > 0) {\n const targetLine = Math.min(n, view.state.doc.lines);\n return applyMotion(view, () => view.state.doc.line(targetLine).from);\n }\n return applyMotion(view, () => view.state.doc.length);\n};\n\nexport const moveToLine = (view: EditorView): boolean => {\n const n = getCount(view.state, 1);\n const targetLine = Math.min(Math.max(1, n), view.state.doc.lines);\n return applyMotion(view, () => view.state.doc.line(targetLine).from);\n};\n\nexport const moveToLastLine = (view: EditorView): boolean => {\n const doc = view.state.doc;\n return applyMotion(view, () => doc.line(doc.lines).from);\n};\n\n/** g. – Go to the position of the last document modification. */\nexport const gotoLastModification = (view: EditorView): boolean => {\n const pos = view.state.field(lastModPosField);\n if (pos < 0) {\n // No modification yet — just clear the pending op and return\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }\n return applyMotion(\n view,\n () => Math.min(pos, view.state.doc.length),\n [setPendingOpEffect.of(null)],\n );\n};\n\nexport const scrollHalfPageDown = (view: EditorView): boolean => {\n const count = getCount(view.state);\n const visibleHeight = view.dom.clientHeight;\n const halfHeight = (visibleHeight / 2) * count;\n view.scrollDOM.scrollTop += halfHeight;\n // Move cursor to stay in view\n return applyMotion(view, (r) => {\n const doc = view.state.doc;\n const line = doc.lineAt(r.head);\n const halfLines = Math.floor(visibleHeight / (view.defaultLineHeight || 16) / 2) * count;\n const targetLineNum = Math.min(doc.lines, line.number + halfLines);\n const targetLine = doc.line(targetLineNum);\n const col = r.head - line.from;\n return Math.min(targetLine.from + col, targetLine.to);\n });\n};\n\nexport const scrollHalfPageUp = (view: EditorView): boolean => {\n const count = getCount(view.state);\n const visibleHeight = view.dom.clientHeight;\n const halfHeight = (visibleHeight / 2) * count;\n view.scrollDOM.scrollTop -= halfHeight;\n return applyMotion(view, (r) => {\n const doc = view.state.doc;\n const line = doc.lineAt(r.head);\n const halfLines = Math.floor(visibleHeight / (view.defaultLineHeight || 16) / 2) * count;\n const targetLineNum = Math.max(1, line.number - halfLines);\n const targetLine = doc.line(targetLineNum);\n const col = r.head - line.from;\n return Math.min(targetLine.from + col, targetLine.to);\n });\n};\n\nexport const scrollPageDown = (view: EditorView): boolean => {\n const count = getCount(view.state);\n const visibleHeight = view.dom.clientHeight;\n view.scrollDOM.scrollTop += visibleHeight * count;\n return applyMotion(view, (r) => {\n const doc = view.state.doc;\n const line = doc.lineAt(r.head);\n const pageLines = Math.floor(visibleHeight / (view.defaultLineHeight || 16)) * count;\n const targetLineNum = Math.min(doc.lines, line.number + pageLines);\n const targetLine = doc.line(targetLineNum);\n const col = r.head - line.from;\n return Math.min(targetLine.from + col, targetLine.to);\n });\n};\n\nexport const scrollPageUp = (view: EditorView): boolean => {\n const count = getCount(view.state);\n const visibleHeight = view.dom.clientHeight;\n view.scrollDOM.scrollTop -= visibleHeight * count;\n return applyMotion(view, (r) => {\n const doc = view.state.doc;\n const line = doc.lineAt(r.head);\n const pageLines = Math.floor(visibleHeight / (view.defaultLineHeight || 16)) * count;\n const targetLineNum = Math.max(1, line.number - pageLines);\n const targetLine = doc.line(targetLineNum);\n const col = r.head - line.from;\n return Math.min(targetLine.from + col, targetLine.to);\n });\n};\n\n// ── Select line / all ─────────────────────────────────────────────────────────\n\n/** x – Select the current line (extend selection downward if already a line). */\nexport const selectLine = (view: EditorView): boolean => {\n const count = getCount(view.state);\n const state = view.state;\n const doc = state.doc;\n const sel = state.selection;\n\n const newRanges = sel.ranges.map((range) => {\n // If selection already spans complete lines, extend by count more lines\n const fromLine = doc.lineAt(range.from);\n const toLine = doc.lineAt(range.to > range.from ? range.to - 1 : range.to);\n\n const isFullLines =\n !range.empty &&\n range.from === fromLine.from &&\n range.to === toLine.to + 1;\n\n let startLine: ReturnType<typeof doc.line>;\n let endLine: ReturnType<typeof doc.line>;\n\n if (isFullLines) {\n startLine = fromLine;\n endLine = doc.line(Math.min(doc.lines, toLine.number + count));\n } else {\n startLine = doc.lineAt(range.head);\n endLine = doc.line(Math.min(doc.lines, startLine.number + count - 1));\n }\n\n return EditorSelection.range(startLine.from, Math.min(endLine.to + 1, doc.length));\n });\n\n view.dispatch(\n state.update({\n selection: EditorSelection.create(newRanges, sel.mainIndex),\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** X – Extend selection to cover entire lines. */\nexport const extendToLineBounds = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const newRanges = state.selection.ranges.map((range) => {\n const fromLine = doc.lineAt(range.from);\n const toLine = doc.lineAt(range.to);\n return EditorSelection.range(fromLine.from, toLine.to + 1);\n });\n view.dispatch(\n state.update({\n selection: EditorSelection.create(\n newRanges,\n state.selection.mainIndex,\n ),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** Alt-x – Shrink selection to inner content of lines. */\nexport const shrinkToLineContent = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const newRanges = state.selection.ranges.map((range) => {\n const fromLine = doc.lineAt(range.from);\n const toLine = doc.lineAt(Math.max(range.from, range.to - 1));\n return EditorSelection.range(fromLine.from, toLine.to);\n });\n view.dispatch(\n state.update({\n selection: EditorSelection.create(\n newRanges,\n state.selection.mainIndex,\n ),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** % – Select entire file. */\nexport const selectAll = (view: EditorView): boolean => {\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create([EditorSelection.range(0, view.state.doc.length)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n// ── ; / Alt-; / , / Alt-, ─────────────────────────────────────────────────────\n\n/** ; – Collapse selection to cursor (head). */\nexport const collapseSelection = (view: EditorView): boolean => {\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(\n view.state.selection.ranges.map((r) => EditorSelection.cursor(r.head)),\n view.state.selection.mainIndex,\n ),\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** Alt-; – Flip cursor and anchor. */\nexport const flipSelection = (view: EditorView): boolean => {\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(\n view.state.selection.ranges.map((r) =>\n EditorSelection.range(r.head, r.anchor),\n ),\n view.state.selection.mainIndex,\n ),\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** Alt-: – Ensure selection is forward (from < to). */\nexport const ensureForwardSelection = (view: EditorView): boolean => {\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(\n view.state.selection.ranges.map((r) =>\n r.anchor <= r.head\n ? r\n : EditorSelection.range(r.head, r.anchor),\n ),\n view.state.selection.mainIndex,\n ),\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** , – Keep only the primary selection. */\nexport const keepPrimarySelection = (view: EditorView): boolean => {\n const sel = view.state.selection;\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create([sel.main], 0),\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n// ── Char find ─────────────────────────────────────────────────────────────────\n\n/** f – queue a find-forward-inclusive operation. */\nexport const startFindForward = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"find_forward\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport const startFindBackward = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"find_backward\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport const startTillForward = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"till_forward\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport const startTillBackward = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"till_backward\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport function executeFindChar(\n view: EditorView,\n opType: PendingOp[\"type\"],\n ch: string,\n): boolean {\n const count = getCount(view.state);\n\n const findType =\n opType === \"find_forward\"\n ? \"f\"\n : opType === \"find_backward\"\n ? \"F\"\n : opType === \"till_forward\"\n ? \"t\"\n : \"T\";\n\n const effects = [\n clearCountEffect.of(null),\n setPendingOpEffect.of(null),\n setLastCharFindEffect.of({ char: ch, type: findType }),\n ];\n\n return applyMotion(\n view,\n (r) => {\n const doc = view.state.doc;\n if (opType === \"find_forward\" || opType === \"till_forward\") {\n return findCharForward(\n doc,\n r.head,\n ch,\n opType === \"till_forward\",\n count,\n );\n } else {\n return findCharBackward(\n doc,\n r.head,\n ch,\n opType === \"till_backward\",\n count,\n );\n }\n },\n effects,\n );\n}\n\n/** Alt-. – Repeat last char find. */\nexport const repeatLastCharFind = (view: EditorView): boolean => {\n const hs = getHelixState(view.state);\n if (!hs.lastCharFind) return false;\n const { char, type } = hs.lastCharFind;\n const opType: PendingOp[\"type\"] =\n type === \"f\"\n ? \"find_forward\"\n : type === \"F\"\n ? \"find_backward\"\n : type === \"t\"\n ? \"till_forward\"\n : \"till_backward\";\n return executeFindChar(view, opType, char);\n};\n\n// ── Goto mode actions ─────────────────────────────────────────────────────────\n// These are called after the user presses g + <key>.\n\nexport const gotoFileStart = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n const n = getCount(view.state, 0);\n if (n > 0) {\n const targetLine = Math.min(n, view.state.doc.lines);\n return applyMotion(view, () => view.state.doc.line(targetLine).from);\n }\n return applyMotion(view, () => 0);\n};\n\nexport const gotoFileEnd = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return applyMotion(view, () => view.state.doc.length);\n};\n\nexport const gotoLineStart = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return applyMotion(view, (r) => lineStart(view.state.doc, r.head));\n};\n\nexport const gotoLineEnd = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return applyMotion(view, (r) => lineEnd(view.state.doc, r.head));\n};\n\nexport const gotoFirstNonWS = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return applyMotion(view, (r) => firstNonWS(view.state.doc, r.head));\n};\n\nexport const gotoScreenTop = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n // Scroll to the first visible line\n const { from } = view.viewport;\n return applyMotion(view, () => from);\n};\n\nexport const gotoScreenBottom = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n const { to } = view.viewport;\n return applyMotion(view, () => Math.min(to, view.state.doc.length));\n};\n\nexport const gotoScreenMiddle = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n const { from, to } = view.viewport;\n const midPos = Math.floor((from + to) / 2);\n return applyMotion(view, () => midPos);\n};\n\n// ── View-mode scrolling actions ───────────────────────────────────────────────\n\n/** zz / zc – Center view on cursor. */\nexport const centerViewOnCursor = (view: EditorView): boolean => {\n const pos = view.state.selection.main.head;\n const coords = view.coordsAtPos(pos);\n if (coords) {\n const scrollDOM = view.scrollDOM;\n const midY = (scrollDOM.clientHeight / 2);\n scrollDOM.scrollTop += coords.top - scrollDOM.getBoundingClientRect().top - midY;\n }\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** zt – Align view so cursor is at top. */\nexport const scrollCursorToTop = (view: EditorView): boolean => {\n const pos = view.state.selection.main.head;\n const coords = view.coordsAtPos(pos);\n if (coords) {\n const scrollDOM = view.scrollDOM;\n scrollDOM.scrollTop += coords.top - scrollDOM.getBoundingClientRect().top;\n }\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** zb – Align view so cursor is at bottom. */\nexport const scrollCursorToBottom = (view: EditorView): boolean => {\n const pos = view.state.selection.main.head;\n const coords = view.coordsAtPos(pos);\n if (coords) {\n const scrollDOM = view.scrollDOM;\n scrollDOM.scrollTop +=\n coords.bottom - scrollDOM.getBoundingClientRect().bottom;\n }\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n// ── Paragraph movement ────────────────────────────────────────────────────────\n\nexport const moveToNextParagraph = (view: EditorView): boolean =>\n applyMotion(view, (r) => nextParagraphStart(view.state.doc, r.head));\n\nexport const moveToPrevParagraph = (view: EditorView): boolean =>\n applyMotion(view, (r) => prevParagraphStart(view.state.doc, r.head));\n\n// ── Matching bracket ──────────────────────────────────────────────────────────\n\nexport const jumpToMatchingBracket = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n\n const openBrackets = \"([{<\";\n const closeBrackets = \")]}>\";\n\n const newRanges = state.selection.ranges.map((range) => {\n const pos = range.head;\n const ch = charAt(doc, pos);\n\n const openIdx = openBrackets.indexOf(ch);\n const closeIdx = closeBrackets.indexOf(ch);\n\n if (openIdx >= 0) {\n const close = closeBrackets[openIdx];\n let depth = 1;\n let p = pos + 1;\n while (p < doc.length && depth > 0) {\n const c = charAt(doc, p);\n if (c === ch) depth++;\n else if (c === close) depth--;\n p++;\n }\n if (depth === 0) {\n const newHead = p - 1;\n return getHelixState(state).mode === \"select\"\n ? EditorSelection.range(range.anchor, newHead)\n : EditorSelection.cursor(newHead);\n }\n } else if (closeIdx >= 0) {\n const open = openBrackets[closeIdx];\n let depth = 1;\n let p = pos - 1;\n while (p >= 0 && depth > 0) {\n const c = charAt(doc, p);\n if (c === ch) depth++;\n else if (c === open) depth--;\n p--;\n }\n if (depth === 0) {\n const newHead = p + 1;\n return getHelixState(state).mode === \"select\"\n ? EditorSelection.range(range.anchor, newHead)\n : EditorSelection.cursor(newHead);\n }\n }\n\n return range;\n });\n\n view.dispatch(\n state.update({\n selection: EditorSelection.create(newRanges, state.selection.mainIndex),\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n// ── Multi-selection manipulation ──────────────────────────────────────────────\n\n/** Alt-, – Remove the primary selection from the set. */\nexport const removePrimarySelection = (view: EditorView): boolean => {\n const sel = view.state.selection;\n if (sel.ranges.length <= 1) return false;\n const newRanges = sel.ranges.filter((_, i) => i !== sel.mainIndex);\n // The new main is the range just before the removed one (or 0).\n const newMain = Math.max(0, sel.mainIndex - 1);\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(newRanges, newMain),\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** ) – Rotate which selection is the primary (cycle forward). */\nexport const rotateSelectionForward = (view: EditorView): boolean => {\n const sel = view.state.selection;\n const newMain = (sel.mainIndex + 1) % sel.ranges.length;\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(sel.ranges, newMain),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** ( – Rotate which selection is the primary (cycle backward). */\nexport const rotateSelectionBackward = (view: EditorView): boolean => {\n const sel = view.state.selection;\n const newMain = (sel.mainIndex - 1 + sel.ranges.length) % sel.ranges.length;\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(sel.ranges, newMain),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** Alt-- – Merge all selections into a single spanning range. */\nexport const mergeAllSelections = (view: EditorView): boolean => {\n const sel = view.state.selection;\n if (sel.ranges.length <= 1) return false;\n const allFrom = sel.ranges.map((r) => Math.min(r.anchor, r.head));\n const allTo = sel.ranges.map((r) => Math.max(r.anchor, r.head));\n const spanFrom = Math.min(...allFrom);\n const spanTo = Math.max(...allTo);\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create([EditorSelection.range(spanFrom, spanTo)], 0),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** Alt-_ – Merge consecutive (overlapping or adjacent) selections. */\nexport const mergeConsecutiveSelections = (view: EditorView): boolean => {\n const sel = view.state.selection;\n // Sort ranges by start position\n const sorted = [...sel.ranges].sort(\n (a, b) => Math.min(a.anchor, a.head) - Math.min(b.anchor, b.head),\n );\n const merged: SelectionRange[] = [];\n let cur = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n const next = sorted[i];\n const curTo = Math.max(cur.anchor, cur.head);\n const nextFrom = Math.min(next.anchor, next.head);\n if (nextFrom <= curTo) {\n // Overlapping or adjacent: merge\n const newFrom = Math.min(cur.anchor, cur.head);\n const newTo = Math.max(curTo, Math.max(next.anchor, next.head));\n cur = EditorSelection.range(newFrom, newTo);\n } else {\n merged.push(cur);\n cur = next;\n }\n }\n merged.push(cur);\n view.dispatch(\n view.state.update({\n selection: EditorSelection.create(merged, 0),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n// ── Go to column ───────────────────────────────────────────────────────────────\n\n/**\n * g| – Go to column <count> on the current line (1-based), or line start\n * if no count.\n */\nexport const gotoColumn = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n const count = getCount(view.state, 0);\n const col = count > 0 ? count - 1 : 0; // Convert 1-based to 0-based\n return applyMotion(view, (r) => {\n const line = view.state.doc.lineAt(r.head);\n // Clamp to last character (Helix cursor sits on a character, not after it).\n const maxPos = line.to > line.from ? line.to - 1 : line.from;\n return Math.min(line.from + col, maxPos);\n });\n};\n","/**\n * edit.ts\n *\n * Document-editing commands for Normal and Select modes.\n *\n * All commands that mutate the document annotate their transaction with\n * `helixAnnotation` so the transaction filter allows them through in normal\n * mode (where raw user-input is blocked).\n */\n\nimport {\n EditorSelection,\n type ChangeSpec,\n type SelectionRange,\n type Text,\n} from \"@codemirror/state\";\nimport {\n isolateHistory,\n indentLess,\n indentMore,\n insertNewlineAndIndent,\n toggleComment,\n undo,\n redo,\n} from \"@codemirror/commands\";\nimport { type EditorView } from \"@codemirror/view\";\nimport {\n clearCountEffect,\n getCount,\n getHelixState,\n getRegister,\n helixAnnotation,\n insertRecord,\n lastChange,\n setCurrentRegisterEffect,\n setModeEffect,\n setPendingOpEffect,\n setRegisterEffect,\n} from \"./state.js\";\nimport {\n firstNonWS,\n isSpaceChar,\n isWordChar,\n lineStart,\n nextWordEnd,\n prevWordStart,\n} from \"./motion.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Returns the effective selection for a range: at minimum 1 char (Helix model). */\nfunction effectiveRange(\n doc: Text,\n range: SelectionRange,\n): { from: number; to: number } {\n if (!range.empty) return { from: range.from, to: range.to };\n // Cursor = 1-char selection\n return { from: range.from, to: Math.min(range.from + 1, doc.length) };\n}\n\n/** Canonical cursor: wraps a position as a single-range EditorSelection. */\nfunction cursorAt(pos: number): import(\"@codemirror/state\").EditorSelection {\n return EditorSelection.create([EditorSelection.cursor(pos)]);\n}\n\n/** Dispatch a change + cursor placement, annotated as a helix transaction. */\nfunction dispatchChange(\n view: EditorView,\n changes: ChangeSpec,\n newSelection:\n | import(\"@codemirror/state\").EditorSelection\n | import(\"@codemirror/state\").SelectionRange\n | { anchor: number; head?: number },\n extraEffects: import(\"@codemirror/state\").StateEffect<unknown>[] = [],\n) {\n // Normalise SelectionRange / anchor-head spec → EditorSelection\n const sel: import(\"@codemirror/state\").EditorSelection | { anchor: number; head?: number } =\n \"ranges\" in newSelection\n ? (newSelection as import(\"@codemirror/state\").EditorSelection)\n : \"from\" in newSelection\n ? EditorSelection.create([newSelection as import(\"@codemirror/state\").SelectionRange])\n : (newSelection as { anchor: number; head?: number });\n\n view.dispatch(\n view.state.update({\n changes,\n selection: sel,\n effects: [clearCountEffect.of(null), ...extraEffects],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n}\n\n// ── Mode transitions ──────────────────────────────────────────────────────────\n\n/** Enter insert mode (before selection / cursor). */\nexport const enterInsertMode = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setModeEffect.of(\"insert\")],\n annotations: helixAnnotation.of(true),\n });\n // Start insert recording for dot-repeat\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n/** a – Insert after selection. */\nexport const enterInsertModeAfter = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const sel = state.selection;\n const newRanges = sel.ranges.map((r) => {\n const { to } = effectiveRange(doc, r);\n return EditorSelection.cursor(to);\n });\n view.dispatch({\n selection: EditorSelection.create(newRanges, sel.mainIndex),\n effects: [setModeEffect.of(\"insert\")],\n annotations: helixAnnotation.of(true),\n });\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n/** I – Insert at line start. */\nexport const enterInsertModeLineStart = (view: EditorView): boolean => {\n const state = view.state;\n const sel = state.selection;\n const newRanges = sel.ranges.map((r) =>\n EditorSelection.cursor(lineStart(state.doc, r.head)),\n );\n view.dispatch({\n selection: EditorSelection.create(newRanges, sel.mainIndex),\n effects: [setModeEffect.of(\"insert\")],\n annotations: helixAnnotation.of(true),\n });\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n/** A – Insert at line end. */\nexport const enterInsertModeLineEnd = (view: EditorView): boolean => {\n const state = view.state;\n const sel = state.selection;\n const newRanges = sel.ranges.map((r) =>\n EditorSelection.cursor(state.doc.lineAt(r.head).to),\n );\n view.dispatch({\n selection: EditorSelection.create(newRanges, sel.mainIndex),\n effects: [setModeEffect.of(\"insert\")],\n annotations: helixAnnotation.of(true),\n });\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n/** o – Open new line below and enter insert mode. */\nexport const openLineBelow = (view: EditorView): boolean => {\n const state = view.state;\n const sel = state.selection;\n\n // Insert a newline at the end of the current line for each range.\n const changes: ChangeSpec[] = [];\n const newAnchors: number[] = [];\n\n // We need to compute insert positions in document order to handle offset.\n let offset = 0;\n const sorted = [...sel.ranges].sort((a, b) => a.from - b.from);\n\n for (const r of sorted) {\n const lineEnd = state.doc.lineAt(r.head).to;\n changes.push({ from: lineEnd, insert: \"\\n\" });\n newAnchors.push(lineEnd + offset + 1);\n offset += 1;\n }\n\n const mainRangeIdx = sel.mainIndex;\n const mainAnchor = newAnchors[mainRangeIdx] ?? newAnchors[0];\n\n view.dispatch(\n state.update({\n changes,\n selection: { anchor: mainAnchor },\n effects: [setModeEffect.of(\"insert\")],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n/** O – Open new line above and enter insert mode. */\nexport const openLineAbove = (view: EditorView): boolean => {\n const state = view.state;\n const r = state.selection.main;\n const line = state.doc.lineAt(r.head);\n\n view.dispatch(\n state.update({\n changes: { from: line.from, insert: \"\\n\" },\n selection: { anchor: line.from },\n effects: [setModeEffect.of(\"insert\")],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n/** Escape – Return to normal mode from insert / select. */\nexport const returnToNormal = (view: EditorView): boolean => {\n const hs = getHelixState(view.state);\n // Already in normal mode with nothing pending — nothing to do.\n if (hs.mode === \"normal\" && hs.pendingOp === null && hs.count === \"\") return false;\n\n // In normal mode but with a pending op or count, just clear them.\n if (hs.mode === \"normal\") {\n view.dispatch({\n effects: [\n setPendingOpEffect.of(null),\n clearCountEffect.of(null),\n setCurrentRegisterEffect.of('\"'),\n ],\n annotations: helixAnnotation.of(true),\n });\n return true;\n }\n\n // Stop insert recording; save for dot-repeat\n if (hs.mode === \"insert\" && insertRecord.active) {\n insertRecord.active = false;\n const capturedChanges = [...insertRecord.changes];\n if (capturedChanges.length > 0) {\n // Save as last change for dot repeat\n const fn = (v: EditorView) => {\n v.dispatch(\n v.state.update({\n changes: capturedChanges,\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n };\n lastChange.current = { fn };\n }\n }\n\n // When leaving insert mode, step cursor back by one (Helix moves cursor\n // back so it sits ON the last typed char, not after it).\n const state = view.state;\n const sel = state.selection;\n const newRanges = sel.ranges.map((r) => {\n if (hs.mode === \"insert\") {\n const line = state.doc.lineAt(r.head);\n return EditorSelection.cursor(Math.max(line.from, r.head - 1));\n }\n return EditorSelection.cursor(r.head);\n });\n\n view.dispatch({\n selection: EditorSelection.create(newRanges, sel.mainIndex),\n effects: [\n setModeEffect.of(\"normal\"),\n setPendingOpEffect.of(null),\n clearCountEffect.of(null),\n ],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** v – Enter / toggle select mode. */\nexport const enterSelectMode = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setModeEffect.of(\"select\"), clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n// ── Yank (copy) ───────────────────────────────────────────────────────────────\n\n/** y – Yank selection to register (and try to sync clipboard). */\nexport const yankSelection = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const hs = getHelixState(state);\n const reg = hs.currentRegister;\n\n const texts = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return doc.sliceString(from, to);\n });\n const text = texts.join(\"\\n\");\n\n const effects: import(\"@codemirror/state\").StateEffect<unknown>[] = [\n setRegisterEffect.of({ name: reg, value: text }),\n clearCountEffect.of(null),\n setCurrentRegisterEffect.of('\"'), // reset to unnamed after use\n ];\n // Propagate to unnamed register only when we're not targeting a named one\n if (reg !== '\"') {\n // Named-register yank: don't overwrite unnamed\n } else {\n // Unnamed yank: also keep clipboard in sync (already the unnamed register)\n }\n\n view.dispatch({ effects, annotations: helixAnnotation.of(true) });\n\n // Non-blocking clipboard write\n navigator.clipboard?.writeText(text).catch(() => {});\n\n lastChange.current = { fn: yankSelection };\n return true;\n};\n\n// ── Delete ────────────────────────────────────────────────────────────────────\n\n/** d – Delete selection (and yank to register). */\nexport const deleteSelection = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const hs = getHelixState(state);\n const reg = hs.currentRegister;\n\n const changes: ChangeSpec[] = [];\n\n for (const r of state.selection.ranges) {\n const { from, to } = effectiveRange(doc, r);\n changes.push({ from, to });\n }\n\n const yanked = state.selection.ranges\n .map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return doc.sliceString(from, to);\n })\n .join(\"\\n\");\n\n if (reg === '\"') {\n navigator.clipboard?.writeText(yanked).catch(() => {});\n }\n\n const deleteEffects: import(\"@codemirror/state\").StateEffect<unknown>[] = [\n setRegisterEffect.of({ name: reg, value: yanked }),\n setCurrentRegisterEffect.of('\"'), // reset to unnamed after use\n ];\n\n // Preserve multi-cursor: map each range's from through the change set so\n // that each cursor lands where its selection started after text is removed.\n const changeSet = state.changes(changes);\n const newLength = changeSet.newLength;\n const newRanges = state.selection.ranges.map((r) => {\n const mapped = changeSet.mapPos(effectiveRange(doc, r).from, -1);\n return EditorSelection.cursor(Math.max(0, Math.min(mapped, newLength - 1)));\n });\n\n dispatchChange(\n view,\n changes,\n EditorSelection.create(newRanges, state.selection.mainIndex),\n deleteEffects,\n );\n\n lastChange.current = { fn: deleteSelection };\n return true;\n};\n\n/** Alt-d – Delete without yanking. */\nexport const deleteSelectionNoYank = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return { from, to };\n });\n const changeSet = state.changes(changes);\n const newLength = changeSet.newLength;\n const newRanges = state.selection.ranges.map((r) => {\n const mapped = changeSet.mapPos(effectiveRange(doc, r).from, -1);\n return EditorSelection.cursor(Math.max(0, Math.min(mapped, newLength - 1)));\n });\n dispatchChange(view, changes, EditorSelection.create(newRanges, state.selection.mainIndex));\n lastChange.current = { fn: deleteSelectionNoYank };\n return true;\n};\n\n// ── Change ────────────────────────────────────────────────────────────────────\n\n/** c – Delete selection and enter insert mode. */\nexport const changeSelection = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const reg = getHelixState(state).currentRegister;\n\n const changes: ChangeSpec[] = [];\n let newHead = state.selection.main.from;\n\n const yanked = state.selection.ranges\n .map((r) => {\n const { from, to } = effectiveRange(doc, r);\n changes.push({ from, to });\n if (r === state.selection.main) newHead = from;\n return doc.sliceString(from, to);\n })\n .join(\"\\n\");\n\n if (reg === '\"') {\n navigator.clipboard?.writeText(yanked).catch(() => {});\n }\n\n view.dispatch(\n state.update({\n changes,\n selection: { anchor: newHead },\n effects: [\n setModeEffect.of(\"insert\"),\n setRegisterEffect.of({ name: reg, value: yanked }),\n setCurrentRegisterEffect.of('\"'), // reset to unnamed after use\n clearCountEffect.of(null),\n ],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n\n insertRecord.active = true;\n insertRecord.changes = [];\n lastChange.current = { fn: changeSelection };\n return true;\n};\n\n/** Alt-c – Change without yanking. */\nexport const changeSelectionNoYank = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return { from, to };\n });\n view.dispatch(\n state.update({\n changes,\n selection: { anchor: state.selection.main.from },\n effects: [setModeEffect.of(\"insert\"), clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n insertRecord.active = true;\n insertRecord.changes = [];\n return true;\n};\n\n// ── Paste ─────────────────────────────────────────────────────────────────────\n\n/** p – Paste after selection. */\nexport const pasteAfter = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const text = getRegister(state);\n if (!text) return false;\n\n const isLinewise = text.endsWith(\"\\n\");\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { to } = effectiveRange(doc, r);\n if (isLinewise) {\n const line = doc.lineAt(r.head);\n return { from: line.to + 1, insert: text };\n }\n return { from: to, insert: text };\n });\n\n const main = state.selection.main;\n const { to } = effectiveRange(doc, main);\n const insertAt = isLinewise ? doc.lineAt(main.head).to + 1 : to;\n\n dispatchChange(\n view,\n changes,\n EditorSelection.cursor(insertAt),\n [setCurrentRegisterEffect.of('\"')],\n );\n lastChange.current = { fn: pasteAfter };\n return true;\n};\n\n/** P – Paste before selection. */\nexport const pasteBefore = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const text = getRegister(state);\n if (!text) return false;\n\n const isLinewise = text.endsWith(\"\\n\");\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n if (isLinewise) {\n const line = doc.lineAt(r.head);\n return { from: line.from, insert: text };\n }\n return { from: r.from, insert: text };\n });\n\n const main = state.selection.main;\n const insertAt = isLinewise\n ? doc.lineAt(main.head).from\n : main.from;\n\n dispatchChange(\n view,\n changes,\n EditorSelection.cursor(insertAt),\n [setCurrentRegisterEffect.of('\"')],\n );\n lastChange.current = { fn: pasteBefore };\n return true;\n};\n\n// ── Replace char ──────────────────────────────────────────────────────────────\n\n/** r – queue a replace-char operation. */\nexport const startReplaceChar = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"replace_char\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport const executeReplaceChar = (view: EditorView, ch: string): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return { from, to, insert: ch.repeat(to - from) };\n });\n dispatchChange(\n view,\n changes,\n EditorSelection.cursor(state.selection.main.from),\n [setPendingOpEffect.of(null)],\n );\n lastChange.current = { fn: (v) => executeReplaceChar(v, ch) };\n return true;\n};\n\n// ── R – Replace with yanked text ─────────────────────────────────────────────\n\nexport const replaceWithYanked = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const text = getRegister(state);\n if (!text) return false;\n\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return { from, to, insert: text };\n });\n dispatchChange(\n view,\n changes,\n EditorSelection.cursor(state.selection.main.from),\n );\n lastChange.current = { fn: replaceWithYanked };\n return true;\n};\n\n// ── Join lines ────────────────────────────────────────────────────────────────\n\n/** J – Join the selected lines (or current + next line). */\nexport const joinLines = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const count = getCount(state);\n const changes: ChangeSpec[] = [];\n\n for (const r of state.selection.ranges) {\n const fromLine = doc.lineAt(r.from);\n const toLine = r.empty\n ? doc.line(Math.min(doc.lines, fromLine.number + count))\n : doc.lineAt(r.to > r.from ? r.to - 1 : r.to);\n\n for (\n let lineNum = fromLine.number;\n lineNum < toLine.number;\n lineNum++\n ) {\n const line = doc.line(lineNum);\n // Replace the newline + leading whitespace on next line with a single space\n const nextLine = doc.line(lineNum + 1);\n const nextContent = nextLine.text.trimStart();\n changes.push({\n from: line.to,\n to: nextLine.from + (nextLine.text.length - nextContent.length),\n insert: nextContent.length > 0 ? \" \" : \"\",\n });\n }\n }\n\n if (changes.length === 0) return false;\n\n view.dispatch(\n state.update({\n changes,\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n lastChange.current = { fn: joinLines };\n return true;\n};\n\n// ── Case switching ────────────────────────────────────────────────────────────\n\n/** ~ – Toggle case of each character. */\nexport const switchCase = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n const text = doc.sliceString(from, to);\n const toggled = text\n .split(\"\")\n .map((c) =>\n c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase(),\n )\n .join(\"\");\n return { from, to, insert: toggled };\n });\n view.dispatch(\n state.update({\n changes,\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n lastChange.current = { fn: switchCase };\n return true;\n};\n\n/** ` – Lowercase selection. */\nexport const lowercaseSelection = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return { from, to, insert: doc.sliceString(from, to).toLowerCase() };\n });\n view.dispatch(\n state.update({ changes, annotations: helixAnnotation.of(true) }),\n );\n lastChange.current = { fn: lowercaseSelection };\n return true;\n};\n\n/** Alt-` – Uppercase selection. */\nexport const uppercaseSelection = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const { from, to } = effectiveRange(doc, r);\n return { from, to, insert: doc.sliceString(from, to).toUpperCase() };\n });\n view.dispatch(\n state.update({ changes, annotations: helixAnnotation.of(true) }),\n );\n lastChange.current = { fn: uppercaseSelection };\n return true;\n};\n\n// ── Indent / Unindent ─────────────────────────────────────────────────────────\n\n/** > – Indent selection. */\nexport const indentSelection = (view: EditorView): boolean => {\n // indentMore is already a CodeMirror command; just proxy it and annotate.\n const result = indentMore(view);\n if (result) {\n lastChange.current = { fn: indentSelection };\n }\n return result;\n};\n\n/** < – Unindent selection. */\nexport const unindentSelection = (view: EditorView): boolean => {\n const result = indentLess(view);\n if (result) {\n lastChange.current = { fn: unindentSelection };\n }\n return result;\n};\n\n// ── Undo / Redo ───────────────────────────────────────────────────────────────\n\n/** u – Undo. */\nexport const undoCommand = (view: EditorView): boolean => undo(view);\n\n/** U – Redo (Helix uses U for redo, unlike Vim). */\nexport const redoCommand = (view: EditorView): boolean => redo(view);\n\n// ── Increment / Decrement ─────────────────────────────────────────────────────\n\nfunction changeNumberUnderCursor(view: EditorView, delta: number): boolean {\n const state = view.state;\n const doc = state.doc;\n const r = state.selection.main;\n\n // Find the number at/around the cursor position\n let start = r.head;\n let end = r.head;\n\n // Expand left to include digits (and optional leading minus)\n while (start > 0 && /[\\d]/.test(doc.sliceString(start - 1, start))) start--;\n if (start > 0 && doc.sliceString(start - 1, start) === \"-\") start--;\n\n // Expand right\n while (end < doc.length && /\\d/.test(doc.sliceString(end, end + 1))) end++;\n\n if (start === end) return false;\n\n const numStr = doc.sliceString(start, end);\n const num = parseInt(numStr, 10);\n if (isNaN(num)) return false;\n\n const newNum = (num + delta).toString();\n dispatchChange(\n view,\n { from: start, to: end, insert: newNum },\n EditorSelection.cursor(start + newNum.length - 1),\n );\n return true;\n}\n\n/** Ctrl-a – Increment number under cursor. */\nexport const incrementNumber = (view: EditorView): boolean =>\n changeNumberUnderCursor(view, getCount(view.state));\n\n/** Ctrl-x – Decrement number under cursor. */\nexport const decrementNumber = (view: EditorView): boolean =>\n changeNumberUnderCursor(view, -getCount(view.state));\n\n// ── Align selections ──────────────────────────────────────────────────────────\n\n/**\n * & – Align selections.\n *\n * Inserts spaces before each selection so that all selections start at the\n * same column (the maximum column among all selection starts).\n *\n * Requires at least two selections; single selections are a no-op.\n */\nexport const alignSelections = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const ranges = state.selection.ranges;\n\n if (ranges.length <= 1) return false;\n\n // Column (character offset from line start) for each selection's from.\n const cols = ranges.map((r) => r.from - doc.lineAt(r.from).from);\n const maxCol = Math.max(...cols);\n\n const changes: ChangeSpec[] = [];\n for (let i = 0; i < ranges.length; i++) {\n const pad = maxCol - cols[i];\n if (pad > 0) {\n changes.push({ from: ranges[i].from, insert: \" \".repeat(pad) });\n }\n }\n\n if (changes.length === 0) return false;\n\n // Don't specify a new selection — CM6 maps the current one through the changes.\n view.dispatch(\n state.update({\n changes,\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n// ── Comment toggle ────────────────────────────────────────────────────────────\n\n/** Ctrl-c – Toggle line comment. */\nexport const toggleLineComment = (view: EditorView): boolean => {\n const result = toggleComment(view);\n if (result) lastChange.current = { fn: toggleLineComment };\n return result;\n};\n\n// ── Dot repeat ────────────────────────────────────────────────────────────────\n\n/** . – Repeat last change. */\nexport const dotRepeat = (view: EditorView): boolean => {\n if (!lastChange.current) return false;\n return lastChange.current.fn(view);\n};\n\n// ── Select mode helpers ───────────────────────────────────────────────────────\n\n/** Trim whitespace from selection boundaries. */\nexport const trimSelectionWhitespace = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const newRanges = state.selection.ranges.map((r) => {\n let { from, to } = r;\n const text = doc.sliceString(from, to);\n const trimmedStart = text.search(/\\S/);\n const trimmedEnd = text.search(/\\S\\s*$/) + 1;\n if (trimmedStart < 0) return r;\n return EditorSelection.range(from + trimmedStart, from + trimmedEnd);\n });\n view.dispatch(\n state.update({\n selection: EditorSelection.create(\n newRanges,\n state.selection.mainIndex,\n ),\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n// ── Register selection ────────────────────────────────────────────────────────\n\nexport const startRegisterSelect = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"goto\" })], // reuse goto pending; handled in keymap\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport const executeRegisterSelect = (\n view: EditorView,\n regName: string,\n): boolean => {\n view.dispatch({\n effects: [\n setCurrentRegisterEffect.of(regName),\n setPendingOpEffect.of(null),\n ],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n// ── Surround ──────────────────────────────────────────────────────────────────\n\nconst SURROUND_PAIRS: Record<string, string> = {\n \"(\": \")\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"<\": \">\",\n \")\": \"(\",\n \"]\": \"[\",\n \"}\": \"{\",\n \">\": \"<\",\n};\n\nfunction openChar(ch: string): string {\n if (SURROUND_PAIRS[ch]) {\n const pair = SURROUND_PAIRS[ch];\n // If ch is a close bracket, the open is its pair\n if (\"([{<\".includes(ch)) return ch;\n return pair;\n }\n return ch;\n}\n\nfunction closeChar(ch: string): string {\n if (\"([{<\".includes(ch)) return SURROUND_PAIRS[ch]!;\n if (\")]}\".includes(ch)) return ch;\n return ch;\n}\n\n/** ms<char> – Surround selection with a character pair. */\nexport const executeSurroundAdd = (\n view: EditorView,\n ch: string,\n): boolean => {\n const state = view.state;\n const doc = state.doc;\n const open = openChar(ch);\n const close = closeChar(ch);\n\n const changes: ChangeSpec[] = [];\n for (const r of state.selection.ranges) {\n const { from, to } = r.empty ? { from: r.from, to: r.from + 1 } : r;\n changes.push({ from, to: from, insert: open });\n changes.push({ from: to, to, insert: close });\n }\n\n view.dispatch(\n state.update({\n changes,\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n }),\n );\n lastChange.current = { fn: (v) => executeSurroundAdd(v, ch) };\n return true;\n};\n\n/** Find the surrounding char pair around the cursor. */\nfunction findSurroundingPair(\n doc: Text,\n pos: number,\n targetOpen: string,\n targetClose: string,\n): { from: number; to: number } | null {\n // Symmetric delimiters (quotes: \" ' `) need a different strategy because\n // depth-tracking is impossible when open === close.\n if (targetOpen === targetClose) {\n const ch = targetOpen;\n // Scan left (inclusive of cursor) for the nearest quote — that's the opener.\n let openPos = -1;\n for (let p = pos; p >= 0; p--) {\n if (doc.sliceString(p, p + 1) === ch) { openPos = p; break; }\n }\n if (openPos < 0) return null;\n // Scan right of the opener for the closing quote.\n let closePos = -1;\n for (let p = openPos + 1; p < doc.length; p++) {\n if (doc.sliceString(p, p + 1) === ch) { closePos = p; break; }\n }\n if (closePos < 0 || pos > closePos) return null;\n return { from: openPos, to: closePos };\n }\n\n // Asymmetric delimiters (brackets): use depth-tracking.\n // Search backward for the opening char.\n let depth = 0;\n let openPos = -1;\n for (let p = pos; p >= 0; p--) {\n const c = doc.sliceString(p, p + 1);\n if (c === targetClose) depth++;\n else if (c === targetOpen) {\n if (depth === 0) { openPos = p; break; }\n depth--;\n }\n }\n if (openPos < 0) return null;\n\n // Search forward for the closing char.\n depth = 0;\n let closePos = -1;\n for (let p = pos; p < doc.length; p++) {\n const c = doc.sliceString(p, p + 1);\n if (c === targetOpen) depth++;\n else if (c === targetClose) {\n if (depth === 0) { closePos = p; break; }\n depth--;\n }\n }\n if (closePos < 0) return null;\n\n return { from: openPos, to: closePos };\n}\n\n/** md<char> – Delete surrounding character pair. */\nexport const executeSurroundDelete = (\n view: EditorView,\n ch: string,\n): boolean => {\n const state = view.state;\n const doc = state.doc;\n const targetOpen = openChar(ch);\n const targetClose = closeChar(ch);\n\n const changes: ChangeSpec[] = [];\n for (const r of state.selection.ranges) {\n const pair = findSurroundingPair(doc, r.head, targetOpen, targetClose);\n if (!pair) continue;\n // Delete close first (higher index), then open\n changes.push({ from: pair.to, to: pair.to + 1 });\n changes.push({ from: pair.from, to: pair.from + 1 });\n }\n\n if (changes.length === 0) return false;\n\n view.dispatch(\n state.update({\n changes,\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n }),\n );\n lastChange.current = { fn: (v) => executeSurroundDelete(v, ch) };\n return true;\n};\n\n/** mr<from><to> – Replace surrounding character pair. */\nexport const executeSurroundReplace = (\n view: EditorView,\n fromCh: string,\n toCh: string,\n): boolean => {\n const state = view.state;\n const doc = state.doc;\n const targetOpen = openChar(fromCh);\n const targetClose = closeChar(fromCh);\n const newOpen = openChar(toCh);\n const newClose = closeChar(toCh);\n\n const changes: ChangeSpec[] = [];\n for (const r of state.selection.ranges) {\n const pair = findSurroundingPair(doc, r.head, targetOpen, targetClose);\n if (!pair) continue;\n // Replace close first\n changes.push({ from: pair.to, to: pair.to + 1, insert: newClose });\n changes.push({ from: pair.from, to: pair.from + 1, insert: newOpen });\n }\n\n if (changes.length === 0) return false;\n\n view.dispatch(\n state.update({\n changes,\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n }),\n );\n lastChange.current = { fn: (v) => executeSurroundReplace(v, fromCh, toCh) };\n return true;\n};\n\n// ── Text objects ──────────────────────────────────────────────────────────────\n\ntype TextObjectType =\n | \"w\" | \"W\" | \"p\"\n | \"(\" | \")\" | \"b\"\n | \"[\" | \"]\"\n | \"{\" | \"}\" | \"B\"\n | \"<\" | \">\"\n | '\"' | \"'\" | \"`\";\n\nfunction selectTextObject(\n view: EditorView,\n obj: TextObjectType,\n inner: boolean,\n): boolean {\n const state = view.state;\n const doc = state.doc;\n\n const newRanges = state.selection.ranges.map((r) => {\n const pos = r.head;\n\n // Word\n if (obj === \"w\") {\n return selectWordObject(doc, pos, inner);\n }\n if (obj === \"W\") {\n return selectWORDObject(doc, pos, inner);\n }\n // Paragraph\n if (obj === \"p\") {\n return selectParagraphObject(doc, pos, inner);\n }\n // Bracket pairs\n const pairMap: Record<string, [string, string]> = {\n \"(\": [\"(\", \")\"],\n \")\": [\"(\", \")\"],\n b: [\"(\", \")\"],\n \"[\": [\"[\", \"]\"],\n \"]\": [\"[\", \"]\"],\n \"{\": [\"{\", \"}\"],\n \"}\": [\"{\", \"}\"],\n B: [\"{\", \"}\"],\n \"<\": [\"<\", \">\"],\n \">\": [\"<\", \">\"],\n };\n if (pairMap[obj]) {\n const [open, close] = pairMap[obj]!;\n return selectBracketObject(doc, pos, open, close, inner);\n }\n // Quotes\n if (obj === '\"' || obj === \"'\" || obj === \"`\") {\n return selectQuoteObject(doc, pos, obj, inner);\n }\n\n return r;\n });\n\n view.dispatch(\n state.update({\n selection: EditorSelection.create(\n newRanges,\n state.selection.mainIndex,\n ),\n effects: [setPendingOpEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n}\n\nfunction selectWordObject(\n doc: Text,\n pos: number,\n inner: boolean,\n): SelectionRange {\n let start = pos;\n let end = pos;\n const ch = doc.sliceString(pos, pos + 1);\n\n if (isWordChar(ch)) {\n while (start > 0 && isWordChar(doc.sliceString(start - 1, start))) start--;\n while (end < doc.length && isWordChar(doc.sliceString(end, end + 1))) end++;\n } else {\n while (start > 0 && !isWordChar(doc.sliceString(start - 1, start)) && !isSpaceChar(doc.sliceString(start - 1, start))) start--;\n while (end < doc.length && !isWordChar(doc.sliceString(end, end + 1)) && !isSpaceChar(doc.sliceString(end, end + 1))) end++;\n }\n\n if (!inner) {\n // Include trailing space\n while (end < doc.length && isSpaceChar(doc.sliceString(end, end + 1))) end++;\n }\n\n return EditorSelection.range(start, end);\n}\n\nfunction selectWORDObject(\n doc: Text,\n pos: number,\n inner: boolean,\n): SelectionRange {\n let start = pos;\n let end = pos;\n\n while (start > 0 && !isSpaceChar(doc.sliceString(start - 1, start))) start--;\n while (end < doc.length && !isSpaceChar(doc.sliceString(end, end + 1))) end++;\n\n if (!inner) {\n while (end < doc.length && isSpaceChar(doc.sliceString(end, end + 1))) end++;\n }\n\n return EditorSelection.range(start, end);\n}\n\nfunction selectParagraphObject(\n doc: Text,\n pos: number,\n _inner: boolean,\n): SelectionRange {\n const line = doc.lineAt(pos);\n let startLine = line.number;\n let endLine = line.number;\n\n while (startLine > 1 && doc.line(startLine - 1).text.trim() !== \"\") {\n startLine--;\n }\n while (endLine < doc.lines && doc.line(endLine + 1).text.trim() !== \"\") {\n endLine++;\n }\n\n return EditorSelection.range(\n doc.line(startLine).from,\n doc.line(endLine).to,\n );\n}\n\nfunction selectBracketObject(\n doc: Text,\n pos: number,\n open: string,\n close: string,\n inner: boolean,\n): SelectionRange {\n const pair = findSurroundingPair(doc, pos, open, close);\n if (!pair) return EditorSelection.cursor(pos);\n\n return inner\n ? EditorSelection.range(pair.from + 1, pair.to)\n : EditorSelection.range(pair.from, pair.to + 1);\n}\n\nfunction selectQuoteObject(\n doc: Text,\n pos: number,\n quote: string,\n inner: boolean,\n): SelectionRange {\n // Search backward for opening quote\n let openPos = -1;\n for (let p = pos; p >= 0; p--) {\n if (doc.sliceString(p, p + 1) === quote) {\n openPos = p;\n break;\n }\n }\n if (openPos < 0) return EditorSelection.cursor(pos);\n\n // Search forward for closing quote\n let closePos = -1;\n for (let p = openPos + 1; p < doc.length; p++) {\n if (doc.sliceString(p, p + 1) === quote) {\n closePos = p;\n break;\n }\n }\n if (closePos < 0) return EditorSelection.cursor(pos);\n\n return inner\n ? EditorSelection.range(openPos + 1, closePos)\n : EditorSelection.range(openPos, closePos + 1);\n}\n\n/** mi<obj> – Select inside text object. */\nexport const startSelectInside = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"select_inside\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** ma<obj> – Select around text object. */\nexport const startSelectAround = (view: EditorView): boolean => {\n view.dispatch({\n effects: [setPendingOpEffect.of({ type: \"select_around\" })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\nexport const executeSelectObject = (\n view: EditorView,\n obj: string,\n inner: boolean,\n): boolean => {\n return selectTextObject(view, obj as TextObjectType, inner);\n};\n\n// ── Insert-mode helpers ───────────────────────────────────────────────────────\n\n/** Ctrl-w in insert mode – delete previous word. */\nexport const insertDeletePrevWord = (view: EditorView): boolean => {\n const state = view.state;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const newPos = prevWordStart(state.doc, r.head);\n return { from: newPos, to: r.head };\n });\n view.dispatch(\n state.update({\n changes,\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** Ctrl-u in insert mode – delete to line start. */\nexport const insertDeleteToLineStart = (view: EditorView): boolean => {\n const state = view.state;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => ({\n from: lineStart(state.doc, r.head),\n to: r.head,\n }));\n view.dispatch(\n state.update({ changes, annotations: helixAnnotation.of(true) }),\n );\n return true;\n};\n\n/** Ctrl-k in insert mode – delete to line end. */\nexport const insertDeleteToLineEnd = (view: EditorView): boolean => {\n const state = view.state;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => ({\n from: r.head,\n to: state.doc.lineAt(r.head).to,\n }));\n view.dispatch(\n state.update({ changes, annotations: helixAnnotation.of(true) }),\n );\n return true;\n};\n\n/** Ctrl-j / Enter in insert mode – insert newline with indentation. */\nexport const insertNewline = (view: EditorView): boolean =>\n insertNewlineAndIndent(view);\n\n/** Alt-d / Alt-Delete in insert mode – delete next word forward. */\nexport const insertDeleteNextWord = (view: EditorView): boolean => {\n const state = view.state;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n const newPos = nextWordEnd(state.doc, r.head);\n return { from: r.head, to: Math.min(newPos + 1, state.doc.length) };\n });\n view.dispatch(\n state.update({\n changes,\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** Ctrl-h in insert mode – delete previous character (Backspace alias). */\nexport const insertDeletePrevChar = (view: EditorView): boolean => {\n const state = view.state;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n if (r.head <= 0) return { from: r.head, to: r.head };\n return { from: r.head - 1, to: r.head };\n });\n view.dispatch(\n state.update({\n changes,\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** Ctrl-d / Delete in insert mode – delete next character forward. */\nexport const insertDeleteNextChar = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const changes: ChangeSpec[] = state.selection.ranges.map((r) => {\n if (r.head >= doc.length) return { from: r.head, to: r.head };\n return { from: r.head, to: r.head + 1 };\n });\n view.dispatch(\n state.update({\n changes,\n annotations: helixAnnotation.of(true),\n }),\n );\n return true;\n};\n\n/** Ctrl-s in insert mode – commit an undo checkpoint. */\nexport const insertCommitUndoCheckpoint = (view: EditorView): boolean => {\n // Dispatch a no-op transaction annotated with isolateHistory to close the\n // current undo group, matching Helix's Ctrl-s \"commit_undo_checkpoint\".\n view.dispatch(\n view.state.update({\n annotations: [isolateHistory.of(\"full\"), helixAnnotation.of(true)],\n }),\n );\n return true;\n};\n\n// ── Join lines and select space ───────────────────────────────────────────────\n\n/** Alt-J – Join lines and select the inserted space character. */\nexport const joinLinesAndSelectSpace = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const count = getCount(state);\n const changes: ChangeSpec[] = [];\n const spacePositions: number[] = [];\n\n for (const r of state.selection.ranges) {\n const fromLine = doc.lineAt(r.from);\n const toLine = r.empty\n ? doc.line(Math.min(doc.lines, fromLine.number + count))\n : doc.lineAt(r.to > r.from ? r.to - 1 : r.to);\n\n for (let lineNum = fromLine.number; lineNum < toLine.number; lineNum++) {\n const line = doc.line(lineNum);\n const nextLine = doc.line(lineNum + 1);\n const nextContent = nextLine.text.trimStart();\n const removeLen = nextLine.text.length - nextContent.length;\n // Record where the space will be inserted (it ends up at line.to)\n if (nextContent.length > 0) {\n spacePositions.push(line.to);\n }\n changes.push({\n from: line.to,\n to: nextLine.from + removeLen,\n insert: nextContent.length > 0 ? \" \" : \"\",\n });\n }\n }\n\n if (changes.length === 0) return false;\n\n // Build changeset to map positions\n const changeSet = state.changes(changes);\n const newRanges = spacePositions.map((pos) => {\n const mapped = changeSet.mapPos(pos);\n return EditorSelection.cursor(mapped);\n });\n\n view.dispatch(\n state.update({\n changes,\n selection: newRanges.length > 0\n ? EditorSelection.create(newRanges, 0)\n : undefined,\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n lastChange.current = { fn: joinLinesAndSelectSpace };\n return true;\n};\n\n// ── Rotate selection contents ─────────────────────────────────────────────────\n\n/** Alt-) – Rotate selection contents forward (each selection gets next one's text). */\nexport const rotateSelectionContentsForward = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const ranges = state.selection.ranges;\n if (ranges.length <= 1) return false;\n\n // Gather text of each selection\n const texts = ranges.map((r) => {\n const { from, to } = r.empty\n ? { from: r.head, to: Math.min(r.head + 1, doc.length) }\n : { from: Math.min(r.anchor, r.head), to: Math.max(r.anchor, r.head) };\n return doc.sliceString(from, to);\n });\n\n // Rotate forward: selection[i] gets text[i-1]\n const rotated = [texts[texts.length - 1], ...texts.slice(0, -1)];\n\n const changes: ChangeSpec[] = ranges.map((r, i) => {\n const { from, to } = r.empty\n ? { from: r.head, to: Math.min(r.head + 1, doc.length) }\n : { from: Math.min(r.anchor, r.head), to: Math.max(r.anchor, r.head) };\n return { from, to, insert: rotated[i] };\n });\n\n view.dispatch(\n state.update({\n changes,\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n\n/** Alt-( – Rotate selection contents backward (each selection gets previous one's text). */\nexport const rotateSelectionContentsBackward = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const ranges = state.selection.ranges;\n if (ranges.length <= 1) return false;\n\n const texts = ranges.map((r) => {\n const { from, to } = r.empty\n ? { from: r.head, to: Math.min(r.head + 1, doc.length) }\n : { from: Math.min(r.anchor, r.head), to: Math.max(r.anchor, r.head) };\n return doc.sliceString(from, to);\n });\n\n // Rotate backward: selection[i] gets text[i+1]\n const rotated = [...texts.slice(1), texts[0]];\n\n const changes: ChangeSpec[] = ranges.map((r, i) => {\n const { from, to } = r.empty\n ? { from: r.head, to: Math.min(r.head + 1, doc.length) }\n : { from: Math.min(r.anchor, r.head), to: Math.max(r.anchor, r.head) };\n return { from, to, insert: rotated[i] };\n });\n\n view.dispatch(\n state.update({\n changes,\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n }),\n );\n return true;\n};\n","/**\n * search.ts\n *\n * Helix search: /, ?, n, N, *\n *\n * We implement a lightweight bottom-panel search bar using CodeMirror's\n * `showPanel` facet. The search state is kept in a StateField.\n *\n * Flow:\n * / → open forward search panel\n * ? → open backward search panel\n * Type → incremental highlight\n * Enter → confirm & close panel, keep matches highlighted\n * Escape → cancel, clear highlights\n * n → go to next match\n * N → go to previous match\n * * → search for the word under cursor\n */\n\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n Panel,\n ViewPlugin,\n type ViewUpdate,\n showPanel,\n} from \"@codemirror/view\";\nimport {\n RangeSetBuilder,\n StateEffect,\n StateField,\n type EditorState,\n EditorSelection,\n} from \"@codemirror/state\";\nimport {\n helixAnnotation,\n getHelixState,\n setLastSearchEffect,\n} from \"./state.js\";\nimport { isWordChar } from \"./motion.js\";\n\n// ── Search state ──────────────────────────────────────────────────────────────\n\nexport interface SearchState {\n active: boolean;\n /** The query currently being typed (only while panel is open). */\n input: string;\n /** Last confirmed search pattern. */\n pattern: string;\n forward: boolean;\n /** Positions of all matches in the document (from the last search). */\n matches: Array<{ from: number; to: number }>;\n /** Index of the \"current\" match. */\n currentMatch: number;\n}\n\nconst initialSearchState: SearchState = {\n active: false,\n input: \"\",\n pattern: \"\",\n forward: true,\n matches: [],\n currentMatch: 0,\n};\n\n// ── Effects ───────────────────────────────────────────────────────────────────\n\nexport const openSearchEffect = StateEffect.define<{\n forward: boolean;\n initial?: string;\n}>();\nexport const closeSearchEffect = StateEffect.define<null>();\nexport const updateSearchInputEffect = StateEffect.define<string>();\nexport const confirmSearchEffect = StateEffect.define<null>();\nexport const navigateMatchEffect = StateEffect.define<\"next\" | \"prev\">();\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findAllMatches(\n doc: import(\"@codemirror/state\").Text,\n pattern: string,\n flags = \"g\",\n): Array<{ from: number; to: number }> {\n if (!pattern) return [];\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, flags);\n } catch {\n return [];\n }\n\n const matches: Array<{ from: number; to: number }> = [];\n const text = doc.toString();\n let m: RegExpExecArray | null;\n while ((m = regex.exec(text)) !== null) {\n if (m[0].length === 0) {\n regex.lastIndex++; // avoid infinite loop on zero-length matches\n continue;\n }\n matches.push({ from: m.index, to: m.index + m[0].length });\n }\n return matches;\n}\n\nfunction nearestMatchIndex(\n matches: Array<{ from: number; to: number }>,\n pos: number,\n forward: boolean,\n): number {\n if (matches.length === 0) return 0;\n if (forward) {\n for (let i = 0; i < matches.length; i++) {\n if (matches[i].from >= pos) return i;\n }\n return 0; // wrap\n } else {\n for (let i = matches.length - 1; i >= 0; i--) {\n if (matches[i].from < pos) return i;\n }\n return matches.length - 1; // wrap\n }\n}\n\n// ── State field ───────────────────────────────────────────────────────────────\n\nexport const searchStateField = StateField.define<SearchState>({\n create: () => initialSearchState,\n\n update(state, tr) {\n let next = state;\n\n for (const effect of tr.effects) {\n if (effect.is(openSearchEffect)) {\n next = {\n ...next,\n active: true,\n input: effect.value.initial ?? \"\",\n forward: effect.value.forward,\n };\n } else if (effect.is(closeSearchEffect)) {\n next = { ...next, active: false, input: \"\" };\n } else if (effect.is(updateSearchInputEffect)) {\n const input = effect.value;\n const matches = findAllMatches(tr.state.doc, input, \"gi\");\n const curPos = tr.state.selection.main.head;\n const currentMatch = nearestMatchIndex(matches, curPos, next.forward);\n next = { ...next, input, matches, currentMatch };\n } else if (effect.is(confirmSearchEffect)) {\n const pattern = next.input;\n const matches = findAllMatches(tr.state.doc, pattern, \"gi\");\n const curPos = tr.state.selection.main.head;\n const currentMatch = nearestMatchIndex(matches, curPos, next.forward);\n next = {\n ...next,\n active: false,\n pattern,\n matches,\n currentMatch,\n input: \"\",\n };\n } else if (effect.is(navigateMatchEffect)) {\n const { matches, currentMatch } = next;\n if (matches.length === 0) break;\n const dir = effect.value === \"next\" ? 1 : -1;\n const newIdx =\n (currentMatch + dir + matches.length) % matches.length;\n next = { ...next, currentMatch: newIdx };\n }\n }\n\n // When the document changes outside of search, recompute matches\n if (tr.docChanged && !next.active && next.pattern) {\n const matches = findAllMatches(tr.state.doc, next.pattern, \"gi\");\n next = { ...next, matches };\n }\n\n return next;\n },\n});\n\n// ── Match decorations ─────────────────────────────────────────────────────────\n\nconst matchMark = Decoration.mark({ class: \"helix-search-match\" });\nconst currentMatchMark = Decoration.mark({ class: \"helix-search-current\" });\n\nfunction buildMatchDecorations(state: EditorState): DecorationSet {\n const ss = state.field(searchStateField);\n const { matches, currentMatch, pattern, input, active } = ss;\n const effectivePattern = active ? input : pattern;\n\n if (!effectivePattern || matches.length === 0) return Decoration.none;\n\n const builder = new RangeSetBuilder<Decoration>();\n // Ranges must be added in order\n const sorted = [...matches].sort((a, b) => a.from - b.from);\n\n for (let i = 0; i < sorted.length; i++) {\n const m = sorted[i];\n const origIdx = matches.indexOf(m);\n const isCurrent = origIdx === currentMatch;\n builder.add(m.from, m.to, isCurrent ? currentMatchMark : matchMark);\n }\n return builder.finish();\n}\n\nexport const searchMatchPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildMatchDecorations(view.state);\n }\n\n update(update: ViewUpdate) {\n if (\n update.docChanged ||\n update.state.field(searchStateField) !==\n update.startState.field(searchStateField)\n ) {\n this.decorations = buildMatchDecorations(update.state);\n }\n }\n },\n { decorations: (v) => v.decorations },\n);\n\n// ── Search panel ──────────────────────────────────────────────────────────────\n\nfunction createSearchPanel(view: EditorView): Panel {\n const dom = document.createElement(\"div\");\n dom.className = \"helix-search-panel\";\n dom.setAttribute(\"aria-label\", \"Search\");\n\n const prefix = document.createElement(\"span\");\n prefix.className = \"helix-search-prefix\";\n\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"helix-search-input\";\n input.setAttribute(\"aria-label\", \"search pattern\");\n input.spellcheck = false;\n\n const count = document.createElement(\"span\");\n count.className = \"helix-search-count\";\n\n dom.appendChild(prefix);\n dom.appendChild(input);\n dom.appendChild(count);\n\n // Sync prefix\n function syncPrefix() {\n const ss = view.state.field(searchStateField);\n prefix.textContent = ss.forward ? \"/\" : \"?\";\n }\n\n // Update count label\n function syncCount() {\n const ss = view.state.field(searchStateField);\n if (ss.matches.length > 0) {\n count.textContent = `${ss.currentMatch + 1}/${ss.matches.length}`;\n } else if (ss.input) {\n count.textContent = \"no matches\";\n } else {\n count.textContent = \"\";\n }\n }\n\n input.addEventListener(\"input\", () => {\n view.dispatch({\n effects: [updateSearchInputEffect.of(input.value)],\n annotations: helixAnnotation.of(true),\n });\n syncCount();\n });\n\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const ss = view.state.field(searchStateField);\n view.dispatch({\n effects: [\n confirmSearchEffect.of(null),\n setLastSearchEffect.of({\n pattern: ss.input,\n forward: ss.forward,\n }),\n ],\n annotations: helixAnnotation.of(true),\n });\n // Jump to current match\n jumpToCurrentMatch(view);\n view.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n view.dispatch({\n effects: [closeSearchEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n view.focus();\n } else if (e.key === \"Tab\" || (e.ctrlKey && e.key === \"n\")) {\n e.preventDefault();\n view.dispatch({\n effects: [navigateMatchEffect.of(\"next\")],\n annotations: helixAnnotation.of(true),\n });\n jumpToCurrentMatch(view);\n syncCount();\n } else if (e.shiftKey && e.key === \"Tab\" || (e.ctrlKey && e.key === \"p\")) {\n e.preventDefault();\n view.dispatch({\n effects: [navigateMatchEffect.of(\"prev\")],\n annotations: helixAnnotation.of(true),\n });\n jumpToCurrentMatch(view);\n syncCount();\n }\n });\n\n syncPrefix();\n\n return {\n dom,\n top: false, // show at bottom\n mount() {\n syncPrefix();\n input.value = \"\";\n input.focus();\n },\n update(update) {\n syncPrefix();\n syncCount();\n },\n };\n}\n\nfunction jumpToCurrentMatch(view: EditorView) {\n const ss = view.state.field(searchStateField);\n const { matches, currentMatch } = ss;\n if (matches.length === 0) return;\n const m = matches[currentMatch];\n if (!m) return;\n view.dispatch({\n selection: EditorSelection.create([EditorSelection.range(m.from, m.to)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n}\n\n// ── Panel facet (show/hide based on searchState.active) ───────────────────────\n\nexport const searchPanelExtension = showPanel.compute(\n [searchStateField],\n (state) => {\n const ss = state.field(searchStateField);\n return ss.active ? createSearchPanel : null;\n },\n);\n\n// ── Search commands ───────────────────────────────────────────────────────────\n\n/** / – Open forward search. */\nexport const openSearchForward = (view: EditorView): boolean => {\n view.dispatch({\n effects: [openSearchEffect.of({ forward: true })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** ? – Open backward search. */\nexport const openSearchBackward = (view: EditorView): boolean => {\n view.dispatch({\n effects: [openSearchEffect.of({ forward: false })],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** n – Go to next search match. */\nexport const gotoNextMatch = (view: EditorView): boolean => {\n const hs = getHelixState(view.state);\n const ss = view.state.field(searchStateField);\n\n if (ss.matches.length === 0 && hs.lastSearch) {\n // Rebuild matches from the last pattern\n const matches = findAllMatches(\n view.state.doc,\n hs.lastSearch.pattern,\n \"gi\",\n );\n const curPos = view.state.selection.main.head;\n const currentMatch = nearestMatchIndex(\n matches,\n curPos,\n hs.lastSearch.forward,\n );\n view.dispatch({\n effects: [\n navigateMatchEffect.of(\"next\"),\n ],\n annotations: helixAnnotation.of(true),\n });\n if (matches.length > 0) {\n const m = matches[(currentMatch + 1) % matches.length];\n view.dispatch({\n selection: EditorSelection.create([EditorSelection.range(m.from, m.to)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n }\n return true;\n }\n\n if (ss.matches.length === 0) return false;\n\n const curPos = view.state.selection.main.head;\n // Find next match after current position\n const nextIdx = nearestMatchIndex(ss.matches, curPos + 1, true);\n const m = ss.matches[nextIdx];\n if (!m) return false;\n\n view.dispatch({\n selection: EditorSelection.create([EditorSelection.range(m.from, m.to)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n\n // Update currentMatch\n view.dispatch({\n effects: [navigateMatchEffect.of(\"next\")],\n annotations: helixAnnotation.of(true),\n });\n // Actually place on the right index\n const ss2 = view.state.field(searchStateField);\n const m2 = ss2.matches[ss2.currentMatch];\n if (m2) {\n view.dispatch({\n selection: EditorSelection.create([EditorSelection.range(m2.from, m2.to)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n }\n return true;\n};\n\n\n/** N – Go to previous search match. */\nexport const gotoPrevMatch = (view: EditorView): boolean => {\n const ss = view.state.field(searchStateField);\n if (ss.matches.length === 0) return false;\n\n view.dispatch({\n effects: [navigateMatchEffect.of(\"prev\")],\n annotations: helixAnnotation.of(true),\n });\n\n jumpToCurrentMatch(view);\n return true;\n};\n\n/** * – Search for current selection (with word boundaries if a single word). */\nexport const searchCurrentSelection = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const r = state.selection.main;\n\n let text: string;\n let pattern: string;\n\n if (r.empty) {\n // Select word under cursor\n let start = r.head;\n let end = r.head;\n while (start > 0 && isWordChar(doc.sliceString(start - 1, start))) start--;\n while (end < doc.length && isWordChar(doc.sliceString(end, end + 1))) end++;\n text = doc.sliceString(start, end);\n pattern = text ? `\\\\b${escapeRegex(text)}\\\\b` : \"\";\n } else {\n text = doc.sliceString(r.from, r.to);\n pattern = escapeRegex(text);\n }\n\n if (!pattern) return false;\n\n const matches = findAllMatches(doc, pattern, \"gi\");\n const currentMatch = nearestMatchIndex(matches, r.from, true);\n\n view.dispatch({\n effects: [\n openSearchEffect.of({ forward: true, initial: pattern }),\n confirmSearchEffect.of(null),\n setLastSearchEffect.of({ pattern, forward: true }),\n ],\n annotations: helixAnnotation.of(true),\n });\n\n if (matches.length > 0) {\n const m = matches[currentMatch];\n view.dispatch({\n selection: EditorSelection.create([EditorSelection.range(m.from, m.to)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n }\n\n return true;\n};\n\n/** Alt-* – Search for selection without word boundaries. */\nexport const searchCurrentSelectionNoWB = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const r = state.selection.main;\n const text = r.empty\n ? doc.sliceString(r.head, r.head + 1)\n : doc.sliceString(r.from, r.to);\n const pattern = escapeRegex(text);\n\n if (!pattern) return false;\n\n const matches = findAllMatches(doc, pattern, \"gi\");\n const currentMatch = nearestMatchIndex(matches, r.from, true);\n\n view.dispatch({\n effects: [\n openSearchEffect.of({ forward: true, initial: pattern }),\n confirmSearchEffect.of(null),\n setLastSearchEffect.of({ pattern, forward: true }),\n ],\n annotations: helixAnnotation.of(true),\n });\n\n if (matches.length > 0) {\n const m = matches[currentMatch];\n view.dispatch({\n selection: EditorSelection.create([EditorSelection.range(m.from, m.to)]),\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n }\n\n return true;\n};\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n// ── Search theme ──────────────────────────────────────────────────────────────\n\nexport const searchTheme = EditorView.baseTheme({\n \"& .helix-search-match\": {\n background: \"rgba(255, 235, 100, 0.3)\",\n borderRadius: \"2px\",\n },\n \"& .helix-search-current\": {\n background: \"rgba(255, 180, 50, 0.5)\",\n borderRadius: \"2px\",\n outline: \"1px solid rgba(255, 180, 50, 0.8)\",\n },\n \"& .helix-search-panel\": {\n padding: \"3px 8px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n background: \"var(--helix-panel-bg, #1e1e2e)\",\n borderTop: \"1px solid #444\",\n },\n \"& .helix-search-prefix\": {\n color: \"#aaa\",\n fontFamily: \"monospace\",\n minWidth: \"12px\",\n },\n \"& .helix-search-input\": {\n flex: 1,\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n color: \"inherit\",\n fontFamily: \"monospace\",\n fontSize: \"inherit\",\n },\n \"& .helix-search-count\": {\n color: \"#888\",\n fontSize: \"0.8em\",\n minWidth: \"60px\",\n textAlign: \"right\",\n },\n});\n","/**\n * multiselect.ts\n *\n * Multi-selection commands:\n * C – copy selection onto next line\n * Alt-c – copy selection onto previous line\n * Alt-s – split selection on newlines\n * s – select all regex matches within selection (prompt)\n * S – split selection on regex (prompt)\n * K – keep only selections matching regex (prompt)\n * Alt-K – remove selections matching regex / keep non-matching (prompt)\n */\n\nimport {\n EditorSelection,\n type SelectionRange,\n StateEffect,\n StateField,\n} from \"@codemirror/state\";\nimport { EditorView, showPanel, type Panel } from \"@codemirror/view\";\nimport {\n clearCountEffect,\n getCount,\n helixAnnotation,\n} from \"./state.js\";\n\n// ── Panel state ───────────────────────────────────────────────────────────────\n\nexport type MultiSelectOp = \"select\" | \"split\" | \"keep\" | \"remove\";\n\ninterface MultiSelectState {\n active: boolean;\n op: MultiSelectOp | null;\n input: string;\n /** Selection captured when the panel opened — used as the scope for s/S and\n * restored on Escape for K/Alt-K. */\n savedRanges: readonly SelectionRange[];\n savedMainIndex: number;\n}\n\nconst initialMultiSelectState: MultiSelectState = {\n active: false,\n op: null,\n input: \"\",\n savedRanges: [],\n savedMainIndex: 0,\n};\n\n// ── Effects ───────────────────────────────────────────────────────────────────\n\nexport const openMultiSelectEffect = StateEffect.define<{\n op: MultiSelectOp;\n ranges: readonly SelectionRange[];\n mainIndex: number;\n}>();\nexport const closeMultiSelectEffect = StateEffect.define<null>();\nexport const updateMultiSelectInputEffect = StateEffect.define<string>();\n\n// ── State field ───────────────────────────────────────────────────────────────\n\nexport const multiSelectStateField = StateField.define<MultiSelectState>({\n create: () => initialMultiSelectState,\n\n update(state, tr) {\n let next = state;\n for (const effect of tr.effects) {\n if (effect.is(openMultiSelectEffect)) {\n next = {\n ...next,\n active: true,\n op: effect.value.op,\n input: \"\",\n savedRanges: effect.value.ranges,\n savedMainIndex: effect.value.mainIndex,\n };\n } else if (effect.is(closeMultiSelectEffect)) {\n next = { ...next, active: false, input: \"\" };\n } else if (effect.is(updateMultiSelectInputEffect)) {\n next = { ...next, input: effect.value };\n }\n }\n return next;\n },\n});\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction makeRegex(pattern: string): RegExp | null {\n try {\n return new RegExp(pattern, \"g\");\n } catch {\n return null;\n }\n}\n\n/** Effective [from, to] of a range — expands a cursor to cover 1 char. */\nfunction effectiveBounds(\n doc: import(\"@codemirror/state\").Text,\n range: SelectionRange,\n): { from: number; to: number } {\n if (!range.empty) return { from: range.from, to: range.to };\n return { from: range.from, to: Math.min(range.from + 1, doc.length) };\n}\n\n// ── Execution ─────────────────────────────────────────────────────────────────\n\nfunction executeMultiSelect(\n view: EditorView,\n ms: MultiSelectState,\n): void {\n const { op, input, savedRanges, savedMainIndex } = ms;\n const doc = view.state.doc;\n\n const close = (): void => {\n view.dispatch({\n effects: [closeMultiSelectEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n };\n\n if (!op || !input.trim()) { close(); return; }\n\n const re = makeRegex(input);\n if (!re) { close(); return; }\n\n let newRanges: SelectionRange[] = [];\n\n if (op === \"select\") {\n // Find all regex matches within each saved selection range.\n for (const range of savedRanges) {\n const { from, to } = effectiveBounds(doc, range);\n const text = doc.sliceString(from, to);\n re.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n if (m[0].length === 0) { re.lastIndex++; continue; }\n newRanges.push(\n EditorSelection.range(from + m.index, from + m.index + m[0].length),\n );\n }\n }\n } else if (op === \"split\") {\n // Split each saved range at regex match points; keep the parts between.\n for (const range of savedRanges) {\n const { from, to } = effectiveBounds(doc, range);\n const text = doc.sliceString(from, to);\n let lastEnd = 0;\n re.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n if (m[0].length === 0) { re.lastIndex++; continue; }\n if (m.index > lastEnd) {\n newRanges.push(EditorSelection.range(from + lastEnd, from + m.index));\n }\n lastEnd = m.index + m[0].length;\n }\n if (lastEnd < text.length) {\n newRanges.push(EditorSelection.range(from + lastEnd, from + text.length));\n }\n }\n } else if (op === \"keep\" || op === \"remove\") {\n const keepMatching = op === \"keep\";\n newRanges = [...savedRanges].filter((range) => {\n const { from, to } = effectiveBounds(doc, range);\n const text = doc.sliceString(from, to);\n re.lastIndex = 0;\n return keepMatching ? re.test(text) : !re.test(text);\n });\n }\n\n if (newRanges.length === 0) {\n // Nothing matched — restore original selection and close.\n view.dispatch({\n selection: EditorSelection.create(savedRanges as SelectionRange[], savedMainIndex),\n effects: [closeMultiSelectEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n return;\n }\n\n view.dispatch({\n selection: EditorSelection.create(newRanges, 0),\n effects: [closeMultiSelectEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n}\n\n// ── Panel ─────────────────────────────────────────────────────────────────────\n\nconst OP_LABELS: Record<MultiSelectOp, string> = {\n select: \"select:\",\n split: \"split:\",\n keep: \"keep:\",\n remove: \"remove:\",\n};\n\nfunction createMultiSelectPanel(view: EditorView): Panel {\n const dom = document.createElement(\"div\");\n dom.className = \"helix-multiselect-panel\";\n\n const prefix = document.createElement(\"span\");\n prefix.className = \"helix-multiselect-prefix\";\n\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"helix-multiselect-input\";\n input.setAttribute(\"aria-label\", \"multi-select pattern\");\n input.spellcheck = false;\n\n dom.appendChild(prefix);\n dom.appendChild(input);\n\n function syncPrefix() {\n const ms = view.state.field(multiSelectStateField);\n prefix.textContent = ms.op ? OP_LABELS[ms.op] : \"\";\n }\n\n input.addEventListener(\"input\", () => {\n view.dispatch({\n effects: [updateMultiSelectInputEffect.of(input.value)],\n annotations: helixAnnotation.of(true),\n });\n });\n\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const ms = view.state.field(multiSelectStateField);\n executeMultiSelect(view, { ...ms, input: input.value });\n view.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n const ms = view.state.field(multiSelectStateField);\n // Restore the original selection and close.\n view.dispatch({\n selection: EditorSelection.create(\n ms.savedRanges as SelectionRange[],\n ms.savedMainIndex,\n ),\n effects: [closeMultiSelectEffect.of(null)],\n annotations: helixAnnotation.of(true),\n });\n view.focus();\n }\n });\n\n syncPrefix();\n\n return {\n dom,\n top: false,\n mount() {\n syncPrefix();\n input.value = \"\";\n input.focus();\n },\n update() {\n syncPrefix();\n },\n };\n}\n\nexport const multiSelectPanelExtension = showPanel.compute(\n [multiSelectStateField],\n (state) => {\n const ms = state.field(multiSelectStateField);\n return ms.active ? createMultiSelectPanel : null;\n },\n);\n\nexport const multiSelectTheme = EditorView.baseTheme({\n \".helix-multiselect-panel\": {\n display: \"flex\",\n alignItems: \"center\",\n padding: \"4px 8px\",\n gap: \"6px\",\n borderTop: \"1px solid var(--helix-border, #444)\",\n background: \"var(--helix-panel-bg, #1e1e1e)\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n },\n \".helix-multiselect-prefix\": {\n color: \"var(--helix-accent, #7aa2f7)\",\n fontWeight: \"bold\",\n whiteSpace: \"nowrap\",\n },\n \".helix-multiselect-input\": {\n flex: \"1\",\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n color: \"inherit\",\n fontFamily: \"inherit\",\n fontSize: \"inherit\",\n },\n});\n\n// ── Panel-based commands ──────────────────────────────────────────────────────\n\nfunction openPanel(view: EditorView, op: MultiSelectOp): boolean {\n const state = view.state;\n view.dispatch({\n effects: [\n openMultiSelectEffect.of({\n op,\n ranges: state.selection.ranges,\n mainIndex: state.selection.mainIndex,\n }),\n ],\n annotations: helixAnnotation.of(true),\n });\n return true;\n}\n\nexport const openSelectWithin = (view: EditorView): boolean => openPanel(view, \"select\");\nexport const openSplitOn = (view: EditorView): boolean => openPanel(view, \"split\");\nexport const openKeepMatching = (view: EditorView): boolean => openPanel(view, \"keep\");\nexport const openRemoveMatching = (view: EditorView): boolean => openPanel(view, \"remove\");\n\n// ── Alt-s: split selection on newlines ───────────────────────────────────────\n\nexport const splitSelectionOnNewlines = (view: EditorView): boolean => {\n const state = view.state;\n const doc = state.doc;\n const newRanges: SelectionRange[] = [];\n\n for (const range of state.selection.ranges) {\n const { from, to } = effectiveBounds(doc, range);\n let pos = from;\n while (pos < to) {\n const line = doc.lineAt(pos);\n const lineEnd = Math.min(line.to, to);\n if (lineEnd > pos) {\n newRanges.push(EditorSelection.range(pos, lineEnd));\n }\n pos = line.to + 1; // step past the newline character\n }\n }\n\n if (newRanges.length === 0) return false;\n\n view.dispatch({\n selection: EditorSelection.create(newRanges, 0),\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n return true;\n};\n\n// ── C / Alt-c: copy selection to next/prev line ───────────────────────────────\n\nfunction copySelectionToLine(view: EditorView, direction: 1 | -1): boolean {\n const state = view.state;\n const doc = state.doc;\n const count = getCount(state);\n const added: SelectionRange[] = [];\n\n for (const range of state.selection.ranges) {\n const anchorLine = doc.lineAt(range.anchor);\n const headLine = doc.lineAt(range.head);\n\n const newAnchorLineNum = anchorLine.number + direction * count;\n const newHeadLineNum = headLine.number + direction * count;\n\n if (newHeadLineNum < 1 || newHeadLineNum > doc.lines) continue;\n if (newAnchorLineNum < 1 || newAnchorLineNum > doc.lines) continue;\n\n const newAnchorLine = doc.line(newAnchorLineNum);\n const newHeadLine = doc.line(newHeadLineNum);\n\n const anchorCol = range.anchor - anchorLine.from;\n const headCol = range.head - headLine.from;\n\n const newAnchor = Math.min(newAnchorLine.from + anchorCol, newAnchorLine.to);\n const newHead = Math.min(newHeadLine.from + headCol, newHeadLine.to);\n\n added.push(EditorSelection.range(newAnchor, newHead));\n }\n\n if (added.length === 0) return false;\n\n view.dispatch({\n selection: EditorSelection.create(\n [...state.selection.ranges, ...added],\n state.selection.mainIndex,\n ),\n effects: [clearCountEffect.of(null)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n return true;\n}\n\nexport const copySelectionToNextLine = (view: EditorView): boolean =>\n copySelectionToLine(view, 1);\n\nexport const copySelectionToPrevLine = (view: EditorView): boolean =>\n copySelectionToLine(view, -1);\n","/**\n * jumplist.ts\n *\n * A simple jump list allowing navigation between previously saved cursor\n * positions, mirroring Helix's jump-list behaviour.\n *\n * Ctrl-s – save current selection to the jump list (save_selection)\n * Ctrl-o – jump back to the previous saved position\n * Ctrl-i – jump forward (undo a Ctrl-o)\n *\n * The list behaves like browser back/forward history:\n * - Saving a new position trims any \"forward\" entries and appends to \"back\".\n * - Ctrl-o pops from \"back\", pushes current position to \"forward\", and\n * restores the popped selection.\n * - Ctrl-i pops from \"forward\", pushes current position to \"back\", and\n * restores the popped selection.\n */\n\nimport {\n EditorSelection,\n StateEffect,\n StateField,\n} from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\nimport { helixAnnotation } from \"./state.js\";\n\n// ── Effects ───────────────────────────────────────────────────────────────────\n\n/** Push a selection onto the back stack (and clear the forward stack). */\nexport const jumpPushEffect = StateEffect.define<EditorSelection>();\n\n/**\n * Move backward: value is the current selection being moved to \"forward\";\n * the state field pops from \"back\" to determine the new cursor position.\n */\nexport const jumpBackEffect = StateEffect.define<EditorSelection>();\n\n/**\n * Move forward: value is the current selection being moved to \"back\";\n * the state field pops from \"forward\" to determine the new cursor position.\n */\nexport const jumpForwardEffect = StateEffect.define<EditorSelection>();\n\n// ── State ─────────────────────────────────────────────────────────────────────\n\ninterface JumpListState {\n /** Positions to restore with Ctrl-o (oldest at index 0). */\n back: readonly EditorSelection[];\n /** Positions to restore with Ctrl-i (most-recent at index 0). */\n forward: readonly EditorSelection[];\n}\n\nexport const jumpListField = StateField.define<JumpListState>({\n create: () => ({ back: [], forward: [] }),\n\n update(state, tr) {\n for (const effect of tr.effects) {\n if (effect.is(jumpPushEffect)) {\n return { back: [...state.back, effect.value], forward: [] };\n }\n if (effect.is(jumpBackEffect)) {\n return {\n back: state.back.slice(0, -1),\n forward: [effect.value, ...state.forward],\n };\n }\n if (effect.is(jumpForwardEffect)) {\n return {\n back: [...state.back, effect.value],\n forward: state.forward.slice(1),\n };\n }\n }\n return state;\n },\n});\n\n// ── Commands ──────────────────────────────────────────────────────────────────\n\n/** Ctrl-s – Save the current selection to the jump list. */\nexport const saveSelection = (view: EditorView): boolean => {\n view.dispatch({\n effects: [jumpPushEffect.of(view.state.selection)],\n annotations: helixAnnotation.of(true),\n });\n return true;\n};\n\n/** Ctrl-o – Jump back to the previous saved position. */\nexport const jumpBack = (view: EditorView): boolean => {\n const jl = view.state.field(jumpListField);\n if (jl.back.length === 0) return false;\n const target = jl.back[jl.back.length - 1];\n const current = view.state.selection;\n view.dispatch({\n selection: target,\n effects: [jumpBackEffect.of(current)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n return true;\n};\n\n/** Ctrl-i – Jump forward (undo a previous Ctrl-o). */\nexport const jumpForward = (view: EditorView): boolean => {\n const jl = view.state.field(jumpListField);\n if (jl.forward.length === 0) return false;\n const target = jl.forward[0];\n const current = view.state.selection;\n view.dispatch({\n selection: target,\n effects: [jumpForwardEffect.of(current)],\n annotations: helixAnnotation.of(true),\n scrollIntoView: true,\n });\n return true;\n};\n","/**\n * goto-word.ts\n *\n * Implements the `gw` (goto word) label-jump command.\n *\n * When activated:\n * 1. Two-character labels are overlaid on every word start in the viewport.\n * 2. The user types the first character — non-matching labels disappear and\n * the remaining labels show only their second character.\n * 3. The user types the second character — the cursor jumps to that word.\n * 4. Escape cancels at any point.\n */\n\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from \"@codemirror/view\";\nimport { getHelixState } from \"./state.js\";\nimport { isWordChar } from \"./motion.js\";\n\n// ── Label alphabet ────────────────────────────────────────────────────────────\n// Home-row keys first for ergonomics.\nconst LABEL_CHARS = \"asdfjkl;ghqweruiopzxcvbnmty\";\n\n// ── Module-level store ────────────────────────────────────────────────────────\n// Labels are computed once when `gw` is pressed and held here until the jump\n// completes or is cancelled. Using a module-level cell (not CM state) because\n// the labels depend on the viewport, which isn't part of immutable CM state.\n\nexport type GotoWordEntry = { label: string; pos: number };\nexport const gotoWordStore: { labels: GotoWordEntry[] } = { labels: [] };\n\n// ── Label computation ─────────────────────────────────────────────────────────\n\n/** Find every word start in the visible viewport and assign a 2-char label. */\nexport function computeGotoWordLabels(view: EditorView): GotoWordEntry[] {\n const state = view.state;\n const cursorPos = state.selection.main.head;\n const positions: number[] = [];\n\n for (const { from, to } of view.visibleRanges) {\n const text = state.doc.sliceString(from, to);\n for (let i = 0; i < text.length; i++) {\n const absPos = from + i;\n if (absPos === cursorPos) continue; // skip the cursor position itself\n const ch = text[i];\n const prevCh = i > 0 ? text[i - 1] : \"\\n\";\n if (isWordChar(ch) && !isWordChar(prevCh)) {\n positions.push(absPos);\n }\n }\n }\n\n const entries: GotoWordEntry[] = [];\n let idx = 0;\n outer: for (let i = 0; i < LABEL_CHARS.length; i++) {\n for (let j = 0; j < LABEL_CHARS.length; j++) {\n if (idx >= positions.length) break outer;\n entries.push({ label: LABEL_CHARS[i] + LABEL_CHARS[j], pos: positions[idx++] });\n }\n }\n return entries;\n}\n\n// ── Label widget ──────────────────────────────────────────────────────────────\n\nclass LabelWidget extends WidgetType {\n constructor(readonly text: string) {\n super();\n }\n\n toDOM(): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = \"helix-goto-label\";\n span.textContent = this.text;\n return span;\n }\n\n eq(other: LabelWidget): boolean {\n return this.text === other.text;\n }\n\n ignoreEvent(): boolean {\n return true;\n }\n}\n\n// ── ViewPlugin ────────────────────────────────────────────────────────────────\n\nexport const gotoWordPlugin = ViewPlugin.fromClass(\n class GotoWordPlugin {\n decorations: DecorationSet = Decoration.none;\n\n constructor(view: EditorView) {\n this.decorations = this.build(view);\n }\n\n update(update: ViewUpdate) {\n const prevOp = getHelixState(update.startState).pendingOp;\n const nextOp = getHelixState(update.state).pendingOp;\n if (\n update.docChanged ||\n update.viewportChanged ||\n prevOp !== nextOp\n ) {\n this.decorations = this.build(update.view);\n }\n }\n\n build(view: EditorView): DecorationSet {\n const hs = getHelixState(view.state);\n\n if (!hs.pendingOp || hs.pendingOp.type !== \"goto_word\") {\n // Not active — clear the module-level store so it doesn't linger.\n gotoWordStore.labels = [];\n return Decoration.none;\n }\n\n const { input } = hs.pendingOp;\n const visible = gotoWordStore.labels\n .filter(({ label }) => label.startsWith(input))\n .sort((a, b) => a.pos - b.pos);\n\n const builder = new RangeSetBuilder<Decoration>();\n for (const { label, pos } of visible) {\n const to = Math.min(pos + 1, view.state.doc.length);\n // Before any input: show full 2-char label.\n // After first char typed: show only the second char (first was consumed).\n const displayText = input.length === 0 ? label : label[1];\n builder.add(pos, to, Decoration.replace({ widget: new LabelWidget(displayText) }));\n }\n return builder.finish();\n }\n },\n { decorations: (v) => v.decorations },\n);\n\n// ── Theme ─────────────────────────────────────────────────────────────────────\n\nexport const gotoWordTheme = EditorView.baseTheme({\n \"& .helix-goto-label\": {\n background: \"var(--helix-goto-label-bg, rgba(255, 165, 0, 0.9))\",\n color: \"var(--helix-goto-label-fg, #000)\",\n fontWeight: \"bold\",\n borderRadius: \"2px\",\n padding: \"0 1px\",\n fontFamily: \"monospace\",\n lineHeight: \"1\",\n cursor: \"default\",\n },\n});\n"],"mappings":"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","names":["import_state","import_commands","import_state","import_state","import_view","import_state","import_state","lineEnd","to","openPos","closePos","import_view","import_state","curPos","m","import_state","import_view","lineEnd","import_state","import_state","import_view","import_view"]}
|