Macで句読点をワンクリックで切り替えるショートカットを設定する

## はじめに
理系だと論文を書くときには「．，」を句読点に使うわけですが、日常でもこれを使うのがなんか理系理系していて嫌だったので、論文を書くときだけいちいち日本語キーボードの設定画面から設定し直していました。
でもふと「これってBTTとか標準機能使ってショートカットにできないの？」と思って色々調べて実装してみたので、ここに置いておきます。
初投稿なので読みづらかったらすみません。

## 環境
MacBook Pro 15-inch, 2018
macOS Sonoma 14.1.1
BetterTouchTool Version: 4.356


## AppleScriptを使った実装（頓挫）
やっぱり同じことを考える人はいるもので、先人がすでに作ってくれていました。

https://qiita.com/mpyw/items/e2749ba8d68310d983a1

この記事の通りにAppleScriptを書いて、BTTに登録すれば完成！と思ったらうまく動きません。色々調べると、macOSのシステム設定のレイアウトがVenturaで刷新されたため、それ以前に作成されたApplescriptは大体全て死んだらしいですね。どうして......。


仕方ないのでこの先人のAppleScriptを参考に新しく書き直してみます。幸いにもVenturaでキーボード関連のスクリプトを書いている先人がいたので、こちらの記事を参考に作成をしてみましたが......

https://discussionsjapan.apple.com/thread/254549299?sortBy=best

要素の指定と操作がわからなすぎて諦めました。どなたか詳しい方作ってみてください......。

## Shell scriptでdefaultsを使った実装（成功）
### 結論
諦めきれずに色々調べてみると、```defaults```コマンドを使ってMacの設定をいじくれることを知りました。具体的には、~/Library/Preferences/ 以下の設定ファイルを読み書きできるんですね。
とりあえずまずは結論のコードを置いておきます。
設定ファイルの書き換えや、プロセスの再起動を含むスクリプトになっているので、**お試しは自己責任**でお願いします。
```shell
prop=`defaults read com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey`
if [ $prop -eq 0 ]; then
    defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey -int 3
else
    defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey -int 0
fi
killall -HUP JapaneseIM-RomajiTyping
```
### 経緯：対応するプロパティの調査
詳しくは先人の記事に譲りますが、まずは、

1. ~/Library/Preferences/ 以下のそれっぽいプロパティリスト（.plist）を探す
1. 設定を変更してみて、どのプロパティが変わっているのか探す
1. 書き換えて試す

みたいなことをします（実はどのプロパティが対応しているかは変更履歴からわかったりもします）。
今回は上記の感じで調べてみると、~/Library/Preferences/com.apple.inputmethod.Kotoeri.plist
が怪しいですね。てっきり"Japanese"とかそういう文言が入っていると思っていたのですが、なんと"Kotoeri"が入っていました。ことえりはOS X Mavericksで採用を終了した日本語入力システムの名前ですが、プロパティファイルの名前として現在も生き続けているのですね。


このファイルに含まれるプロパティを```defaults read```を使って読み出してみます。このときには.plist拡張子は省略します。なお、この時点での句読点の設定は「。、」です。
```terminal
% defaults read com.apple.inputmethod.Kotoeri
{
    JIMDictionaryTrainerLastProcessedFileID = 0;
    JIMDictionaryTrainerLastProcessedRecordNumber = 0;
    JIMPrefCandidateWindowFontKey = "HiraginoSans-W6";
    JIMPrefCapsLockActionKey = 0;
    JIMPrefCharacterForSlashKey = 1;
    JIMPrefCharacterForYenKey = 1;
    JIMPrefConvertWithPunctuationKey = 0;
    JIMPrefPunctuationTypeKey = 0;
    JIMPrefShiftKeyActionKey = 1;
    JIMPrefTypingMethodKey = 0;
    JIMPrefVersionKey = 1;
}
```
ここで、システム設定から句読点を「．，」に変更してみて再度同じコマンドを叩くと、下記のように出力が変わります。
```terminal
% defaults read com.apple.inputmethod.Kotoeri
{
    JIMDictionaryTrainerLastProcessedFileID = 0;
    JIMDictionaryTrainerLastProcessedRecordNumber = 0;
    JIMPrefCandidateWindowFontKey = "HiraginoSans-W6";
    JIMPrefCapsLockActionKey = 0;
    JIMPrefCharacterForSlashKey = 1;
    JIMPrefCharacterForYenKey = 1;
    JIMPrefConvertWithPunctuationKey = 0;
    JIMPrefPunctuationTypeKey = 3;
    JIMPrefShiftKeyActionKey = 1;
    JIMPrefTypingMethodKey = 0;
    JIMPrefVersionKey = 1;
}
```
見比べると、```JIMPrefPunctuationTypeKey```が```0```から```3```に変化していることがわかります。つまり内部的にはこのプロパティによって句読点の設定がなされているようです。


ここまでわかれば、あとはこの設定を変更するスクリプトを作成します。今回はこのプロパティを```0```→```3```→```0```→...のように相互に変更したいので、現在の値を読み取って対応する数値を書き込むスクリプトを作成します。
```shell
prop=`defaults read com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey`
if [ $prop -eq 0 ]; then
    defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey -int 3
else
    defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey -int 0
fi
```
```shell
defaults read com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey
```
で読み込んだプロパティの値によって条件を分岐し、
```shell
defaults write com.apple.inputmethod.Kotoeri JIMPrefPunctuationTypeKey -int *
```
で値の書き換えを行っているだけです。
### 経緯：プロセスの再起動
プロパティによっては書き込むだけで設定が反映されるようですが、これは反映されないタイプのようでした。そのため、プロセスの再起動を行って設定の反映を行う必要があります。
しかしここでまた問題があり、何のプロセスを再起動すればいいのかわかりません。こちらについてはアクティビティモニタからそれらしいプロセスを探してみます。JapaneseやKotoeriなどで探してみても全く見つからなかったのですが、「日本語入力プログラム – ローマ字入力」とかいうそのまんまなプロセスがあったのでおそらくこれでしょう。
「サンプルを収集」から詳しく調べてみると、どうやら正式名称は```JapaneseIM-RomajiTyping```だそうなので、このプロセスを再起動してみます。
通常の```killall```では終了できないようだったので、```-HUP```オプションで再起動をかけます。
```shell
killall -HUP JapaneseIM-RomajiTyping
```
実行してみると、無事に句読点を変更できました！

## ショートカットの作成
Mac純正ソフトの「ショートカット」アプリケーションでショートカットを作成できます。
「スクリプティング」→「シェルスクリプトを実行」から、上記のソースコードを貼り付ければOKです。
適当にコントロールセンターやTouch Barなどにウィジェットを配置すると、ワンクリックで変更可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661623/988e68f2-5758-d755-27f7-db2f01ace07f.png)


## BetterTouchToolへの登録
もちろん、このスクリプトをBTTのショートカット等に登録することもできます。
「その他のアプリケーションの制御」→「シェルスクリプト/タスクの実行」
を選択し、Scriptの部分に上記のソースコードを貼り付ければOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661623/f1792af3-9477-b95e-10a3-d5c66427f15b.png)

## 結果
これで、ワンタッチで，句読点を、変更できるように，なりました。やったね．

## まとめ
```defaults```コマンドを今回初めて知りましたが、非常に便利ですね。これとBTTを組み合わせれば、今回の件以外にも可能性が大きく広がる気がします。一方で、おそらく```defaults```コマンドは公に推奨されているものではないので、ご利用は計画的に。
AppleScriptは......正直ちゃんと勉強する気もしないですね......。
## 参考リンク
https://memo.yammer.jp/posts/macos-defaults

https://amasuda.xyz/post/2016-10-23-mastering-mac-defaults-command/