Macアプリ、PopClipのエクステンションを作ったので、簡単な方法メモ…のつもりだったのだけどなんかマニュアルの和訳っぽくなってしまった。
目次
執筆時の環境
- macOS Sierra 10.12.6
 - PopClip 1.5.7
 
エクステンションファイルの構成
フォルダもしくはzipファイルを1つのエクステンションファイルとして扱う。
フォルダの場合は拡張子を .popclipext zipファイルの場合は .popclipextz とすることでPopClipのエクステンションと認識されるようになる。
フォルダの中にはConfig.plistが必須で、Config.plistファイルにエクステンションの設定や処理を記入する。詳細内容は後述。
また、アイコンとして画像ファイルを含めることが出来る。
アイコンファイルは256px*256px以上のPNGファイルで、表示部分が黒、背景は透過にすることが推奨されている。
また、シェルスクリプトやApple Scriptを実行するエクステンションにはそれらの実行ファイルも含める必要がある。
Config.plist
Config.plistにはApple Property Listのフォーマットに従ってエクステンションの設定を記載する。(サンプルファイル)
構造
Config.plistは以下の項目を持つ
| Key | 型 | 必須か | 説明 | Extension Identifier | String | 必須 | このエクステンションを示す一意の文字列。com.pilotmoon.を使ってはいけない。例: com.example.myextension | 
|---|---|---|---|
| Extension Name | String or Dictionary | 必須 | 設定画面に表示されるエクステンションの名前。 | 
| Extension Image File | String | 任意 | アイコンファイルのファイル名。エクステンションのパッケージ内に含める必要がある。 | 
| Blocked Apps | Array | 任意 | ここで指定されたアプリケーション内ではアクションが表示されない。アプリケーションのバンドル識別子の文字列の配列が入る。(例: com.apple.TextEdit) | 
| Required Apps | Array | 任意 | この要素が存在する場合、ここで指定されたアプリケーション内でのみアクションが表示される。アプリケーションのバンドル識別子の文字列の配列が入る。(例: com.apple.TextEdit) 注: この要素はアプリがMac内に存在しているかは確認しない。アプリの存在を確認するにはApps要素を使用する。 | 
| Regular Expression | String | 任意 | アクションが表示される条件を正規表現で指定する。 注: URLやeメールアドレスに正規表現を使用する必要はない。かわりにRequirements要素のhttpurl, httpurls, emailを使用するべきである。 | 
| Requirements | Array | 任意 | Requirementsキーの配列。アクションが表示される条件を指定する。[デフォルト: copy] | 
| Stay Visible | Boolean | 任意 | YESの場合、アクションがクリックされてもPopClipの画面が表示されたままになる。[デフォルト: NO] | 
| Preserve Image Color | Boolean | 任意 | YESの場合、白のかわりにオリジナルの色でアイコンが表示される。[デフォルト: NO] | 
| Pass HTML | Boolean | 任意 | YESの場合、PopClipはHTMLテキストが選択されていれば、それをPOPCLIP_HTML (シェルスクリプト)、{popclip html} (Apple Script)に渡します。NOにしておくとHTMLの処理が不要になるため動作が軽くなります。[デフォルト: NO] | 
| Long Running | Boolean | 任意 | Apple Script及びシェルスクリプトにのみ適用。YESにすると、このアクションは処理に時間がかかるものとしてPopClipに認識される。処理に0.1秒以上かかった場合、待機中スピナーを表示する。 | 
| Restore Pasteboard | Boolean | 任意 | paste-afterかpreview-resultを使用した場合にのみ適用。YESにすると、結果を貼り付けた後にクリップボードを元のテキストに復元する。[デフォルト: NO] | 
| Extension Description | String or Dictionary | 任意 | 短いエクステンションの説明文。 | 
| Extension Long Name | String or Dictionary | 任意 | 長いエクステンションのタイトル。アプリ内には表示されないが、ウェブサイト上に表示される。 | 
| Credits | Array | 任意 | 作者の情報を記した辞書の配列。辞書の詳細はCredits辞書を参照。 | 
| Apps | Array | 任意 | アクションが動作するための必須アプリを定義された辞書の配列。辞書の詳細はApps Dictionaryを参照。 | 
| Required OS Version | String | 任意 | アクションが動作可能なmacOSの最低バージョンを指定。(例: 10.8.2) | 
| Required Software Version | Number | 任意 | アクションが動作可能なPopClipの最低バンドルバージョンを指定。(例: 701はPopClip 1.4.5を示す。) | 
| Actions | Array | 必須 | アクションの処理を指定する辞書の配列。Action辞書を参照。 | 
| Options | Array | 任意 | エクステンションの設定項目を指定する辞書の配列。Option辞書を参照 | 
| Options Title | String or Dictionary | 任意 | 設定画面に表示されるタイトル。[デフォルト: Options for this extension.] | 
Action辞書
Service Name、AppleScript File、Shell Script File、URLをどれか1つだけ設定してメインアクションを指定する。
| Key | 型 | 必須か | 説明 | 
|---|---|---|---|
| Title | String or Dictionary | 必須 | アクションの名前。アイコンがない場合はボタンになる。アイコンが指定されている場合アイコンの上にマウスを置くと表示される。 | 
| Image File | String | 任意 | ボタンのアイコンファイルのファイル名。エクステンションのパッケージ内に含める必要がある。 | 
| Service Name | String | Serviceアクションに必須 | 呼び出すサービスの名前を正確に入力する。(例: Make Sticky) | 
| AppleScript File | String | AppleScriptアクションに必須 | 実行するAppleScriptファイルのファイル名。エクステンションのパッケージ内に含める必要がある。スクリプトファイルはプレーンテキストで(.scptではなく.applescript)、UTF-8でエンコードする。スクリプトでは、”{popclip text}”が選択されたテキストで置き換えられる。 それ以外の項目はScript変数を参照。AppleScriptの例はExample AppleScript Fileも参照。 | 
| Shell Script File | String | シェルスクリプトアクションに必須 | 実行するシェルスクリプトのファイル名。エクステンションのパッケージ内に含める必要がある。/bin/shにパラメータとして渡される。スクリプト内では環境変数 $POPCLIP_TEXT で選択されたテキストにアクセスできる。他の変数はScript変数を参照。カレントディレクトリはエクステンションディレクトリに設定される。シェルスクリプトの例はExample Shell Script Fileも参照。 | 
| Script Interpreter | String | 任意 | シェルスクリプトに使用されるインタプリタを指定。(例: /usr/bin/ruby) [デフォルト: /bin/sh] | 
| URL | String | URLアクションに必須 | 実行された際に開くURLを指定。{popclip text}が選択されたテキストで置き換えられる。&は&とエンコードする必要がある。(例: http://translate.google.com/#auto%7Cauto%7C{popclip text} ) | 
| Key Combo | Dictionary | Keypressアクションに必須 | 実行された際に押すキーを指定します。注: キーはシステムレベルではなく、アクティブなアプリケーションレベルで行われるため、アプリの切り替えのようなグローバルキーボードショートカットは起動できません。辞書の中身はKey Code format参照 | 
| Before | String | 任意 | メインアクションが実行される前に実行される処理を指定します。Before、Afterキーを参照。 | 
| After | String | 任意 | メインアクションが実行された後に実行される処理を指定します。Before、Afterキーを参照。 | 
| Blocked Apps | Array | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Required Apps | Array | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Regular Expression | String | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Requirements | Array | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Stay Visible | Boolean | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Preserve Image Color | Boolean | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Pass HTML | Boolean | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Restore Pasteboard | Boolean | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
| Long Running | Boolean | 任意 | 上記参照。エクステンションヘッダで指定された値を上書きします。 | 
Requirementsキー
アクションが表示される条件を指定する。
| キー | 説明 | 
|---|---|
| copy | 選択されたテキストがコピー可能な場合。デフォルト。 | 
| cut | 選択されたテキストがカット可能な場合。 | 
| paste | 選択された場所にペースト可能な場合。 | 
| formatting | 選択されたテキストのフォーマットを変更できる場合。 | 
| httpurl | 選択されたテキストに1つのHTTP(S)のURLが含まれている場合。 | 
| httpurls | 選択されたテキストに1つ以上のHTTP(S)のURLが含まれている場合。 | 
| 選択されたテキストに1つのeメールアドレスが含まれている場合。 | |
| path | 選択されたテキストがローカルファイルのパスの場合。 | 
| html | HTMLのテキストが選択されている場合。 | 
| option-*=# | The option named `*` must be equal to the string `#`. For example `option-fish=1` would require an option named `fish` to be set on. This mechanism allows actions to be enabled and disabled via options. | 
Before、Afterキー
メインアクションの前や後に実行される処理を指定する。
| キー | 説明 | 
|---|---|
| cut | ⌘Xがおされた時のように、システムのカットを行う。 | 
| copy | ⌘Cがおされた時のように、システムのコピーを行う。 | 
| paste | ⌘Vがおされた時のように、システムのペーストを行う。 | 
| paste-plain | クリップボードの中身をプレーンテキストにしてペーストする。 | 
| popclip-appear | PopClipを再び呼び出す。(Select Allエクステンションで使われている) | 
| copy-selection | 最初に選択されたテキストをプレーンテキストとしてコピーする。(Swapエクステンションで使われている) | 
| copy-result | スクリプトが返したテキストをクリップボードに格納(コピー)する。スクリプトが失敗した場合×を表示。 | 
| paste-result | スクリプトが返したテキストをクリップボードに格納(コピー)し、ペーストが可能な場合そのテキストをペーストする。スクリプトが失敗した場合×を表示。 | 
| preview-result | スクリプトが返したテキストをクリップボードに格納(コピー)し、そのテキストを表示します(100文字以上は省略されます)。結果をクリックすることでそのテキストをペーストすることも出来ます。スクリプトが失敗した場合×を表示。 | 
| show-result | スクリプトが返したテキストを表示。スクリプトが失敗した場合×を表示。 | 
| show-status | スクリプトが進行状況を目盛りで表示。スクリプトが失敗した場合×を表示。 | 
Option辞書
インストール時などに設定可能な設定項目を指定する。
| Key | 型 | 必須か | 説明 | 
|---|---|---|---|
| Option Identifier | String | 必須 | オプションを一意に区別する名前。全てアルファベットの小文字である必要がある。スクリプトからオプションを参照するときの名前。Script変数参照 | 
| Option Type | String | 必須 | 以下の項目から1つ選んで入力。 `string` (ユーザーが自由に入力するテキストボックス)、`boolean` (チェックボックス) or `multiple` (複数の選択肢から選択するボックス). | 
| Option Label | String or Dictionary | 必須 | 画面に表示される設定項目名。 | 
| Option Default Value | String | 任意 | デフォルトで入力や選択される項目を指定。 | 
| Option Values | Array | multiple Typeで必須 | ボックス内に表示される選択肢を指定した配列。 | 
Script変数
AppleScript、URLで置き換えられる文字列と、シェルスクリプト内で使用できる変数
| シェルスクリプト変数 | AppleScript/URLプレースホルダー | 説明 | 
|---|---|---|
| POPCLIP_TEXT | {popclip text} | 選択されたテキスト。 | 
| POPCLIP_URLENCODED_TEXT | {popclip urlencoded text} | 選択されたテキストがURLエンコードされたもの | 
| POPCLIP_URLS | {popclip urls} | 行で分けられた選択されたURLのリスト。 | 
| POPCLIP_URL_TITLES | {popclip url titles} | 行で分けられた選択されたURLのページタイトルリスト。タイトルがない場合は空行。 | 
| POPCLIP_HTML | {popclip html} | HTMLが選択されている場合、選択されているHTMLのHTMLコード。Pass HTMLがYESになっている必要がある。 | 
| POPCLIP_MODIFIER_FLAGS | {popclip modifier flags} | アクションのボタンが押された際に押されているキーのコード。Key Code format参照 | 
| POPCLIP_BUNDLE_IDENTIFIER | {popclip bundle identifier} | テキストが選択されたアプリケーションのバンドル識別子。(例: com.apple.Safari) | 
| POPCLIP_APP_NAME | {popclip app name} | テキストが選択されたアプリケーションの名前。(例: Safari) | 
| POPCLIP_BROWSER_TITLE | {popclip browser title} | テキストが選択されたウェブページのタイトル。(SafariとChromeでのみ動作。) | 
| POPCLIP_SPECIAL_BROWSER_TITLE | {popclip special browser title} | ウェブページのタイトル。ブラウザ上のアドレスバーでURLを選択した場合のみ使用可能。(SafariとChromeでのみ動作。) | 
| POPCLIP_BROWSER_URL | {popclip browser url} | テキストが選択されたウェブページのURL。(SafariとChromeでのみ動作。) | 
| POPCLIP_DECIMAL_SEPARATOR | N/A | macOSのシステムロケールで指定された小数点区切り文字。(例: .) | 
| POPCLIP_GROUPING_SEPARATOR | N/A | macOSのシステムロケールで指定された桁区切り文字。(例: ,) | 
| POPCLIP_OPTION_*` *(all UPPERCASE)* | {popclip option *}` *(all lowercase)* | One such value is generated for each option specified in `Options`, where `*` represents the `Option Identifier`. For boolean options, the value with be a string, either `0` or `1`. | 
Credits辞書
作者の情報。
| Key | 型 | 必須か | 説明 | 
|---|---|---|---|
| Name | String | 必須 | 作者の名前。 | 
| Link | String | 任意 | 作者のウェブサイトへのリンク。 | 
まとめ
Config.plistをXCodeとかで作るだけでウェブページ開く程度のエクステンションならものすごく簡単に作れてしまうし、Bashに限らずPHPとかSwiftとかのプログラムもシェルスクリプトとして読み込んでエクステンションを作れるのでものすごく簡単に開発できる。正直このページの執筆のほうがエクステンションの開発より時間かかった…。