メニューバーにPhotoshopカラー設定表示② （AppleScript、Keyboard Maestro不使用）

:::note
アプリ化しています。バイナリをテキスト化してから解析するのではなく、直接バイナリを触るようにしています。
[最新記事はこちら](https://qiita.com/yamo74/items/18f01dbb8db22ba3cfb5)
:::


:::note info
この内容は、[前回の記事](https://qiita.com/yamo74/items/69ca8d3ba892b61f5613)の改良版です。
:::

# Photoshopカラー設定内容をメニューバーに表示させる
Photoshopカラー設定は「間違えると絶対色が変わってしまう」ようなものでは実はなくて、プロファイルの扱いを分かっていて、適切に設定されていれば、開くとき・保存時のクリック数が少し減ってラクだよ、くらいの意味しかありません。それでも今の状態をすぐに把握できると便利なので、メニューバーに表示させます。

## ACEConfigCache2.lstというファイル
Photoshop/InDesign/Illustratorのカラー設定は、Bridgeで同期させられます。ということは、どこかに同期・共有用のファイルがあるはず。それがユーザライブラリ以下にあるこのファイルです。
`~/Library/Preferences/Adobe/Color/ACEConfigCache2.lst`
バイナリなので、読めるようにします。`od`して`tr`で整形。
```shell:
od -A n -c -v /Users/yamo/Library/Preferences/Adobe/Color/ACEConfigCache2.lst | tr -d ' \\*\n'
```
結果こういうものが得られます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/22e77707-0903-ab0f-eb62-4dcc3421829d.png)


:::note info
ここには、Illustrator、Photoshop、Illustratorバックグラウンド（AIRobin）のカラー設定内容が書かれています。ファイルを消してから各アプリを起動（＆Photoshop以外はカラー設定開いて設定）すると分かりますが、記載順はアプリの起動順です。例えばPhotoshopしか起動したことがなければ、内容にはPhotoshopのカラー設定しか記載されません。また、***Photoshop2023/2021/2019と複数バージョンを起動するとその分増えていきます。***
:::

[前回](https://qiita.com/yamo74/items/69ca8d3ba892b61f5613)は、この中にカラー設定プリセット名称が含まれていることは分かったのですが、プリセットから外れた`Custom`の状態だと名称はそのまま残るため正しく取得できず、結局AppleScriptでPhotoshopに問い合わせていました。
が、***カスタム（プリセットから外れた状態）のとき変わるところがあるのを発見しました。***
![1のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/76687962-e2d4-0c4f-7b14-042a9ed07a26.png)
赤枠部`10`が`Custom`の印で、プリセット名称を持っているならここは`00`になります。続いてアプリケーションパスがあるので、ここでは正規表現を使い00/10を調べます。10なら文字列`Custom`を出力、00ならアプリケーション（バージョン）名と`.csf0033`に挟まれたプリセット名称を取得します。

:::note alert
`csf0033`ではなく、`cfs`で止めた方がいいみたいです。`csf0034`と数値が変わっていました。
:::


```shell:PSColor2Menubar.sh（旧ver）
#!/bin/bash
export LANG=ja_JP.UTF-8
ColorSettings=/Users/yamo/.PSColorSettings_out.txt
lstdump=`od -A n -c -v /Users/yamo/Library/Preferences/Adobe/Color/ACEConfigCache2.lst | tr -d ' \\\*\n'`
customcheck=`echo $lstdump | perl -pe 's/.+(..).\/Applications\/AdobePhotoshop2023.+/$1/'`
if [ $customcheck = "10" ]; then
echo "⚠️カスタム" > $ColorSettings
else
echo $lstdump | perl -pe 's/.+?Photoshop2023\.app.+?([^\/]+?)\.csf.+/$1/' > $ColorSettings
fi
```

:::note info
デフォルトプリセット名、例えば一般用-ナントカ、はローカライズされた名前で、AppleScriptやこのファイルに記載されているのはローカライズ前の名称です。
当然自分で作ったプリセット名称はそのままです。
:::
これで設定ファイルからプリセット名（＆カスタム状態）を取得できました。ファイルはホーム直下に見えない状態で保存しておきます。

### ローカライズ名を出したい
勝手ローカライズファイルを用意します。
```csvs:colorTranslation.txt
JapanWebInternet,Web・インターネット用 - 日本
JapanPrepress,プリプレス用 - 日本２
MonitorColor,モニタのカラー設定に合わせる
JapanGeneralPurpose,一般用 - 日本２
JapanMagazine,日本 - 雑誌広告用
JapanNewspaper,日本 - 新聞用
EuropeWebInternet2,Web・インターネット用 - ヨーロッパ２
NorthAmericaWebInternet,Web・インターネット用 - 北米
EuropePrepress3,プリプレス用 - ヨーロッパ３
NorthAmericaPrepress,プリプレス用 - 北米２
EuropeGeneralPurpose3,一般用 - ヨーロッパ３
NorthAmericaGeneralPurpose,一般用 - 北米２
JapanGeneralPurpose3,一般用 - 日本３
NorthAmericaNewspaper,新聞用 - 北米
```
メニューバーに表示させるのですから、自分で短く表記しちゃってください。
解析スクリプトは次のように書き換えます。

```shell:PSColor2Menubar.sh
#!/bin/bash
export LANG=ja_JP.UTF-8

#書き出し先とローカライズファイル（カンマ区切りテキスト）
ColorSettings=/Users/yamo/.PSColorSettings_out.txt
ColorTranslation=/Users/yamo/UTL/colorTranslation.txt

#読み出すPhotoshopバージョン（Photoshopに続くもの）
photoshop=2023

#ACE…lstをテキスト化
lstdump=$(od -A n -c -v /Users/yamo/Library/Preferences/Adobe/Color/ACEConfigCache2.lst | tr -d ' \\\*\n')

#Photoshop2023のカラー設定がカスタム（プリセット名を持っていない）かチェックする箇所を取り出し
customcheck=$(echo $lstdump | perl -pse 's/.+(..).\/Applications\/AdobePhotoshop.?$PS.+/$1/' -- -PS=$photoshop)

#もしチェック箇所が10ならカスタム、00ならプリセット名あり
if [ ${customcheck} = "10" ]; then
	CSOut="⚠️カスタム"
else

#プリセット名を取り出す
	CSOut=$(echo ${lstdump} | perl -pse 's/.+?Photoshop.?$PS\.app.+?([^\/]+?)\.csf.+/$1/' -- -PS=$photoshop)

#プリセット名に対応するローカライズされた名前があるか調べる
	CSOutTrans=$(echo ${CSOut} | xargs -n 1 -I{} awk -F "," '$1 == mycolor {print $2}' mycolor={} ${ColorTranslation})

#ある（Transが空でない）場合は出力用変数を入れ替える
	if [ "${CSOutTrans}" != "" ]; then
	CSOut=$CSOutTrans
	fi
fi

#テキストファイルに出力する
#うまく取得できていない場合はエラーを返す。※PsBETAを起動した場合勝手に上書きするためエラーになる

if [ ${#CSOut} -gt 20 ];then
echo "‼️Error" > $ColorSettings
else
echo $CSOut > $ColorSettings
fi
```
リスト中と同じ名前があった場合、awkでローカライズ名を取り出しています。
ですのでもし全く同じ、例えば`MonitorColor`という名前だと日本語に置き換わってしまいます。

:::note info
最初からあるローカライズされるプリセット類は、設定ファイルのパスに`/Recommended/`がついているので、それで処理を分けてもいいでしょう
:::



## fswatchで監視させる
`brew install fswatch`してインストールしておきます。
`fswatch -o -l 6 [監視ファイル.lst] | xargs -n 1 [↑で書いたPsColor2Menubar.shのパス]`
すると、変更がある度にPsColor2Menubar.shを実行します。ただ、Photoshopをアクティブにするだけでファイルの書き換えが行われ、カラー設定のプルダウンを変えただけでも書き換えられているため、あまりに頻度が高いとコマンド類がいろいろ詰まってよくありません。意味無いし…なので、`-o`オプションで、`-l 6`秒ごとの出力数をまとめてしまいます。6秒なのはテキトウです。ある程度ぱっと変わって欲しいし。

## Lingon Xで設定する
[Lingon X](https://www.peterborgapps.com/lingon/)は有料ですが、面倒くさいplist書くより買った方がいいです。

これでOSに起動時、fswatchを実行させます。
新規作成して、
![スクリーンショット 2023-01-11 22.30.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/9e4d84c3-0e32-2ac9-2a8b-7851fefc97e8.png)

シェルコマンドを入力します。
![スクリーンショット 2023-01-11 22.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/50a9a647-1180-2f18-2d37-8abe6ab84bc7.png)
最初は直接以下のコマンドを書いていたのですが、「複雑過ぎるみたいだけどスクリプトファイルに書き出したほうがいいかもよ」と警告してくれるのでその通りにすれば、shファイルを自動で書いてリンクしてくれます。
```
/opt/homebrew/bin/fswatch -o -l 6 /Users/yamo/Library/Preferences/Adobe/Color/ACEConfigCache2.lst | xargs -n 1 /Users/yamo/UTL/PSColor2Menubar.sh
```
はい、これで、起動したらfswatchが6秒ごとにファイルをチェックし、変更があった場合`ACEConfigCache2.lst`ファイルを解析してプリセットから外れている＝＞カスタム、そうでなければプリセット名を書いたファイルを書き出すことができました。

あとは、このファイルをxbarでメニューバーに表示させます。

## xbarでメニューバーに表示させる。
`brew install xbar`しときましょう。
xbarのプラグインフォルダーに、このファイルを入れるとそのまま表示します。ただ、先のファイルをcatするだけ。実行間隔はファイル名に書き込みます。
```shell:PsColorSettings.5s.sh
#!/bin/bash
cat /Users/yamo/.PSColorSettings_out.txt
```
# 以上！
結局Photoshopに`tell application id "com.adobe.phtoshop" to color settings`する必要がなくなりました。前回Keyboard MaestroはPhotoshop起動数（複数起動）を調べて、PhotoshopがなくなればLaunchctlでオフにしていたんですが、それも面倒くさいからやめましょう。どうせPhotoshop常に起動してるしうちは……🐸