opencode-vim
Advanced tools
+1
-1
| { | ||
| "name": "opencode-vim", | ||
| "version": "0.0.9", | ||
| "version": "0.0.10", | ||
| "exports": { | ||
@@ -5,0 +5,0 @@ "./tui": { |
@@ -5,2 +5,3 @@ /** @jsxImportSource @opentui/solid */ | ||
| import { onCleanup } from "solid-js" | ||
| import type { Accessor } from "solid-js" | ||
| import type { PromptContext, PromptModule } from "../../prompt/types" | ||
@@ -17,3 +18,3 @@ import { applyVimCursorStyle, focusedInput } from "./actions" | ||
| export function createVimModule(options?: unknown): PromptModule { | ||
| export function createVimModule(options?: unknown, enabled: Accessor<boolean> = () => true): PromptModule { | ||
| const config = createVimConfig(options) | ||
@@ -31,6 +32,6 @@ const log = createVimLog(config) | ||
| renderAbove(ctx) { | ||
| return <VimKeyboard ctx={ctx} config={config} state={state} log={log} /> | ||
| return <VimKeyboard ctx={ctx} config={config} state={state} enabled={enabled} log={log} /> | ||
| }, | ||
| renderRight(ctx) { | ||
| return <VimStatus mode={state.mode} pending={() => readablePending(state.pending())} theme={ctx.api.theme.current} pendingDisplayDelay={config.pendingDisplayDelay} disabled={ctx.disabled} log={log} requestRender={ctx.requestRender} /> | ||
| return <VimStatus mode={state.mode} pending={() => readablePending(state.pending())} enabled={enabled} theme={ctx.api.theme.current} pendingDisplayDelay={config.pendingDisplayDelay} disabled={ctx.disabled} log={log} requestRender={ctx.requestRender} /> | ||
| }, | ||
@@ -40,3 +41,3 @@ } | ||
| function VimKeyboard(props: { ctx: PromptContext; config: VimConfig; state: ReturnType<typeof createVimState>; log: VimLog }) { | ||
| function VimKeyboard(props: { ctx: PromptContext; config: VimConfig; state: ReturnType<typeof createVimState>; enabled: Accessor<boolean>; log: VimLog }) { | ||
| let cursorStyleMode = "" | ||
@@ -60,4 +61,4 @@ const vimee = createVimeeAdapter(props.state, props.config, props.log) | ||
| if (props.ctx.disabled || props.ctx.visible === false) { | ||
| props.log("keyboard.skip", { disabled: props.ctx.disabled, visible: props.ctx.visible }) | ||
| if (!props.enabled() || props.ctx.disabled || props.ctx.visible === false) { | ||
| props.log("keyboard.skip", { enabled: props.enabled(), disabled: props.ctx.disabled, visible: props.ctx.visible }) | ||
| return | ||
@@ -64,0 +65,0 @@ } |
@@ -13,2 +13,3 @@ /** @jsxImportSource @opentui/solid */ | ||
| pending: Accessor<string | undefined> | ||
| enabled: Accessor<boolean> | ||
| theme: PromptContext["api"]["theme"]["current"] | ||
@@ -24,2 +25,3 @@ pendingDisplayDelay?: number | ||
| const [pending, setPending] = createSignal<string | undefined>() | ||
| const [enabled, setEnabled] = createSignal(props.enabled()) | ||
| let pendingTimer: ReturnType<typeof setTimeout> | undefined | ||
@@ -38,2 +40,9 @@ let scheduledPending: string | undefined | ||
| const nextEnabled = props.enabled() | ||
| if (enabled() !== nextEnabled) { | ||
| props.log?.("status.enabled", { from: enabled(), to: nextEnabled }) | ||
| setEnabled(nextEnabled) | ||
| props.requestRender?.() | ||
| } | ||
| syncPending(nextPending) | ||
@@ -50,4 +59,4 @@ } | ||
| <box paddingLeft={1} paddingRight={1} flexDirection="row"> | ||
| {pending() ? <text fg={props.theme.info}>{pending()} </text> : undefined} | ||
| <text fg={props.disabled ? props.theme.textMuted : mode() === "insert" ? props.theme.success : props.theme.warning}>{modeLabel(mode())}</text> | ||
| {enabled() && pending() ? <text fg={props.theme.info}>{pending()} </text> : undefined} | ||
| {enabled() ? <text fg={props.disabled ? props.theme.textMuted : mode() === "insert" ? props.theme.success : props.theme.warning}>{modeLabel(mode())}</text> : undefined} | ||
| </box> | ||
@@ -54,0 +63,0 @@ ) |
+19
-1
| /** @jsxImportSource @opentui/solid */ | ||
| import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@opencode-ai/plugin/tui" | ||
| import { createSignal } from "solid-js" | ||
| import { PromptRoot } from "./prompt/root" | ||
@@ -10,2 +11,19 @@ import type { PromptModule } from "./prompt/types" | ||
| const tui: TuiPlugin = async (api, options, meta) => { | ||
| const vimEnabledKey = `${meta.id}:enabled` | ||
| const [vimEnabled, setVimEnabled] = createSignal(api.kv.get(vimEnabledKey, true) === true) | ||
| api.command.register(() => [{ | ||
| title: vimEnabled() ? "Disable Vim Mode" : "Enable Vim Mode", | ||
| value: "opencode-vim.toggle", | ||
| description: vimEnabled() ? "Turn off Vim key handling" : "Turn on Vim key handling", | ||
| category: "Vim", | ||
| slash: { name: "vim" }, | ||
| onSelect() { | ||
| const next = !vimEnabled() | ||
| setVimEnabled(next) | ||
| api.kv.set(vimEnabledKey, next) | ||
| api.ui.toast({ variant: "info", message: `Vim mode ${next ? "enabled" : "disabled"}` }) | ||
| }, | ||
| }]) | ||
| if (readAutoUpdate(options)) { | ||
@@ -33,3 +51,3 @@ let timer: Timer | undefined | ||
| if (hasSnippetsPlugin(api)) modules.push(createSnippetsModule()) | ||
| modules.push(createVimModule(options)) | ||
| modules.push(createVimModule(options, vimEnabled)) | ||
| moduleCache.set(key, modules) | ||
@@ -36,0 +54,0 @@ return modules |
384330
0.34%2462
1.03%