Mac のデスクトップにゴミ箱がない

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

ゴミ箱ではなくTrashとなっていたかも。

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

デスクトップにゴミ箱を作ろうとしたわけだ。プログラムを作るのはもう何年もやってないからChatGPTに助けてもらったわけだ。AIはAIが理解できるように、誤解されないような依頼をしないと、あーでもない、こーでもないと、結局時間がかかる。そんで最初の提案はAutomatorで作るということだったのだが無理だということになりApple Script で作成することになったのだ。

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/ゴミ箱関連にある ゴミ箱_空のアイコンも同じく空のアイコンを貼り付ける。ゴミ箱_満杯には満杯のアイコンを同様に貼り付ける。

このようなのができているはず。

これで、取り合えすおしまい。

捨てるファイルをデスクトップのゴミ箱にドラッグ&ドロップすると、ゴミ箱が膨れる(満杯のアイコン)になり、ゴミ箱をダブルクリックすると、普通の確認プロンプトがでてきて捨てることができ、捨てると ゴミ箱は元の空ゴミ箱に変わる。このゴミ箱が変わるのはDockにあるゴミ箱も同じように変化する。

デスクトップのゴミ箱を右クリックして ゴミ箱を空にする というメニューは出ない。

まだうまく行ってないのは
①Dockのゴミ箱からゴミ箱を空にすると、このデスクトップのゴミ箱のアイコンは満杯のまま変わらない。新たにゴミファイルを入れて、満杯のアイコンに変え、デスクトップのゴミ箱をダブルクリックして空にすると、アイコンは空ゴミ箱にもどる。
②ファイルのほうからゴミ箱に入れるとしてもデスクトップのアイコンは空のアイコンから満杯のアイコンに変わらない。代わってないけどダブルクリックしてゴミ箱の中身を捨てることはできる。
②外付けHDDとかUSBメモリをデスクトップのゴミ箱にいれると、昔は取り出すことができたのだか、このゴミ箱はできない。Dockの方はメデイアを選んだ時点でアイコンが取り出しアイコンに代わって取り出すことができる。

というわけで、まだまだ再現できてないのですが、一応機能しています。
ChatGPTとやり取りしてプログラムを作ると、何回も完成だ、あと一歩だといってくるのだが、バグのあるスクリプトで、ここまで進むのは大変だった。スクリプトを読めないのにやるのだから無理があるね。