macOSでCLIで日本語入力の句読点を切替
macOS 11(BigSur)更新
macOS 11以降、JapaneseIM
がJapaneseIM-RomajiTyping
に変更されました。
これは、/System/Library/Input Methods
にて確認することができました。
macOS 10.15まで使用する方はこの記事のまま使えますが、
macOS 11以降を使用する方はこの記事に言及されるJapaneseIM
をJapaneseIM-RomajiTyping
に書き換えてください。
概要
# 句読点設定を読み込む(0~3)
# [0] 。、
# [1] 。,
# [2] .、
# [3] .,
defaults read com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey
# 句読点設定を書き込む
defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey 値
# 設定をリロードさせる
killall -HUP JapaneseIM
使用例
例1、コンマ・ピリオドに切り替えたい場合
defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey 3
killall -HUP JapaneseIM
例2、てん・まるに切り替えたい場合
defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey 0
killall -HUP JapaneseIM
例3、「コンマ・ピリオド」と「てん・まる」を切り替えたい場合
設定を読み込み、0だった場合は3に、それ以外の場合は0に設定を書き込んでリロードさせます。
defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey \
$([ $(defaults read com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey) \
= 0 ] && echo 3 || echo 0) && killall -HUP JapaneseIM
クイックアクション
TouchBar搭載のMacBookでは、Automatorという内蔵アプリで クイックアクション を作成し、TouchBarに載せることができます。
Automatorアプリを開き、書類の種類は「クイックアクション」を選択し、左側のアクションは「シェルスクリプトを実行」を選択して右側にドラッグします。「ワークフローが受け取る現在の項目」を「入力なし」にし、実行するスクリプトを次のようにします。
/usr/bin/defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey $([[ $(/usr/bin/defaults read com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey) == 0 ]] && echo 3 || echo 0) && /usr/bin/killall -HUP JapaneseIM
注:例3と同じですが、コマンドは全て絶対パスにしました。
作成したクイックアクションを保存すると自動的にTouchBarに載せられ、手軽に使えるようになります。
ただし、場合によって一時日本語入力が利用できないことがあります。その場合はスペースが入力されないまで「かな」キーを何回か押してみればいいかもしれません。
SIGHUPに関する考察
DNSキャッシュをクリアする際もkillall -HUP
を使用したので、
SIGHUPについて調べてみました。
SIGHUP
はターミナルなどの制御端末の入力が完了した時に、シェルの子プロセスに送信して終了させようとするシグナルです。例えば、ターミナルアプリを開き、zshでプログラムをバックグラウンドで実行し、
exitしようとすると"you have suspended jobs"と怒られ、もう一度exitを実行すると全てのバックグラウンドプロセスがSIGHUPを送信されます。
nohupコマンドのhupはまさにSIGHUPを意味しており、
nohupで実行したコマンドはSIGHUPを無視します。ただし、zshではnohupを利用してもデフォルトでSIGHUPが貫通するので、
exit前にdisown $pid
かdisown %$jobnum
を実行して子プロセスを外すか、
nohupを実行する際に&
を& disown
または&|
か&!
に変更する必要があります。
しかし、デーモンプロセスは制御端末の入力を受けることがないため、入力が完了したという理由でSIGHUPが送信されることがありません。そのまま使用されないのも無駄なので、killall -HUP JapaneseIM
かkillall -HUP mDNSResponder
のように、
設定ファイルの再読み込みやキャッシュの削除を要求する目的で使用されることもあります。ただし、あくまでも元々の用途でSIGHUPが利用されないから他の用途で利用されてもよいということだけなので、全てのデーモンがSIGHUPを受信すると動作するとは限りません。
結論
defaults read $domain $key
で設定を読み込むdefaults write $domain $key $value
で設定を書き込むkillall -HUP $process
で設定をリロードさせる- 日本語入力のdomainは
com.apple.inputmethod.Kotoeri
- 句読点設定のkeyは
JIMPrefPunctuationTypeKey
- 日本語入力のprocessは
JapaneseIM
他に変更したい設定がある場合でも、defaults read
コマンドで設定のdomainとkeyを調べれば
(process名の調べ方は分かりません…ググればいいかもしれません)、以上のコマンドの組み合わせでクイックアクションの作成ができるので、ぜひ色々試してみてください。
参考
あるくますくさんの文章 Mac OS X El Capitanで日本語入力の句読点をショートカットで変更する(失敗例) を参考にしました。
この文章ではdefaults read/writeは成功したが、 killallは不安定だったそうです。 killallはデフォルトでSIGTERMを送信し、プロセスを終了させることになるので、代わりにキャッシュをクリアするようにSIGHUPを送信すればいいではないかと考え、実践したところ無事に成功しました。
ゼロから実現までの考えと試行が詳しく解説されたので、大変勉強になりました。ありがとうございました。