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 というエラーを吐くことを付記しておく。



© 神和電子 2017-2023