macOS Catalina β でKarabinerが動かない時の暫定対処法 :備忘

Macのキーボードカスタマイズツール、Karabinerは自分の必須ツールになっているのだがCatalinaベータ版にUpdateしたところ、上手く動かなくなってしまった。

【追記】2019.8.16
Ver 12.6.0 macOS Catalinaでは、下記の設定が必要なことがマニュアルに書かれた。
Ver 12.6.0以降はダイアログで設定を促される。
Sleep後の処理も必要なくなったようだ。◎
https://pqrs.org/osx/karabiner/document.html#usage-catalina

Karabinerの暫定対処法

様々探した結果、下記のコメントに暫定的な対処法が示されていることを知った。

https://github.com/tekezo/Karabiner-Elements/issues/1867

【システム環境設定でキーボード監視のチェック】

まず、システム環境設定>セキュリティとプライバシー>プライバシー>キーボード監視 で karabinergrabberと karabinerobserver を許可する。

ボタンが出ない状況の時は、 Karabiner-EventViewerを立ち上げれば現れるはず。

【Sleep復帰後の処理】

これで、karabinerは動作するはず。但し、これを行ってもSleepから復帰するとうまく動かない状況に陥る。これを回避するためには、Sleep復帰したら、

~/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_grabber
~/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_observer

をkillする必要がある。これをまとめた下記を起動する。

ps -ef | egrep karabiner_observer\|karabiner_grabber | grep -v grep |  awk '{print $2}' | xargs -I _ sudo kill _

【sleepwatcherによる自動化】

でも、スリープ毎にコマンドを叩くのは面倒なので、Sleepから復帰した後で自動的に上記が実施されるようにしたいと想って、いろいろ探したら、sleepwatcherというtoolをみつけた。

http://tyhoffman.com/blog/2013/09/sleepwatcher-power-event-driven-automation/

インストールはHomebrewで brew install sleepwatcher OK.

あるいは、こちらから 手動で。

https://www.bernhard-baehr.de/

先ほどのKillコマンドをシェルスクリプト化して.wakeupと名付ける
(下記、Plist参照。復帰の際に起動させるスクリプト)

~~#!/bin/sh
~~ps -ef | egrep karabiner_observer\|karabiner_grabber | grep -v grep |  awk '{print $2}' | xargs -I _ sudo kill _

このシェルをSleepwatchでSleep復帰後に自動起動させる。

ユーザーディレクトリのライブラリにLaunchAgentsというディレクトリを作成し、そこに下記のようなplistファイル(ここではde.bernhard-baehr.sleepwatcher.plist)を設置する。

mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/sleepwatcher/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist~

plist の中身は、こんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>de.bernhard-baehr.sleepwatcher</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/sbin/sleepwatcher</string>
		<string>-V</string>
		<string>-s ~/.sleep</string>
		<string>-w ~/.wakeup</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>

スリープに入るときに ~/.sleepの実行ファイルを、スリープから復帰するときに

~/.wakeupの実行ファイルを実行するためのPlist

【launchd への登録】

あとは、sleepwatcherをlaunchctl を使用して launchd に登録、常駐化する。

launchctl load de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist

これでOK.

Macの起動時にlaunchdによって自動的にSleepWatherが起動、スリープ復帰後に上記のスクリプトを動作させてくれる。GJ!