Изменить привязки клавиш (сочетания клавиш) в Firefox Quantum

После квантового обновления все дополнения, которые позволяли изменять привязки клавиш в Firefox, перестали работать / поддерживаться.

Есть ли способ изменить привязки клавиш по умолчанию в Firefox Quantum?

8 ответов

Есть выход. Это не супер официальный, но в принципе вы можете распаковать browser/omni.jaотредактируйте сочетания клавиш в chrome/browser/content/browser/browser.xul, перепакуйте его, удалите автозагрузку кеша и все заработает.

Кроме того, вы можете скомпилировать свой собственный Firefox, и тогда вам не нужно распаковывать бинарный файл, если вы считаете, что распаковка и перепаковка более хакерские, чем сборка.

Еще одним преимуществом сборки является то, что вы можете хранить свои модификации поверх официальных источников в git и всегда перебазировать, как я делаю здесь: https://github.com/errge/gecko-dev/tree/gregzilla-patched-20181223

Я советую вам сначала начать с двоичной опции, потому что у вас будут рабочие сочетания клавиш через 20 минут, а не только в начале процедуры клонирования Mercurial:)

Оба эти метода не зависят от каких-либо расширений / веб-расширений и будут ВСЕГДА работать, даже в адресной строке и даже на защищенных страницах (как вы просили в комментариях). Таким образом, они будут работать лучше, чем переназначение веб-расширений.

У меня есть статья со всеми подробностями, которые могут вас заинтересовать: https://github.com/nilcons/firefox-hacks

Если у вас есть дополнительные вопросы, пожалуйста, сообщайте о проблемах на github.

Вы можете изменить привязки клавиш в Firefox с помощью AutoConfig без необходимости распаковывать и изменять двоичный файл Firefox.

Создайте файл и:

в Windows:

  • C:\Program Files\Mozilla Firefox\defaults\pref\config-prefs.js
  • C:\Program Files\Mozilla Firefox\defaults\pref\config.js

на MacOS:

  • Firefox.app\Contents\Resources\config.js
  • Firefox.app\Contents\Resources\defaults\pref\config-prefs.js

в Linux:

  • /usr/lib/firefox/config.js
  • /usr/lib/firefox/browser/defaults/preferences/config-prefs.js

со следующим содержанием:

config-prefs.js:

      pref("general.config.filename", "config.js");    
pref("general.config.obscure_value", 0);  
pref("general.config.sandbox_enabled", false);  

:

      try {
  let { classes: Cc, interfaces: Ci, manager: Cm  } = Components;
  const {Services} = Components.utils.import('resource://gre/modules/Services.jsm');
  const {SessionStore} = Components.utils.import('resource:///modules/sessionstore/SessionStore.jsm');
  function ConfigJS() { Services.obs.addObserver(this, 'chrome-document-global-created', false); }
  ConfigJS.prototype = {
    observe: function (aSubject) { aSubject.addEventListener('DOMContentLoaded', this, {once: true}); },
    handleEvent: function (aEvent) {
      let document = aEvent.originalTarget; let window = document.defaultView; let location = window.location;
      if (/^(chrome:(?!\/\/(global\/content\/commonDialog|browser\/content\/webext-panels)\.x?html)|about:(?!blank))/i.test(location.href)) {
        if (window._gBrowser) {

          // Place your keyboard shortcut changes here
          // ...
          // ...


        }
      }
    }
  };
  if (!Services.appinfo.inSafeMode) { new ConfigJS(); }
} catch(ex) {};

После изменения этих файлов вам всегда нужно перейти вabout:supportи бежатьClear startup cache, чтобы перезапустить браузер с новой конфигурацией.

Несколько примеров того, что вы можете сделать:

Поместите эти фрагменты в config.js, где я написал Place your keyboard shortcut changes here.

Удаление существующего сочетания клавиш

      // remove Ctrl-Shift-X, so that I can map it to 1Password in the 1Password app later
let keySwitchDirection = window.document.getElementById('key_switchTextDirection');
keySwitchDirection.remove();

Изменение существующего сочетания клавиш

      // remap Ctrl-J to downloads (removing it from focusing the browser bar)
let search2 = window.document.getElementById('key_search2')
search2.remove();
let openDownloads = window.document.getElementById('key_openDownloads')
openDownloads.setAttribute("modifiers", "accel");
openDownloads.setAttribute("key", "J");

Создайте новое сочетание клавиш

      // create keyboard shortcut to Toolbar > Settings with Ctrl-,
let settingsKey = window.document.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'key');
settingsKey.setAttribute("id", "key_Settings");
settingsKey.setAttribute("modifiers", "accel,shift");
settingsKey.setAttribute("key", "U");
settingsKey.setAttribute("oncommand", "openPreferences()");
settingsKey.addEventListener('command', this, false);
mainKeyset.appendChild(settingsKey);

Что-то совершенно индивидуальное. ( Firefox представил Shift-Ctrl-T как универсальную функцию отмены (набор изменений ), поэтому пример здесь больше не нужен. Я оставлю его здесь, чтобы он служил примером для других настроек. )

      // make Ctrl-Shift-T reopen last tab OR last window, depending on which one was closed last
let undoCloseTabKey = window.document.getElementById('key_undoCloseTab');
undoCloseTabKey.removeAttribute('command');
undoCloseTabKey.setAttribute('oncommand', 'undoCloseLastClosedTabOrWindow()');
undoCloseTabKey.addEventListener('command', this, false);

window.undoCloseLastClosedTabOrWindow = function() {
  // don't have any tabs to restore
  if (SessionStore.getClosedTabCount(window) == 0) {
    // we don't need to worry whether there are any windows to restore - undoCloseWindow does that for us
    window.undoCloseWindow();
  }

  // don't have any windows to restore
  else if (SessionStore.getClosedWindowCount() == 0) {
    // we don't need to worry whether there are any tabs to restore - undoCloseTab does that for us
    window.undoCloseTab();
  }

  // restore whichever was closed more recently
  else if (SessionStore.getClosedTabData(window)[0].closedAt > SessionStore.getClosedWindowData()[0].closedAt) {
    window.undoCloseTab();
  } else {
    window.undoCloseWindow();
  }
}

Инструкции:

Чтобы найти существующие сочетания клавиш:

  • Меню-гамбургер > Дополнительные инструменты > Панель инструментов браузера
  • В Инспекторе найдите#mainKeyset
  • Там вы увидите все назначенные сочетания клавиш.

Чтобы найти действия меню, которые можно вызвать с помощью сочетаний клавиш.

  • Меню-гамбургер > Дополнительные инструменты > Панель инструментов браузера
  • Используйте Инспектор, чтобы найти элемент, который вы хотите активировать с помощью сочетания клавиш, напримерappMenu-settings-button
  • Возьмите атрибут из пункта меню и используйте его как атрибут для тега ключа.

или

  • Используйте Инспектор, найдите#mainCommandSet
  • и принять командыidи используйте его какcommand(нетoncommand) атрибут ключевого тега.

Определение сочетаний клавиш:

  • укажите модификаторы с помощьюmodifiersатрибут. Вы можете использоватьaccel(для Ctrl),shiftиalt
  • укажите сам ключ с помощьюkeyатрибут

Источник всего этого: Reddit, u/aveyo, восстановить Ctrl+Shift+B = библиотеку, установив config.js.

Более подробная информация: Сочетания клавиш Firefox (Веб-архив)

Если вы используете macOS, вы можете настроить ярлыки любого приложения, если они отображаются в меню приложения. Инструкции для macOS 13+

  1. На Mac выберите меню  > « Системные настройки» , нажмите «Клавиатура» на боковой панели (возможно, вам придется прокрутить вниз), затем нажмите « Сочетания клавиш» справа.

  2. Выберите «Ярлыки приложений» слева, нажмите кнопку «Добавить», нажмите всплывающее меню « Приложение », затем выберите конкретное приложение или «Все приложения» .

  3. В поле «Название меню» введите команду меню, для которой вы хотите создать ярлык, точно так же, как эта команда отображается в приложении.

Более подробную информацию можно найти на сайте Apple: https://support.apple.com/guide/mac-help/create-keyboard-shortcuts-for-apps-mchlp2271/mac .

Из поддержки Firefox: https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly:

Примечание. Вы можете настроить сочетания клавиш для Firefox, используя расширение https://addons.mozilla.org/firefox/addon/saka-key/.

Я надеюсь, что это то, что вы искали.

Вот еще один рабочий пример с последней версией Firefox на момент написания этой статьи (113.0), основанный на ответе @Benedikt Köppel.Для отладки может быть полезно использовать функциюServices.prompt.alert(null, "Title", "Message")(упоминается здесь ), в дополнение к журналам, которые можно найти в разделе «Инструменты» > «Инструменты браузера» > «Панель инструментов браузера» > «Консоль» сErrorиWarningsвключен в правом верхнем углу.

Firefox.cfg
      // -*- mode: javascript; -*- vim: set ft=javascript:
// See https://support.mozilla.org/en-US/kb/customizing-firefox-using-autoconfig
"use strict";

(() => {
  if (Services.appinfo.inSafeMode) {
    return;
  }

  const addressPattern = new RegExp(
    "^(chrome:(?!//(global/content/commonDialog)\\.xhtml)|about:(?!blank))"
  );

  Services.obs.addObserver(subject => {
    const namespaceID =
      "autoconfig_" + subject.crypto.randomUUID().replaceAll("-", "_");
    subject.addEventListener(
      "DOMContentLoaded",
      event => {
        const document = event.originalTarget;
        const window = document.defaultView;
        if (!addressPattern.test(window.location.href)) {
          return;
        }

        // To find a key code ID, go to Tools > Browser Toolbox in Firefox and
        // click on the web inspector, then search for "keycode". Or go to this
        // URL view-source:chrome://browser/content/browser.xhtml
        const keyReloadSkipCache = document.getElementById(
          "key_reload_skip_cache"
        );
        keyReloadSkipCache?.setAttribute("modifiers", "accel,alt");

        const keyToggleReaderMode = document.getElementById(
          "key_toggleReaderMode"
        );
        keyToggleReaderMode?.setAttribute("modifiers", "accel,shift");

        const keyScreenshot = document.getElementById("key_screenshot");
        keyScreenshot?.setAttribute("modifiers", "accel,shift,alt");

        const keyUndoCloseTab = document.getElementById("key_undoCloseTab");
        keyUndoCloseTab?.setAttribute("modifiers", "accel,shift");
        keyUndoCloseTab?.setAttribute("key", "T");

        const keyUndoCloseWindow = document.getElementById(
          "key_undoCloseWindow"
        );
        keyUndoCloseWindow?.setAttribute("modifiers", "accel,control,shift");
        keyUndoCloseWindow?.setAttribute("key", "T");

        const keyPrivateBrowsing = document.getElementById(
          "key_privatebrowsing"
        );
        keyPrivateBrowsing?.setAttribute("key", "N");

        // Prefer Unclutter over default reader view.
        // https://unclutter.lindylearn.io
        const toggleUnclutterCommand = namespaceID + "_toggleUnclutter";
        window[toggleUnclutterCommand] = () => {
          // From about:debugging#/runtime/this-firefox > Unclutter >
          // Extension ID.
          const extensionID = "8f8c4c52-216c-4c6f-aae0-c214a870d9d9";
          const keyUnclutter = window.document.querySelector(
            `#ext-keyset-id-_${extensionID}_ > key`
          );
          keyUnclutter?.dispatchEvent(new window.CustomEvent("command"));
        };

        const readerModeButton = document.getElementById("reader-mode-button");
        readerModeButton?.setAttribute(
          "onclick",
          toggleUnclutterCommand + "();"
        );
        const readerViewCommand = document.getElementById("View:ReaderView");
        readerViewCommand?.setAttribute(
          "oncommand",
          toggleUnclutterCommand + "();"
        );
      },
      { once: true }
    );
  }, "chrome-document-global-created");
})();
по умолчанию/pref/autoconfig.js
      // See https://support.mozilla.org/en-US/kb/customizing-firefox-using-autoconfig
pref("general.config.filename", "firefox.cfg");
pref("general.config.obscure_value", 0);
pref("general.config.sandbox_enabled", false);

Я рекомендую бежатьfirefox.cfg(илиconfig.jsв ответе выше) против плагина Mozilla ESLint , который показывает предупреждения, которые я не смог найти нигде в документации. Например, он выдает эту ошибку при использованииComponents.utils.import:

      error  Please use ChromeUtils.import instead of Cu.import  mozilla/use-chromeutils-import
error  Use Cu rather than Components.utils                 mozilla/use-cc-etc

Его можно установить черезnpm install eslint-plugin-mozilla --save-dev.

Вот пример.eslintrc.json:

      {
  "extends": [
    "eslint:recommended",
    "plugin:mozilla/recommended"
  ],
  "plugins": [
    "mozilla"
  ]
}

Постоянная установка macOS

К сожалению, поскольку в macOS эти файлы должны быть помещены в пакет приложения, после обновлений они могут быть удалены. Эту проблему можно обойти, настроив сценарий отслеживания путей с помощью Launchd или Hammerspoon.

firefox_apply_autoconfig
      #!/bin/sh
set -o errexit -o nounset

FIREFOX_PATH="/Applications/Firefox.app"
FIREFOX_RESOURCES_PATH="$FIREFOX_PATH/Contents/Resources"

# Path to directory containing firefox.cfg and `defaults/autoconfig.js` (or
# equivalent).
AUTOCONFIG_DIR="/patch/to/autoconfig"

main() (
    if [ ! -d "$FIREFOX_PATH" ]; then
        echo "Application does not exist at $FIREFOX_PATH; aborting."
        exit 1
    fi

    cd "$FIREFOX_RESOURCES_PATH"
    mkdir -p ./defaults/pref
    cd "$AUTOCONFIG_DIR"
    find . -type f | while read -r file; do
        relpath="$(echo "$file" | cut -c3-)"
        target="$FIREFOX_RESOURCES_PATH/$relpath"
        source="$(realpath "$file")"
        rsync --archive "$source" "$target"
    done

    # Avoid macOS sandbox warning when Firefox is reinstalled about the app
    # bundle being modified.
    xattr -rd com.apple.quarantine /Applications/Firefox.app

    echo "Installed Firefox autoconfig files."
)

main
Запущен (Вариант 1)
com.superuser.firefox-apply-autoconfig.plist
      <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.superuser.firefox-apply-autoconfig</string>
    <key>Program</key>
    <string>/Users/username/Library/Application Support/com.superuser.launchd/firefox_apply_autoconfig</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/username/Library/Application Support/com.superuser.launchd/firefox_apply_autoconfig</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Applications/Firefox.app/Contents/Resources/</string>
    </array>
    <key>ProcessType</key>
    <string>Background</string>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
Монтаж

Затем запустите что-то вроде этого:

      mkdir -p "/Users/username/Library/Application Support/com.superuser.launchd/"
chmod u+x ./firefox_apply_autoconfig
mv ./firefox_apply_autoconfig "/Users/username/Library/Application Support/com.superuser.launchd/"

launchctl bootstrap "gui/$(launchctl manageruid)" ./com.superuser.firefox-apply-autoconfig.plist
Молотковая ложка (Вариант 2)
init.lua
      local function applyFirefoxAutoConfig()
  hs.task.new(
    os.getenv("HOME")
    ..
    "/.config/hammerspoon/scripts/firefox_apply_autoconfig",
    nil
  ):start()
end

local watcher = hs.pathwatcher.new(
  "/Applications/Firefox.app/Contents/Resources/",
  applyFirefoxAutoConfig
):start()

applyFirefoxAutoConfig()

Предостережения

general.config.sandbox_enabledдолжен быть установлен наfalse(значение по умолчанию), чтобыChromeUtilsдолжно быть определено в файле автоконфигурации. Смотрите этот комментарий .

Я не уверен, какие ярлыки вам нужны, но есть замечательные расширения, называемые Vimium FF, которые позволяют просматривать без мыши. Это расширение предлагает механизм фильтрации, который позволяет вам решать, на каких веб-сайтах должны работать сочетания клавиш.

Это все еще в экспериментальной стадии, так как это порт из расширений Chrome, но я использую и столкнулся с какой-либо ошибкой или проблемой.

Привязки следуют за привязками VIM и должны быть естественными, если вы уже знакомы с ними, в противном случае вы можете настроить их на свой вкус.

Ответ Бенедикта очень хорошо написан, но не хватает одной вещи. Первая линияconfig.jsигнорируется, начало с 1-й строки в конечном итоге приведет к синтаксической ошибке. Так что просто измените его на что-то вроде этого, должно помочь.

      // IMPORTANT: Start your code on the 2nd line
try {
...

Это упоминается в официальном документе AutoConfig, а также https://github.com/xiaoxiaoflood/firefox-scripts, откуда в сообщении Reddit заимствована идея.

Если вы намерены изменить ярлык расширения, вы можете сделать это: https://support.mozilla.org/kb/manage-extension-shortcuts-firefox .

  1. Нажмите кнопку меню (гамбургер), нажмите « Дополнения и темы» и выберите «Расширения» .
  2. Нажмите на шестеренку «Инструменты для всех надстроек» .
  3. В меню нажмите «Управление ярлыками расширений» .

Вы увидите параметры ярлыков (если они доступны) для установленных надстроек.

Другие вопросы по тегам