⌘Cを2回できないのが嫌で、macOSのクリップボードを3つにしました - DualClip
(github.com/RAKKUNN)こんにちは! 今回初めてmacOSを使いながら作ったミニプロジェクト、DualClipを公開してみます。
こういう文章を書くのが初めてなので、少し緊張しています。拙いところがあっても温かく見てもらえるとうれしいです 🙇
これは何かというと
ただの小さなメニューバーアプリなのですが、クリップボードの「スロット」を3つ使えます。
Slot A → 標準のクリップボードそのまま (⌘C / ⌘V)
Slot B → ⌥⌘C / ⌥⌘V
Slot C → ⌃⌘C / ⌃⌘V
PasteやMaccyのような「履歴」方式ではなく、「スロット」方式です。
よく使うメール文面や変数名のようなものをBに固定しておいて、普段のコピー&ペーストは⌘C/⌘Vをそのまま使う、という感覚です。
なぜ作ったのかというと
リファクタリングや翻訳作業をしていると、⌘Cをもう1回押しただけで前にコピーしておいたものがそのまま消えてしまいますよね。
それが一日積み重なると、地味にストレスでした。
履歴アプリも使ってみたのですが、自分にはこんな不満がありました。
- ポップアップを開いて選ぶ、そのひと手間が遅い
- 「さっきのではなく、その前のもの」を探すには結局目で見ないといけない
- 自分としては、⌥⌘Vを押したらすぐそれが貼り付いてほしかった
なので機能をあれこれ足すよりも、「スロットに固定してショートカットで取り出す」という一行のコンセプトだけを残しました。
作りながらいちばん面白かった部分 (Atomic Paste)
これは思ったより厄介だったのですが、macOSでは⌘Vは必ずsystem pasteboardだけを読みます。
そのためSlot Bを貼り付けるにはsystem clipboardを一瞬だけ上書きする必要があるのですが、そうすると元の⌘Cしておいた内容が消えてしまうんです。
これをどう解決するか、かなり悩みました。
最終的に、こういう順序で動くようにしました。
- 現在のsystem clipboardをいったんバックアップ(全タイプをディープコピー)
- Slot Bの内容で上書き
- CGEventで⌘Vをシミュレーション
- 150ms後にバックアップしておいた元の内容へ復元
このサイクルが150ms以内にすべて終わるので、使う側は「⌘Cしておいたものが一瞬消えた」と感じること自体がありません。
一人で「Atomic Paste」と呼んでいます…(名前を付けて一人で満足していました 😅)。
ポーリングを一時停止してchangeCountを無視させるタイミング合わせの部分に本当に時間がかかりました。
「なぜSlot AがSlot Bの内容に変わるんだ…?」と、しばらく迷走しました。
そのほか細かい点:
- テキスト / 画像 / ファイル / RTF をすべてサポート (NSPasteboardItemのディープコピー)
- パスワードフィールドではまったく動作しません (IsSecureEventInputEnabled チェック)
- 終了時にスロットのメモリを zero-fill (
memset_s) - ショートカットはすべて変更できます (sindresorhus/KeyboardShortcuts のおかげで)
プライバシーについては
クリップボードアプリが扱うのは機微なデータなので、ここだけは気を使いました。
- ディスクには何も書きません。すべてRAM上だけです。
- ネットワークコードがそもそもありません。更新チェックやテレメトリもなし。
- MITオープンソースなので、直接中身を確認してもらえます。
試してみるなら
Homebrewが便利だと思います。
brew install RAKKUNN/tap/dualclip
あるいはGitHub Releasesからzipをダウンロードして、/Applicationsに入れても大丈夫です。
Appleのnotarization済みビルドなので、初回起動時に警告ダイアログは出ません。
GitHub: https://github.com/RAKKUNN/DualClip
要件: macOS 13+ (Apple Silicon)、アクセシビリティ権限
初めて作ったmacOSアプリなので、きっと拙い部分も多いと思います。
「これはこうしたほうがいい」「ここでエラーが起きる」といったフィードバックをいただけたら、本当にありがたく学ばせてもらいます。
気軽にコメントしてください!
皆さん、良い一日を!!
4件のコメント
Windows用のクリップボード管理プログラムであるDittoも、実装されたものと似たように動作します。
参考にしてみると、改善の方向性を決めるのに良いのではないかと思います〜
情報ありがとうございます!🙇🙇
一度確認して、必要な部分だけ取り入れることを検討してみます!
Clipy のように保存機能も作るとよさそうです
履歴とスニペットのどちらにニーズがありますか?
ただし、履歴はDualClipの方向性とは合いません。
できるだけ軽く、手軽に使えるように作ることを目指しています。
フィードバックありがとうございます。