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

MediaWiki:Gadget-shortcuts.js

MediaWiki interface page

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
// MediaWiki:Gadget-shortcuts.js
// Shortcuts:
//   d -> delete current page
//   h -> history
//   r -> review latest diff
//   e -> edit current page
//   u -> upload file
//   p -> purge current page
//   . -> recent changes
//
// Wikitext editor only:
//   Ctrl+s (or Cmd+s) -> Save changes
//
// Notes:
// - d/h/r/e/u/p/. won't trigger while typing.
// - Ctrl/Cmd+s WILL trigger while typing on wikitext edit pages.
(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();
      
      if (e.repeat) return;
      
      // Ctrl+s / Cmd+s -> Save changes (wikitext edit form)
      if ((e.ctrlKey || e.metaKey) && !e.altKey && k === 's') {
        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 || e.shiftKey) 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: 'purge' }); return; }
      if (k === 'd') { e.preventDefault(); go(page, { action: 'delete' }); return; }
      if (k === 'r') { e.preventDefault(); go(page, { diff: '' }); return; }
      if (k === '.') { e.preventDefault(); go('Special:RecentChanges'); return; }
      if (k === 'u') { e.preventDefault(); go('Special:Upload'); return; }
    },
    true
  );
})();