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

  • 4
    いいね
  • 0
    コメント

うっかり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もちゃんと動いてない