diff --git a/src/__tests__/opencode_cell_actions.spec.ts b/src/__tests__/opencode_cell_actions.spec.ts index b16d36e..9ac2e0c 100644 --- a/src/__tests__/opencode_cell_actions.spec.ts +++ b/src/__tests__/opencode_cell_actions.spec.ts @@ -619,4 +619,59 @@ describe('OpenCodeInlinePrompt', () => { const writeText = (navigator.clipboard.writeText as unknown as jest.Mock); expect(writeText).toHaveBeenCalledWith('print(1)'); }); + + it('Enter in the textarea submits; Shift+Enter does not', () => { + const cell = makeFakeCell('x = 1'); + const onSubmit = jest.fn(); + const prompt = new OpenCodeInlinePrompt(cell, { + onSubmit, + onCancel: jest.fn(), + disabled: false, + providers: null + }); + prompt.setMessages([ + { role: 'user', content: '' }, + { role: 'assistant', content: 'noop' } + ]); + const textarea = prompt.node.querySelector( + 'textarea' + ) as HTMLTextAreaElement; + textarea.value = 'fix the bug'; + + // Plain Enter submits with the current text + the current + // provider/model selection (both default to "" / first when null). + textarea.dispatchEvent( + new KeyboardEvent('keydown', { + key: 'Enter', + bubbles: true, + cancelable: true + }) + ); + expect(onSubmit).toHaveBeenCalledTimes(1); + expect(onSubmit).toHaveBeenCalledWith('fix the bug', undefined, undefined); + + // Shift+Enter must NOT submit (chat convention: newline). + onSubmit.mockClear(); + textarea.dispatchEvent( + new KeyboardEvent('keydown', { + key: 'Enter', + shiftKey: true, + bubbles: true, + cancelable: true + }) + ); + expect(onSubmit).not.toHaveBeenCalled(); + + // Ctrl+Enter also must not submit (newline). + onSubmit.mockClear(); + textarea.dispatchEvent( + new KeyboardEvent('keydown', { + key: 'Enter', + ctrlKey: true, + bubbles: true, + cancelable: true + }) + ); + expect(onSubmit).not.toHaveBeenCalled(); + }); }); diff --git a/src/components/opencode_inline_prompt.ts b/src/components/opencode_inline_prompt.ts index a4fdc6c..f7328e0 100644 --- a/src/components/opencode_inline_prompt.ts +++ b/src/components/opencode_inline_prompt.ts @@ -125,6 +125,14 @@ export class OpenCodeInlinePrompt extends Widget { const modelId = this._modelSelect?.value || undefined; options.onSubmit(text, providerId, modelId); }); + // Chat-input convention: Enter submits, Shift+Enter / Ctrl+Enter + // insert a newline (textarea default). + this._textarea.addEventListener('keydown', (e) => { + if (e.key === 'Enter' && !e.shiftKey && !e.ctrlKey) { + e.preventDefault(); + this._sendBtn.click(); + } + }); this._cancelBtn = document.createElement('button'); this._cancelBtn.className = 'opencode-btn-cancel'; this._cancelBtn.textContent = '取消';