Ubuntu FirefoxをEmacs Keybindにする

普段Chromeを使っているのだが、外で作業するとき電池の消費量が異常だったのでFirefoxの環境も整備する必要が出てきた。

しかしながら、Emacs脳である自分にはネットサーフィンもEmacsでしたいという欲求が非常に強い。

ChromeにはChromemacsという拡張があるが、Firefoxにはなかったのでなんとかしてみた。


以下の記事を参考した。

xkeysnail - もうひとつの Linux 向けキーリマッパ

Firefox が Quantum になり、旧来の XUL ベースのアドオンは動作しなくなった。新たな拡張機能の機構である WebExtensions ではキーボードショートカットに関する API が大幅に制限され、ぼくは拙作のアドオン KeySnail のWebExtensions 化を諦めた。

この筆者も同じことを考えていて、同じように辛さを感じているようだ。

この xkeysnailFirefoxのplugin ではなくて、 Linuxのuinputを取得して任意のkeyに変換する ということをやっている。

mooz/xkeysnailREADME.md に導入方法が書いてある。

自分の .config.py は以下。

# -*- coding: utf-8 -*-

import re
from xkeysnail.transform import *

define_conditional_modmap(re.compile(r'Firefox'), {
    Key.CAPSLOCK: Key.LEFT_CTRL,
})

define_keymap(re.compile("Firefox"), {
    # change tab
    K("C-f"): K("C-Tab"),
    K("C-b"): K("C-Shift-Tab"),

    # search
    K("C-s"): K("C-f"),
    K("C-s"): K("C-g"),
    K("C-r"): K("C-Shift-g"),

    # private window
    K("C-Shift-n"): K("C-Shift-p"),

    # up/down
    K("C-n"): K("DOWN"),
    K("C-p"): K("UP"),
    K("C-v"): K("SPACE"),

    K("C-g"): {
        # change page
        K("C-b"): K("C-LEFT_BRACE"),
        K("C-f"): K("C-RIGHT_BRACE"),

        # reload
        K("C-r"): K("C-r"),

        # paste
        K("C-v"): K("C-v"),

        # close
        K("C-w"): K("C-w"),

        # close
        K("C-t"): K("C-Shift-t"),
    }
}, "Firefox")

Firefox のみ反応してほしいのでこのような設定にした。

takeokunn/dotfiles/blob/master/modules/xkeysnail/dot.config.pyで管理をしている。

あとは、 sudo xkeysnail ~/.config.py をたたけば有効になる。


ついでにserviceにも登録しておく。

/etc/systemd/system/xkeysnail.service:

[Unit]
Description=xkeysnail

[Service]
KillMode=process
ExecStart=/usr/local/bin/xkeysnail /home/take/.config.py
ExecStartPre=/usr/bin/xhost +SI:localuser:root
Type=simple
Restart=always

# Update DISPLAY to be the same as `echo $DISPLAY` on your graphical terminal.
Environment=DISPLAY=:0

[Install]
WantedBy=default.target

ExecStartPre~/usr/bin/xhost +SI:localuser:root をしないとどうも Xlib.error.DisplayConnectionError: Can't connect to display ":0.0": b'No protocol specified\n' というエラーが出る。

以下を叩いて終わり。

$ sudo service xkeysnail enabled
$ sudo service xkeysnail start

これで FirefoxEmacs のように操作ができるようになった。最高。

微妙に融通の効かない部分とかあるので細かい調整をどんどんしていきたい。

Firefox QuantumKey API がハックしや少なってくれることを祈るばかり。