Mac版Keyhacでアプリごとにまとめてキーバンド設定

More than 1 year has passed since last update.

みなさんEmacs使ってますか? 私はもはやエディタのEmacs自体は使ってないけど指が永遠のEmacs派です。atomでもまずatomic-emacsを入れます。

ということで私物のMacではKarabinerを使ってるもののなんか微妙に思い通りにならず(設定が悪いだけかも)、会社でWindowsからMacに乗り換えたのを機にWindowsでも使っていたKeyhacのMac版を試してみました。KeyhacはPythonで設定をかなり柔軟に書けるのが魅力です。

基本的にはWindows版とまったく同じように使える……のですが、キーバインドをアプリごとに変えるところで若干躓きが。

複数のアプリをまとめて設定するために例えばここのように


config.py

def is_im_target(window):

if window.getProcessName() in ("cmd.exe", # cmd
# ……
"MobaXterm.exe"): # MobaXterm
return True
return False

keymap_im = keymap.defineWindowKeymap(check_func=is_im_target)


defineWindowKeymapメソッドのcheck_func引数にアプリを判定する関数を指定してやれば良いのですが、Macではwindow.getProcessName()が使えません。

んで調べてみると開発者が答えていて、微妙にわかりづらいんですが要は


config.py

def is_emacs_target(app):

# Mac版ではこうやってアプリ名を取得
if ckit.getApplicationNameByPid(app.pid) \
in (
# ここでは除外したいアプリ名を列挙
"com.apple.Terminal", # terminal
):
return False
return True

keymap_emacs = keymap.defineWindowKeymap(check_func=is_emacs_target)
keymap_emacs[ "Ctrl-P" ] = "Up" # Move cursor up


プロセスIDを取得→ckit.getApplicationNameByPidに渡す、と。めでたしめでたし。