您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds keyboard shortcuts for model selection and search on t3.chat
// ==UserScript== // @name T3 Chat Keyboard shortcuts // @namespace http://tampermonkey.net/ // @version 2025-07-22.1 // @description Adds keyboard shortcuts for model selection and search on t3.chat // @author Yassine Safraoui // @match https://t3.chat/chat/* // @icon https://www.google.com/s2/favicons?sz=64&domain=t3.chat // @grant none // @run-at document-idle // @license MIT // ==/UserScript== (function () { setTimeout(() => { let debug = false; let log = (...e) => { if (debug) console.log(...e) } function selectDropdownItem(index) { log('selectDropdownItem called with index:', index); let modelSelectButton = document.querySelector("form button:has(.lucide-chevron-down)"); log('modelSelectButton:', modelSelectButton); if (!modelSelectButton) { log('modelSelectButton not found'); return; } const observer = new MutationObserver((mutations) => { log('Mutations detected:', mutations); mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { log('Added node:', node); if (node.nodeType === Node.ELEMENT_NODE && node.tagName === 'DIV' && node.hasAttribute('data-radix-popper-content-wrapper')) { log('Found dropdown element:', node); const menuItems = node.querySelectorAll('[role=menuitem]'); log('menuItems:', menuItems); if (menuItems.length > index) { log('Found target model element:', menuItems[index]); menuItems[index].click(); } else { log('Target model element not found for index:', index); } observer.disconnect(); log('Observer disconnected after selection'); return; } }); }); }); observer.observe(document.body, { childList: true }); log('Observer started'); setTimeout(() => { observer.disconnect(); log('Observer disconnected after timeout'); }, 1000); log('Dispatching pointerdown event to modelSelectButton'); modelSelectButton.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, cancelable: true, view: window })); } document.addEventListener('keydown', function (event) { log('keydown event:', event); if (event.altKey) { log('Alt key pressed'); if (event.code.startsWith('Digit')) { const num = parseInt(event.code.slice(5), 10); log('Digit key pressed:', num); if (num >= 1 && num <= 5) { log('Calling selectDropdownItem with:', num); selectDropdownItem(num - 1) } else { log('Digit out of range:', num); } } if (event.key == "s") { log('Alt+S pressed'); let searchButton = document.querySelector("form button:has(.lucide-globe)"); log('searchButton:', searchButton); if (searchButton) { log('Clicking searchButton'); searchButton.click() } else { log('searchButton not found'); } } } }); log('Script initialized'); }, 500) })();