macOS Tahoeのクリップボードのしくみ:ペーストボード、履歴、プライバシーを解説
結論から: macOSのクリップボードは、「ペーストボード」と呼ばれるシステム共通のサービスです。コピーすると、コピー元のアプリが同じ内容の表現(プレーンテキスト、リッチテキスト、画像、ファイル参照など)を複数まとめてシステムに渡し、変更カウンタが1つ増えます。ペースト時には、貼り付け先のアプリが理解できる形式のうち、最も情報量の多いものを選びます。Tahoeでもこの基本モデルは変わりません。そのうえでSpotlightにクリップボード履歴が追加され、バックグラウンドでクリップボードを読み取るアプリに対するプライバシー保護も引き続き強化されています。
⌘Cは1日に何十回も押しますよね。そのうちの1回を、押してから貼り付けるまで追いかけてみましょう。「ペーストしたらフォントがおかしい」「画像がファイルとして貼られた」「パスワードが履歴アプリに残っていた」といったクリップボードまわりの不可解な挙動は、ほぼすべてこの流れのどこかのステップが原因だからです。
macOSのクリップボードとは?
クリップボードの実体は汎用ペーストボード(general pasteboard)です。アプリがNSPasteboard APIを通じてアクセスする、システム共有のサービスにあたります。ファイルでも、目に見えるアプリでもありません。保持できるのは現在の「アイテムセット」1つだけで、もう一度コピーすると上書きされます。pbcopyやpbpasteといったターミナルコマンドにpbが付いているのは、この「pasteboard」が由来です。
以降の話の前提として、次の2点を押さえておいてください。
- 保持できるのは常に1つだけ。 Windowsの⊞Vのような複数アイテムの履歴を、macOSは汎用ペーストボードのネイティブ機能として持ったことがありません。履歴はこれまで、外側から追加するものでした。Tahoeで加わったSpotlightの機能は、Appleによる初のシステムレベルの履歴機能です(後述)。
- 1回のコピーは、実は複数のコピー。 ⌘Cを1回押すだけで、同じ内容の複数の表現が一度にペーストボードへ置かれることがあります。
⌘Cを押すと何が起こる?
- アプリがペーストボードの所有権を取る。 古い内容をクリアし、これから提供するデータの種類を宣言します。このとき、ペーストボードの変更カウント(change count、整数値)が1つ増えます。
- アプリが複数のタイプを提示する。 それぞれのタイプは、ファイル形式の識別にも使われているUniform Type Identifier(UTI)で表されます。
- データは遅延提供されることがある。 アプリは「この形式で渡せます」と約束だけしておき、実際にペーストされた時点で初めて中身のバイト列を生成できます。大きな画像やスプレッドシートのセル範囲をコピーしても、貼り付けるまで負荷が小さいのはこのためです。
アプリによってペースト結果が違うのはなぜ?
選ぶのは貼り付け先だからです。たとえばSafariで装飾付きの段落をコピーすると、ペーストボードには複数のバージョンが同時に入っていることがあります。
| 表現 | 代表的なタイプ識別子 | 主に選ぶ側 |
|---|---|---|
| プレーンテキスト | public.utf8-plain-text |
ターミナル、コードエディタ、検索フィールド |
| リッチテキスト | public.rtf |
テキストエディット、Pages、メール |
| HTML | public.html |
Webエディタ、メモ、リッチテキストフィールド |
| 画像 | public.png / public.tiff |
プレビュー、Keynote、デザインツール |
| ファイル参照 | public.file-url |
Finder、メールの添付、チャットアプリ |
コードエディタはプレーンテキストを採用してHTMLを無視するので、装飾が消えます。一方、メモアプリはHTMLを採用するので、装飾が残ります。どちらもバグではなく仕様どおりの動きです。⌥⇧⌘V(ペーストしてスタイルを合わせる)が用意されているのも同じ理由で、貼り付け先にプレーンテキスト表現を優先させ、その場の書式を適用してもらうための操作です。
ターミナルで実際に確かめてみる
鵜呑みにする必要はありません。何かをコピーしてから、次のコマンドを実行してみてください。
osascript -e 'clipboard info'
いまクリップボードに載っている各タイプと、そのバイト数が一覧で表示されます。Numbersでセル範囲をコピーした場合と、Webページの段落をコピーした場合とで、出力を見比べてみましょう。その違いこそが、アプリごとにペースト結果が変わる理由のすべてです。テキストとして中身を見たいときはpbpaste、書き込みたいときはecho "hello" | pbcopyが使えます。
クリップボードの変更はどうやって検知される?
実は、基本的には誰にも通知されません。公開されているAPIを見る限り、NSPasteboardには「クリップボードが変わった」ことを知らせる通知がありません。そのため、クリップボードの内容に関心のあるアプリ、つまりすべてのクリップボードマネージャは、短い間隔で変更カウントをポーリングし、数値が動いたときだけ中身を読みにいきます。整数1つを読むだけなので、コストはほぼゼロです。
この仕組みには、実用上の注意点がいくつかあります。
- 履歴アプリは、自分が起動していない間にコピーされたものを知ることができません。
- ポーリング間隔より短い間に2回コピーすると、1回目を取りこぼすことがあります。Maccyではポーリング間隔を設定で調整できます 。
- アプリが同じ内容を書き直した場合も変更カウントは増えます。履歴ツール側に重複排除の仕組みが必要なのはこのためです。
Tahoeで何が変わった?
Spotlightのクリップボード履歴
このテーマでTahoeの目玉となるのは、Spotlightにクリップボードビューが加わったことです。Spotlightを開いて切り替えると(新しいSpotlightのカテゴリ用ショートカットでは、クリップボードは⌘4に割り当てられているようです )、最近のコピーを一覧して、選んだものを貼り付け直せます。Appleの説明では、この履歴は短期間のもので、さかのぼれるのは約8時間とされています 。
つまりSpotlightは、「1時間前にコピーしたアレ」を拾うための安全網としては十分使えます。ただし、公開されている設計を見る限り、長期保存のアーカイブではありません。1週間前のスニペットは残らず、ピン留めのお気に入りもなく、専用ツールにあるようなアプリ単位の除外ルールも持たないようです 。
クリップボード読み取りに対するプライバシー強化
Appleは、アプリによるプログラム的なクリップボードの読み取りを、ユーザーから見えるようにする方向へ進めています。その下地として、開発者向けに新しいペーストボードのアクセス動作を制御するAPIが提供されました。方向性としては、ユーザーのペースト操作を介さずにアプリがクリップボードを読んだ場合に、iOSのような確認プロンプトを出すというものです。ただし、Tahoeで一般的なサードパーティ製アプリに対してどこまで厳密に適用されるのか、ユーザーにはどんな設定が表示されるのかといった詳細は、Tahoe搭載機で確認してから頼るのが安全です 。クリップボードマネージャは、バックグラウンドでクリップボードを読み取ることが本業なので、この変更の影響を受けます。Tahoeでの権限まわりは、各アプリのドキュメントを確認してください。
MacとiPhoneの間でクリップボードは同期される?
はい、ユニバーサルクリップボードで同期されます。 Continuityの機能の1つで、両方のデバイスで同じApple Accountにサインインし、Handoffをオンにし、BluetoothとWi-Fiを有効にして、デバイスを近くに置いておけば使えます。片方でコピーして、もう片方でペーストするだけです。転送された内容を貼り付けられるのは短い時間に限られるため、同期された履歴というより「受け渡し」に近い動作です。また1アイテムのみで、新しくコピーするたびに前のものは置き換わります。
動かなくなったときの原因は、たいていHandoffがオフ、Bluetoothが無効、デバイス間でApple Accountが違う、のいずれかです。Handoffを一度オフにしてからオンに戻すのが、定番の最初の対処法です。
何がプライベートで、何がそうでない?
クリップボードは、読み取りを許可されたアプリならどれでも読めます。コピーごとの暗号化もありません。そこでコミュニティは、ある慣習を作りました。機密データをコピーするアプリが、特別なペーストボードタイプを付けてマークするというものです。仕様はnspasteboard.orgにまとまっていて、たとえばorg.nspasteboard.ConcealedType(パスワード)やorg.nspasteboard.TransientType(短時間だけ有効な内容)があります。パスワードマネージャの多くはこれらを設定し、行儀のよいクリップボードマネージャは、これらが付いたデータを記録しません。
Maccyもこの慣習に従っています。設定の「無視(Ignore)」から、無視するペーストボードタイプの一覧を確認・編集できるほか、特定のアプリを丸ごと無視することもできます 。ただし、正直にお伝えしておくべき注意点が2つあります。1つは、このマークはあくまで慣習であり強制力はないため、マークを付けないアプリのデータは無防備になること。もう1つは、コピーした内容は、上書きされるまでクリップボードの読み取りを許可されたすべてのアプリから見えることです。
標準のクリップボード vs. クリップボードマネージャ
| 標準のクリップボード(ペーストボード) | Spotlight履歴(Tahoe) | 専用マネージャ(例:Maccy) | |
|---|---|---|---|
| 保持するアイテム数 | 1つ | 直近のみ、目安は数時間 | 履歴の件数を設定可能 |
| 検索 | なし | Spotlight経由 | あり(入力して絞り込み) |
| 機密アプリ/タイプの除外 | 該当なし | あり | |
| ディスクへの保存 | なし | Mac内にローカル保存 | |
| 費用 | OSに含まれる | OSに含まれる | Maccy:無料・オープンソース |
たまに直近のコピーを取り戻したいだけなら、Spotlightの履歴で十分かもしれません。毎日同じスニペット群から貼り付ける人や、機密アプリの除外・長めの履歴が欲しい人には、Maccy Appのような専用マネージャが役に立ちます。Maccy Macはメニューバーに常駐し、既定では⇧⌘Cで開き、キーボード中心の絞り込みを軸に作られています 。どちらを選んでも、ここまで説明してきた内容はそのまま当てはまります。どのツールも、同じペーストボードの上に載っているからです。
トラブルシューティング:クリップボードの調子がおかしいとき
- ペーストしても何も起きない、または古い内容が貼られる。 プレーンテキストのフィールドで適当な文字をコピーして状態をリセットし、もう一度試します。直らなければ、貼り付け先のアプリを再起動してください。
- 書式がついてまわる。 「ペーストしてスタイルを合わせる」(⌥⇧⌘V)を使います。
- ファイルをコピーしたのにパスが貼られた(またはその逆)。 アプリが、期待したものとは別の表現を選んでいます。
osascript -e 'clipboard info'でクリップボードの中身を確認しましょう。 - ユニバーサルクリップボードが不安定。 同じApple Accountか、Handoffがオンか、BluetoothとWi-Fiがオンかを確認します。
- 最後の手段。 ログアウトして入り直すか、Macを再起動します。ペーストボードサービスはシステムが管理しており、セッションとともに再起動されます。
覚えておきたいメンタルモデル
コピーは「複数の形式の束」を公開してカウンタを進める操作で、ペーストは貼り付け先のアプリがその束から選ぶ操作です。履歴も、同期も、プライバシーも、すべてこのシンプルな土台の上に作られています。clipboard infoで束の中身が見えるようになれば、クリップボードの謎の大半は謎ではなくなります。
ペーストまわりで一番イライラするのは、書式が消えること、履歴が消えること、それとも別のことでしょうか?教えていただければ、次の記事のテーマになるかもしれません。