【iPhone】ショートカットでクリップボードマネージャーを作る [作業ログ]
とりあえず実験がてら色々やってみて、作業過程を適当にまとめておこうという記事です。やったことをそのまま書いているので、あんまり綺麗じゃないです。
0. やりたい(やる)ことの整理
クリップボードの内容をショートカットAppを使ってファイルに書き込み&読み込みすることで、インタラクティブに制御することを目指します。
簡単に言うと、ショートカットAppを使ってクリップボードに履歴機能みたいなもんをつけて遊びたいわけです。ただそれだけ。
基本的な処理の流れは以下のような感じかな?
共有メニューから呼び出した時の処理
(1) 選択された内容をコピーするかどうかを聞く。コピーする場合は(2)、そうでないなら(4)
(2) 現在のクリップボードの内容を選択された内容にする
(3) 現在のファイル数がファイル数の上限より下ならば、選択された内容を書き込んだ新規ファイルを普通に作成。「現在のファイル数 == ファイル数の上限」 ならば、作成日時がもっとも古いファイルを消した後、選択された内容を書き込んだ新規ファイルを作成する
(4) 存在するファイルを全て読み、内容をリスト表示させて選択させる。プロンプトは「クリップボードに読み込みたいものを選択」とかかな
(5) 選択した項目のタイムスタンプを更新して、クリップボードに読み込む
普通に実行した時の処理
(1) 現在のクリップボードの内容表示
(2) 共有メニューから呼び出した時の処理 の(4)〜
まあとりあえずこんなもん?書き込みと読み込みのショートカットは分けて作れば楽かな
1. フォルダ構成
専用のフォルダを用意して、選択された内容が書き込まれたファイルを保存していきます。(ファイル名は書き込まれた内容のSHA1ハッシュ値にする)
ファイル数の上限とファイルを保存していくフォルダ名はどこかで適当に決めておく。
まあこんな感じになるのかな?拡張子は省略
cbmgr/
├ 0a4d55a8d778e5022fab701977c5d840bbc486d0
├ 634befb62a51845154a338cd16ce281e4c12d341
├ da39a3ee5e6b4b0d3255bfef95601890afd80709
├ 46e7f607e7208a6021b99a638e4280c1dc86548e
├ f9b64a2cfb8cdad9264642127b2fb0ff8083d2f5
├ ...
2. 準備
とりあえずフォルダを作る。ファイルAppで cbmgr フォルダを作るだけ。
あと、ショートカットApp側でも作業用にフォルダを作っておく。名前は ClipboardManager とかでいいかな。そのまんま。
3. ファイルに書き込んでみる
とりあえず書き込み用のショートカットを作ります。最初はシンプルに。共有シートから実行させるための設定も済ませておきます。
CBMWriter
これでとりあえず、共有シートから実行して、選択された内容をファイルにガシガシ書き込んでいけるようになりました。ファイル名はSHA1ハッシュなので、例えば2連続で同じ内容に対して呼び出したりしてもファイルが2つできるということはないと言え、単に作成日時が更新される(実際には上書き)というような動きにできました。
実行結果の例
4. ファイルを読み込んでみる
書き込みができたら、読み込み処理を作っていきます。とりあえずファイルを取ってきて、そのリストから選択して、表示するだけって感じのシンプルなやつ。
CBMReader
これでとりあえず、先程ファイルに書き込んだ内容を以下のようにして読み込めるようになりました。
ただ、リスト選択する時にファイル名(ハッシュ値)だと何が書かれているのかよくわからないと思うので、以下のようにして内容を表示してそこから選べるようにします。
※ 【(作成日)】(繰り返し項目) の部分の(繰り返し項目)は、種類を「テキスト」に設定しておきます。
これで、以下のようにして作成日&その内容を表示させ、そこから選択できるようになりました。
ただ、保存されたテキストの文字数が多い場合、これだと使いにくい気もします。なので、正規表現を使って少し絞ります。
正規表現(コピペ用)
(^[\s\S]{0,30})([\s\S]*$)
※ 「テキストを置き換え」アクションの(繰り返し項目)の種類を「テキスト」にするのを忘れずに
これで、以下のようなスッキリとした表示になりました。
5. ファイル数を制限する
このままだと制限なくファイルが増え続けてしまうので、ファイル数に上限を設けます。以下のようにすればいいかな。
(1) 現在のファイル数を調べる
(2) 「現在のファイル数 < 上限」なら普通にファイルを新規作成、そうでないなら作成日時が一番古いファイルを削除してからファイル新規作成
とりあえず、上限を5にして作ってみます。「現在のファイル数 >= 5」の時にファイルを削除する処理を入れればいい気がするのでそのようにします。
6. 履歴表示を作成日順にする
新しいファイルの内容から並んでいた方がいいと思うので、作成日の新しい順にソートしたものを「繰り返し」アクションに渡すようにします。
7. アクション化(?)する
書き込みと読み込みのショートカットをそのまま実行するのではなく、「ショートカットを実行」アクションを使って実行させるようにします。
その際、フォルダ名などの情報をショートカット内に直書きしてしまうと整合性が取りづらくなるため、それらの情報は辞書を使ってショートカットの入力として与えることにします。
とりあえず以下のように変更。
CBMWriter
CBMReader
8. 組み合わせる
新たに "ClipboardManager" というショートカットを作って、そこから "CBMWriter" と "CBMReader" を呼び出すようにします。
また、記事冒頭に述べた処理の流れも組み込んでいきます。とりあえず以下のようになった。
ClipboardManager
スクショではhashが sha1 になってるが、それは間違い(認識されないのでMD5になる)なので、SHA1になおす。
9. 組み合わせた時に起きた不具合を修正する
とりあえず思うままに結合したが、色々間違ってたので直します。修正点は以下。
CBMWriter
現在のファイル数をチェック&削除してから、ファイルを新規作成しているので、「現在のファイル数 == 上限」の時に ClipboardManager を普通に実行&選択してクリップボードに取り込むと一番古いファイルが消えてしまう。なので、ファイルを新規作成してからファイル数チェック&削除処理を実行するようにする。新たな条件式は「現在のファイル数 > 上限」なら最終変更日が一番古いモノを削除するようにしておく
また、ファイルを新規作成するときは、「最終変更日」をキチンと変更させるために、一旦普通に保存した後、保存したファイルを再度クリップボードに読み込み直し、それをまた保存するようにする。そうしないと写真Appなどから取り込んだ時に上手く動かない。
そして、ファイルを新規作成する処理(2回行われる)が終わったら、「待機」アクションで1秒待機する処理を入れておく。こうしないとファイル数の制限がうまく働かない時があった。(多分、ちゃんと書き込まれるまで待つ必要があるとかそんなん)
CBMReader
「作成日」ではなく、「最終変更日」でソートするようにする。また、【(作成日)】(繰り返し項目) の部分を【(最終変更日)】(繰り返し項目) に変更しておく。
ClipboardManager は何もいじらなくておk。ここまでくると、以下のようにいい感じに動くようになる。
(1) 普通に実行すると、現在のクリップボードの内容を表示した後で今までの履歴から選択してクリップボードの値を更新できる
(2) 最後に取り込んだもの or 最後に保存したものがリストの先頭にくるようになる
10. 履歴を自動的に削除したい場合
クリップボードなんてものは基本的には一時的な値の保管庫。
であれば、それを管理するショートカットも、いつまでもファイルを保管しておくなんて仕様になってるのはいかがなもんかと思う。
なので、時刻をトリガーとしたオートメーションを作って、ファイルを自動的に消すとかしておくとかしておけば、履歴が勝手に消えるから便利かもしれない。
11. クイックルックでいい感じに表示する
「名前を設定」アクションを使うと、「クイックルック」アクションがなんだかいい感じになるので、以下にサンプルレシピと、実行結果を載せておきます。
a nice quickLook
実行結果
12. まとめ
今回の記事では、ショートカットAppを使ってクリップボードマネージャーを作ってみる過程を作業ログとしてまとめました。
まだ色々不安定な感じはしますが、基本的な処理の部分は作れたのかなあ、と思います。
あとは見た目をもうちょい整えたり、正規表現で絞る時に「...」を付ける必要がないときは付けないようにしたり、はじめて起動した時にフォルダを自動生成するようにしたり...とかそんな感じでいじっていけばもっといい感じになるかなあ。
では今回はこの辺で。
この記事が気に入ったらサポートをしてみませんか?