macOSでCLIで日本語入力の句読点を切替

macOS 11(BigSur)更新

macOS 11以降、JapaneseIMJapaneseIM-RomajiTypingに変更されました。
これは、/System/Library/Input Methodsにて確認することができました。

macOS 10.15まで使用する方はこの記事のまま使えますが、
macOS 11以降を使用する方はこの記事に言及されるJapaneseIMJapaneseIM-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に載せられ、手軽に使えるようになります。

TouchBarに載せられたクイックアクション

ただし、場合によって一時日本語入力が利用できないことがあります。その場合はスペースが入力されないまで「かな」キーを何回か押してみればいいかもしれません。

SIGHUPに関する考察

DNSキャッシュをクリアする際もkillall -HUPを使用したので、 SIGHUPについて調べてみました。

SIGHUPはターミナルなどの制御端末の入力が完了した時に、シェルの子プロセスに送信して終了させようとするシグナルです。例えば、ターミナルアプリを開き、zshでプログラムをバックグラウンドで実行し、 exitしようとすると"you have suspended jobs"と怒られ、もう一度exitを実行すると全てのバックグラウンドプロセスがSIGHUPを送信されます。

SIGHUPデモ

nohupコマンドのhupはまさにSIGHUPを意味しており、 nohupで実行したコマンドはSIGHUPを無視します。ただし、zshではnohupを利用してもデフォルトでSIGHUPが貫通するので、 exit前にdisown $piddisown %$jobnumを実行して子プロセスを外すか、 nohupを実行する際に&& disownまたは&|&!に変更する必要があります。

しかし、デーモンプロセスは制御端末の入力を受けることがないため、入力が完了したという理由でSIGHUPが送信されることがありません。そのまま使用されないのも無駄なので、killall -HUP JapaneseIMkillall -HUP mDNSResponderのように、 設定ファイルの再読み込みやキャッシュの削除を要求する目的で使用されることもあります。ただし、あくまでも元々の用途でSIGHUPが利用されないから他の用途で利用されてもよいということだけなので、全てのデーモンがSIGHUPを受信すると動作するとは限りません。

結論

他に変更したい設定がある場合でも、defaults readコマンドで設定のdomainとkeyを調べれば (process名の調べ方は分かりません…ググればいいかもしれません)、以上のコマンドの組み合わせでクイックアクションの作成ができるので、ぜひ色々試してみてください。

参考

あるくますくさんの文章 Mac OS X El Capitanで日本語入力の句読点をショートカットで変更する(失敗例) を参考にしました。

この文章ではdefaults read/writeは成功したが、 killallは不安定だったそうです。 killallはデフォルトでSIGTERMを送信し、プロセスを終了させることになるので、代わりにキャッシュをクリアするようにSIGHUPを送信すればいいではないかと考え、実践したところ無事に成功しました。

ゼロから実現までの考えと試行が詳しく解説されたので、大変勉強になりました。ありがとうございました。