Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:UserScripts/Shortcuts.js: Difference between revisions

MediaWiki interface page
Created page with "// MediaWiki:UserScripts/Shortcuts.js // Shortcuts: // d -> delete current page // h -> history // r -> recent changes // e -> edit current page // u -> upload file // p -> protect current page // // Wikitext editor only: // Ctrl+Enter (or Cmd+Enter) -> Save changes // // Notes: // - D/H/R/E/U/P won't trigger while typing. // - Ctrl/Cmd+Enter WILL trigger while typing in the wikitext textarea. (function () { if (window.__shortcutsInstalled) return; wind..."
 
m Protected "MediaWiki:UserScripts/Shortcuts.js": utility script ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
 
(No difference)

Latest revision as of 16:41, 10 February 2026

// MediaWiki:UserScripts/Shortcuts.js
// Shortcuts:
//   d -> delete current page
//   h -> history
//   r -> recent changes
//   e -> edit current page
//   u -> upload file
//   p -> protect current page
//
// Wikitext editor only:
//   Ctrl+Enter (or Cmd+Enter) -> Save changes
//
// Notes:
// - D/H/R/E/U/P won't trigger while typing.
// - Ctrl/Cmd+Enter WILL trigger while typing in the wikitext textarea.
(function () {
  if (window.__shortcutsInstalled) return;
  window.__shortcutsInstalled = true;

  function isTypingTarget(el) {
    if (!el) return false;
    var tag = (el.tagName || '').toLowerCase();
    return tag === 'input' || tag === 'textarea' || tag === 'select' || !!el.isContentEditable;
  }

  function go(title, query) {
    location.href = mw.util.getUrl(title, query || {});
  }

  function trySaveWikitext() {
    var btn =
      document.querySelector('#wpSave') ||
      document.querySelector('button[name="wpSave"]') ||
      document.querySelector('input[name="wpSave"]');

    if (btn && !btn.disabled) {
      btn.click();
      return true;
    }
    return false;
  }

  document.addEventListener(
    'keydown',
    function (e) {
      var k = (e.key || '').toLowerCase();

      // Ctrl+Enter / Cmd+Enter -> Save changes (wikitext edit form)
      if ((e.ctrlKey || e.metaKey) && !e.altKey && k === 'enter') {
        if (mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') {
          if (trySaveWikitext()) {
            e.preventDefault();
            e.stopPropagation();
          }
        }
        return;
      }

      // Single-key shortcuts: ignore modifiers + typing
      if (e.ctrlKey || e.metaKey || e.altKey) return;
      if (isTypingTarget(e.target)) return;

      var page = mw.config.get('wgPageName');

      if (k === 'e') { e.preventDefault(); go(page, { action: 'edit' }); return; }
      if (k === 'h') { e.preventDefault(); go(page, { action: 'history' }); return; }
      if (k === 'p') { e.preventDefault(); go(page, { action: 'protect' }); return; }
      if (k === 'd') { e.preventDefault(); go(page, { action: 'delete' }); return; }
      if (k === 'r') { e.preventDefault(); go('Special:RecentChanges'); return; }
      if (k === 'u') { e.preventDefault(); go('Special:Upload'); return; }
    },
    true
  );
})();