錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

Firefox Quantumでカスタマイズできないデフォルトショートカットキーを変更する

(2024/02/23)「omni.jaを編集する(zip使用)」を追記

FirefoxがQuantumになりキーカスタマイズアドオンのVimperatorが使えなくなってから久しい。
Vimperatorが開発終了となった当時、Chromeで同じく愛用していたキーカスタマイズアドオンのVimiumをFirefoxでも使ってQuantumに乗り換えるつもりでいたが、Vimiumでキーのリマップ設定をしてみたところ、Ctrl-Fで「ScrollDown」や、Ctrl-Pで「前のタブへ移動」など概ね問題なく設定できるのだが、「次のタブへの移動」に設定したCtrl-Nを押したところ、何かの呪いのように新しいウィンドウが開いてしまった。

以下に引用したVimiumの公式GitHubページのFAQによると、呪わしいことに、特定の(Ctrl-Nのような)Firefoxデフォルトのキーバインドは、拡張機能から書き換えることができないとのこと(Macだけはバインド可能らしい)*1

Why can't I remap Ctrl-N and similar keys on Linux and Windows?
Chrome won't let extensions like Vimium interfere with certain application-level key bindings.
(翻訳)
なぜLinuxWindowsでCtrl-Nのようなキーをリマップできないのですか?
ChromeはVimiumのような拡張機能を、特定のアプリケーションレベルのキーバインディングに干渉させません。

FAQ · philc/vimium Wiki · GitHub

これは使いものにならない…。

ということで、いたしかたなく今日までFirefox ESRとVimperatorを使い続けてきたが、今回デフォルトのキーバインドであるCtrl-Nを次のタブへの移動に置き換えることができたため、めでたくFirefox Quantumへ乗り換えする目処がついた。と言ってもFirefox本体ファイルの書き換えという姑息な(その場しのぎの)方法になってしまうのだが、大きな進歩ということで以下に残しておく。



目次


omni.jaを編集する

(追記:Firefox123.0でも有効であることを確認済。ただし編集する行が少し動いている。同じ記述の箇所を編集すればよい)

Firefoxのバージョンは76.0.1でUbuntu16.04にて使用している。
編集するのは/usr/lib/firefox/browser/omni.jaだが、このファイルはzipアーカイブになっておりこの中のファイルを編集する。
omni.jaはunzipで展開せずにNautilusなどのファイラーから書庫管理ソフト(「アーカイブマネージャー」)で開く。
→Firefox121.0ぐらいからNautilusomni.jaが書庫扱いされなくなってしまったのでzipで展開・圧縮することとした。omni.jaを編集する(zip使用)を参照。

chrome→browser→content→browserと開いていった下のbrowser.xhtmlが目的のファイルとなる。
今回は、Ctrl-Nで新しいウィンドウが開くのを無効にして、かつアドオンからCtrl-Nの書き換えができるようにしたいので、以下のように編集する(マイナスの行を削除、プラスの行を追加)。後は、VimiumでCtrl-NをnextTabに設定すればよい。

browser.xhtml 276行目~

     <keyset id="mainKeyset">
       <key id="key_newNavigator"
            data-l10n-id="window-new-shortcut"
    -       command="cmd_newNavigator"
    +       command=""
    -       modifiers="accel" reserved="true"/>
    +       modifiers="accel" reserved="false"/>

(GitHub - nilcons/firefox-hacks: How to make Firefox usable を参考に修正箇所を改変)

(OSをEmacsキーバインドにしていない場合は、この項目は読み飛ばしてOK)
「command="cmd_newNavigator"」の変更と、OSやアドオンによるEmacsキーバインド設定の衝突について

(ここをクリック・タップして開く)

command=""ではなく、command="Browser:NextTab"(次のタブへ移動)のようにしてもよいが、その場合「新しいタブ」で開いたページや設定画面でもキーバインドが有効のままになって便利なものの、OSレベルでEmacsキーバインドになっている場合(具体的にはUbuntuのgconf-editorコマンドで/desktop/gnome/interface/gtk_key_themeをEmacsにしている場合。以下同じ)に、複数行フォームでの入力時にカーソルを上から下に移動するつもりでCtrl-Nを押すと次のタブへ移動してしまって意図通りに動作しないため煩わしい。
また、キーカスタマイズアドオンのVimiumを使う際も同様に、「b」や「o」の単押しでVomnibarを開いてブックマークおよび履歴をインクリメンタルサーチの上、表示されたドロップダウンから項目を選択しようとしてCtrl-Nを押すと次のタブへ移動してしまい、これも意図しない動作になって煩わしい。
キーカスタマイズはアドオンだけにして、Firefox本体ファイルには手を加えないことにすると、OSレベルでEmacsキーバインドにしている場合の複数行フォームやVomnibarはCtrl-N・Ctrl-Pで上下移動できるが、新しいタブや設定画面ではキーバインドが無効になり、何よりCtrl-Nで次のタブに移動できなくなる。あちらを立てればこちらが立たずなので、どちらを取るかの選択となる。

(追記)キーカスタマイズアドオンのTridactylでは、OSレベルでEmacsキーバインドにしている場合のCtrl-N・Ctrl-Pによる複数行入力フォームやコマンドモードでの上下移動とタブの前後移動が両立することを確認した。設定方法はこのブログのTridactylのエントリ(Tridactylのキーカスタマイズ(モード別に変更など) - 錯誤試行)を参照。

また、新しいタブや設定タブなどでCtrl-Pを押すと印刷ダイアログが開いてしまうのも封殺しておきたい。
300行目

-    <key id="printKb" data-l10n-id="print-shortcut" command="cmd_print"  modifiers="accel"/>
+    <key id="printKb" data-l10n-id="print-shortcut" command=""  modifiers="accel"/>

最後に、アドレスバーからabout:profilesを開いて「アドオンを無効にして再起動」を選び、開いたセーフモード起動のウィンドウを閉じて起動し直すと設定が反映される。

以上でだいぶFirefox Quantumが快適に使えるようになった。
ただ、ここまでやってきて何なのだが、別にVimiumデフォルトのキーバインドである「J」や「K」でタブ移動してもいいような気がしてきた。Ctrl-N・Ctrl-Pよりさらにホームポジションから指を動かさなくてよいから楽だし(セミコロンをワンショットモディファイヤでShift化していれば右手だけでタブ移動できてしまう)。しかし、やはり手に馴染んでいるのはCtrl-N・Ctrl-Pの方なので設定は必要といえる。

omni.jaについての補足

omni.jaは展開せずに中のファイルを編集すること

(2024/2追記)

Firefox121.0ぐらいからNautilusomni.jaが書庫扱いされなくなってしまったのでzipで展開・圧縮することとした。後述のomni.jaを編集する(zip使用)を参照。

先にomni.jaはunzipで展開せずにNautilusなどのファイラーから書庫管理ソフト(「アーカイブマネージャー」)で開く旨を記載したが、その理由は、omni.jaをunzipで展開して中身を編集した後に、zipコマンドで圧縮して元の位置に戻してもfirefoxが起動しないため。
unzipでの展開後、全くアーカイブの中身を変えずにzipで圧縮の上、元の位置に戻してもfirefoxは起動しないので、おそらく圧縮形式の違いが原因と思われる(zipコマンドで圧縮すると元のファイルサイズより太ってしまう)。このためzipアーカイブのまま編集する必要がある。

omni.jaの編集が反映されるタイミングについて

about:profilesを開いて「アドオンを無効にして再起動」を選び、開いたセーフモード起動のウィンドウを閉じて起動し直すとomni.jaの編集内容が反映された。
または、~/.mozilla/firefox/(プロファイル名) 以下のjsonファイルを全て移動ないし削除してもomni.jaの変更が反映された。
設定で参照したサイトの説明によると、omni.jaの設定を反映させるにはキャッシュフォルダを消せばよいらしい。その方法はリンク先を参照。

キー定義ファイル(browserSets.ftl)について

omni.ja内の「localization/en-US/browser/browserSets.ftl」でキー定義がされている。ここに記述されているキー定義を変えて~/.mozilla/firefox/(プロファイル名) 以下のjsonファイルを全消しして再起動すると変更が反映される。設定すれば、「Ctrl-X」で新しいウィンドウを開くといったことができた。

omni.jaを編集する(zip使用)

Firefox121.0ぐらいから、Nautilusでomni.jaが書庫扱いされなくなってしまったのでその対応について。
omni.jaをomni.ja.zipにリネームしてunzipで展開する。中身のファイルを編集するのは同じ。ファイル編集後、展開したディレクトリをzipで圧縮してomni.jaとして配置してもFirefoxは起動しない。再圧縮したomni.jaを確認するとオリジナルよりもファイルサイズが小さくなってしまっているようなので、圧縮率が悪い動画・音声ファイルなど(今回は30MB程度のmp3を使用)をomni.jaを展開したディレクトリ内に入れた上で作成したzipファイルをomni.jaとして配置してやるとFirefoxが正常に起動した。
おそらく起動時にファイルサイズをチェックしているのではないかと思われる。
(追記:2024/4/1)Firefox124.0.1に更新したところ、この「嵩増し」は不要になっていた。omni.jaを展開してbrowser.xhtmlを編集してzipで圧縮、omni.jaとして配置するだけで起動した。

参照サイト

*1:なお、ChromeのVimiumではCtrl-Nで次のタブがバインドできている