2022-03-29
Many vim users use ctrl-w
to delete a word. Unfortunately on Firefox, this closes the current tab. So if you’re editing a text area / filling out a form you may accidentally close the tab ๐. There’s no option to change or disable default keyboard shortcuts (Firefox 98, 2022-03-29). So if you want to do it, you need to manually edit the file /usr/lib/firefox/browser/omni.ja
.
First unzip it to a temporary directory:
mkdir /tmp/firefox-omni cd /tmp/firefox-omni unzip /usr/lib/firefox/browser/omni.ja
Now you need to edit chrome/browser/content/browser/browser.xhtml
to make your changes. You can change as many shortcuts as you want here. The ctrl-w
key is called close-shortcut
. You can either comment out the offending line, or change modifiers="accel,shift"
to require ctrl-shift-w
to close tabs.
I personally use Firenvim (which uses an embedded neovim to edit text areas). In this case all you need to do is changed reserved="false"
in the corresponding line. This will allow Firenvim to take over the shortcut ctrl-w
when it’s active (in text areas), and you won’t accidentally close tabs when trying to delete words. While I was at it, I also made ctrl-t
/ ctrl-n
un-reserved, so that I can use these shortcuts when editing text areas with Firenvim.
diff -ru firefox-omni-orig/chrome/browser/content/browser/browser.xhtml ./chrome/browser/content/browser/browser.xhtml --- firefox-omni-orig/chrome/browser/content/browser/browser.xhtml 2010-01-01 00:00:00.000000000 -0500 +++ ./chrome/browser/content/browser/browser.xhtml 2022-04-05 20:26:31.880470112 -0400 @@ -263,9 +263,9 @@ <key id="key_newNavigator" data-l10n-id="window-new-shortcut" command="cmd_newNavigator" - modifiers="accel" reserved="true"/> + modifiers="accel" reserved="false"/> <key id="key_newNavigatorTab" data-l10n-id="tab-new-shortcut" modifiers="accel" - command="cmd_newNavigatorTabNoEvent" reserved="true"/> + command="cmd_newNavigatorTabNoEvent" reserved="false"/> <key id="focusURLBar" data-l10n-id="location-open-shortcut" command="Browser:OpenLocation" modifiers="accel"/> <key id="focusURLBar2" data-l10n-id="location-open-shortcut-alt" command="Browser:OpenLocation" @@ -284,7 +284,7 @@ <key id="openFileKb" data-l10n-id="file-open-shortcut" command="Browser:OpenFile" modifiers="accel"/> <key id="key_savePage" data-l10n-id="save-page-shortcut" command="Browser:SavePage" modifiers="accel"/> <key id="printKb" data-l10n-id="print-shortcut" command="cmd_print" modifiers="accel"/> - <key id="key_close" data-l10n-id="close-shortcut" command="cmd_close" modifiers="accel" reserved="true"/> + <key id="key_close" data-l10n-id="close-shortcut" command="cmd_close" modifiers="accel" reserved="false"/> <key id="key_closeWindow" data-l10n-id="close-shortcut" command="cmd_closeWindow" modifiers="accel,shift" reserved="true"/> <key id="key_toggleMute" data-l10n-id="mute-toggle-shortcut" command="cmd_toggleMute" modifiers="control"/> <key id="key_undo"
If you save the above (or your custom changes) to a patch, then you can apply it by:
patch /tmp/firefox-omni/chrome/browser/content/browser/browser.xhtml firefox-omni.patch
Now switch to root, and install your changes:
cd /tmp/firefox-omni zip -0DXqr /tmp/omni.ja * cd cp /usr/lib/firefox/browser/omni.ja /usr/lib/firefox/browser/omni.ja.orig cp /tmp/omni.ja /usr/lib/firefox/browser/omni.ja rm -rf /tmp/omni.ja /tmp/firefox-omni
Now as a normal user, clear your startup cache.
rm -rf ~/.cache/mozilla/firefox/*/startupCache
Restart firefox, and it should work.
Note: You will have to do this every time you reinstall firefox. I automated the above into a script. First save firefox-omni.patch as ~/local/src/firefox-omni.patch
, and then download and run this script as a normal users (that has sudo privileges).
Anonymous (2022-06-17 09:34:22 EDT)
this does not work, no effect
Gautam Iyer (2022-06-20 14:34:30 EDT)
It works (at least for me as of 2022-06-20), as I use it every day.
Note, the above instructions only make Ctrl-W
an unreserved shortcut. This means extensions can now remap it. If you don’t have any extensions that remap it then Ctrl-W
will still close your current window.
If you’d like to simply disable Ctrl-W
, then just comment out the above shortcut definitions entirely (instead of only changing reserved="true"
to reserved="false"
as I suggest above).
GI
Anonymous (2022-10-05 20:13:15 EDT)
Thanks for this, works for me.
Vinny (2022-12-22 13:04:18 EST)
Firefox 108 assigned Shift + ESC to invoke the Process Manager, but it is also a shortcut for Discord to mark a server as read. Found this page via Google and tried to follow the instructions on my Ubuntu Mate machine, but unfortunately the directory /usr/lib/firefox/browser doesn’t exists. Even using find I can’t find the omni.ja file. Maybe it’s because Ubuntu handle Firefox via snap instead of apt-get? I don’t know, need to research more.
Gautam Iyer (2022-12-22 20:38:07 EST)
Maybe itโs because Ubuntu handle Firefox via snap instead of apt-get? I donโt know, need to research more.
Yeah; the snap files may not be in the standard location. Try searching the filesystem via find
or locate
.
cv (2023-03-21 14:32:39 EDT)
Go to System, Preferences, Hardware, Keyboard Shortcuts, assign Ctrl-w to something and it will quit working in Firefox. Beware that it will probably quit working in other apps.
notajake (2023-05-05 01:51:04 EDT)
I test it on Firefox 102.5.0esr. I can confirm that the successful modification (reserved="false"
) of chrome/browser/content/browser/browser.xhtml
. But the remapping is not working (the extension that listen to Ctrl+W
is not triggered)
Here’s the description that i found on MDN (https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/commands). Which is the API that used by browser extension to define browser scope shortcuts.
If a key combination is already used by the browser (like “Ctrl+P”) or by an existing add-on, then you can’t override it. You can define it, but your event handler will not be called when the user presses the key combination.
The description above didn’t cover the “reserved” option, I’m not dive into the source code yet. So I can’t confirm that this is 100% not working. If anyone can confirm it or figure out how to make the remapping work, please leave a comment.
MusicSky (2023-05-09 00:36:09 EDT)
Hello! Thank you for writing this blog post. I really need to remap C-w because of my vim habit. However, I get the following error:
โ ./patch-firefox-omni.zsh /home/username/repo/important/firefox-omni/src/firefox-omni.patch +./patch-firefox-omni.zsh:10> [[ -d /tmp/firefox-omni ]] +./patch-firefox-omni.zsh:10> rm -rf /tmp/firefox-omni +./patch-firefox-omni.zsh:11> mkdir /tmp/firefox-omni +./patch-firefox-omni.zsh:12> cd /tmp/firefox-omni +./patch-firefox-omni.zsh:13> unzip -q /usr/lib/firefox/browser/omni.ja +./patch-firefox-omni.zsh:15> patch chrome/browser/content/browser/browser.xhtml /home/username/repo/important/firefox-omni/src/firefox-omni.patch patching file chrome/browser/content/browser/browser.xhtml Reversed (or previously applied) patch detected! Assume -R? [n] yes Hunk #1 succeeded at 270 (offset 7 lines). Hunk #2 FAILED at 284. 1 out of 2 hunks FAILED -- saving rejects to file chrome/browser/content/browser/browser.xhtml.rej
Any input is much appreciated. Thank you!
Gautam Iyer (2023-05-10 08:59:52 EDT)
patching file chrome/browser/content/browser/browser.xhtml Reversed (or previously applied) patch detected! Assume -R? [n] yes Hunk #1 succeeded at 270 (offset 7 lines). Hunk #2 FAILED at 284.
This error means you already applied the patch, and don’t need to use it again.
I can confirm that this patch works on Firefox 113 (on Arch Linux) with firenvim as of 2023-05-10