作者:limodou 修改日期:2001/10/26
FlyEdit的插件就是Python的一个模块,不过想要使其加入到FlyEdit的环境中,需要遵守一定的格式,下面为插件格式的说明。
目前FlyEdit插件可以允许你自由定义主菜单项、加速键、右键菜单项、工具条。可以一次在一个文件中定义多个插件。由于Python语言的动态性,你可以使用所有FlyEdit的资源。但最主要的是使用文本编辑框中的文字。
下面以FlyEdit中所带的插件 addcomment.py 为例进行说明。
#add comment __all__=\ [ 'keylist', 'eventlist', 'menulist', 'rmenulist', 'on_plugin_addcomment' ] menulist=\ [ ('_Plugin', [ ('Add Comment\tCtrl+1', '<<plugin-addcomment>>') ]) ] rmenulist=\ [ ('Add Comment\tCtrl+1', '<<plugin-addcomment>>') ] keylist=\ { '<<plugin-addcomment>>': ['<Control-Key-1>'] } eventlist=\ [ ('<<plugin-addcomment>>', 'on_plugin_addcomment') ] def on_plugin_addcomment(self, event=None): w=70 comment='\n'+"#"+'-'*w+'\n'+"#\n#"+'-'*w+'\n' self.dselect() self.set_select_text(unicode(comment))
全局变量 __add__ 为一个列表,它定义了所有将要输出到FlyEdit中的对象。此处为加速键列表( 'keylist' )、事件列表( 'eventlist' )、主菜单项列表( 'menulist' )、右键菜单项列表( 'rmenulist' )、事件列表( 'eventlist' )、工具条列表( 'toolbuttonlist' )、和处理方法名( 'on_plugin_addcomment' )。注意,输出对象均为字符串表示。如果有多个菜单项,则要对应多个处理方法,则相应的处理方法依次列出。
加速键列表对象必须为: keylist 。它是一个字典,关键字为事件的名字,值为对应的加速键。事件(相当于一个功能,但并不是真正的功能,而是功能的一个名字)的名字由你自已指定,它是一个字符串,且一定要用'<<'和'>>'包括起来,如例中的:'<<plugin-addcomment>>'。值为一个加速键的列表,所以一个事件可以对应多个加速键。每个加速键都用字符串进行定义。不同的功能键有相应的字符表示,如:
Control Alt Shift F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12
对于组合键,用 '-' 将键的字符串表示连接起来。对于某些组合键,如: Control+1 等应表示为: '<Control-Key-1>' 。注意,对于加速键事件的字符串表示,应前后加 '<' 和 '>' 。[1]
主菜单项列表对象必须为: menulist 。它是一个列表。每项为两值元组对象(tuple)。元组对象的第一个元素为菜单项提示信息,后面为菜单项对应的事件名。如果当前菜单有子菜单,由第二项应为一个列表,此列表则应该为子菜单结构。故主菜单项列表的定义为一个递归定义。如本例中定义为:主菜单 Plugin 下有一子菜单,子菜单提示为: 'Add Comment\tCtrl+1' 。对应的事件(功能)为: '<<plugin-addcomment>>' 。对于子菜单的提示,要注意,如果在某个字母前加入下划线( '_' ),则表示它后面的字母为快捷键,当在菜单上进行选择时,按相应的快捷键可以直接执行菜单功能。它的显示为快捷字母有一下划线。如果菜单还有相应的加速键,则应由你加入此说明,即在菜单项的提示后面加上: '\t加速键的说明' 。此处为: '\tCtrl+1' 。这样的定义只是一个说明,并不会自动转换为加速键的定义。
对于FlyEdit的插件菜单是可以自动融合的。对于你定义的菜单项,应完全按照实际的菜单布局进行定义,即第一层应为菜单条,后面为相应的子菜单。那么定义完之后,处理过程是这样的:
根据提供的菜单结构定位相应的父菜单,如果找到,则将子菜单追加到父菜单的后面;如果没有找到,则定义的新菜单级别。这样,如果有相同的菜单结构,则菜单会进行融合。如第一个插件为: addcomment.py ,生成新的菜单项 Plugin ,下面有一个下拉菜单,下拉菜单有一菜单项 'Add Comment' 。如果还有一个插件: blank2nbsp.py ,则会在菜单项 Plugin 的下拉菜单中增加一项 'Blank to ' ,即菜单进行了融合。
要注意,由于菜单会进行融合,则定义上级菜单时应严格菜单的字符串写法,要完全相同。
右键菜单列表对象必须为: rmenulist 。它是一个同 menulist 相似的列表,不过它没有相应完整的菜单结构,而只是从子菜单开始定义的。
事件列表对象必须为: eventlist 。它是一个列表,每个元素为两值元组对象。元组第一个值为事件的字符串表示,第二个值为事件对应的处理方法名字。
还要定义事件对应的处理方法,一个事件应对应一个处理方法。要注意的是,不同的插件不能有同名的处理事件和方法。方法应定义为类的方法,同时还要带一个 event 的事件参数,如:
def on_plugin_addcomment(self, event=None): w=70 comment='\n'+"#"+'-'*w+'\n'+"#\n#"+'-'*w+'\n' self.dselect() self.set_select_text(unicode(comment))
其中 self 将为正在使用的编辑窗口对象,因此你就可以使用编辑窗口对象中的所有函数。一般说来,插件的任务是对正在编辑的文本进行处理,所以只需要使用某些方法即可,它们为:
在FlyEdit中还可以定义工具条,格式如:
#toolbuttonlist toolbuttonlist=\ [ ('image/new.gif', '<<file-new>>'), ('image/open.gif', '<<file-open>>'), ('image/save.gif', '<<file-save>>'), (None, None), ('image/cut.gif', '<<Cut>>'), ('image/copy.gif', '<<Copy>>'), ('image/paste.gif', '<<Paste>>'), (None, None), ('image/undo.gif', '<<undo>>'), ('image/redo.gif', '<<redo>>') ]
工具条对象必须为: toolbuttonlist 。它是一个列表,每个元素由两值元组对象构成。每个元组为:工具条图片和对应的事件。注意:只支持gif格式文件。如果需要增加分隔符则应定义为 (None, None) 。
安装一个插件很简单,首先根据插件编写的要求写好插件。然后将其拷贝到plugin目录下。接着修改plugin目录下的__init__.py文件,在__all__列表的后面增加新的插件的文件主名(要去掉.py)。然后重启FlyEdit即可。