如何创建 EmEditor 插件
在 EmEditor 中,您可以用宏,外部工具以及代码段自动化所有的操作。然而,一些用户,特别是编程者,可能还是喜欢自己编写插件程序。自己编写插件程序的优点有:
- 您可以用 Win 32 API 编写 C++ 。
- 您可以编写 GUI (Graphic User Interface,图形用户界面) 元素,例如对话框。
- 您可以在 EmEditor 中使用自定义栏和窗口,自定义工具栏,还有输出栏。
另一方面,插件的编写需要使用到 Microsoft Visual C++ ,是一个难度比较大的编程语言。但是,如果您已经习惯使用 C++ 或是 Win32 的话,编写插件程序对您来说应该是得心应手的一件事。
Hello World 示例
如果您还没有安装Visual C++ 2012, 您可以在下面的链接中下载并安装Visual Studio Express 2012 for Windows Desktop:
在 EmEditor 网站上的资源库中,您可以下载这个 Hello World!! 示例:
在下载这个文件之后,请把它提取到一个文件夹,然后用 Visual C++ 打开 Hello.sln 解决方案文件,您将会在这个 Hello 项目中看到下面的一系列文件。
File name | 用途 | 需要编辑吗? |
---|---|---|
etlframe.h | ETL (EmEditor Template Library) 头文件 | 否 |
hello.h | Hello World 插件实现文件 | 是 |
plugin.h | EmEditor 插件头文件 | 否 |
resource.h | Hello World 插件资源文件 | 是 |
stdafx.h | 预编译头文件 | 也许 |
bitmap1.bmp | 工具栏按钮位图 (16 colors, 16×16 pixels) | 是 |
hello.rc | Hello World 插件资源 | 是 |
hello.cpp | Hello World 插件实现文件 | 也许 |
hello.def | 定义文件 | 否 |
在这些文件中,需要编辑的文件是 hello.h,hello.rc,resource.h,还有 bitmap1.bmp。如果您想要添加头文件的话,您也可以修改 hello.cpp 和 stdafx.h。其余的文件中,plugin.h 和 etlframe.h 是由 Emurasoft 公司提供的头文件并不需要修改。 请到下面的链接中下载最新版本的头文件:
另外,hello.def 是定义 EmEditor 可导出功能的文件,这个文件也不需要修改。
首先,先不做任何更改,用 Visual C++ 打开这个项目并生成一个文件。然后您将会看见出现了一个 Hello.dll 文件。把这个文件复制到 EmEditor 安装目录下的PlugIns (插件)子文件夹中。通常,文件的路径是:C:Program FilesEmEditorPlugIns。接着,打开 EmEditor,您将会看到插件工具栏上出现一个黄色的圆圈按钮。当您按下这个按钮, EmEditor 编辑器中就会显示 Hello World!! 的文本。
接下来,让我们来更改这个示例,让这个插件能打开输出栏并在输出栏上显示 Hello World!! 的文本。
最重要的函数:OnCommand
在 hello.h 文件中最最重要的函数就是 OnCommand。当用户从菜单上选择这个插件或点击这个插件按钮时,就需要用到 OnCommand。通过更改这个函数内容,您可以改变这个插件的行为。在这个例子中,请先删除已存在的 Editor_InsertW 函数,然后添加下面的 Editor_OutputString 函数。
// Editor_InsertW( hwndView, L"Hello World!!n", true ); Editor_OutputString( hwndView, L"Hello World!!n", FLAG_OPEN_OUTPUT );
上面所示以 Editor_ 开头的函数被定义在 plug-in.h 文件中。当您用 EmEditor 打开 hello.h 后,请把光标移到以 Editor_ 开头的函数,然后按一下 F1 在帮助中查看该函数的描述。
在 hello.h 文件中,还有一个重要的函数,就是 QueryStatus。当 EmEditor 显示一个菜单或者它需要进行更新来刷新工具栏按钮时,就会使用到 QueryStatus 函数。当插件被启用时,这个函数会还原 TRUE 值。
*pbChecked = TRUE
另外,这个函数还能检查插件菜单项目和工具栏按钮是否会在被点选的情况下出现。
OnEvents 函数会在一个文件被打开,一个文档被更新,或者各种其它事件发生时被使用。这一系列的事件的具体描述可以在 EmEditor 中的帮助 — 插件参考 — 事件中找到。在这些事件中,我们将改变 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 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++生成示例项目,您自定义的 Hello.dll 插件会被创建。您也可以把这个新的插件复制到 PlugIns 子文件夹中,打开EmEditor,然后点击插件按钮。”Hello World!!” 文本就会在输出栏中出现了。您也可以尝试在文本编辑器中输入新的文本,然后您就会在输出栏上看到您自己的定义的文本了。
自定义插件备注
在上面的例子中,我们修改了 Hello 示例插件。然而,当您想要创建一个新的插件时,以下几点您需要注意。首先要先准备一个定义文件,像 hello.def,这个文件定义了 DLL 文件必须导出的函数。另外,hello.def 文件一定要在 Linker – Input 中被标明是 Module Definition File (模块定义文件) 。而且,__stdcall 一定要在 C/C++ – Advanced 中被标明是 Calling Convention (枚举)。在 C/C++ – Code Generation 中,请选择 Multithread (多线程) 而不是Multithread DLL。为使程序更优化,请选择支持小代码。这样,插件会程序会变小并减少对运行库的依赖。
标准插件源代码
EmEditor中一些插件的源代码可以在下面的链接中下载:
您也可以参考下列的插件源代码:
- HTMLBar (HTML 工具栏)
- OpenDocuments (打开的文档)
- OutlineText (大纲)
- Search (搜索)
- WordCount (单词数量)
在所有这些源代码中,HTMLBar 是一个非常好的设置自定义工具栏的参照。别的插件也能够帮助您创建自定义工具栏。请参考这些源代码来创建您自己的插件。
我已经解释了怎么创建 EmEditor 插件。我们在这里所举的例子只是一个非常简单的例子。但是,您可以创建更加实用,有效,适合您自己的插件!