Help us understand the problem. What is going on with this article?

Photoshopカラー設定内容をメニューバーに表示させる(Mac)

SS 2020-05-11 13.20.57.png

追記200512:ACEConfigCache2.lst経由だと、カスタムを拾えないことが分かりました…あーあ。
osascriptで問い合わせるしかないか。というわけで途中書き替えました。od/tr/perlregexのあたりが無駄に😨
でも、カラー設定を触ってOKするとACEConfigCache2.lstも書き換えが発生するようで、イベントを拾う手段としてはまだ使えます。と言うわけで、イベント取得のあたりはそのままにして、PhotoshopColorWatch_Extract.commandでAppleScript使うだけの変更で済みました。

カラー設定は常に確認しておきたい

Photoshopのカラー設定はアプリケーションデフォルトとして動作します。ドキュメントのプロファイル無し警告や作業用と違う警告表示がオンになっていればカラー設定がどうあれ正しく開けますが、顧客の要望や仕事内容に応じてカラー設定を切り替えるとスムーズに作業できます。
と言うわけで私は結構頻繁にカラー設定を切り替えるため、Photoshopを開いたらCmd+Shift+Kして、今どんなカラー設定プリセットになっているのか毎回確認していました。
ただこれ、面倒くさいっちゃめんどくさい。なんかどこかで常時表示させて確認したい。
JavaScriptもShellScriptもはじっこ囓ってるだけなので、迷走しつつなんとか形にした経緯と結果を紹介します。

いつ、取得するか?

JSXでapp.ColorSettingsをPhotoshopに投げれば、ローカライズ前のプリセット名が得られます。KeyboardMaestroなどから、AppleScript(osascript)で問い合わせればいい…んですが、ただ定期的にJSXを投げ続けるのもPhotoshop操作に支障があるし(PSはね、JSX実行速度がうんこなのです)、できればなんらかのイベントを拾って、その時だけやるようにしたい。
これはPhotoshopのスクリプトイベントマネージャーやKeyboard Maestroでウインドウを拾うなど考えましたが、迂遠な気がして・難しくて止めました。

ACEConfigCache2.lst

カラー設定は、Bridgeから同期させたりできます。Bridge側では、各アプリケーションのカラー設定がどうなっているのか見えている、ということですよね。ということは、どこかに同期用のファイルがあるはず。
それが「ACEConfigCache2.lst」でした。Macでは、~/Library/Preferences/Adobe/Colorの中にあります。
file.png
Cache2とあるので1とかあんのかも?ファイル名は環境依存かもしれません。

このファイルは、Bridgeからカラー設定同期させたときや、Photoshop等でカラー設定を変更したときに随時、書き替えられています。つまり、このファイルに変更があったことを検知できれば、その時だけ処理すればいいので負荷も少なくて済みます。

fswatch

で、このファイルが変更されたことを検出するため、brewでfswatchを導入しました。
brew install fswatch
名前の通り変更があるか監視するツールです。監視対象に何か起きたときだけ、コマンドを実行します。

どのシェルで実行する?

勉強中というのもおこがましいほど知らないのでアレですが、
fswatchは常時起動して監視するものですので、これをKeyboard Maestroのexec shellでやってしまうと、マクロが終了したらシェルも終了してしまいます(のはず)。また実行中はPhotoshopのキーボードショートカットが効かないなどの症状があり、よろしくありません。
さてどうするか、daemonとしてMac側で起動してやればいいのでは?と思いつき、Launchdで実行させることにしました。

Lingon3導入

サービスとして実行させる場合、plistを書いて読み込ませる必要があります。plistを間違い無く書くためにLingon3を導入し、新規サービスを作ります。
SS 2020-05-12 13.25.45.png
全部オフで可。commandの所に、シェルスクリプトのファイルを後であてがいましょう。
~/Library/LaunchAgents内になんとかかんとか、plistができています。このファイル名メモっておきます。

シェルスクリプトを書く

処理を試すたびにplist書き替えたりするのが面倒くさそうだったんで、テキストの処理部分は別ファイルにしておき、まずはfswatchを起動させるスクリプトを書きます。

PhotoshopColorWatch.command
#!/bin/sh
/usr/local/bin/fswatch  -o -l 2 /Users/(ほむ)/Library/Preferences/Adobe/Color/ACEConfigCache2.lst | xargs -I{} /Users/(ほむ)/Documents/PhotoshopColorWatch_Extract.command

fswatchで件のACEConfigCache2.lstを監視させます。書き替え時にはしょっちゅうイベント発生するため、-lと-oで余裕持たせます。発動するとパイプ以降が実行されますが、ここは処理をいろいろ試したかったので別ファイルに飛ばします。
chmod +xして実行権限付けときましょう。ちなみに拡張子.commandにしとくとターミナルで開きます。

ACEConfig……のバイナリからテキストを取り出す

このファイルバイナリで、かつカラー設定のあるアプリの設定が全て入ってます。
stringで取り出せればいいんですが、マルチバイト文字は化ける…
Mac版のodダンプだと日本語も正常に表示されるのを発見し、これでなんとかすることにしました。
まずod -A -n -c -vでダンプします。
SS 2020-05-11 22.58.47.png
日本語も出てますね。欲しいのは、Photoshop2020のカラー設定「2011知覚変換」というプリセット名称です。プリセットはcsfファイルがそのまま拡張子含め記載されていて、この後は必ず0033になります。

これを、trで整形します。スペースとバックスラッシュ、アスタリスク、改行を除去。
tr -d ' \\*\n'
SS 2020-05-11 22.59.23.png
読めるテキストになってきました。
これから、正規表現でPhotoshop2020以降にあるプリセット名を取り出します。今回はperlを使いました。macのBSDなsedでやろうとすると訳分かんなくなって💦
perl -pe 's|.*?Photoshop2020.+?([^/]+?)\.csf0033.*|$1|g'
SS 2020-05-11 23.00.50.png
これでプリセット名のみ取り出せました。パイプで繋げてテキストファイルに起こしましょう。

PhotoshopColorWatch_Extract.command
#!/bin/bash
export LANG=ja_JP.UTF-8
# func
ColOD() {
od -A n -c -v /Users/yamo74/Library/Preferences/Adobe/Color/ACEConfigCache2.lst | tr -d ' \\*\n' | perl -pe 's|.*?Photoshop2020.+?([^/]*?)\.csf0033.*|$1|g'
}
a=(`ColOD`)

echo $a > /Users/yamo74/Library/Logs/PSColorSetting.txt

200512追記:上のようにして共有ファイル解釈で拾おうとすると、カラー設定がカスタムになっているときに正しく拾えないことが分かりました。残念。なので、AppleScriptで問い合わせます。しょうがない……

PhotoshopColorWatch_Extract.command
#!/bin/bash
export LANG=ja_JP.UTF-8
a=`osascript -e 'tell application "Adobe Photoshop 2020" to color settings'`
echo $a > /Users/yamo74/Library/Logs/PSColorSetting.txt

Photoshop起動中だけ動作させる

先のplistはロードしてスタートさせないと動作しません。
Keyboard MaestroのトリガーにPhotoshopのlaunchとquitを設定し、それぞれに
起動時
launchctl load PSColorSettings.plist
launchctl start PSColorSettings

終了時
launchctl stop PSColorSettings
を当てます。
起動時マクロには、pgrepを入れてfswatchが起動しているかどうかのチェックもさせておきます。
pgrep -f fswatch
戻り値がPIDなら起動中、nullなら起動していません。
修了時マクロにはpkillを入れて、fswatchを終了させます。
pkill fswatch

メニューバーに表示させる

GeekToolでメニューバー上に最前面表示させるか、メニューバー以外にならGeektoolで先のシェルスクリプトで書き出したtxtをcatしとけばいいと思います。
今回はメニューバー項目として表示したかったので、Bitbar.appを使いました。
bitbar
これに、またシェルスクリプトのファイルをあてがいます。

PhotoshopColorWatch.3s.sh
#!/bin/sh
export LANG=ja_JP.UTF-8
a=`cat /Users/(ほむ)/Library/Logs/PSColorSetting.txt`
b=`pgrep -f fswatch`
if [ "$b" = "" ] ; then
c="#"
else
c=""
fi
echo $c$a 

ここで何してるかと言うと、Photoshop起動時、つまりfswatch起動時は常に情報更新されているため現在のプリセット名が出ていますが、Photoshop終了時=fswatch終了時にはこの情報は怪しいかもしれません。
特に、Bridgeでカラー設定を同期したときには、Photoshopを起動するまでPSには設定は反映されません。問題無いっちゃないんですが、気持ち悪いので一応その旨「#」を付けて表示したいと思いました。
pgrepでfswatchが起動してるか確かめて、起動中は無し、そうでないときは#を付けてメニューバーにechoします。

複雑!

ですが、Photoshopには一切触らず処理できました。jsxを一定間隔で飛ばすとか怖すぎる。
結局osascriptで問い合わせてますが、最小限に抑えてるしいいかな……
全てにおいて初心者なので、とりあえず動いたからいいや状態です。これを元に勉強いたしやす。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした