Изменить привязки клавиш (сочетания клавиш) в 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+
На Mac выберите меню > « Системные настройки» , нажмите «Клавиатура» на боковой панели (возможно, вам придется прокрутить вниз), затем нажмите « Сочетания клавиш» справа.
Выберите «Ярлыки приложений» слева, нажмите кнопку «Добавить», нажмите всплывающее меню « Приложение », затем выберите конкретное приложение или «Все приложения» .
В поле «Название меню» введите команду меню, для которой вы хотите создать ярлык, точно так же, как эта команда отображается в приложении.
Более подробную информацию можно найти на сайте 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 .
- Нажмите кнопку меню (гамбургер), нажмите « Дополнения и темы» и выберите «Расширения» .
- Нажмите на шестеренку «Инструменты для всех надстроек» .
- В меню нажмите «Управление ярлыками расширений» .
Вы увидите параметры ярлыков (если они доступны) для установленных надстроек.