ChatGPT Command+Enter Send

Send messages with Command+Enter or Ctrl+Enter. Enter and Shift+Enter will create new lines.

// ==UserScript==
// @name         ChatGPT Command+Enter Send
// @description  Send messages with Command+Enter or Ctrl+Enter. Enter and Shift+Enter will create new lines.
// @author       schweigen
// @license      MIT
// @version      1.0
// @namespace    ChatGPT.CommandEnterSend
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com
// @match        https://chatgpt.com
// @match        https://chatgpt.com/?model=*
// @match        https://chatgpt.com/?temporary-chat=*
// @match        https://chatgpt.com/c/*
// @match        https://chatgpt.com/g/*
// @match        https://chatgpt.com/share/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';
    
    function setupCommandEnterSend() {
        function handleKeyDown(event) {
            if (event.key === 'Enter') {
                // 检查是否在输入框中
                const isPromptTextarea = event.target.matches('#prompt-textarea') || 
                                       event.target.closest('.ProseMirror') || 
                                       event.target.matches('[name="prompt-textarea"]') ||
                                       event.target.closest('[data-testid="composer"]') ||
                                       event.target.closest('[data-testid="textbox"]');
                
                if (!isPromptTextarea) return;
                
                // 支持Command+Enter和Ctrl+Enter两种组合
                const sendKey = event.metaKey || event.ctrlKey; // Command或Ctrl都可以
                
                if (sendKey) {
                    // Command+Enter或Ctrl+Enter: 发送消息
                    // 阻止原事件,创建一个普通的Enter事件来触发发送
                    event.preventDefault();
                    event.stopPropagation();
                    
                    const sendEvent = new KeyboardEvent('keydown', {
                        key: 'Enter',
                        code: 'Enter',
                        keyCode: 13,
                        which: 13,
                        shiftKey: false,
                        ctrlKey: false,
                        altKey: false,
                        metaKey: false,
                        bubbles: true,
                        cancelable: true
                    });
                    
                    // 临时移除监听器,分发事件,然后重新添加
                    document.removeEventListener('keydown', handleKeyDown, true);
                    event.target.dispatchEvent(sendEvent);
                    setTimeout(() => {
                        document.addEventListener('keydown', handleKeyDown, true);
                    }, 0);
                    
                } else {
                    // 单独的Enter或Shift+Enter: 换行
                    // 阻止原事件,创建一个带Shift的Enter事件来换行
                    event.preventDefault();
                    event.stopPropagation();
                    
                    const newlineEvent = new KeyboardEvent('keydown', {
                        key: 'Enter',
                        code: 'Enter',
                        keyCode: 13,
                        which: 13,
                        shiftKey: true, // 强制设为true以确保换行
                        ctrlKey: false,
                        altKey: event.altKey,
                        metaKey: false,
                        bubbles: true,
                        cancelable: true
                    });
                    
                    // 临时移除监听器,分发事件,然后重新添加
                    document.removeEventListener('keydown', handleKeyDown, true);
                    event.target.dispatchEvent(newlineEvent);
                    setTimeout(() => {
                        document.addEventListener('keydown', handleKeyDown, true);
                    }, 0);
                }
            }
        }
        
        // 添加事件监听器
        document.addEventListener('keydown', handleKeyDown, true);
        
        // 返回清理函数
        return () => {
            document.removeEventListener('keydown', handleKeyDown, true);
        };
    }
    
    // 初始化函数
    function init() {
        setupCommandEnterSend();
        console.log('ChatGPT Command+Enter Send initialized');
    }
    
    // 等待DOM加载完成
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init, { once: true });
    } else {
        init();
    }
})();