古くからのMacユーザだったら、デスクトップにゴミ箱があって、不必要になったファイルはこのゴミ箱にドラッグ&ドロップすると、ゴミ箱が膨れ、ゴミ箱を空にすると、元のスリムなゴミ箱になるというパフォーマンスを知っているかと思う。


ゴミ箱ではなくTrashとなっていたかも。
いつのOSバージョンからか、わからないけれど、ゴミ箱はデスクトップではなくDockの端っこに置かれるようになった。

デスクトップにゴミ箱を作ろうとしたわけだ。プログラムを作るのはもう何年もやってないからChatGPTに助けてもらったわけだ。AIはAIが理解できるように、誤解されないような依頼をしないと、あーでもない、こーでもないと、結局時間がかかる。そんで最初の提案はAutomatorで作るということだったのだが無理だということになりApple Script で作成することになったのだ。
ChatGPTの方針は、全く同じスクリプトの異なったアイコンを持つアプリを用意し、ファイルがゴミ箱に入った、空にした、という動作の度にアプリを入れ替えるというものです。アプリの位置が同じだからゴミ箱が満杯になった/からになったかのように見えるというものです。
4つ.app を作る。ゴミ箱.app,ゴミ箱_空.app、ゴミ箱_満杯.app、ゴミ箱更新.app である。以下では.app を省いている。
1️⃣まず、ゴミ箱、 ゴミ箱_空、ゴミ箱_満杯 というアプリを全部同じ中身で作成する。
① アプリケーション → ユーティリティ からスクリプトエディタ を起動する
② ファイル → 新規 で空のウインドウを開き
on run
tell application "Finder"
activate
end tell
delay 0.2
try
tell application "Finder"
empty the trash
end tell
on error errMsg number errNum
if errNum is -128 then return
end try
repeat 10 times
delay 0.5
try
tell application "Finder"
if (count of items in trash) is 0 then exit repeat
end tell
end try
end repeat
delay 0.5
my runUpdater()
end run
on open droppedItems
repeat with anItem in droppedItems
set targetPath to POSIX path of anItem
set escapedPath to my escapeForAppleScript(targetPath)
set innerScript to "tell application \"Finder\" to delete POSIX file \"" & escapedPath & "\""
do shell script "/usr/bin/osascript -e " & quoted form of innerScript
end repeat
delay 0.4
my runUpdater()
end open
on escapeForAppleScript(t)
set AppleScript's text item delimiters to "\\"
set parts to text items of t
set AppleScript's text item delimiters to "\\\\"
set t to parts as text
set AppleScript's text item delimiters to "\""
set parts to text items of t
set AppleScript's text item delimiters to "\\\""
set t to parts as text
set AppleScript's text item delimiters to ""
return t
end escapeForAppleScript
on runUpdater()
set updaterPath to POSIX path of ((path to home folder as text) & "Applications:ゴミ箱関連:ゴミ箱更新.app")
do shell script "/usr/bin/open " & quoted form of updaterPath
end runUpdater
をコピペし 保存 ファイルフォーマット をアプリケーションに、名前を ゴミ箱 としてデスクトップに保存する。
自分のホームディレクトリに Applications というフォルダを作成し その中に ゴミ箱関連 というフォルダを作成する。~/Application/ゴミ箱関連 です。
③ スクリプトエディタで ファイル → 新規 で空のウインドウを開き 上記と全く同じプログラムをコピペし、 保存 ファイルフォーマット をアプリケーションに、名前を ゴミ箱_空 にして ~/Application/ゴミ箱関連に保存する。_ は半角英語である。
④同様にスクリプトエディタで ファイル → 新規 で空のウインドウを開き 上記と全く同じプログラムをコピペし、 保存 ファイルフォーマット をアプリケーションに、名前を ゴミ箱_満杯 にして ~/Application/ゴミ箱関連に保存する。
⑤同様にスクリプトエディタで ファイル → 新規 で空のウインドウを開き
set helperPath to POSIX path of ((path to home folder as text) & "Applications:ゴミ箱関連:")
set desktopAlias to path to desktop folder
set visibleApp to POSIX path of (desktopAlias) & "ゴミ箱.app"
set emptyApp to POSIX file (helperPath & "ゴミ箱_空.app") as alias
set fullApp to POSIX file (helperPath & "ゴミ箱_満杯.app") as alias
set trashIsEmpty to true
tell application "Finder"
try
if (count of items in trash) > 0 then
set trashIsEmpty to false
end if
end try
end tell
do shell script "/bin/rm -rf " & quoted form of visibleApp
tell application "Finder"
if trashIsEmpty then
set newItem to duplicate emptyApp to desktopAlias
else
set newItem to duplicate fullApp to desktopAlias
end if
set name of newItem to "ゴミ箱.app"
end tell
をコピペし、 保存 ファイルフォーマット をアプリケーションに、名前を ゴミ箱更新 にして ~/Application/ゴミ箱関連に保存する。

である。これでプログラム作成はおしまい。
2️⃣3つのプログラムにアイコンを設定する。このままだと、各ファイルはApple Scriptのプログラムのアイコンなのでこれを変える。
①アイコンを用意する。ネットで 「Mac ごみ箱」とかで検索してごみ箱のアイコンを探す。ごみ箱が空のときのアイコンとゴミが入っているときのアイコンである。アイコン同士に関連がある必要はないから好きなものを選ぶ。空と満杯の絵がペアになっているのはあまりない。


これは初期のMacOSで使っていたごみ箱を再現したものだ。ゴミが入っているゴミ箱がなかなかみつからないから作成した。


というのもある。ペアで揃っている必要はない。
ダウンロードして、もしアイコンの背景があるとまずいので、背景を取り除く必要がある。ダウンロードした図はpngがいいようなのでjpegとかだったらpngに変換する必要がある(確認していない)。ダウンロードしたゴミ箱の背景が白と灰色の市松模様だったらプレビューで開いて

右上の背景を取り除くアイコンをクリックすると背景がなくなる。
アイコンの絵をプレビューで開いて コマンド+A で全部を選択し、コマンド+C でコピーし、ゴミ箱.appを右クリックして 「情報を見る」 を開き、左上の小さなアイコンをクリックして青く選択して コマンド+V でペーストする。本来のアイコンの大きさより大きい図を貼り付けるのがいいようだ。Macのほうで適当な大きさにしてくれる。

~/Applications/ゴミ箱関連にある ゴミ箱_空のアイコンも同じく空のアイコンの絵を貼り付ける。ゴミ箱_満杯には満杯の絵を同様に貼り付ける。
ゴミ箱更新は見せないのでAppleScriptのアプリケーションのアイコンのままでいい。

このようなのができているはず。
これで、取り合えずおしまい。Finderを再起動する必要があるかもしれない。最初に起動したときは何やら動かしていいかとか言うのを聞いてくるから OK とすればいい、2回目からは聞いてこない。
Finder の 設定 一般 で「ゴミ箱を空にする前に警告を表示」にチェックが入ってないと、警告なしにすてられてしまう。デフォルトでチェックが入っているはず。
捨てるファイルをデスクトップのゴミ箱にドラッグ&ドロップすると、ゴミ箱が膨れる(満杯のアイコン)になり、ゴミ箱をダブルクリックすると、普通の確認プロンプトがでてきて捨てることができ、捨てると ゴミ箱は元の空ゴミ箱に変わる。このゴミ箱が変わるのはDockにあるゴミ箱も同じように変化する。
デスクトップのゴミ箱を右クリックして ゴミ箱を空にする というメニューは出ない。
まだうまく行ってないのは;
①Dockのゴミ箱からゴミ箱を空にすると、このデスクトップのゴミ箱のアイコンは満杯のまま変わらない。新たにゴミファイルを入れて、デスクトップのゴミ箱をダブルクリックして空にすると、アイコンは空ゴミ箱にもどる。
②ファイルのほうからゴミ箱に入れるとしてもデスクトップのアイコンは空のアイコンから満杯のアイコンに変わらない。代わってないけどダブルクリックしてゴミ箱の中身を捨てることはできる。
③外付けHDDとかUSBメモリをデスクトップのゴミ箱にいれると、昔は取り出すことができたのだか、このゴミ箱はできない。Dockの方はメデイアを選んだ時点でアイコンが取り出しアイコンに代わって、ドラッグ&ドロップで取り出すことができる。
④空のゴミ箱をダブルクリックしてゴミ箱を空にするという操作ができる。Dockのゴミ箱では空の場合空にするという選択肢は選択できない。
⑤このプログラムはアイコンが違うアプリが入替るということなので、アプリがデスクトップの同じ位置で入れ替わる保証がない。アイコンの大きさがずれると、MacOS標準の新しいオブジェクトの位置にできてしまう。右上が優先位置でそこに既に何かがあるとその下の次の位置、ここにもなにかあるとさらに次の下の位置….となるから、アイコンの置ける場所が空いていると操作するたびに位置が変わってしまう。右下にゴミ箱を起きたかったら、順番が右上から真下の方になっているから、デスクトップアイコンの右の縦の行はすべて何かで埋まっている必要がある。そうすると操作の度にアイコンが動くことはなくなる。デスクトップを整頓して、ゴミ箱の位置を右端の縦の行の一番下に置く必要がある。整頓されたときアイコンがあるべき位置を空白にしてはいけない。
上のモノクロ1bitのゴミ箱はアイコンの位置に依存しないが、カラーのゴミ箱の方は位置が右下でその上に空白がないとしないと位置が動く。理由はわからない。
⑥アイコンが変化するのが遅れていてギクシャクしている。これはプログラムのdelay の値を小さくする(単位:秒)といいのだが、どこまで小さくできるのかテストしていない。
というわけで、まだまだ完璧に再現できてないのですが、一応機能しています。
ChatGPTとやり取りしてプログラムを作ると、何回も完成だ、あと一歩だといってくるのだが、バグのあるスクリプトで、ここまで進むのは大変だった。スクリプトを読めないのにやるのだから無理があるね。
その昔、このゴミ箱が膨れて、ゴミを捨てるとスリムに復活するという動作が面白くて、子供にMacを使わせたら、必要なアプリやファイルが捨てられてしまったと嘆いたお父さんがいた。