User:GregU/hotkeys.js

// This defines some control-key shortcuts you can use in text fields. // IE not supported. See talk page for documentation. // by Greg Ubben

// Add some control hotkeys for easily entering right-arrows (→) and other // characters and phrases in the edit summary, edit box, or other text fields. // hotkeys[] can be defined to augment the defaults. Type Ctrl-? to list all.

function hotkey(e) { if (e && e.ctrlKey && hotkeys[String.fromCharCode( e.charCode )]) {       var newtxt = hotkeys[String.fromCharCode( e.charCode )]; var before = this.value.slice( 0, this.selectionStart ); var after = this.value.slice( this.selectionEnd ); var scroll = this.scrollTop;

if (newtxt == "MENU") {        // type Ctrl-? for a list var menu = ""; for (var key in hotkeys) { var name = key.toUpperCase.replace(",", "<").replace(".", ">"); var value = hotkeys[key].replace(/\n/g, "•").slice(0,40); if (value && value != newtxt) menu += "\u200E" + name + " \t" + value + "\n"; }           alert( menu ); return false; }       //  hack to not override Ctrl-F, Ctrl-T, etc. in main text area //       if (newtxt.search(/\[\[WP:|\bfix/i) >= 0 && this.id == "wpTextbox1") { return true; }       if (newtxt.search(/^\[*\w./) >= 0 && this.id != "wpTextbox1") { if (before.search(/[^\s;,]$/) >= 0) before += "; "; if (after.search(/^[^\s;,]/) >= 0)  newtxt += "; "; }       this.value = before + newtxt + after; this.selectionStart = this.selectionEnd = before.length + newtxt.length; this.scrollTop = scroll;      // don't lose our position return false; }   return true; }

addOnloadHook( function {   var defaultCtrl = {        "," : "←",                   // Ctrl <   left arrow        "." : "→",                   // Ctrl >   right arrow        "-" : "–",                   // Ctrl -   en dash        "=" : "—",                   // Ctrl =   em dash        "7" : "&" + "nbsp;",         // Ctrl &   non-breaking space        "l" : "link rename",        "r" : "reverted vandalism",        "s" : "WP:STYLE",        "/" : "MENU"                 // special function    };    var fields = { wpSummary:0, wpTextbox1:0, wpReason:0, wpUploadDescription:0 };

if (mw.config.get('wgAction') != "view" || mw.config.get('wgCanonicalSpecialPageName')) {       if (typeof(hotkeys) == 'undefined')  hotkeys = {}; for (var key in defaultCtrl) { if (hotkeys[key] == null) hotkeys[key] = defaultCtrl[key]; }       for (var field in fields) { var f = document.getElementById(field); if (f) f.onkeypress = hotkey; }   } });