12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Karabiner-Elementsの設定が超絶楽になるDSL「Goku」

Last updated at Posted at 2019-06-06

※使用環境: Goku 0.2.5, Karabiner-Elements 12.4.0, Homebrew 2.1.4, macOS 10.13.6

#はじめに
「Mac 三大神アプリ」の1つと言っても差し支えない「Karabiner-Elements」ですが、設定ファイルの編集が少し面倒ですよね。Gokuという__Karabiner-Elements用のDSL__を使うと、めちゃくちゃ楽に設定ができるようになりますよ。

どのくらい楽になるのか?

左Optionキーの空打ちを、Control+F2に割り当てる1」という設定を例に、Gokuを使わずに直接書いた場合と、Gokuを使って書いた場合とを比べてみます。

  • Gokuを使わない場合
karabiner.json(抜粋)
{
  "description": "左Option(空打ち) -> Ctrl+F2",
  "manipulators": [
    {
      "from": {
        "key_code": "left_option"
      },
      "to": [
        {
          "key_code": "left_option"
        }
      ],
      "to_if_alone": [
        {
          "key_code": "f2",
          "modifiers": [
            "left_control"
          ]
        }
      ],
      "type": "basic"
    }
  ]
}
  • Gokuを使った場合
karabiner.edn(抜粋)
{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}

いかがでしょうか?

1つだけだと、違いがもう一つ伝わらないかもしれませんので、さらに設定を2つ追加してみます。
Terminalアプリの場合にのみ、「Cmd+S -> Ctrl+S」「Cmd+T -> Cmd+T,英数キー」となる設定を追加した例が下記になります。

Gokuを使わない場合 (クリックで表示)
karabiner.json(抜粋)
{
  "rules": [
    {
      "description": "左Option(空打ち) -> Ctrl+F2",
      "manipulators": [
        {
          "from": {
            "key_code": "left_option"
          },
          "to": [
            {
              "key_code": "left_option"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "f2",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "[Terminal]  Cmd+S -> Ctrl+S",
      "manipulators": [
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.googlecode\\.iterm2$",
                "^com\\.apple\\.Terminal$"
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "s",
            "modifiers": {
              "mandatory": [
                "left_command"
              ]
            }
          },
          "to": [
            {
              "key_code": "s",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "[Terminal]  Cmd+T -> Cmd+T, EISUU",
      "manipulators": [
        {
          "conditions": [
            {
              "bundle_identifiers": [
                "^com\\.googlecode\\.iterm2$",
                "^com\\.apple\\.Terminal$"
              ],
              "type": "frontmost_application_if"
            }
          ],
          "from": {
            "key_code": "t",
            "modifiers": {
              "mandatory": [
                "left_command"
              ]
            }
          },
          "to": [
            {
              "key_code": "t",
              "modifiers": [
                "left_command"
              ]
            },
            {
              "key_code": "japanese_eisuu"
            }
          ],
          "type": "basic"
        }
      ]
    }
  ]
}
  • Gokuを使った場合
karabiner.edn
{:main [{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}
        {:des "[Terminal]  Cmd+S -> Ctrl+S" :rules [[:!Cs :!Ts :terminal]]}
        {:des "[Terminal]  Cmd+T -> Cmd+T, EISUU" :rules [[:!Ct [:!Ct :japanese_eisuu] :terminal]]}]
 :applications {:terminal ["^com\\.googlecode\\.iterm2$" "^com\\.apple\\.Terminal$"]}}

いかがでしょうか?

Gokuを使わない場合は70行以上の追加が必要ですが、Gokuを使った場合は3行の追加で済みます。
このように、Gokuを使えば大半の設定は1~2行で書けるため、追加や見直しを躊躇する必要がなく、いつでも思いついたタイミングで新しい設定を試してみることが可能になります。


#導入手順
Gokuを試してみたい方は、まず最初に以下の3つのドキュメントを読むことをオススメします。インストール方法、記述方法、Karabiner-Elementsへの反映まで、必要なことが一通り網羅されています。

1. Install

HomebrewでGithubのリポジトリをtapしてインストールします。

$ brew install yqrashawn/goku/goku

2. Profileの作成

Karabiner-Elementsの設定画面の「Profiles」から、Defaultという名前のProfileを追加してください。
GokuはProfileを指定する記述がない場合、Defaultという名前のProfileに設定を反映しようとします。

[※注意事項]
__もし、既にDefaultという名前でProfileを運用している場合、Gokuで記述されていないリマップルールは反映時に消えてしまいます__ので、リネームしておいてください。別の名前のProfileを使うように指定することも可能ですが、記述ミスなどによってDefaultという名前のProfileが使われることもありますので、慣れるまではリネームしておいたほうが安全です。

karabiner-profile-gui.jpg

3. karabiner.ednの作成

Gokuはデフォルトでは、~/.config/karabiner.ednを設定ファイルとして読み込みます。
他のディレクトリやファイル名を使う場合は、反映時に環境変数GOKU_EDN_CONFIG_FILEを使ってファイルパスを指定しておく必要があります。

はじめに紹介した「左Optionキーの空打ちを、Ctrl+F2に割り当てる」という設定のみを書いたkarabiner.ednを作成します。

$ cd ~/.config
$ echo `{:main [{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}]}` > karabiner.edn

4. Karabiner-Elementsへの反映

gokuコマンドを実行して、karabiner.ednに書いた設定を、Karabiner-Elementsへの反映します。

$ goku

Done!と表示されたら反映完了です。
Karabiner-ElementsからProfileをDefaultに変更すれば、設定が反映されていることが確認できます。

complex_modifications_抜粋_.jpg

デフォルトとは違うディレクトリやファイル名で設定ファイルを作成した場合は、以下のようにGOKU_EDN_CONFIG_FILEという環境変数でパスを指定後、gokuコマンドを実行してください。

$ GOKU_EDN_CONFIG_FILE=~/path/to/file.edn
$ goku

設定ファイルをウォッチする

gokuwコマンドを実行すると、設定ファイルをウォッチして、変更があれば自動でgokuコマンドが実行されるようになります。

$ gokuw

また、brew services start yqrashawn/goku/gokuを実行すると、gokuwコマンドと同様の処理がバックグラウンドサービスとして起動されます。

ただし、現状はいずれの場合もウォッチする設定ファイルのパスが固定で、環境変数は使われないようになっているため、デフォルト以外のファイルパスを使っている場合は、gokuwの中身を変更したり、別のスクリプトを書いて対応する必要があります。

/usr/local/bin/gokuw
#!/bin/sh
watchexec -r -w ~/.config/karabiner.edn /usr/local/opt/goku/bin/goku

インポート用設定ファイルを使って反映する場合

gokuコマンドを実行すると、karabiner.jsonが更新されますが、それを避けたい場合はインポート用の設定ファイルを作成するのがいいかと思います。方法は下記の記事を参照してください。
【Karabiner-Elements+Goku】インポート用の設定ファイルを作成する

#参考資料

  1. Macの標準設定では、Control+F2はメニューバーへフォーカスが移動するショートカットです。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?