diff --git a/package.json b/package.json index 6bcdf89..9c520ad 100644 --- a/package.json +++ b/package.json @@ -208,6 +208,11 @@ "type": "boolean", "default": false, "description": "Enable the local router to convert OpenAI format to Anthropic format. Required for providers that use OpenAI-compatible APIs." + }, + "claudeCodeChat.input.sendOnEnter": { + "type": "boolean", + "default": true, + "description": "When enabled, Enter sends the message. When disabled, Enter inserts a line break and messages are sent with Ctrl+Enter (Cmd+Enter on macOS)." } } } diff --git a/src/extension.ts b/src/extension.ts index 8fa37fb..74574ab 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3400,6 +3400,7 @@ class ClaudeChatProvider { 'executable.path': config.get('executable.path', ''), 'environment.variables': config.get>('environment.variables', {}), 'environment.disabled': config.get('environment.disabled', false), + 'input.sendOnEnter': config.get('input.sendOnEnter', true), 'isOpenCredits': this._isOpenCredits() }; diff --git a/src/script.ts b/src/script.ts index 4c949e2..6e8f9d6 100644 --- a/src/script.ts +++ b/src/script.ts @@ -79,6 +79,7 @@ const getScript = (isTelemetryEnabled: boolean, opencreditsApiUrl: string = 'htt let planModeEnabled = false; let thinkingModeEnabled = false; let isWindows = false; + let sendOnEnter = true; let lastPendingEditIndex = -1; // Track the last Edit/MultiEdit/Write toolUse without result let lastPendingEditData = null; // Store diff data for the pending edit { filePath, oldContent, newContent } let attachedImages = []; // Array of { filePath, previewUri } @@ -1211,7 +1212,8 @@ const getScript = (isTelemetryEnabled: boolean, opencreditsApiUrl: string = 'htt }); messageInput.addEventListener('keydown', (e) => { - if (e.key === 'Enter' && !e.shiftKey) { + // Alt/Option+Enter always inserts a line break, regardless of the sendOnEnter setting + if (e.key === 'Enter' && !e.shiftKey && !e.altKey && (sendOnEnter || e.ctrlKey || e.metaKey)) { e.preventDefault(); const sendBtn = document.getElementById('sendBtn'); if (sendBtn.disabled){ @@ -4863,6 +4865,8 @@ const getScript = (isTelemetryEnabled: boolean, opencreditsApiUrl: string = 'htt const yoloMode = document.getElementById('yolo-mode').checked; const executablePath = document.getElementById('executable-path').value; const useRouter = document.getElementById('use-router')?.checked || false; + const sendOnEnterSetting = document.getElementById('send-on-enter').checked; + sendOnEnter = sendOnEnterSetting; // Keep module state in sync without waiting for the settingsData round trip // Collect environment variables from key-value UI const envVariables = getEnvVariablesFromUI(); @@ -4902,7 +4906,8 @@ const getScript = (isTelemetryEnabled: boolean, opencreditsApiUrl: string = 'htt 'permissions.yoloMode': yoloMode, 'executable.path': executablePath, 'environment.variables': envVariables, - 'router.enabled': useRouter + 'router.enabled': useRouter, + 'input.sendOnEnter': sendOnEnterSetting } }); } @@ -5159,6 +5164,10 @@ const getScript = (isTelemetryEnabled: boolean, opencreditsApiUrl: string = 'htt }); } else if (message.type === 'settingsData') { // Update UI with current settings + sendOnEnter = message.data['input.sendOnEnter'] !== false; + document.getElementById('send-on-enter').checked = sendOnEnter; + + const thinkingIntensity = message.data['thinking.intensity'] || 'think'; const intensityValues = ['think', 'think-hard', 'think-harder', 'ultrathink']; const sliderValue = intensityValues.indexOf(thinkingIntensity); diff --git a/src/ui.ts b/src/ui.ts index 4ffcab7..8ae6d16 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -414,6 +414,15 @@ const getHtml = (isTelemetryEnabled: boolean, opencreditsApiUrl: string = 'https

+

Input

+
+
+ + +
+
+ +