Windows で Emacs 風キーバインディングにする


やりたいこと

タイトル通りだが、Windows で Emacs 風キーバインディングにしたい。Mac だと、デフォルトで Emacs 風のキー操作が使えて便利なんだけど、Windows では何かソフトとかを使わなければいけないらしい。

自分自身はヘビーな Emacs ユーザーではないので、完全に Emacs 風にする必要は無く、最低限

  • カーソル移動(Ctrl-N, P, F, B, A, E 等)
  • Ctrl-K で、カーソル以降を削除

くらいで十分。

選択肢

“Windows keyboard emacs” とかで検索するといくつか出てくる。

XKeyemacs

以下の EmacsWiki で紹介されている。

EmacsWiki: XKeymacs

結構昔からあるようだけど、以下の本家バージョンは2008年が最終更新とかなり古い。

XKeymacs

以下のフォークバージョン?だと2017年が最終更新なので比較的新しい。

GitHub – fujieda/xkeymacs

AutoHotKey

AutoHotKey は、Emacs 風のキーバインディングにするためのものではなく、作業の自動化を行うスクリプト言語で、キー操作によりそのスクリプトを呼び出すことが出来るらしい。

これを使い、例えば Ctrl-A が押されたらカーソルを先頭に動かす処理を実行する、といったスクリプトを定義することが出来るので、それで Emacs 風キーバインディングを実現出来る。

XKeymacs は若干古いのが気になったので、今回は AutoHotKey を使うことにした。

その他

そのほかにもいくつか見つかったが、今回は省略。

AutoHotKey で Emacs 風キーバインディングにする方法

基本

以下のページにわかりやすく解説されている。

Windows 10でも「Emacs風キーバインド」を使おう【AutoHotKey】 | LFI

なるべく全ての操作を Emacs 風にしたい場合は、以下のスクリプトを使えば出来る。

emacs.ahk/emacs.ahk at master · usi3/emacs.ahk · GitHub

特定のアプリでは AutoHotKey を無効にしたい

Emacs ユーザーは Windows でも Emacs を使うと思うが、当然 AutoHotKey のキー操作とかぶる。特定のアプリの場合に AutoHotKey を無効にするには、上のスクリプトの中で以下のような関数が定義されていると思うので、必要に応じてコメントアウトする・コメントを外す、というのをやる必要がある。ちなみに、セミコロン以降がコメント。

is_target()
{
  IfWinActive,ahk_class ConsoleWindowClass ; Cygwin
    Return 1 
  IfWinActive,ahk_class MEADOW ; Meadow
    Return 1 
  IfWinActive,ahk_class cygwin/x X rl-xterm-XTerm-0
    Return 1
  IfWinActive,ahk_class MozillaUIWindowClass ; keysnail on Firefox
    Return 1
  ; Avoid VMwareUnity with AutoHotkey
  IfWinActive,ahk_class VMwareUnityHostWndClass
    Return 1
  IfWinActive,ahk_class Vim ; GVIM
    Return 1
;  IfWinActive,ahk_class SWT_Window0 ; Eclipse
;    Return 1
;   IfWinActive,ahk_class Xming X
;     Return 1
;   IfWinActive,ahk_class SunAwtFrame
;     Return 1
;; 自分の環境では、以下の2行のコメントを外した
;   IfWinActive,ahk_class Emacs ; NTEmacs
;     Return 1  
;   IfWinActive,ahk_class XEmacs ; XEmacs on Cygwin
;     Return 1
  Return 0
}

ここでの各 if 文がやっていることとしては、Window クラスが「Emacs」という名前の場合は、「1」を返す、つまり AutoHotKey の処理は行わない、というもの。それを、対応が必要なアプリ分だけ記載している。

詳しく知りたい方は、スクリプト言語のマニュアルを参照のこと。

自分が使っているアプリの Window クラス名を調べたい時には、以下のアプリを使った。

WinLister v1.22 – display the list of opened windows on your system

(2021/10/11追記)AutoHotKey のタスクトレイアイコンを右クリックして、「Window Spy」をクリックすると同じことが出来るので、上のアプリは不要。

特定のキー操作だけ通常の動作にしたい

上の方のスクリプトだと Ctrl-W が「cut」に割り当てられているが、これってブラウザのタブを閉じるキーとかぶっていて使いづらい。なので、Ctrl-W は通常の動作にしたいんだけど、そのためにはスクリプトの Ctrl-W の部分を以下の通りコメントアウトする必要がある。

;
; <ctrl>w
; cut
;
;^w::
;  If is_target()
;    Send %A_ThisHotkey%
;  Else
;    Send ^x
;  Return

まとめ

元々は Windows ユーザーだったものの、2010年頃に Mac を買って以来、ずっと Mac ユーザーだった。気分転換に 2019年に Windows マシンを購入したものの、キー操作に慣れずに古い Mac を使い続ける日々だったんだけど、これでようやく Windows に移行できそう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です