summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-04 11:08:47 -0600
committerAdam <[email protected]>2026-01-04 11:08:47 -0600
commit5ca2f6c5a9151a43e2d73bb59244b0e6a0c08713 (patch)
tree35c72e380a08b503c50ed59b1728ea2265a4be5f /packages/app/src
parent12ffb270fb088fd75700f3e7266e4cd8aa734762 (diff)
downloadopencode-5ca2f6c5a9151a43e2d73bb59244b0e6a0c08713.tar.gz
opencode-5ca2f6c5a9151a43e2d73bb59244b0e6a0c08713.zip
fix(app): prompt input improvements
Diffstat (limited to 'packages/app/src')
-rw-r--r--packages/app/src/components/prompt-input.tsx240
1 files changed, 0 insertions, 240 deletions
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index a5edac980..00b61429b 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -162,7 +162,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
imageAttachments: ImageAttachmentPart[]
mode: "normal" | "shell"
applyingHistory: boolean
- killBuffer: string
}>({
popover: null,
historyIndex: -1,
@@ -172,7 +171,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
imageAttachments: [],
mode: "normal",
applyingHistory: false,
- killBuffer: "",
})
const MAX_HISTORY = 100
@@ -801,242 +799,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
return false
}
- const IS_MAC = typeof navigator === "object" && /(Mac|iPod|iPhone|iPad)/.test(navigator.platform)
- const IS_WIN = typeof navigator === "object" && /Win/.test(navigator.platform)
-
- const textOnly = () => {
- const parts = prompt.current()
- if (!parts.every((part) => part.type === "text")) return
- return parts.map((part) => part.content).join("")
- }
-
- const exitHistoryMode = () => {
- if (store.historyIndex < 0) return
- if (store.applyingHistory) return
- setStore("historyIndex", -1)
- setStore("savedPrompt", null)
- }
-
- const applyText = (content: string, cursorPosition: number) => {
- exitHistoryMode()
- setStore("popover", null)
-
- const part = {
- type: "text" as const,
- content,
- start: 0,
- end: content.length,
- }
-
- prompt.set([part], cursorPosition)
- requestAnimationFrame(() => {
- editorRef.focus()
- setCursorPosition(editorRef, cursorPosition)
- queueScroll()
- })
- }
-
- const handleReadlineKeyDown = (event: KeyboardEvent) => {
- if (event.metaKey) return false
-
- const ctrl = event.ctrlKey && !event.altKey && !event.shiftKey
- const alt = event.altKey && !event.ctrlKey && !event.shiftKey
-
- if (!ctrl && !alt) return false
-
- if (alt && IS_WIN) return false
-
- if (ctrl && IS_WIN) {
- const blocked = new Set(["KeyA", "KeyC", "KeyV", "KeyX", "KeyZ", "KeyY", "KeyF", "KeyT"])
- if (blocked.has(event.code)) return false
- }
-
- const { collapsed, cursorPosition, textLength } = getCaretState()
- if (!collapsed) return false
-
- const text = textOnly()
- if (text === undefined) return false
-
- const moveCursor = (pos: number) => {
- setCursorPosition(editorRef, pos)
- queueScroll()
- }
-
- const saveKillBuffer = (start: number, end: number) => {
- if (start === end) return false
- setStore("killBuffer", text.slice(start, end))
- return true
- }
-
- const killRange = (start: number, end: number) => {
- if (!saveKillBuffer(start, end)) return
- applyText(text.slice(0, start) + text.slice(end), start)
- }
-
- if (ctrl) {
- if (event.code === "KeyA" && IS_MAC) {
- const pos = text.lastIndexOf("\n", cursorPosition - 1) + 1
- moveCursor(pos)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyE") {
- const next = text.indexOf("\n", cursorPosition)
- const pos = next === -1 ? textLength : next
- moveCursor(pos)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyB") {
- const pos = Math.max(0, cursorPosition - 1)
- moveCursor(pos)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyF" && IS_MAC) {
- const pos = Math.min(textLength, cursorPosition + 1)
- moveCursor(pos)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyD") {
- if (cursorPosition >= textLength) {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- applyText(text.slice(0, cursorPosition) + text.slice(cursorPosition + 1), cursorPosition)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyK") {
- const next = text.indexOf("\n", cursorPosition)
- const lineEnd = next === -1 ? textLength : next
- const end = lineEnd === cursorPosition && lineEnd < textLength ? lineEnd + 1 : lineEnd
- if (end === cursorPosition) {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- killRange(cursorPosition, end)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyU" && IS_MAC) {
- const start = text.lastIndexOf("\n", cursorPosition - 1) + 1
- if (start === cursorPosition) {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- killRange(start, cursorPosition)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyY" && IS_MAC) {
- if (!store.killBuffer) {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- applyText(
- text.slice(0, cursorPosition) + store.killBuffer + text.slice(cursorPosition),
- cursorPosition + store.killBuffer.length,
- )
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyT" && IS_MAC) {
- if (textLength < 2 || cursorPosition === 0) {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- const atEnd = cursorPosition === textLength
- const first = atEnd ? cursorPosition - 2 : cursorPosition - 1
- const second = atEnd ? cursorPosition - 1 : cursorPosition
-
- if (text[first] === "\n" || text[second] === "\n") {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- const nextText = text.slice(0, first) + text[second] + text[first] + text.slice(second + 1)
- const nextCursor = atEnd ? cursorPosition : cursorPosition + 1
- applyText(nextText, nextCursor)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- return false
- }
-
- if (alt) {
- if (event.code === "KeyB") {
- let pos = cursorPosition
- while (pos > 0 && /\s/.test(text[pos - 1])) pos -= 1
- while (pos > 0 && !/\s/.test(text[pos - 1])) pos -= 1
- moveCursor(pos)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyF") {
- let pos = cursorPosition
- while (pos < textLength && /\s/.test(text[pos])) pos += 1
- while (pos < textLength && !/\s/.test(text[pos])) pos += 1
- moveCursor(pos)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- if (event.code === "KeyD") {
- let end = cursorPosition
- while (end < textLength && /\s/.test(text[end])) end += 1
- while (end < textLength && !/\s/.test(text[end])) end += 1
- if (end === cursorPosition) {
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- killRange(cursorPosition, end)
- event.preventDefault()
- event.stopPropagation()
- return true
- }
-
- return false
- }
-
- return false
- }
-
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === "Backspace") {
const selection = window.getSelection()
@@ -1104,8 +866,6 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
return
}
- if (handleReadlineKeyDown(event)) return
-
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
if (event.altKey || event.ctrlKey || event.metaKey) return
const { collapsed } = getCaretState()