keyhac

macOS Sierra + Keyhacでキーバインドをカスタマイズ

More than 1 year has passed since last update.

うっかりmacOS Sierraにアップデートしてしまった後にKarabinerが対応していないことを知って困った。せっかくなのでデフォルトのキーバインドに慣れようかと思ってしばらくがんばっていたけど、生産性が下がりすぎて無理。そこで、Keyhacでできるとこまでがんばってみることに。


要求


必須


  1. SandS


  2. Ctrl-mReturn


  3. Ctrl-[PNBF]


  4. Ctrl-[Esc

  5. iTerm上のVimで、インサートモードから抜ける時にIMEを英数に戻す


できれば


  1. SlackでCtrl-Tab, Ctrl-Shift-Tabで未読チャンネルを移動


  2. Ctrl-Cmd-Spaceでスポットライトの検索バーを出す


コード

from keyhac import *

def configure(keymap):
keymap_global = keymap.defineWindowKeymap()

# 必須1: SandS
keymap.replaceKey("Space", "Shift")
keymap_global["D-Shift"] = "Shift"
keymap_global["O-Shift"] = "Space"
keymap_global["O-Space"] = "Space"

# IMEのトグル
# ↑の設定のせいで既存の設定が食われてしまうぽいので、
# 環境設定→キーボード→ショートカットであらかじめ設定したキーにあてる
keymap_global[ "Cmd-Shift" ] = "F12"

# 必須2と3: Emacs Keybindings
keymap_global[ "Ctrl-M" ] = "Return"
keymap_global[ "Ctrl-P" ] = "Up"
keymap_global[ "Ctrl-N" ] = "Down"
keymap_global[ "Ctrl-F" ] = "Right"
keymap_global[ "Ctrl-B" ] = "Left"

# 必須4: C-[ to Esc
keymap_global[ "Ctrl-OpenBracket" ] = "Esc"

# 必須5: iTerm2
# インサートモードから戻る時はIMEを英数にしてほしい
def escWithIMEOff():
esc = keymap.InputKeyCommand("Esc")
esc()
ime_off = keymap.InputKeyCommand("Ctrl-Shift-Semicolon") # GoogleIMEのショートカット
ime_off()

keymap_terminal = keymap.defineWindowKeymap( app_name="com.googlecode.iterm2" )
keymap_terminal[ "Ctrl-OpenBracket" ] = escWithIMEOff

# できれば1: Slack
# いまのところなんかだめ
keymap_slack = keymap.defineWindowKeymap( app_name="com.tinyspeck.slackmacgap" )
keymap_slack[ "Ctrl-Tab" ] = "Option-Shift-Down"
keymap_slack[ "Ctrl-Shift-Tab" ] = "Option-Shift-Up"

# できれば2: Spotlight
# いまのところなんかだめ
keymap_global[ "Cmd-Ctrl-Space" ] = "F11"


補遺


  • どうもスペースの動きが変。スペースとして効いてほしい時に、状況によって一発で効いたり効かなかったりする。ので、変換する時にスペースを一度押したら変換できたりできなかったりするし、スペースを二回押さないとスペース自体が入力できなかったりする

  • 上記の要求の「できれば」は、1も2もちゃんと動いてない