Yona’s blog

思いついたらなんか書く

WindowsでAutoHotKeyを使って雑にEmacsキーバインドを再現する(再)

WindowsEmacsキーバインド実装して

過去にMac OSを使っておりました。テキスト入力欄で^f^b^p^n^h^d^a^eが使えるのはとっても便利なんですよね。しかし、Windowsには実装されておらず、ブラウザの入力欄で^hを押そうものなら閲覧履歴画面に飛ばされます。^aを押せば全文選択になり画面が真っ青になります。

なにかいい方法は無いかと考えたら、AutoHotKeyを利用したEnthumbleなるものがあることを知りました。どうやら過去には無償版が公開されていたらしいですが、現在は有償版のみになっていました。更にショックな事に、このソフトはJISキーボードの無変換キーを活用するものです。現在僕はUSキーボードを使用していますので、Enthumbleを諦めるしかありません。

jp.enthumble.com

もう少し調べてみると、このソフトが利用しているAutoHotKeyを用いれば 無償で 無変換キーがなくても利用できるとのこと。DIY欲が湧いてきましたので、AutoHotKeyを利用する方向へ舵を切ることにしました。

GithubとQiitaになんでもある

適当に「AutoHotKey Emacs」等で検索するとGithubとQiitaで先人が書いてくれたスクリプトがあることを知りました。QiitaのスクリプトGithubスクリプトを参考に少し編集が加えられたものでした。Diffを確認したところ、C-c C-x等を無効化して簡易なEmacsキーバインドのみを利用できるようにしていることが確認できました。

github.com

qiita.com

Qiitaの記事では言及されていませんでしたが、IME.ahkというスクリプトを別に参照する必要がありそうです。どうやらIME.ahkAutoHotKey界隈では有名なようで、わざわざ説明する必要が無いほどの知名度のようです。Qiitaのスクリプトをそのまま読み込むと、Invalid Hotkyなるアラートが出てうまく起動できないので、IME.ahkの入手元を示しておきます。

w.atwiki.jp

IME切り替えの部分は消した

Qiitaの記事ではIMEの変更にこだわって^oを割り当てていました。僕はGoogleIMEでShift-SPACEに割り当てていて必要ないなと感じたので消しました。そもそも^oを使わなければIME.ahkも不要なようなので、include文も不要なので消しました。

何故か出るInvalid Hotkey

emacs.ahkをダブクリックでスクリプトが読み込まれ、構文がチェックされるのですが、何やら260行目の「^vk20sc039」でエラーが出ます。調べると、スペースキーを表すコードらしいですが、キーコードが変わっていた(要出典)ようなので、「^Space」に変更しました。これでようやく起動できるようになりました。※^Spaceは範囲選択に割り当てられていますので、IME切り替えと競合しますので、この項目も消しました。

scrapbox.io

firefoxで微妙に動かない

アクティブウィンドウのクラスが微妙に違っているらしく、そのまま使用すると^h^d^eが履歴・ブックマーク・検索バーへフォーカスの機能のままでした(ブラウザの標準)。引用したスクリプトfirefox用のクラスにはMozillaUIWindowClassが指定されていました。何やらコメント部分にKeysnail on firefoxと書かれており、調べると既にサポートを終了したアドオン向けの記述だった様子。

仕方なくfirefoxそのものを指すクラスを探したところ、stack overflowでMozillaWindowClassという記述を見かけましたので、これを採用しました。

stackoverflow.com

先程のMozillaUIWindowClassをMozillaWindowClassに変更し、Returnも0が帰るようにしました(1だとキーがそのまま入力されるので)。これでようやく僕が求めていた挙動をするようになりました。めでたしめでたし。

まとめ

月曜の夜中(日をまたいで火曜日)に唸りながら以下のことを行いました。

  • AutoHotKeyEmacsキーバインドを実現したかったが色々引っかかった
  • IME.ahkなんていらんかった
  • スペースキーのキーコード変更に対応する修正
  • ^Spaceと^o部分を削除
  • firefox用のクラスに書き換え

これでWindows上にEmacsキーバインドを実装できたので、しばらくは精神衛生が良く過ごせそうです。

付録(emacs.ahk)

ブログに全文書いていましたが、Githubに上げたのでリンクを貼り付けておきます。(2020年7月28日)

github.com