// ==UserScript== // @name ChatGPT Enter 换行 // @namespace https://viayoo.com/9u286k // @version 1.0.2 // @description ChatGPT 输入框按 Enter 换行,Ctrl/Cmd + Enter 发送 // @author ChatGPT // @license MIT // @match https://chatgpt.com/* // @match https://chat.openai.com/* // @run-at document-start // @grant none // ==/UserScript== (() => { 'use strict'; // 输入框选择器 const SELECTORS = [ '.ProseMirror[contenteditable="true"]', ].join(','); // 获取输入框元素 function getInput(target) { if (!(target instanceof Element)) return null; return target.closest(SELECTORS); } // 判断是否在中文输入法中(选词阶段不拦截 Enter) function isComposing(event) { return event.isComposing || event.keyCode === 229; } // textarea 换行:光标处插入 \n function insertTextareaNewline(el) { const start = el.selectionStart; const end = el.selectionEnd; const value = el.value; el.value = value.slice(0, start) + '\n' + value.slice(end); const position = start + 1; el.setSelectionRange(position, position); el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertLineBreak', data: '\n', })); } // contenteditable 换行:光标处插入
function insertContentEditableNewline(el) { el.focus(); const selection = window.getSelection(); if (!selection || selection.rangeCount === 0) return; const range = selection.getRangeAt(0); if (!el.contains(range.commonAncestorContainer)) return; range.deleteContents(); const br = document.createElement('br'); range.insertNode(br); range.setStartAfter(br); range.collapse(true); selection.removeAllRanges(); selection.addRange(range); el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertLineBreak', data: null, })); } // 根据输入框类型插入换行 function insertNewline(el) { if (el instanceof HTMLTextAreaElement) { insertTextareaNewline(el); return; } if (el.isContentEditable) { insertContentEditableNewline(el); } } // 键盘事件:Enter 换行,Ctrl+Enter 发送 document.addEventListener('keydown', (event) => { if (event.key !== 'Enter') return; if (isComposing(event)) return; const input = getInput(event.target); if (!input) return; if (event.ctrlKey || event.metaKey) return; if (event.altKey) return; event.preventDefault(); event.stopPropagation(); event.stopImmediatePropagation(); insertNewline(input); }, true); })();