EmEditor プラグインの作成方法

EmEditor では、マクロ、外部ツール、スニペットといった方法で、ほとんど操作を自動化することが可能です。しかし、それでも特定用途のためにプラグインを開発したいという要求があるのも事実です。プラグインの長所には、次のことが挙げられます。

  • Win32 API を利用でき、C++ で記述できる。
  • ダイアログなどの GUI を自由に記述できる。
  • カスタム バー、カスタム ツール バー、アウトプット バーなどを使用することができる。

逆に、短所としては、基本的には Microsoft Visual C++ が必要で、作成が難しい、ということになります。しかし、C++ や Win32 に慣れている方にとっては、逆にプラグインの方が作りやすいかもしれません。

Hello World サンプル

Visual C++ 2012 製品版をお持ちでなければ、無料で使用できる Visual C++ 2012 Express でも構いません。Visual C++ 2012 Express は、以下からダウンロードしていただけます。(Visual C++ 2010 でも使用可能です。)

EmEditor ホーム ページのライブラリには、「Hello World!!」サンプルが公開されています。以下からダウンロードしていただけます。

これをダウンロードして、適当なフォルダに解凍し、Visual C++ から Hello.sln ソリューションを開くと、次のファイルが Hello プロジェクトに含まれていることがわかります。

ファイル名用途編集必要
etlframe.hETL (EmEditor Template Library) のヘッダ×
hello.hHello World プラグインの実装ファイル
plugin.hEmEditor プラグインのヘッダ×
resource.hHello World プラグインのリソース用ファイル
stdafx.hプリコンパイル用ヘッダ
bitmap1.bmpツール バーのボタンのビットマップ (16色、16×16ピクセル)
hello.rcHello World プラグインのリソース
hello.cppHello World プラグインの実装ファイル
hello.def定義ファイル×

これらのうち、実際に変更が必要なファイルは、hello.h、hello.rc、resource.h、bitmap1.bmp の 4 個のみです。hello.cpp や stdafx.h は、さらに大きなプラグインを開発する場合に、インクルードしたいヘッダを増やしたいときなどに変更することがあります。逆に、plugin.h、etlframe.h のファイルは、エムソフトが提供しているヘッダ ファイルであり、変更を加えてはいけません。また、これらのヘッダ ファイルの最新版は、

よりダウンロードしていただけます。hello.def は、EmEditor 本体が必要とする関数のエクスポートを定義しているファイルで変更の必要はありません。

まずは、プロジェクトを開いたら、何も変更せずにビルドしてみてください。すると、Hello.dll というファイルができあがります。このファイルを EmEditor のインストール フォルダの PlugIns サブ フォルダにコピーします。通常は、C:Program FilesEmEditorPlugIns フォルダに、この Hello.dll をコピーしましょう。そして、EmEditor を実行すると、プラグイン ツール バーに黄色い丸の付いたボタンができていることがわかります。そのボタンをクリックすると、テキストエディタに「Hello World!!」と表示されます。

次に、このサンプルを少しだけ書き換え、アウトプット バーを開いて、「Hello World!!」という文字列をアウトプット バーに出力するプラグインを作成します。

最も重要な関数 OnCommand

hello.h ファイルの中で最も重要な関数が、OnCommand になります。これは、ユーザーがプラグインをメニューまたはツール バーのボタンを押すことにより選択したときに呼び出されます。この関数の中を書き換えることにより、プラグインの動作を自由に変更することが可能です。このサンプルでは、まず、既存の Editor_InsertW 関数を削除してから、以下の Editor_OutputString 関数を追加します。

// Editor_InsertW( hwndView, L"Hello World!!n", true );
Editor_OutputString( hwndView, L"Hello World!!n", FLAG_OPEN_OUTPUT );

上記の Editor_ で始まる関数は、plugin.h で定義されています。hello.h を EmEditor で開いた後、これらの Editor_ で始まる関数の上にカーソルを置いてから F1 を押すと、ヘルプでこれらの関数の説明を表示することができます。

hello.h ファイルの中で次に気を付けたい関数は、QueryStatus です。QueryStatus 関数は、EmEditor がメニューを表示するときや、ツール バーの更新のためにアイドル時に頻繁に呼ばれます。プラグインが実行可能なときには、TRUE を返すようにします。また、 *pbChecked = TRUE とすると、メニューのこのプラグインの項目がチェックされた状態となり、ツール バーのボタンは押された状態となります。

OnEvents() では、ファイルが開かれた直後、文書が変わった時、などさまざまなイベントが発生したときに呼び出されます。イベントの一覧は、ヘルプの「プラグイン リファレンス」-「イベント」に書かれていますので、ご参照ください。この中で、代表的なイベントである EVENT_CHANGE を使って、文書に変更があったときに、アウトプット バーに「Text Changed!!」と表示されるように変更します。そのため、以下の 3 行を追加します。

if( nEvent & EVENT_CHANGE ){
        Editor_OutputString( hwndView, L"Text changed!!n", FLAG_OPEN_OUTPUT );
}

リソースの書き換え

次に、hello.rc ファイルを見てみます。このファイルには、各種文字列が定義されています。IDS_MENU_TEXT は、このプラグインの名前です。”Hello World!” という名前が定義されていますが、これを好きな名前に置き換えてみましょう。ここでは、”Hello Test!” と変更してみます。

STRINGTABLE
BEGIN
    IDS_MENU_TEXT           "Hello Test!"
    IDS_VERSION             "1"
    IDS_SURE_TO_UNINSTALL   "Are you sure you want to uninstall this Plug-in?"
END

さらに、bitmap1.bmp は、Visual C++ またはペイントで好きなイメージに変更して保存します。ここでは、赤い丸に変更して保存します。

以上ですべての変更は完了です。Visual C++ で、サンプル プロジェクトをビルドすると、あなただけのプラグイン Hello.dll が作成できます。作成できたプラグインは、前回と同様、EmEditor のインストール フォルダの PlugIns サブ フォルダにコピーして、EmEditor を実行し、プラグインのボタンを押してみます。アウトプット バーに「Hello World!!」と表示されることがわかります。また、EmEditor に何か文字を入力してみます。すると、アウトプット バーに「Text changed!!」と表示されることがわかります。

プロジェクト設定の注意点

ここでは、Hello サンプルを変更するという形でプラグインを作成してみました。もしプロジェクトを新規に最初から作成する場合には、注意することがあります。それは、hello.def と同じ定義ファイルを用意するということです。定義ファイルには、DLL ファイルがエクスポートしなけばならない関数が定義されています。また、Visual C++ のプロジェクトの設定で、リンカーの入力で、モジュール定義ファイルに hello.def を指定しておくことが必要です。さらに、C/C++ の詳細設定で、呼び出し規約として __stdcall を指定しておくことが必要です。C/C++ のコード生成では、ランタイム ライブラリとして「マルチスレッド DLL」ではなく「マルチ スレッド」を選択しておきます。また、最適化の設定では、「サイズの最小化」を選択します。すると、プラグインができるだけ小さくなり、DLL の他のランタイム ライブラリへの依存も減らすことができます。

今回は、単純な機能しか作成しませんでしたが、カスタム バー、カスタム ツール バー、アウトプット バーなどを使用して、より高度なプラグインを作成することも可能です。

標準プラグインのソース

EmEditor で標準に付属するプラグインの一部は、以下のリンクから公開されています。

以下が公開されているプラグインの一覧です。

  • HTML バー (HTMLBar)
  • 開いている文書 (OpenDocuments)
  • アウトライン (OutlineText)
  • 検索 (Search)
  • 単語数 (WordCount)

これらのうち、HTML バーは、カスタム ツール バーを作るのに参考になります。また他のプラグインは、カスタム バーを作るのに参考になります。これらのプラグインを参考にして、自分にあったより良いプラグインを開発してみると面白いでしょう。

以上で、EmEditor プラグインの作り方を説明してきました。今回は、単純な機能しか作成できませんでしたが、どのような機能のプラグインを作成するかは、あなたのアイディア次第です。是非あなただけの使いやすいプラグインを作成して、作業効率のアップにお役立てください。