您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Rebind pr0gramm.com keybindings to your liking. Defaults are for Colemak-DH keyboard layout (easily customizable)
// ==UserScript== // @name pr0gramm Keybindings remapper // @namespace http://tampermonkey.net/ // @version 1.0 // @description Rebind pr0gramm.com keybindings to your liking. Defaults are for Colemak-DH keyboard layout (easily customizable) // @author wallawallah // @match https://pr0gramm.com/* // @icon https://pr0gramm.com/favicon.ico // @match https://www.pr0gramm.com/* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // Colemak-DH key mappings for ortholinear keyboard // New key you press -> Original QWERTY key pr0gramm expects const keyMappings = { // Navigation 'r': 'a', // Press R -> sends A (Previous upload) 't': 'd', // Press T -> sends D (Next upload) // Voting 'f': 'w', // Press F -> sends W (Downvote) // Actions 'g': 'f', // Press G -> sends F (Favorite) }; // Function to intercept and remap keydown events function remapKeyboardEvent(event) { // Skip if this event was already remapped by us if (event.remappedByColemakDH) { return; } // Only process if no modifier keys are pressed if (event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) { return; } // Only process if not in an input field const activeElement = document.activeElement; if (activeElement && ( activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA' || activeElement.contentEditable === 'true' )) { return; } const pressedKey = event.key.toLowerCase(); // Check if this key should be remapped if (keyMappings.hasOwnProperty(pressedKey)) { const targetKey = keyMappings[pressedKey]; // Prevent the original event event.preventDefault(); event.stopPropagation(); // Create and dispatch a new event with the target key const newEvent = new KeyboardEvent('keydown', { key: targetKey, code: `Key${targetKey.toUpperCase()}`, keyCode: targetKey.toUpperCase().charCodeAt(0), which: targetKey.toUpperCase().charCodeAt(0), bubbles: true, cancelable: true }); // Mark this event as already remapped to prevent re-processing newEvent.remappedByColemakDH = true; // Dispatch the remapped event to the same target event.target.dispatchEvent(newEvent); console.log(`pr0gramm Colemak-DH: Remapped ${pressedKey.toUpperCase()} -> ${targetKey.toUpperCase()}`); return; } } // Function to show current key mappings function showKeyMappings() { console.log('pr0gramm Colemak-DH Ortholinear Key Mappings:'); console.log('============================================'); console.log('Press Key -> Function (sends original key)'); console.log('R -> Previous upload (sends A)'); console.log('T -> Next upload (sends D)'); console.log('F -> Upvote upload (sends W)'); console.log('G -> Favorite upload (sends F)'); console.log('============================================'); } // Initialize the script function init() { console.log('pr0gramm Colemak-DH keybinding remapper loaded'); // Add event listener for keydown events document.addEventListener('keydown', remapKeyboardEvent, true); // Show mappings on load showKeyMappings(); // Add a way to show mappings again (Ctrl+Shift+?) document.addEventListener('keydown', (event) => { if (event.ctrlKey && event.shiftKey && event.key === '?') { showKeyMappings(); } }); } // Wait for page to load if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();