@opentui/keymap 0.2.2 → 0.2.3
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 +56 -32
- package/chunks/index-frk6sdcd.js +409 -0
- package/chunks/index-frk6sdcd.js.map +14 -0
- package/package.json +17 -7
- package/src/addons/index.js +511 -4870
- package/src/addons/index.js.map +25 -0
- package/src/addons/opentui/edit-buffer-bindings.d.ts +6 -2
- package/src/addons/opentui/index.d.ts +2 -2
- package/src/addons/opentui/index.js +101 -5515
- package/src/addons/opentui/index.js.map +12 -0
- package/src/addons/universal/dead-bindings.d.ts +1 -1
- package/src/addons/universal/default-parser.d.ts +2 -2
- package/src/addons/universal/ex-commands.d.ts +11 -8
- package/src/addons/universal/index.d.ts +2 -1
- package/src/addons/universal/leader.d.ts +1 -1
- package/src/addons/universal/metadata.d.ts +2 -2
- package/src/addons/universal/mod-bindings.d.ts +6 -0
- package/src/addons/universal/unresolved-commands.d.ts +1 -1
- package/src/extras/binding-sections.d.ts +4 -4
- package/src/extras/command-bindings.d.ts +2 -2
- package/src/extras/formatting.d.ts +3 -0
- package/src/extras/graph.d.ts +9 -0
- package/src/extras/graph.js +373 -0
- package/src/extras/graph.js.map +11 -0
- package/src/extras/index.js +13 -0
- package/src/extras/index.js.map +12 -0
- package/src/extras/lib/graph-snapshot.d.ts +14 -0
- package/src/extras/lib/graph-types.d.ts +83 -0
- package/src/html.d.ts +3 -3
- package/src/html.js +47 -4992
- package/src/html.js.map +10 -0
- package/src/index.d.ts +3 -1
- package/src/index.js +2688 -2807
- package/src/index.js.map +34 -0
- package/src/keymap.d.ts +17 -33
- package/src/lib/emitter.d.ts +1 -2
- package/src/lib/registry.d.ts +2 -2
- package/src/lib/runtime-utils.d.ts +34 -0
- package/src/opentui.d.ts +1 -3
- package/src/opentui.js +40 -4994
- package/src/opentui.js.map +10 -0
- package/src/react/index.d.ts +5 -19
- package/src/react/index.js +3 -0
- package/src/react/index.js.map +10 -0
- package/src/runtime-modules.d.ts +2 -0
- package/src/runtime-modules.js +5 -0
- package/src/runtime-modules.js.map +10 -0
- package/src/services/activation.d.ts +7 -33
- package/src/services/active-key-cache.d.ts +29 -0
- package/src/services/command-catalog.d.ts +27 -52
- package/src/services/command-executor.d.ts +6 -12
- package/src/services/compiler.d.ts +4 -12
- package/src/services/conditions.d.ts +4 -16
- package/src/services/dispatch-decisions.d.ts +21 -0
- package/src/services/dispatch-patterns.d.ts +5 -0
- package/src/services/dispatch.d.ts +6 -42
- package/src/services/environment.d.ts +6 -24
- package/src/services/extension-context.d.ts +16 -0
- package/src/services/layer-diagnostics.d.ts +10 -0
- package/src/services/layers.d.ts +15 -24
- package/src/services/notify.d.ts +6 -8
- package/src/services/pending-sequence.d.ts +4 -0
- package/src/services/primitives/active-layers.d.ts +2 -3
- package/src/services/primitives/bindings.d.ts +4 -0
- package/src/services/primitives/field-invariants.d.ts +16 -1
- package/src/services/primitives/pending-captures.d.ts +5 -0
- package/src/services/runtime-view.d.ts +5 -0
- package/src/services/runtime.d.ts +2 -7
- package/src/services/sequence-index.d.ts +24 -0
- package/src/services/state.d.ts +46 -92
- package/src/solid/index.d.ts +5 -19
- package/src/solid/index.js +3 -0
- package/src/solid/index.js.map +10 -0
- package/src/testing/index.d.ts +90 -0
- package/src/testing/index.js +276 -0
- package/src/testing/index.js.map +10 -0
- package/src/types.d.ts +180 -128
- package/src/services/primitives/binding-inputs.d.ts +0 -4
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/addons/universal/default-parser.ts", "../src/addons/universal/binding-overrides.ts", "../src/addons/universal/aliases.ts", "../src/addons/universal/backspace-pops-pending-sequence.ts", "../src/addons/universal/comma-bindings.ts", "../src/addons/universal/dead-bindings.ts", "../src/addons/universal/escape-clears-pending-sequence.ts", "../src/addons/universal/enabled.ts", "../src/addons/universal/emacs-bindings.ts", "../src/addons/universal/ex-commands.ts", "../src/addons/universal/leader.ts", "../src/addons/universal/metadata.ts", "../src/addons/universal/mod-bindings.ts", "../src/addons/universal/neovim-disambiguation.ts", "../src/addons/universal/timed-leader.ts", "../src/addons/universal/unresolved-commands.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type {\n BindingParser,\n EventMatchResolver,\n KeyMatch,\n Keymap,\n KeymapEvent,\n KeySequencePart,\n KeyStrokeInput,\n} from \"../../index.js\"\n\nconst namedSingleStrokeKeys = new Set<string>([\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n \"clear\",\n \"escape\",\n \"return\",\n \"linefeed\",\n \"enter\",\n \"tab\",\n \"backspace\",\n \"delete\",\n \"insert\",\n \"home\",\n \"end\",\n \"pageup\",\n \"pagedown\",\n \"space\",\n \"lt\",\n \"gt\",\n \"plus\",\n \"minus\",\n \"equal\",\n \"comma\",\n \"period\",\n \"slash\",\n \"backslash\",\n \"semicolon\",\n \"quote\",\n \"backquote\",\n \"leftbracket\",\n \"rightbracket\",\n \"capslock\",\n \"numlock\",\n \"scrolllock\",\n \"printscreen\",\n \"pause\",\n \"menu\",\n \"apps\",\n \"kp0\",\n \"kp1\",\n \"kp2\",\n \"kp3\",\n \"kp4\",\n \"kp5\",\n \"kp6\",\n \"kp7\",\n \"kp8\",\n \"kp9\",\n \"kpdecimal\",\n \"kpdivide\",\n \"kpmultiply\",\n \"kpminus\",\n \"kpplus\",\n \"kpenter\",\n \"kpequal\",\n \"kpseparator\",\n \"kpleft\",\n \"kpright\",\n \"kpup\",\n \"kpdown\",\n \"kppageup\",\n \"kppagedown\",\n \"kphome\",\n \"kpend\",\n \"kpinsert\",\n \"kpdelete\",\n \"mediaplay\",\n \"mediapause\",\n \"mediaplaypause\",\n \"mediareverse\",\n \"mediastop\",\n \"mediafastforward\",\n \"mediarewind\",\n \"medianext\",\n \"mediaprev\",\n \"mediarecord\",\n \"volumedown\",\n \"volumeup\",\n \"mute\",\n \"leftshift\",\n \"leftctrl\",\n \"leftalt\",\n \"leftsuper\",\n \"lefthyper\",\n \"leftmeta\",\n \"rightshift\",\n \"rightctrl\",\n \"rightalt\",\n \"rightsuper\",\n \"righthyper\",\n \"rightmeta\",\n \"iso_level3_shift\",\n \"iso_level5_shift\",\n \"option\",\n \"alt\",\n \"meta\",\n \"super\",\n \"hyper\",\n \"control\",\n \"ctrl\",\n \"shift\",\n])\n\nconst modifierKeyNames = new Set<string>([\"ctrl\", \"control\", \"shift\", \"meta\", \"alt\", \"option\", \"super\", \"hyper\"])\n\nconst namedSingleStrokeKeyPrefixes = createPrefixBuckets(namedSingleStrokeKeys)\nconst modifierKeyPrefixes = createPrefixBuckets(modifierKeyNames)\n\ntype DefaultParserContext = Parameters<BindingParser>[0]\n\nfunction createPrefixBuckets(values: Iterable<string>): ReadonlyMap<number, readonly string[]> {\n const buckets = new Map<number, string[]>()\n\n for (const value of values) {\n const first = value.charCodeAt(0)\n if (Number.isNaN(first)) {\n continue\n }\n\n let bucket = buckets.get(first)\n if (!bucket) {\n bucket = []\n buckets.set(first, bucket)\n }\n\n bucket.push(value)\n }\n\n for (const bucket of buckets.values()) {\n bucket.sort((left, right) => right.length - left.length)\n }\n\n return buckets\n}\n\nfunction toLowerAsciiCode(code: number): number {\n return code >= 65 && code <= 90 ? code + 32 : code\n}\n\nfunction isDigitCode(code: number): boolean {\n return code >= 48 && code <= 57\n}\n\nfunction startsWithAsciiInsensitive(input: string, prefix: string, index: number): boolean {\n if (input.startsWith(prefix, index)) {\n return true\n }\n\n if (index + prefix.length > input.length) {\n return false\n }\n\n for (let offset = 0; offset < prefix.length; offset += 1) {\n if (toLowerAsciiCode(input.charCodeAt(index + offset)) !== prefix.charCodeAt(offset)) {\n return false\n }\n }\n\n return true\n}\n\nfunction findBucketedPrefixMatch(\n buckets: ReadonlyMap<number, readonly string[]>,\n input: string,\n index: number,\n): string | undefined {\n const first = input.charCodeAt(index)\n if (Number.isNaN(first)) {\n return undefined\n }\n\n const candidates = buckets.get(toLowerAsciiCode(first))\n if (!candidates) {\n return undefined\n }\n\n for (const candidate of candidates) {\n if (startsWithAsciiInsensitive(input, candidate, index)) {\n return candidate\n }\n }\n\n return undefined\n}\n\nfunction parseObjectKeyInput(\n ctx: DefaultParserContext,\n key: KeyStrokeInput,\n display?: string,\n match?: KeyMatch,\n tokenName?: string,\n): KeySequencePart {\n return ctx.parseObjectKey(key, {\n display,\n match,\n tokenName,\n })\n}\n\nfunction parseStringKeyPart(input: string, ctx: DefaultParserContext): KeySequencePart {\n if (input === \" \") {\n return ctx.parseObjectKey({ name: \"space\" }, { display: \"space\" })\n }\n\n if (input === \"+\") {\n return ctx.parseObjectKey({ name: \"+\" }, { display: \"+\" })\n }\n\n const parts = input.split(\"+\")\n let name = \"\"\n let displayName = \"\"\n let ctrl = false\n let shift = false\n let meta = false\n let superKey = false\n let hyper = false\n\n for (const rawPart of parts) {\n const part = rawPart.trim()\n if (!part) {\n continue\n }\n\n const lowered = part.toLowerCase()\n if (lowered === \"ctrl\" || lowered === \"control\") {\n ctrl = true\n continue\n }\n\n if (lowered === \"shift\") {\n shift = true\n continue\n }\n\n if (lowered === \"meta\" || lowered === \"alt\" || lowered === \"option\") {\n meta = true\n continue\n }\n\n if (lowered === \"super\") {\n superKey = true\n continue\n }\n\n if (lowered === \"hyper\") {\n hyper = true\n continue\n }\n\n if (name) {\n throw new Error(`Invalid key \"${input}\": multiple key names are not supported`)\n }\n\n name = part\n displayName = lowered\n }\n\n if (!name) {\n throw new Error(`Invalid key \"${input}\": missing key name`)\n }\n\n const displayParts: string[] = []\n if (ctrl) displayParts.push(\"ctrl\")\n if (shift) displayParts.push(\"shift\")\n if (meta) displayParts.push(\"meta\")\n if (superKey) displayParts.push(\"super\")\n if (hyper) displayParts.push(\"hyper\")\n displayParts.push(displayName)\n\n return ctx.parseObjectKey(\n {\n name,\n ctrl,\n shift,\n meta,\n super: superKey,\n hyper: hyper || undefined,\n },\n {\n display: displayParts.join(\"+\"),\n },\n )\n}\n\nfunction parseNamedKeyPart(name: string, ctx: DefaultParserContext): KeySequencePart {\n const normalized = name.trim().toLowerCase()\n return ctx.parseObjectKey({ name: normalized }, { display: normalized })\n}\n\nfunction findNamedSingleStrokeKey(input: string, index: number): string | undefined {\n const namedKey = findBucketedPrefixMatch(namedSingleStrokeKeyPrefixes, input, index)\n if (namedKey) {\n return namedKey\n }\n\n if (toLowerAsciiCode(input.charCodeAt(index)) !== 102 || !isDigitCode(input.charCodeAt(index + 1))) {\n return undefined\n }\n\n const end = isDigitCode(input.charCodeAt(index + 2)) ? index + 3 : index + 2\n return input.slice(index, end).toLowerCase()\n}\n\nfunction findModifierKey(input: string, index: number): string | undefined {\n return findBucketedPrefixMatch(modifierKeyPrefixes, input, index)\n}\n\nfunction parseModifiedKeyPart(\n input: string,\n index: number,\n ctx: DefaultParserContext,\n):\n | {\n part: KeySequencePart\n nextIndex: number\n }\n | undefined {\n let cursor = index\n let ctrl = false\n let shift = false\n let meta = false\n let superKey = false\n let hyper = false\n\n while (cursor < input.length) {\n const modifier = findModifierKey(input, cursor)\n if (!modifier) {\n break\n }\n\n const plusIndex = cursor + modifier.length\n if (input[plusIndex] !== \"+\") {\n break\n }\n\n if (modifier === \"ctrl\" || modifier === \"control\") {\n ctrl = true\n } else if (modifier === \"shift\") {\n shift = true\n } else if (modifier === \"meta\" || modifier === \"alt\" || modifier === \"option\") {\n meta = true\n } else if (modifier === \"super\") {\n superKey = true\n } else if (modifier === \"hyper\") {\n hyper = true\n }\n\n cursor = plusIndex + 1\n }\n\n if (cursor === index) {\n return undefined\n }\n\n const char = input[cursor]\n if (char === undefined) {\n throw new Error(`Invalid key \"${input.slice(index)}\": missing key name`)\n }\n\n const name = findNamedSingleStrokeKey(input, cursor) ?? char\n const displayName = name === \" \" ? \"space\" : name === \"+\" ? \"+\" : name.toLowerCase()\n const displayParts: string[] = []\n if (ctrl) displayParts.push(\"ctrl\")\n if (shift) displayParts.push(\"shift\")\n if (meta) displayParts.push(\"meta\")\n if (superKey) displayParts.push(\"super\")\n if (hyper) displayParts.push(\"hyper\")\n displayParts.push(displayName)\n\n return {\n part: ctx.parseObjectKey(\n {\n name: name === \" \" ? \"space\" : name,\n ctrl,\n shift,\n meta,\n super: superKey,\n hyper: hyper || undefined,\n },\n {\n display: displayParts.join(\"+\"),\n },\n ),\n nextIndex: cursor + name.length,\n }\n}\n\nexport const defaultBindingParser: BindingParser = (ctx) => {\n const { input, index, tokens, normalizeTokenName } = ctx\n\n if (index === 0 && input.includes(\"+\") && /\\s/.test(input)) {\n return {\n parts: [parseStringKeyPart(input, ctx)],\n nextIndex: input.length,\n }\n }\n\n const char = input[index]\n if (char === undefined) {\n return undefined\n }\n\n if (char === \"<\") {\n const end = input.indexOf(\">\", index)\n if (end === -1) {\n return {\n parts: [parseStringKeyPart(char, ctx)],\n nextIndex: index + 1,\n }\n }\n\n const tokenName = normalizeTokenName(input.slice(index + 1, end))\n const token = tokens.get(tokenName)\n if (!token) {\n return {\n parts: [],\n nextIndex: end + 1,\n unknownTokens: [tokenName],\n }\n }\n\n return {\n parts: [parseObjectKeyInput(ctx, token.stroke, `<${tokenName}>`, token.match, tokenName)],\n nextIndex: end + 1,\n usedTokens: [tokenName],\n }\n }\n\n if (char === \"{\") {\n const end = input.indexOf(\"}\", index)\n if (end === -1) {\n return {\n parts: [parseStringKeyPart(char, ctx)],\n nextIndex: index + 1,\n }\n }\n\n const patternName = normalizeTokenName(input.slice(index + 1, end))\n const pattern = ctx.patterns.get(patternName)\n if (!pattern) {\n return {\n parts: [],\n nextIndex: end + 1,\n unknownTokens: [patternName],\n }\n }\n\n const part = ctx.parseObjectKey(\n { name: patternName, ctrl: false, shift: false, meta: false, super: false },\n { display: pattern.display ?? `{${patternName}}`, match: pattern.match },\n )\n\n return {\n parts: [{ ...part, patternName: pattern.name, payloadKey: pattern.payloadKey }],\n nextIndex: end + 1,\n usedTokens: [patternName],\n }\n }\n\n const modified = parseModifiedKeyPart(input, index, ctx)\n if (modified) {\n return {\n parts: [modified.part],\n nextIndex: modified.nextIndex,\n }\n }\n\n const namedKey = findNamedSingleStrokeKey(input, index)\n if (namedKey) {\n return {\n parts: [parseNamedKeyPart(namedKey, ctx)],\n nextIndex: index + namedKey.length,\n }\n }\n\n return {\n parts: [parseStringKeyPart(char, ctx)],\n nextIndex: index + 1,\n }\n}\n\nexport const defaultEventMatchResolver: EventMatchResolver<KeymapEvent> = (event, ctx) => {\n return [\n ctx.resolveKey({\n name: event.name,\n ctrl: event.ctrl,\n shift: event.shift,\n meta: event.meta,\n super: event.super ?? false,\n hyper: event.hyper || undefined,\n }),\n ]\n}\n\n/**\n * Parses the built-in string binding syntax, including modifiers,\n * `<token>` aliases, and `{pattern}` dynamic sequence segments.\n */\nexport function registerDefaultBindingParser<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.appendBindingParser((ctx) => defaultBindingParser(ctx))\n}\n\n/**\n * Matches incoming key events against their canonical normalized stroke.\n */\nexport function registerDefaultEventMatchResolver<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.appendEventMatchResolver((event, ctx) => defaultEventMatchResolver(event, ctx))\n}\n\n/**\n * Installs the standard parser and event matcher used by most keymaps.\n */\nexport function registerDefaultKeys<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n const offParser = registerDefaultBindingParser(keymap)\n const offResolver = registerDefaultEventMatchResolver(keymap)\n\n return () => {\n offResolver()\n offParser()\n }\n}\n",
|
|
6
|
+
"import type { Binding, Keymap, KeymapEvent } from \"../../index.js\"\n\nconst BINDING_OVERRIDES_RESOURCE = Symbol(\"keymap:binding-overrides\")\n\nfunction normalizeBindingOverrides<TTarget extends object, TEvent extends KeymapEvent>(\n value: unknown,\n): readonly Binding<TTarget, TEvent>[] {\n if (!Array.isArray(value)) {\n throw new Error('Keymap layer field \"bindingOverrides\" must be an array of binding objects')\n }\n\n return value as readonly Binding<TTarget, TEvent>[]\n}\n\nfunction getBindingOverrides<TTarget extends object, TEvent extends KeymapEvent>(\n layer: Readonly<Record<string, unknown>>,\n): readonly Binding<TTarget, TEvent>[] | undefined {\n const overrides = layer.bindingOverrides\n if (!overrides || !Array.isArray(overrides)) {\n return undefined\n }\n\n return normalizeBindingOverrides<TTarget, TEvent>(overrides)\n}\n\n/**\n * Adds a `bindingOverrides` layer field that replaces bindings by string\n * command name within that layer before compilation.\n */\nexport function registerBindingOverrides<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(BINDING_OVERRIDES_RESOURCE, () => {\n const offLayerField = keymap.registerLayerFields({\n bindingOverrides(value) {\n normalizeBindingOverrides<TTarget, TEvent>(value)\n },\n })\n\n const offTransformer = keymap.appendLayerBindingsTransformer((bindings, ctx) => {\n const overrides = getBindingOverrides<TTarget, TEvent>(ctx.layer)\n if (!overrides) {\n return\n }\n\n const validation = ctx.validateBindings(overrides)\n if (!validation.ok) {\n throw new Error(validation.reason)\n }\n\n const overrideCommands = new Set(\n overrides.flatMap((binding) => (typeof binding.cmd === \"string\" ? [binding.cmd.trim()] : [])),\n )\n\n return [\n ...overrides,\n ...bindings.filter((binding) => {\n return typeof binding.cmd !== \"string\" || !overrideCommands.has(binding.cmd.trim())\n }),\n ]\n })\n\n return () => {\n offTransformer()\n offLayerField()\n }\n })\n}\n",
|
|
7
|
+
"import type { Keymap, KeymapEvent } from \"../../index.js\"\n\nexport type Aliases = Record<string, string>\n\nconst ALIASES_FIELD_RESOURCE = Symbol(\"keymap:aliases-field\")\n\nfunction normalizeAliases(value: unknown): Aliases {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error('Keymap aliases field \"aliases\" must be an object of key-name mappings')\n }\n\n const aliases: Aliases = {}\n\n for (const [name, key] of Object.entries(value as Record<string, unknown>)) {\n const trimmedName = name.trim()\n if (!trimmedName) {\n throw new Error('Keymap aliases field \"aliases\" cannot contain empty alias names')\n }\n\n if (typeof key !== \"string\") {\n throw new Error(`Keymap alias \"${trimmedName}\" must map to a string key name`)\n }\n\n const trimmedKey = key.trim()\n if (!trimmedKey) {\n throw new Error(`Keymap alias \"${trimmedName}\" cannot map to an empty key name`)\n }\n\n aliases[trimmedName.toLowerCase()] = trimmedKey.toLowerCase()\n }\n\n return aliases\n}\n\nfunction getAliases(layer: Readonly<Record<string, unknown>>): Aliases | undefined {\n const aliases = layer.aliases\n if (!aliases || typeof aliases !== \"object\" || Array.isArray(aliases)) {\n return undefined\n }\n\n return normalizeAliases(aliases)\n}\n\n/**\n * Adds an `aliases` layer field for remapping single-key binding names within\n * that layer.\n */\nexport function registerAliasesField<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(ALIASES_FIELD_RESOURCE, () => {\n const offLayerField = keymap.registerLayerFields({\n aliases(value, ctx) {\n normalizeAliases(value)\n },\n })\n\n const offBindingTransformer = keymap.appendBindingTransformer((binding, ctx) => {\n const aliases = getAliases(ctx.layer)\n if (!aliases) {\n return\n }\n\n if (binding.sequence.length !== 1) {\n return\n }\n\n const [part] = binding.sequence\n if (!part) {\n return\n }\n\n const aliasedName = aliases[part.stroke.name]\n if (!aliasedName) {\n return\n }\n\n ctx.add({\n ...binding,\n sequence: [\n ctx.parseKey({\n ...part.stroke,\n name: aliasedName,\n }),\n ],\n })\n })\n\n return () => {\n offBindingTransformer()\n offLayerField()\n }\n })\n}\n",
|
|
8
|
+
"import type { Keymap, KeymapEvent } from \"../../index.js\"\n\nexport interface BackspacePopsPendingSequenceOptions {\n /**\n * When true, consume Backspace after popping the sequence so it does not\n * reach the focused target or lower-priority listeners. Default: `true`.\n */\n preventDefault?: boolean\n priority?: number\n}\n\n/**\n * Lets `Backspace` step back through the current pending multi-key sequence.\n */\nexport function registerBackspacePopsPendingSequence<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n options?: BackspacePopsPendingSequenceOptions,\n): () => void {\n const shouldPreventDefault = options?.preventDefault ?? true\n\n return keymap.intercept(\n \"key\",\n ({ event, consume }) => {\n if (event.name !== \"backspace\") {\n return\n }\n\n if (!keymap.popPendingSequence()) {\n return\n }\n\n if (shouldPreventDefault) {\n consume()\n }\n },\n { priority: options?.priority ?? 0 },\n )\n}\n",
|
|
9
|
+
"import type { BindingExpander, Keymap, KeymapEvent } from \"../../index.js\"\n\nconst COMMA_BINDINGS_RESOURCE = Symbol(\"keymap:comma-bindings\")\n\nconst commaBindingExpander: BindingExpander = ({ input, displays }) => {\n if (!input.includes(\",\")) {\n return undefined\n }\n\n const parts = input.split(\",\").map((part) => part.trim())\n if (parts.some((part) => part.length === 0)) {\n throw new Error(`Invalid key sequence \"${input}\": comma-separated bindings cannot contain empty entries`)\n }\n\n if (!displays) {\n return parts.map((key) => ({ key }))\n }\n\n const displayParts = displays.length === 1 ? displays[0]!.split(\",\").map((part) => part.trim()) : displays\n if (displayParts.length !== parts.length || displayParts.some((part) => part.length === 0)) {\n return parts.map((key) => ({ key }))\n }\n\n return parts.map((key, index) => ({\n key,\n displays: displayParts[index]!.trim().split(/\\s+/).filter(Boolean),\n }))\n}\n\n/**\n * Expands comma-separated binding strings such as `j,k` into separate\n * bindings.\n */\nexport function registerCommaBindings<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(COMMA_BINDINGS_RESOURCE, () => {\n return keymap.appendBindingExpander(commaBindingExpander)\n })\n}\n",
|
|
10
|
+
"import { stringifyKeySequence, stringifyKeyStroke } from \"@opentui/keymap\"\nimport type { Keymap, KeymapEvent, LayerBindingAnalysis, LayerAnalysisContext } from \"@opentui/keymap\"\n\nconst DEAD_BINDING_WARNINGS_RESOURCE = Symbol(\"keymap:dead-binding-warnings\")\n\nfunction isDeadMetadataOnlyBinding<TTarget extends object, TEvent extends KeymapEvent>(\n binding: LayerBindingAnalysis<TTarget, TEvent>,\n): boolean {\n if (binding.command !== undefined) {\n return false\n }\n\n if (binding.event === \"release\") {\n return true\n }\n\n return !binding.hasContinuations && !binding.hasCommandAtSequence\n}\n\nfunction warnDeadMetadataOnlyBinding<TTarget extends object, TEvent extends KeymapEvent>(\n ctx: LayerAnalysisContext<TTarget, TEvent>,\n binding: LayerBindingAnalysis<TTarget, TEvent>,\n): void {\n const sequence = stringifyKeySequence(binding.parsedBinding.sequence, { preferDisplay: true })\n const sourceKey =\n typeof binding.parsedBinding.key === \"string\"\n ? binding.parsedBinding.key\n : stringifyKeyStroke(binding.parsedBinding.key)\n const warningKey = `dead-binding:${binding.sourceLayerOrder}:${binding.bindingIndex}:${sourceKey}`\n\n ctx.warnOnce(\n warningKey,\n \"dead-binding\",\n {\n binding: binding.parsedBinding,\n target: binding.sourceTarget,\n },\n `[Keymap] Binding \"${sequence}\" has no command and no reachable continuations; it will never trigger`,\n )\n}\n\n/**\n * Warns about bindings that can never trigger because they have no command and\n * no reachable continuation.\n */\nexport function registerDeadBindingWarnings<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(DEAD_BINDING_WARNINGS_RESOURCE, () => {\n return keymap.appendLayerAnalyzer((ctx) => {\n for (const binding of ctx.bindings) {\n if (!isDeadMetadataOnlyBinding(binding)) {\n continue\n }\n\n warnDeadMetadataOnlyBinding(ctx, binding)\n }\n })\n })\n}\n",
|
|
11
|
+
"import type { Keymap, KeymapEvent } from \"../../index.js\"\n\nexport interface EscapeClearsPendingSequenceOptions {\n /**\n * When true, consume Escape after clearing the sequence so it does not\n * reach the focused renderable or lower-priority listeners. Default: `true`.\n */\n preventDefault?: boolean\n priority?: number\n}\n\n/**\n * Lets `Escape` cancel an in-progress multi-key sequence before it dispatches\n * further.\n */\nexport function registerEscapeClearsPendingSequence<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n options?: EscapeClearsPendingSequenceOptions,\n): () => void {\n const shouldPreventDefault = options?.preventDefault ?? true\n\n return keymap.intercept(\n \"key\",\n ({ event, consume }) => {\n if (event.name !== \"escape\") {\n return\n }\n\n if (!keymap.hasPendingSequence()) {\n return\n }\n\n keymap.clearPendingSequence()\n\n if (shouldPreventDefault) {\n consume()\n }\n },\n { priority: options?.priority ?? 0 },\n )\n}\n",
|
|
12
|
+
"import type { Keymap, KeymapEvent, ReactiveMatcher } from \"../../index.js\"\n\nconst ENABLED_FIELDS_RESOURCE = Symbol(\"keymap:enabled-fields\")\n\n/**\n * Accepted `enabled` values: boolean, raw `() => boolean`, or an\n * `ReactiveMatcher` for subscription-driven invalidation.\n */\nexport type Enabled = boolean | (() => boolean) | ReactiveMatcher\n\nfunction isReactiveMatcher(value: unknown): value is ReactiveMatcher {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const candidate = value as { get?: unknown; subscribe?: unknown }\n return typeof candidate.get === \"function\" && typeof candidate.subscribe === \"function\"\n}\n\nfunction normalizeEnabledValue(fieldName: string, value: unknown): Enabled {\n if (typeof value === \"boolean\") {\n return value\n }\n\n if (typeof value === \"function\") {\n return value as () => boolean\n }\n\n if (isReactiveMatcher(value)) {\n return value\n }\n\n throw new Error(`Keymap enabled field \"${fieldName}\" must be a boolean, a function, or a reactive matcher`)\n}\n\n/**\n * Adds `enabled` layer and command fields for boolean, callback, or reactive\n * matcher gating.\n */\nexport function registerEnabledFields<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(ENABLED_FIELDS_RESOURCE, () => {\n const offLayerFields = keymap.registerLayerFields({\n enabled(value, ctx) {\n const normalized = normalizeEnabledValue(\"enabled\", value)\n if (normalized === true) {\n return\n }\n\n if (normalized === false) {\n ctx.activeWhen(() => false)\n return\n }\n\n ctx.activeWhen(normalized)\n },\n })\n\n const offCommandFields = keymap.registerCommandFields({\n enabled(value, ctx) {\n const normalized = normalizeEnabledValue(\"enabled\", value)\n if (normalized === true) {\n return\n }\n\n if (normalized === false) {\n ctx.activeWhen(() => false)\n return\n }\n\n ctx.activeWhen(normalized)\n },\n })\n\n return () => {\n offCommandFields()\n offLayerFields()\n }\n })\n}\n",
|
|
13
|
+
"import type { BindingParser, BindingParserContext, Keymap, KeymapEvent, KeySequencePart } from \"../../index.js\"\n\nconst EMACS_BINDINGS_RESOURCE = Symbol(\"keymap:emacs-bindings\")\n\n/**\n * Example Emacs-style chord parsing.\n *\n * This is included as a sample addon and may not be a complete or accurate\n * representation of Emacs binding syntax.\n */\n\nfunction parseEmacsStroke(\n input: string,\n sequence: string,\n parseObjectKey: BindingParserContext[\"parseObjectKey\"],\n): KeySequencePart {\n const parts = input.split(\"+\")\n let name = \"\"\n let ctrl = false\n let shift = false\n let meta = false\n let superKey = false\n let hyper = false\n\n for (const rawPart of parts) {\n const part = rawPart.trim()\n if (!part) {\n continue\n }\n\n const lowered = part.toLowerCase()\n if (lowered === \"ctrl\" || lowered === \"control\") {\n ctrl = true\n continue\n }\n\n if (lowered === \"shift\") {\n shift = true\n continue\n }\n\n if (lowered === \"meta\" || lowered === \"alt\" || lowered === \"option\") {\n meta = true\n continue\n }\n\n if (lowered === \"super\") {\n superKey = true\n continue\n }\n\n if (lowered === \"hyper\") {\n hyper = true\n continue\n }\n\n if (name) {\n throw new Error(`Invalid emacs key sequence \"${sequence}\": stroke \"${input}\" contains multiple key names`)\n }\n\n name = part\n }\n\n if (!name) {\n throw new Error(`Invalid emacs key sequence \"${sequence}\": stroke \"${input}\" is missing a key name`)\n }\n\n return parseObjectKey({\n name,\n ctrl,\n shift,\n meta,\n super: superKey,\n hyper: hyper || undefined,\n })\n}\n\nfunction parseEmacsSequence(\n input: string,\n parseObjectKey: BindingParserContext[\"parseObjectKey\"],\n): KeySequencePart[] | undefined {\n const strokes = input.trim().split(/\\s+/).filter(Boolean)\n\n if (strokes.length <= 1) {\n return undefined\n }\n\n if (!strokes.some((stroke) => stroke.includes(\"+\"))) {\n return undefined\n }\n\n return strokes.map((stroke) => parseEmacsStroke(stroke, input, parseObjectKey))\n}\n\n/**\n * Parses Emacs-style space-separated chords such as `ctrl+x ctrl+s`.\n */\nexport function registerEmacsBindings<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(EMACS_BINDINGS_RESOURCE, () => {\n const parseEmacsBinding: BindingParser = ({ input, index, parseObjectKey }) => {\n const parsed = parseEmacsSequence(input, parseObjectKey)\n if (!parsed || index !== 0) {\n return undefined\n }\n\n return {\n parts: parsed,\n nextIndex: input.length,\n }\n }\n\n return keymap.prependBindingParser(parseEmacsBinding)\n })\n}\n",
|
|
14
|
+
"import type { CommandContext, Command, CommandResult, Keymap, KeymapEvent, ParsedCommand } from \"../../index.js\"\n\nconst EX_COMMANDS_RESOURCE = Symbol(\"keymap:ex-commands\")\n\nexport interface ExCommandPayload {\n raw: string\n args: readonly string[]\n payload?: unknown\n}\n\nexport interface ExCommand<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n name: string\n aliases?: string[]\n nargs?: \"0\" | \"1\" | \"?\" | \"*\" | \"+\"\n run: (ctx: CommandContext<TTarget, TEvent, ExCommandPayload>) => CommandResult<TTarget, TEvent>\n [key: string]: unknown\n}\n\nfunction isExCommandPayload(value: unknown): value is ExCommandPayload {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const candidate = value as { raw?: unknown; args?: unknown }\n return typeof candidate.raw === \"string\" && Array.isArray(candidate.args)\n}\n\nfunction getExCommandPayload(input: string, payload: unknown): ExCommandPayload {\n if (isExCommandPayload(payload)) {\n return payload\n }\n\n return { raw: input, args: [], payload }\n}\n\nfunction normalizeExCommandName(name: string): string {\n const normalized = name.trim()\n if (!normalized) {\n throw new Error(\"Invalid keymap command name: name cannot be empty\")\n }\n\n if (/\\s/.test(normalized)) {\n throw new Error(`Invalid keymap command name \"${name}\": command names cannot contain whitespace`)\n }\n\n if (normalized.startsWith(\":\")) {\n return normalized\n }\n\n return `:${normalized}`\n}\n\nfunction normalizeExCommandAliases(value: unknown): string[] {\n if (!Array.isArray(value)) {\n throw new Error('Keymap ex-command field \"aliases\" must be an array of command names')\n }\n\n const aliases: string[] = []\n for (const alias of value) {\n if (typeof alias !== \"string\") {\n throw new Error('Keymap ex-command field \"aliases\" must only contain command names')\n }\n\n aliases.push(alias)\n }\n\n return aliases\n}\n\nfunction normalizeExCommandNargs(value: unknown): ExCommand[\"nargs\"] {\n if (value === \"0\" || value === \"1\" || value === \"?\" || value === \"*\" || value === \"+\") {\n return value\n }\n\n throw new Error('Keymap ex-command field \"nargs\" must be \"0\", \"1\", \"?\", \"*\", or \"+\"')\n}\n\nfunction getExCommandAliases<TTarget extends object, TEvent extends KeymapEvent>(\n command: Command<TTarget, TEvent>,\n): readonly string[] {\n const aliases = command.aliases\n if (aliases === undefined) {\n return []\n }\n\n return normalizeExCommandAliases(aliases)\n}\n\nfunction isExCommand<TTarget extends object, TEvent extends KeymapEvent>(command: Command<TTarget, TEvent>): boolean {\n return command.name.trim().startsWith(\":\") || command.namespace === \"excommands\"\n}\n\nfunction parseCommandInput(input: string): ParsedCommand {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error(\"Invalid keymap command: command cannot be empty\")\n }\n\n const parts = trimmed.split(/\\s+/)\n const [name, ...args] = parts\n if (!name) {\n throw new Error(`Invalid keymap command \"${input}\"`)\n }\n\n return {\n input: trimmed,\n name,\n args,\n }\n}\n\nfunction validateCommandArgs<TTarget extends object, TEvent extends KeymapEvent>(\n command: Command<TTarget, TEvent>,\n args: readonly unknown[],\n): boolean {\n if (command.nargs === undefined) {\n return true\n }\n\n const nargs = normalizeExCommandNargs(command.nargs)\n const count = args.length\n if (nargs === \"0\") {\n return count === 0\n }\n\n if (nargs === \"1\") {\n return count === 1\n }\n\n if (nargs === \"?\") {\n return count <= 1\n }\n\n if (nargs === \"*\") {\n return true\n }\n\n if (nargs === \"+\") {\n return count >= 1\n }\n\n return true\n}\n\nfunction createExCommandRegistration<TTarget extends object, TEvent extends KeymapEvent>(\n command: Command<TTarget, TEvent>,\n name: string,\n): Command<TTarget, TEvent, ExCommandPayload> {\n const run = command.run\n\n return {\n ...command,\n name,\n namespace: \"excommands\",\n run(ctx) {\n const payload = getExCommandPayload(ctx.input, ctx.payload)\n\n if (!validateCommandArgs(command, payload.args)) {\n return { ok: false, reason: \"invalid-args\" }\n }\n\n return run({\n ...ctx,\n command: ctx.command!,\n payload,\n })\n },\n }\n}\n\n/**\n * Installs Ex command support. Ex commands are registered through normal\n * keymap layers by using a colon-prefixed command name or\n * `namespace: \"excommands\"`.\n */\nexport function registerExCommands<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(EX_COMMANDS_RESOURCE, () => {\n const offFields = keymap.registerCommandFields({\n aliases(value) {\n normalizeExCommandAliases(value)\n },\n nargs(value) {\n normalizeExCommandNargs(value)\n },\n })\n\n const offTransformer = keymap.appendCommandTransformer((command, ctx) => {\n if (!isExCommand(command)) {\n return\n }\n\n ctx.skipOriginal()\n\n if (command.nargs !== undefined) {\n normalizeExCommandNargs(command.nargs)\n }\n\n const names = [command.name, ...getExCommandAliases(command)].map((name) => normalizeExCommandName(name))\n for (const name of names) {\n ctx.add(createExCommandRegistration(command, name))\n }\n })\n\n const offResolver = keymap.appendCommandResolver((input, ctx) => {\n if (!input.startsWith(\":\")) {\n return undefined\n }\n\n const parsed = parseCommandInput(input)\n const normalizedName = normalizeExCommandName(parsed.name)\n const command = ctx.getCommand(normalizedName)\n\n if (!command) {\n return undefined\n }\n\n ctx.setInput(parsed.input)\n ctx.setPayload({ raw: parsed.input, args: parsed.args, payload: ctx.payload } satisfies ExCommandPayload)\n return command\n })\n\n return () => {\n offResolver()\n offTransformer()\n offFields()\n }\n })\n}\n",
|
|
15
|
+
"import type { KeyLike, Keymap, KeymapEvent } from \"../../index.js\"\n\nexport interface LeaderOptions {\n trigger: KeyLike\n name?: string\n}\n\n/**\n * Defines a token such as `leader` that the default parser can reference as `<leader>`.\n */\nexport function registerLeader<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n options: LeaderOptions,\n): () => void {\n return keymap.registerToken({\n name: options.name ?? \"leader\",\n key: options.trigger,\n })\n}\n",
|
|
16
|
+
"import type { Keymap, KeymapEvent } from \"../../index.js\"\n\nconst METADATA_FIELDS_RESOURCE = Symbol(\"keymap:metadata-fields\")\n\nfunction normalizeMetadataText(fieldName: string, value: unknown): string {\n if (typeof value !== \"string\") {\n throw new Error(`Keymap metadata field \"${fieldName}\" must be a string`)\n }\n\n const trimmed = value.trim()\n if (!trimmed) {\n throw new Error(`Keymap metadata field \"${fieldName}\" cannot be empty`)\n }\n\n return trimmed\n}\n\n/**\n * Maps `desc`, `group`, `title`, and `category` fields into binding and\n * command attrs.\n *\n * This addon only registers binding and command field compilers. Apps can\n * register layer metadata fields directly with `registerLayerFields`.\n */\nexport function registerMetadataFields<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(METADATA_FIELDS_RESOURCE, () => {\n const offBindingFields = keymap.registerBindingFields({\n desc(value, ctx) {\n ctx.attr(\"desc\", normalizeMetadataText(\"desc\", value))\n },\n group(value, ctx) {\n ctx.attr(\"group\", normalizeMetadataText(\"group\", value))\n },\n })\n\n const offCommandFields = keymap.registerCommandFields({\n desc(value, ctx) {\n ctx.attr(\"desc\", normalizeMetadataText(\"desc\", value))\n },\n title(value, ctx) {\n ctx.attr(\"title\", normalizeMetadataText(\"title\", value))\n },\n category(value, ctx) {\n ctx.attr(\"category\", normalizeMetadataText(\"category\", value))\n },\n })\n\n return () => {\n offCommandFields()\n offBindingFields()\n }\n })\n}\n",
|
|
17
|
+
"import type { BindingExpander, HostMetadata, Keymap, KeymapEvent } from \"../../index.js\"\n\nconst MOD_BINDINGS_RESOURCE = Symbol(\"keymap:mod-bindings\")\n\nconst MOD_MODIFIER_PATTERN = /(^|[+,\\s])mod(?=\\s*\\+)/i\nconst MOD_MODIFIER_REPLACE_PATTERN = /(^|[+,\\s])mod(?=\\s*\\+)/gi\n\nfunction resolveModModifier(metadata: Readonly<HostMetadata>): \"ctrl\" | \"super\" {\n const primary = metadata.primaryModifier\n if ((primary === \"ctrl\" || primary === \"super\") && metadata.modifiers[primary] !== \"unsupported\") {\n return primary\n }\n\n if (metadata.modifiers.ctrl !== \"unsupported\") {\n return \"ctrl\"\n }\n\n return \"super\"\n}\n\nfunction createDisplays(input: string): readonly string[] {\n if (input.includes(\",\")) {\n return [input]\n }\n\n const trimmed = input.trim()\n return trimmed.includes(\" \") ? trimmed.split(/\\s+/) : [input]\n}\n\n/**\n * Adds a platform-aware `mod+...` modifier alias. `mod` resolves to the host's\n * primary modifier, with `ctrl` as the fallback when the host is unknown.\n */\nexport function registerModBindings<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(MOD_BINDINGS_RESOURCE, () => {\n const expandModBinding: BindingExpander = ({ input, displays }) => {\n if (!MOD_MODIFIER_PATTERN.test(input)) {\n return undefined\n }\n\n const modifier = resolveModModifier(keymap.getHostMetadata())\n return [\n {\n key: input.replace(MOD_MODIFIER_REPLACE_PATTERN, (_match, prefix: string) => `${prefix}${modifier}`),\n displays: displays ?? createDisplays(input),\n },\n ]\n }\n\n return keymap.appendBindingExpander(expandModBinding)\n })\n}\n",
|
|
18
|
+
"import type { Keymap, KeymapEvent } from \"../../index.js\"\n\nexport interface NeovimDisambiguationOptions {\n timeoutMs?: number\n}\n\n/**\n * Defers ambiguous exact-vs-prefix bindings and runs the exact binding if no\n * continuation arrives before the timeout, matching Neovim-style timeout-based\n * disambiguation.\n */\nexport function registerNeovimDisambiguation<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n options?: NeovimDisambiguationOptions,\n): () => void {\n const timeoutMs = options?.timeoutMs ?? 300\n\n return keymap.appendDisambiguationResolver((ctx) => {\n return ctx.defer(async (deferred) => {\n const elapsed = await deferred.sleep(timeoutMs)\n if (!elapsed) {\n return\n }\n\n return deferred.runExact()\n })\n })\n}\n",
|
|
19
|
+
"import type { Keymap, KeymapEvent, KeySequencePart } from \"../../index.js\"\nimport { registerLeader, type LeaderOptions } from \"./leader.js\"\n\nexport interface TimedLeaderOptions extends LeaderOptions {\n timeoutMs?: number\n onArm?: () => void\n onDisarm?: () => void\n}\n\n/**\n * Defines a leader token and clears it if no follow-up key arrives before the\n * timeout.\n */\nexport function registerTimedLeader<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n options: TimedLeaderOptions,\n): () => void {\n const matchesTrigger = keymap.createKeyMatcher(options.trigger)\n const timeoutMs = options.timeoutMs ?? 1500\n\n let armed = false\n let timeout: ReturnType<typeof setTimeout> | undefined\n\n const clearTimer = (): void => {\n if (!timeout) {\n return\n }\n\n clearTimeout(timeout)\n timeout = undefined\n }\n\n const scheduleTimeout = (): void => {\n clearTimer()\n timeout = setTimeout(() => {\n keymap.clearPendingSequence()\n }, timeoutMs)\n }\n\n const syncArmedState = (sequence: readonly KeySequencePart[]): void => {\n const nextArmed = matchesTrigger(sequence[0])\n if (nextArmed) {\n scheduleTimeout()\n } else {\n clearTimer()\n }\n\n if (nextArmed === armed) {\n return\n }\n\n armed = nextArmed\n if (armed) {\n options.onArm?.()\n return\n }\n\n options.onDisarm?.()\n }\n\n const offLeader = registerLeader(keymap, options)\n const offPendingSequenceChange = keymap.on(\"pendingSequence\", (sequence) => {\n syncArmedState(sequence)\n })\n syncArmedState(keymap.getPendingSequence())\n\n const dispose = (): void => {\n clearTimer()\n offPendingSequenceChange()\n offLeader()\n\n if (!armed) {\n return\n }\n\n armed = false\n options.onDisarm?.()\n }\n\n return dispose\n}\n",
|
|
20
|
+
"import { stringifyKeySequence, stringifyKeyStroke } from \"@opentui/keymap\"\nimport type { Keymap, KeymapEvent, LayerAnalysisContext, ParsedBinding } from \"@opentui/keymap\"\n\nconst UNRESOLVED_COMMAND_WARNINGS_RESOURCE = Symbol(\"keymap:unresolved-command-warnings\")\n\ninterface UnresolvedCommandWarning<TTarget extends object, TEvent extends KeymapEvent> {\n command: string\n binding: ParsedBinding<TTarget, TEvent>\n target?: TTarget\n}\n\nfunction warnUnresolvedCommand<TTarget extends object, TEvent extends KeymapEvent>(\n ctx: LayerAnalysisContext<TTarget, TEvent>,\n binding: LayerAnalysisContext<TTarget, TEvent>[\"bindings\"][number],\n): void {\n if (typeof binding.command !== \"string\") {\n return\n }\n\n if (ctx.checkCommandResolution(binding.command) !== \"unresolved\") {\n return\n }\n\n const sequence = stringifyKeySequence(binding.parsedBinding.sequence, { preferDisplay: true })\n const sourceKey =\n typeof binding.parsedBinding.key === \"string\"\n ? binding.parsedBinding.key\n : stringifyKeyStroke(binding.parsedBinding.key)\n const warning: UnresolvedCommandWarning<TTarget, TEvent> = {\n command: binding.command,\n binding: binding.parsedBinding,\n target: binding.sourceTarget,\n }\n\n ctx.warnOnce(\n `unresolved:${binding.sourceLayerOrder}:${binding.bindingIndex}:${binding.command}:${sourceKey}`,\n \"unresolved-command\",\n warning,\n `[Keymap] Unresolved command \"${binding.command}\" for binding \"${sequence}\"`,\n )\n}\n\n/**\n * Warns when a string command name cannot be resolved by registered commands\n * or resolvers.\n */\nexport function registerUnresolvedCommandWarnings<TTarget extends object, TEvent extends KeymapEvent>(\n keymap: Keymap<TTarget, TEvent>,\n): () => void {\n return keymap.acquireResource(UNRESOLVED_COMMAND_WARNINGS_RESOURCE, () => {\n return keymap.appendLayerAnalyzer((ctx) => {\n for (const binding of ctx.bindings) {\n warnUnresolvedCommand(ctx, binding)\n }\n })\n })\n}\n"
|
|
21
|
+
],
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "BC9676433CEF75A964756E2164756E21",
|
|
24
|
+
"names": []
|
|
25
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { type CliRenderer, type KeyEvent, type Renderable } from "@opentui/core";
|
|
2
|
-
import type {
|
|
2
|
+
import type { Binding, Bindings, Keymap, Layer } from "../../index.js";
|
|
3
3
|
declare const editBufferActions: readonly ["move-left", "move-right", "move-up", "move-down", "select-left", "select-right", "select-up", "select-down", "line-home", "line-end", "select-line-home", "select-line-end", "visual-line-home", "visual-line-end", "select-visual-line-home", "select-visual-line-end", "buffer-home", "buffer-end", "select-buffer-home", "select-buffer-end", "delete-line", "delete-to-line-end", "delete-to-line-start", "backspace", "delete", "newline", "undo", "redo", "word-forward", "word-backward", "select-word-forward", "select-word-backward", "delete-word-forward", "delete-word-backward", "select-all", "submit"];
|
|
4
4
|
export type EditBufferCommandName = (typeof editBufferActions)[number];
|
|
5
|
+
export type EditBufferFineGroup = "Cursor" | "Selection" | "Delete" | "History" | "Insert" | "Submit";
|
|
5
6
|
export interface EditBufferCommandOptions {
|
|
7
|
+
category?: string;
|
|
8
|
+
group?: string;
|
|
9
|
+
includeFineGroup?: boolean;
|
|
6
10
|
commandNames?: Partial<Record<EditBufferCommandName, string>>;
|
|
7
11
|
descriptions?: Partial<Record<EditBufferCommandName, string>>;
|
|
8
12
|
}
|
|
@@ -16,7 +20,7 @@ export type ManagedTextareaLayer = Omit<Layer<Renderable, KeyEvent>, "bindings"
|
|
|
16
20
|
* take precedence. Prefer `registerManagedTextareaLayer` unless you are
|
|
17
21
|
* composing a custom textarea integration.
|
|
18
22
|
*/
|
|
19
|
-
export declare function createTextareaBindings(overrides?: readonly
|
|
23
|
+
export declare function createTextareaBindings(overrides?: readonly Binding[], options?: EditBufferCommandOptions): Binding[];
|
|
20
24
|
/**
|
|
21
25
|
* Suspends a focused `TextareaRenderable`'s own key handling so keymap
|
|
22
26
|
* bindings can take over, restoring the previous suspend state on cleanup or
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from "
|
|
1
|
+
export * from "@opentui/keymap/addons";
|
|
2
2
|
export { registerBaseLayoutFallback } from "./base-layout.js";
|
|
3
3
|
export { createTextareaBindings, registerEditBufferCommands, registerManagedTextareaLayer, registerTextareaMappingSuspension, } from "./edit-buffer-bindings.js";
|
|
4
|
-
export type { EditBufferCommandName, EditBufferCommandOptions } from "./edit-buffer-bindings.js";
|
|
4
|
+
export type { EditBufferCommandName, EditBufferCommandOptions, EditBufferFineGroup } from "./edit-buffer-bindings.js";
|