スクリプトフックは、特定のイベント発生時にスクリプトを起動する機能です。CotEditorは次に挙げるイベントでのフックをサポートしています。
document opened: 書類を開く操作を行い、テキストが読み込まれた直後document saved: 書類を保存する操作を行い、テキストが書き込まれた直後イベントの詳細な仕様については、AppleScript辞書の「CotEditor Event Handler suite」項を参照してください。
このページではCotEditorスクリプトをスクリプトフックへ対応させる方法について説明します。
フックに対応したスクリプトを作成する場合、以下の制約を満足する必要があります。
以上に加えて、フックしたいイベントをメタデータファイルにて明示し、イベントハンドラを記述する必要があります。
スクリプトバンドルは、以下に示す構造を持つディレクトリ構造です。
HookingScript.scptd
└── Contents
├── Info.plist
└── Resources
├── Script Libraries
│ └── my-fancy-library.scpt
├── Scripts
│ └── main.scpt
└── description.rtfd
└── TXT.rtf
この形式には、macOSに標準で添付されているスクリプトエディタを用いることにより、簡単に書き出すことができます。
CotEditorのスクリプトフックに対応させるためには、まず、Contents/Info.plistにフックしたいイベントの一覧を記載する必要があります。 plistファイルはプロパティリストと呼ばれ、その内容は以下に示すようなXML形式で記述されたバンドルのメタデータです。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleIdentifier</key> <string>com.coteditor.hooking-script</string> <key>CFBundleName</key> <string>Hooking Script</string> <key>CFBundleShortVersionString</key> <string>1.0</string> </dict> </plist>
フックしたいイベントの一覧は、キーCotEditorHandlersに文字列の配列として記載します。以下にその一例を示します。
<key>CotEditorHandlers</key> <array> <string>document opened</string> <string>document saved</string> </array>
イベントハンドラは、アプリケーションが発生させたイベントを受信し、処理をするスクリプトを指します。 ここでは、ファイルを読み込んだ後と書き込んだ後にダイアログを表示するスクリプトを例に採り上げ、イベントハンドラの記述方法について説明します。
AppleScriptでスクリプトを記述する場合、using terms fromブロックとonブロックを組み合わせることで、ハンドラを作成します。
using terms from application "CotEditor" on document opened theDocument write to console "Opened " & (theDocument's name) end document opened on document saved theDocument write to console "Saved " & (theDocument's name) end document saved end using terms from
JXAでスクリプトを記述する場合、function文を用いてハンドラを作成します。関数はグローバルオブジェクト上で定義する必要があります。
CotEditor = Application.currentApplication() CotEditor.includeStandardAdditions = true function documentOpened(document) { CotEditor.writeToConsole("Opened " + document.name()) } function documentSaved(document) { CotEditor.writeToConsole("Saved " + document.name()) }