のどあめ

ググってもなかなか出てこなかった情報を垂れ流すブログ。

macOS SierraでKarabinerの「EISUU to Escape(入力ソースが日本語以外の場合のみ)」を実現する

macOS SierraからKarabinerが使えなくなりました。 公式サイトでは、Karabiner-Elementsへの移行を呼びかけていますが、 2017/09/16現在ではKarabinerの全ての機能を使うことはできないようです。

私が愛用していた「EISUU to Escape(入力ソースが日本語以外の場合のみ)」(下図)もその一つです。 今回は、HammerspoonとKarabiner-Elementsを使って擬似的にこの設定を再現しました。

f:id:ykicisk:20170916162357p:plain

注意

失敗するとKarabiner-Elementsの設定ファイル(~/config/karabiner/karabiner.json)が消えてしまいます。 必ずバックアップをとってから試すようにして下さい

実現方法

こちらの記事とほぼ同じ方法を使います。 日本語入力の切替時に、HammerspoonでKarabiner-Elementsの設定を切り替えます。

qiita.com

必要なアプリケーションをインストール

以下の2つをインストールします。

Karabiner-Elementsのプロファイルを作る

上の記事を参考に、Karabiner-Elementsのプロファイルを作成します。

今回は、日本語入力以外の設定である「Default」と 日本語入力中の設定である「Japanese」の2つのプロファイルを作成します。 設定項目はなんでも良いですが、 Defaultの方のみに、英数キーをEscapeにマッピングする設定をします。

f:id:ykicisk:20170916162440p:plain

また、Miscから「show profile name in menu bar」をONにしておくと、切り替わりがわかりやすくて良いと思います。

Karabinerの設定を変更するスクリプトを実装

以下のスクリプト~/.hammerspoon/karabiner-switcher.pyに配置します。

※要実行権限

#!/usr/bin/env python
# -*- encode: utf-8 -*-
import os
import sys
import json


def main():
    if len(sys.argv) != 2:
        print("usage: {0} profile_name".format(sys.argv[0]))
        exit(1)

    home = os.environ['HOME']
    fpath = os.path.join(home, ".config/karabiner/karabiner.json")

    with open(fpath) as f:
        conf = json.load(f)

    profile_name = sys.argv[1]
    select_flag = False
    for c in conf["profiles"]:
        c["selected"] = c["name"] == profile_name
        select_flag |= c["selected"]

    if not select_flag:
        print("profile_name[{0}] is not found".format(profile_name))
        exit(1)

    with open(fpath, "w") as f:
        f.write(json.dumps(conf, indent=4, sort_keys=True))


if __name__ == "__main__":
    main()

Hammerspoonの設定

入力ソース切替で上のスクリプトを実行するよう、 ~/.hammerspoon/init.luaを実装します。

以下はgoogle日本語入力の場合です。他のIMEを使っている場合はif文のところを変更して下さい。 IMEのSouceIDはコメントアウトしているprint文をconsoleから確認できます。

local home = os.getenv("HOME")

function switchKarabiner()
  source_id = hs.keycodes.currentSourceID()
  -- print("source_id: " .. source_id .. "\n")
  if source_id == "com.google.inputmethod.Japanese.base" then
    hs.execute(home .. '/.hammerspoon/karabiner-switcher.py Japanese')
  else
    hs.execute(home .. '/.hammerspoon/karabiner-switcher.py Default')
  end
end

hs.keycodes.inputSourceChanged(switchKarabiner)

Hammerspoonの設定を反映させる

HammerspoonのReload Configを選びます。

これで日本語入力のON/OFFでKarabiner-ElementsのプロファイルがJapanese/Default が切り替わっていれば成功です。

まとめ

  • HammerspoonでKarabiner-Elementsの設定を切り替えることで、 macOS SierraでKarabinerの「EISUU to Escape(入力ソースが日本語以外の場合のみ)」を実現しました。
  • たまに設定がおかしくなったときは、手動でKarabinerの設定を切り替えてください。