Scintilla icon SciTE Director インタフェース SciTE Director Interface

目的 Purpose.

SciTE で行うソフトウェア開発は単一ファイルだけで行われるものとは限りません。開発者は一つのプロジェクトという概念の中で関係づけられるファイル群に対して作業を行います。他のエディタのように SciTE にプロジェクト管理機能を追加することもできました。ですがそれでは、プロジェクトがどのようにプロジェクトファイルの形式とともに管理されているかを見るに特定の方法を課すことになります。そのかわりに、SciTE はプロジェクトマネージャのようなアプリケーションが SciTE を制御するためのインタフェースを持っています。SciTE を制御するアプリケーションは "Director" として参照されます。

Software development does not occur only at the single file level handled by SciTE. A developer will generally work on a group of related files together in the context of one project. Project manager functionality could be added to SciTE as it has to other editors but this would impose a particular view of how projects are to be managed including the format of project files. Instead, SciTE has an interface that can be used by project managers or similar applications to control SciTE. Any application that controls SciTE is referred to as a "Director".

現在の Director インタフェースは Windows のみで動作します。将来は低水準のインタフェースを置き換えて他の環境でも利用できるようにしなくてはならないでしょう。

The current Director interface only works on Windows. In the future, it should be possible to replace the low level interface and so make this interface available on other platforms.

現在 Director アプリケーションがひとつあります。Filerx です。

There is currently one director application, Filerx, available.

このインタフェースはファイル scite\win32\DirectorExtension.cxx 内で SciTE 拡張インタフェース の最上部に実装されています。

This interface is implemented on top of the SciTE Extension Interface, in the file scite\win32\DirectorExtension.cxx.

直接接続、全体の告知、明確な復帰アドレス Direct connection, broadcasting and explicit return addresses.

SciTE のDirector として SciTE を制御するのは一度に一つのアプリケーションだけです。他の協働技術を利用できるようにするため、全てのアクティブな Director インタフェースに対する告知を行うことができます。これを行うときは各メッセージが明確な復帰アドレスを持たなくてはなりません。全体告知メッセージへの応答の送り先となります。

One application at a time is the director of SciTE, controlling SciTE as it wishes. To support other communications techniques applications may broadcast to all active director interfaces. When doing so, each message should contain an explicit return address where replies to the broadcast message will be sent.

Windows 用低水準インタフェース Low level interface on Windows.

SciTE と Director の間でデータ転送を行うため Windows の WM_COPYDATA メッセージを使います。このメッセージは二つの別アプリケーションから作られたウィンドウ間で送られます。SciTE はメッセージを受け取る以外になにもしないウィンドウを作ります。COPYDATASTRUCT の lpData と cbData フィールドを 2 プロセス間の文字列転送に使います。cbData が長さで lpData が文字列へのポインタとなります。文字列は '\0' で終わる必要はありません。dwData は 0 にしておいてください。

The Windows WM_COPYDATA message is used to transfer data between SciTE and a Director. The messages are sent between windows created by the two applications. SciTE uses a window that has no other purpose than to receive these messages. The lpData and cbData fields of the COPYDATASTRUCT are used to transfer a string between the two processes, with cbData holding the length of the string pointed to by lpData. The string does not have to be terminated with '\0'. The dwData should be 0.

一方から他方にメッセージが送られる前にメッセージを受け取るウィンドウハンドルを見つけなくてはなりません。これは通常他方のアプリケーションがコマンドライン引数として起動したときに転送されます。どちらのアプリケーションも他方を起動できます。SciTE は WindowID 属性としてそれらのハンドルを扱えるようにします。また diractor.hwnd 属性をデータを送る側のウィンドウハンドルとして受け入れます。

Before messages can be sent from one application to the other, the window handle of the window to receive the message must be found. This is normally transferred when starting the other application as a command line parameter. Either application may start the other. SciTE makes its window handle available in the WindowID property and accepts a director.hwnd property as the window handle to which it sends data.

ウィンドウハンドルとともに動作する例としてツールメニューに Filerx を追加すると上記の属性が使えるようになります。

As an example of communicating the window handle, to install Filerx in the Tools menu of SciTE these properties could be used:

command.name.0.*=Project Editor
command.0.*="C:\os\scite\bin\filerx.exe" "$(FileDir)" "$(WindowID)"
command.subsystem.0.*=2

逆に Filerx が SciTE を起動する場合、編集したいファイル名と同様にウィンドウハンドルをコマンドラインに渡すことができます。

In the opposite direction, Filerx can start up SciTE with a command line that specifies its window handle as well as the file it wants edited:

SciTE -director.hwnd=937846 c:\os\scite\src\SciTEBase.cxx

一方のアプリケーションが他のアプリケーションのウィンドウハンドルを持ったら、自身のウィンドウハンドルを他方に知らせなくてはなりません。これには口述の識別メッセージを用います。

Once one application has the window handle of the other application, it should send its window handle to the other application using an identity message as described later. Then both sides are able to send messages.

Windows において広域告知メッセージを送るにはアクティブな Director インタフェースの一覧を "SciTEDirectorInterface"メッセージを広域告知することで獲得可能です。

To broadcast a message on Windows, the set of active director interfaces can be found by broadcasting the "SciTEDirectorInterface" message and seeing which windows reply with the same value as that message. Example broadcast code:

unsigned int SDI = ::RegisterWindowMessage("SciTEDirectorInterface");
HWND w = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
while (w) {
    
DWORD res = 0;
    
// ハングアップを避けるため時間切れ設定が必要。
    
// Need time out to avoid hung applications
    
::SendMessageTimeout(w, SDI, 0, 0,
        
SMTO_NORMAL, 1000, &res);
    
if (res == static_cast<DWORD>(SDI)) {
        
// 同じ SDI コードが返されたら SDI 版の WM_COPYDATA を理解すべきである
        
// Replied with same SDI code so should
        
// understand SDI's version of WM_COPYDATA
        
::SendMessage(w,WM_COPYDATA,
            
(UINT)m_hWnd,(long)&cds);
    
}
    
w = ::GetWindow(w, GW_HWNDNEXT);
}

トップレベルウィンドウが Director インタフェースに対応していることを知らせるには次のようにします。

To advertise that a top level window supports the Director interface:

LRESULT PASCAL DirectorExtension_WndProc(HWND hWnd, 
    
UINT iMessage, WPARAM wParam, LPARAM lParam) {
    
unsigned int SDI = ::RegisterWindowMessage("SciTEDirectorInterface");
    
if (iMessage == SDI) {
        
return SDI;
    
}
    
return ::DefWindowProc(hWnd, iMessage, wParam,lParam);
}

GTK+ 用低水準インタフェースLow level interface on GTK+.

これはまだ実装されていません。/tmp ディレクトリにある "/tmp/SciTE<PID>.director" という形の名前を持った Director インタフェースが FIFO入力に対応するという方式の提案があります。これによりすべてのアクティブな Director インタフェースを拾うことができ、またコマンドライン引数や identity: コマンドのような手法でもたらされた FIFO 名を伝え合えば特定のインタフェースを開くこともできるようになります。

This is not yet implemented. The proposed design uses an input fifo for each application supporting the director interface located in /tmp with a name using a pattern such as "/tmp/SciTE<PID>.director". This allows enumerating all active director interfaces and also opening a specific interface when the fifo name has been communicated through some other means such as a command line argument or an identity: command.

高水準インタフェイスHigh level interface.

C 言語式のエスケープで制御文字を表現して可視文字だけを転送するメッセージを使います。ただし、メッセージを分離する '\n' はエスケープせずそのまま用います。

Messages use C style escapes to represent control characters and ensure that only visible characters are transmitted apart from the use of '\n' to separate messages.

低水準インタフェースで転送される文字列は ':' で囲まれたオプションの復帰アドレスを含んでいます。行動内容 ':' 補助引数、という形になります。引数はしばしばファイルのパス名です。':' は引数が無くても付加しなくてはなりません。例えば SciTE は次のメッセージを理解します。

The string transmitted by the low level interface contains an optional return address surrounded by ':' characters, an action, a ':' character and an optional argument. The argument is often a file path. The ':' must be present even if there is no argument. For example, SciTE understands the message

open:c:\\os\\scintilla\\include\\Scintilla.iface

上記はファイル "c:\os\scintilla\include\Scintilla.iface" をユーザが求めたときのように開くことを意味します。

as a command to open the file "c:\os\scintilla\include\Scintilla.iface" just as if the user had performed this operation.

メッセージの最初の文字が ':' である場合、次の ':' までが復帰アドレスとみなされます。従って SciTE は次のメッセージに対し、

If the first character of the message is a ':' then up to the next ':' is a return address, so SciTE will reply to the message

:73658:askfilename:

編集されようとしているファイル名とその Director に復帰するかわりに番地に復帰します。

by sending the filename being edited to the return address 73658 rather than to its director.

SciTE が受け入れる指示The actions understood by SciTE are:

askfilename: これから編集されつつあるファイルの名前を返す
askproperty:<項目> 属性の値を返す
close: 現在のファイルを閉じる
closing: Director を閉じる。Director から SciTE を起動していた場合は SciTE も閉じる。
currentmacro:<文字列> 現在のマクロの名前を指定された文字列にする
cwd: 作業ディレクトリを変更する
enumproperties:dyn|local|user|base|embed 引数で指定された群の属性をすべて拾う
exportashtml:<ファイルパス> HTML 形式で指定のファイルを保存する
exportasrtf:<ファイルパス> RTF 形式で指定のファイルを保存する
find:<文字列> 文字列を検索し、選択状態にして表示する
goto:<行番号>[,<桁番号>] キャレットを特定の行に移動して見えるように可視部を移動する。
桁番号があればその位置の単語を選択する。なければキャレットを指定位置に移動する。
identity:<hwndDirector> SciTE のメッセージ送信相手となる Director のウィンドウハンドルを設定する。引数は十進数値。
insert:<値> 編集部の選択部を置換して値を表示する
macrocommand:<command> マクロコマンドを実行する。コマンドの引数は SciTE のソースコードを参照のこと。
macroenable:<enable> 有効にすると SciTE のメニューでマクロの記録・再生が可能となる
macrolist:<一覧> ユーザが選択するマクロの一覧を表示する
menucommand:<cmd> 数値による識別子に基づいてメニューコマンドを実行する
open:<ファイルパス> 指定したファイルを開く
output:<値> 選択部を交換して出力部に値を表示する
property:<項目名>=<値> 属性に値を設定する
quit: SciTE を終了する.
replaceall:<被検索文字列>\000<置換文字列> 文書内の全ての被検索文字列を置換文字列で置き換える
saveas:<ファイルパス> 指定されたファイルとして現在のファイルを保存する
askfilename: Return the name of the file being edited.
askproperty:<key> Return the value of a property.
close: Close the current file.
closing: Director is closing - SciTE closes if it was started by the director.
currentmacro:<string> Set the current macro to name.
cwd: Change the working directory.
enumproperties:dyn|local|user|base|embed Enumerate all the properties in the argument set.
exportashtml:<path> Save the document in HTML format as the indicated file.
exportasrtf:<path> Save the document in RTF format as the indicated file.
find:<string> Search for a string, select and show it.
goto:<lineNumber>[,<columnNumber>] Move caret to a particular line and make it visible.
If there is a column number then select the word at that column number or move the caret there if no word is present.
identity:<hwndDirector> Sets the director window handle to which SciTE sends messages. The argument is in decimal.
insert:<value> Display the value in the editor pane replacing the selection.
macrocommand:<command> Execute a macro command. See the SciTE source code for the syntax of the command argument.
macroenable:<enable> If enable, display menu commands in SciTE for recording and playing macros.
macrolist:<list> Display a list for the user to choose from.
menucommand:<cmd> Execute a menu command based on numeric ID.
open:<path> Open the indicated file.
output:<value> Display the value in the output pane replacing the selection.
property:<key>=<value> Set a property to a value.
quit: Shut down SciTE.
replaceall:<search>\000<replace> Replace all instances of he search string in the document with the replace string.
saveas:<path> Save the document as the indicated file.

SciTE から送られるメッセージThe actions sent by SciTE are:

closing: SciTE は閉じられつつある
dyn|local|user|base|embed:<項目名>=<値> 特定群の中の属性値を設定する
filename:<ファイルパス> ファイルパスの名を持つファイルが編集されようとしている。これは askfilename: の応答。
identity:<hwndSciTEReceiving> SciTE は Director にメッセージを送るべきウィンドウハンドルを提示している。引数は十進数値。
macro:getlist macrolist の応答として使用可能マクロの一覧を返す
macro:record:<details> マクロの記録を開始する。details 引数の書式は SciTE のソースコードを参照のこと。
macro:run:<マクロ名> この名前のマクロを実行する
macro:stoprecord マクロの記録を停止する
opened:<ファイルパス> SciTE この名前のファイルを開く
switched:<ファイルパス> SciTE はこの名前のファイルを扱うバッファに切り替える
saved:<ファイルパス> SciTE はこの名前のファイルを保存する
closing: SciTE is closing.
dyn|local|user|base|embed:<key>=<value> Set a property in a set to a value.
filename:<path> The file being edited is path. This is the reply to the askfilename: command.
identity:<hwndSciTEReceiving> SciTE indicates to the director the window handle to which it should send messages. The argument is in decimal.
macro:getlist Retrieve the list of available macros which will be returned by the macrolist command.
macro:record:<details> Start recording a macro. See the SciTE source code for the syntax of the details argument.
macro:run:<macroName> Run the named macro.
macro:stoprecord Stop recording a macro.
opened:<path> SciTE has opened the indicated file.
switched:<path> SciTE has switched buffers to the indicated file.
saved:<path> SciTE has saved the indicated file.

将来はより多くの通知が定義される予定です。アプリケーションは理解できない通知が来たら無視すべきです。

In the future, more actions will be defined. Applications should ignore any actions that they do not understand.