MacOSでクリップボード上の画像を保存するスクリプト
作成日:
定期的にEmacsのOrg Modeを触りたくなるもので、このたびは【emacs】org-roam を使ってみた | 林檎コンピュータという記事を読んでorg-roamを試していた。
org-roamの雰囲気が理解できてきたところで、画像を簡単に貼り付ける方法があるのか気になってきた。似たような仕組みのメモツールも様々ある中で、画像を貼るのが面倒だと大きな欠点になるからだ。調べてみると専用のツールも存在していたが導入を考えるのが面倒で、それをするくらいなら単なるスクリプトで「クリップボードの画像をorg-roamのディレクトリに保存。その画像ファイルへのリンクをつくるOrg形式のテキストをクリップボードにコピー」すれば十分かなと思った。OS依存の強い操作でもあるので。
で、その方法を調べると、どうもApple Scriptというのが必要らしい(pbpaste
コマンドではテキストのみしか扱えないため)。
macos - How to save PNG clipboard contents to file on Mac - Stack Overflowに紹介されているのが以下のスクリプトである(一部改変)。
set png_data to the clipboard as «class PNGf»
set the_file to open for access POSIX path of (POSIX file "/tmp/image.png") with write permission
write png_data to the_file
close access the_file
めちゃくちゃ気持ち悪い見た目をしているが、これを「スクリプトエディタ」に貼り付け、画像をクリップボードに入れた状態で実行すると、確かに/tmp/image.png
にその画像が吐き出される。
というわけで、今回は次のようなスクリプトを書いた。
#!/bin/bash
# クリップボードの内容をPNGファイルで保存するスクリプト
set -eu
dir=$HOME/org/roam
name=$(date "+%Y%m%d%H%M%S").png
osascript <<EOF
set png_data to the clipboard as «class PNGf»
set the_file to open for access POSIX path of (POSIX file "$dir/$name") with write permission
write png_data to the_file
close access the_file
EOF
echo "[[file:$name]]" | tee >(pbcopy)
本当は全体をApple Scriptで書いてもいいのだが、謎言語を調べるモチベーションがないのでヒアドキュメントでお茶を濁す。なおクリップボードに画像がないときに実行すると、 error "いくつかのデータを期待されるタイプに変換できません。" number -1700 to item
というエラーを吐くことを付記しておく。