📋

macOSでWindows Win+V風のクリップボード履歴機能を自作する

に公開

はじめに

こんにちは。つい最近になってclaude codeのhookとコマンドからのUI通知の組み合わせが盛り上がっていることで初めてosascriptを知ったyossuliです。
hookとosascriptをゴニョゴニョといじっていい感じにできないかと試行錯誤していたところふと思い立ちました。

「osascript、結構リッチなUI作れるくね?」

WindowsのWin+Vによるクリップボード履歴機能は非常に便利ですが、macOSには標準で同等の機能がありません。僕は普段Windowsを使っているため、macにこの機能がないことにかなり不便を感じていました。一方であまりサードパーティのアプリを常駐させたくないなと。
そこで、この記事ではShortcutsアプリとシェルスクリプト+osascriptだけを使って、macOSでクリップボード履歴管理システムを自作する方法を解説します。サードパーティのアプリは不要で、常駐して動かすことなく、macOS標準機能だけで実現できます。

完成する機能

  • 右クリックメニューからコピーを保存: テキスト選択後、右クリックメニューの「Clipboard History Save」や任意のキーでショートカットを実行して履歴に追加(最大30件)
  • キーボードショートカットで履歴表示: 任意のキーでショートカットを実行して履歴をUIで選択

動作イメージ

必要な環境

  • macOS(Sequoia以外でも動作する可能性あり)
  • Shortcuts.app(macOS標準アプリ)
  • Homebrew(jqインストール用)

アーキテクチャ

┌──────────────────┐
│ 自作ショートカット1 │
└────────┬─────────┘


┌───────────────────┐
│ clipboard-save.sh │  ← クリップボード内容をJSONL形式で保存
│  ~/.local/bin/    │
└───────────────────┘


┌────────────────────┐
│~/.clipboard_history│  ← JSONL形式(最大30件)
└────────────────────┘

┌──────────────────┐
│ 自作ショートカット2 │
└────────┬─────────┘


┌──────────────────┐
│clipboard-pick.sh │  ← choose from listで履歴選択UI
│  ~/.local/bin/   │  ← 選択内容をクリップボードに復元
└────────┬─────────┘


┌──────────────────┐
│     cmd + v      │
└──────────────────┘

セットアップ手順

1. 必要なツールのインストール

# Homebrewがない場合はインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# jqのインストール(JSONパース用)
brew install jq

2. ディレクトリ作成

mkdir -p ~/.local/bin

3. クリップボード保存スクリプト作成

~/.local/bin/clipboard-save.sh を作成:

https://gist.github.com/yossuli/e15115e4b98f8f471340c3570ac95343#file-clipboard-save-minimal-sh

実行権限を付与:

chmod +x ~/.local/bin/clipboard-save.sh

4. クリップボード選択スクリプト作成

~/.local/bin/clipboard-pick.sh を作成:

https://gist.github.com/yossuli/e15115e4b98f8f471340c3570ac95343#file-clipboard-pick-minimal-sh

実行権限を付与:

chmod +x ~/.local/bin/clipboard-pick.sh

5. Shortcutsアプリの設定

Shortcuts.appで2つのショートカットを作成します。

ショートカット1: コピー(履歴にも保存)

  1. Shortcuts.appを開く
  2. 「+」で新規ショートカット作成
  3. 名前を好きな名前に変更
  4. クイックアクションからテキストの入力を受け取るに変更
  5. アクション1を追加: 「クリップボードにコピー」
    • 入力: 「ショートカットの入力」(選択テキストをクリップボードにコピー)
    • (5.5. 少し待機したほうがいいかもしれない)
  6. アクション2を追加: 「シェルスクリプトを実行」
    • スクリプト: ~/.local/bin/clipboard-save.sh
    • 入力: なし(pbpasteで読み取る)
  7. 右上の「i」アイコン → 「サービスメニューに表示」をオン → 「入力を受け取る」: テキスト
  8. キーボードショートカット設定:
    • 設定→キーボード→ショートカット→アプリのショートカットからこのショートカットの名前を正確に入力して追加

ショートカット2: 履歴から選択

  1. 新規ショートカット作成
  2. 名前を好きな名前に変更
  3. アクション追加:
    • 「シェルスクリプトを実行」
    • スクリプト: ~/.local/bin/clipboard-pick.sh
  4. キーボードショートカット設定:
    • 設定→キーボード→ショートカット→アプリのショートカットからこのショートカットの名前を正確に入力して追加

使い方

基本操作

  1. コピー: テキストを選択 → 右クリック → 「Clipboard History Save」を選択 or 任意のキーでショートカットを実行 → 履歴に保存
  2. 履歴呼び出し: 設定したキーボードショートカットを押す
  3. 選択: 履歴呼び出しUIで履歴を選択(セキュリティから許可している場合はここでペーストされます)
  4. ペースト: (セキュリティで制限されている場合)Cmd+Vでペースト

拡張機能

https://gist.github.com/yossuli/56ac2f2c056b72450859f23d47b1ce57
https://gist.github.com/yossuli/b27b64ebdac4507948240ee09d1e4bcd

履歴の削除や複数選択削除、全クリア機能、実行時の通知などを追加したい場合はこちらのスクリプトを参考にしてください。

また、karabiner-elementsを使うとよりUXよく使うことができます。

{
    "description": "New Rule (change left_shift+caps_lock to page_down, right_shift+caps_lock to left_command+mission_control)",
    "manipulators": [
        {
            "from": {
                "key_code": "c",
                "modifiers": { "mandatory": ["command"] }
            },
            "to": [
                {
                    "key_code": "c",
                    "modifiers": ["command"]
                },
                {
                    "hold_down_milliseconds": 100,
                    "shell_command": "/Users/yoshiteru.589/.local/bin/clipboard-save.sh"
                }
            ],
            "type": "basic"
        }
    ]
}

のように設定することで、デフォルトのCmd+Cでの履歴保存が可能です。

データフォーマット

履歴は ~/.clipboard_history にJSONL(JSON Lines)形式で保存されます:

{"timestamp":"2026-02-10T14:11:23+0900","content":"copied text here"}
{"timestamp":"2026-02-10T14:12:45+0900","content":"another text"}
  • 最大30件まで自動的に保持
  • 古いエントリは自動削除
  • タイムスタンプはJST(日本標準時)
    • 別のタイムゾーンに変更したい場合: TZ=America/New_York など、環境に応じて変更可能

トラブルシューティング

日本語が文字化けする

LANGLC_ALL の設定を確認してください。環境に応じて適宜変更する必要があるかもしれません。

export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

実行してもエラーになる

  1. ~/.local/bin/clipboard-save.sh が実行可能か確認: ls -l ~/.local/bin/clipboard-save.sh
  2. 手動実行してエラーが出ないか確認: ~/.local/bin/clipboard-save.sh
  3. ターミナルでテスト: echo "test" | pbcopy && ~/.local/bin/clipboard-save.sh
  4. 設定→プライバシーとセキュリティ→アクセシビリティ→ペーストを実行したいアプリを追加

ロックファイルが残ってしまう

60秒以上経過した古いロックは自動削除されますが、手動で削除する場合:

rmdir ~/.clipboard_history.lock

制限事項

自動ペーストについて

macOS Sequoiaのセキュリティ制限により、自動ペーストを実現するためにはペースト先のアプリをアクセシビリティに追加する必要があります。(回避手段あるかも...?)

対応データ形式

このスクリプトではプレーンテキストのみ対応しています。画像やファイルパスなどは保存されません。

まとめ

macOS標準のShortcutsアプリとシェルスクリプトだけで、Windows Win+V風のクリップボード履歴機能を実現できました。サードパーティの常駐アプリが不要で、カスタマイズ性も高いのが特徴です。

WindowsのWin+Vに比べるとできることは少ないですが、このくらいの機能だったら自作したいですよね?

今回はかなり雑な実装になっていてあまり起動速度も早くないのでより良いスクリプトが合ったら教えてください!

## 宣伝?

僕はAIエージェントとの協業を効率化するということに取り組んでおり、特にトークン効率よく使うということに興味があり色々検証しています。
もし興味がありましたら以前の記事もご覧ください。

Discussion