Sublime Text 手工汉化和插件开发、提交方法教程(二)——插件开发

来源:互联网 发布:java volite 多线程 编辑:程序博客网 时间:2024/05/01 00:06

  (转载须注明本文原始地址和作者“碧海情天 赵亮”及博客地址http://blog.csdn.net/theforever)

   在上一部分讲了“Sublime Text 手工汉化的方法”(http://blog.csdn.net/theforever/article/details/8962727)。其中涉及对插件扩展包的存放位置和编辑方法的介绍,是本部分的必要前提基础,这里不再重复,请自行移步过去参考。

   下面结合我自己写的一个ST插件来讲解一下开发方法。这个插件功能比较简单,适合入门。其作用是把当前剪贴板中的所有空行(包括只含有空格和TAB制表符而没有其它有效内容的行)删除,并粘贴到ST当前编辑的文档。这在用浏览器查看网页并想收集文字内容时,比较有用,因为即使在网页中是连续的行,复制粘贴后也会发现中间可能有无用的空行,更不用说有的内容明显有多个不必要的空行了。当一个文件含有多个不同页面的不同内容时,这些多余的空行会使内容显得散乱而不易区分。
  虽然用ST的正则替换可以消除空行,但输入还是稍微麻烦点,而且一般还都要选择“替换区域内文本”,否则就会把之前已经处理好的文本中需要保留的空行也一并删除了。
  而用ST的“唯一化”功能,又会消除一些作为分隔线的相同内容行,和其它一些必要的重复行(比如鬼故事中经常在不同位置出现连续几行只含单个象声字的行,一旦唯一化,你能想像是什么样子)。“唯一化”在别的时候可能很有用,但在这种情况下显然不适合。
  而ST2的delete blank line插件还得选择粘贴完的内容再手工按键操作,有时还要按几次,还是比较麻烦,尤其当粘贴的内容较多,不容易看出全部效果的时候,会让用户感觉比较困扰。
  而且用我这种对剪贴板进行处理的方法,还有个好处,被减肥的内容还可以再粘贴到别处使用。比如你在论坛看到有个人提问的问题,你想要回复,并且把这个问题和你的回复都记录到一个文档中。在你回复时,你可能还想要引用他的问题,但是如果他的问题中有一些不必要的空行,就会在你的回答前面占据不必要的空间。这种情况下,你复制他的问题后,到ST中按一下插件绑定的热键CTRL+ALT+SHIFT+L(虽然看着键子多,但按起来还是挺方便的,也容易理解:SHIFT在功能键的含义中一般表示去除或者反向,L表示空行Lines),就会以去掉多余空行的形式粘贴到你的文档中,然后你再回到浏览器的回复框中,用CTRL+V就能再次粘贴刚才已经减肥过的内容。

  至少这个插件对我常做的事情还是挺有用的,以至于我曾经为几个浏览器和其它一些支持插件的编辑器都写过。倒不是我热衷于此,而是如果使用时没有这个功能,确实有点麻烦,心情都会很烦。

  好了,现在就开始正式编写了:

  1、虽然在ST的Tools(工具)菜单里有一项“new Plugin 新插件"菜单,但我觉得更快捷的方法是你可以选择与Installed Packages文件夹同级的Packages文件夹中一个现成的插件目录(最好里面的内容种类齐全,如果你有意常做,可以制作一个模板——当然最好放在别处——甚至可以编写一个可视化操作软件来生成这些文件),复制粘贴,然后更改其名称,进入里面,选择不想要的文件删除,再对剩下的文件进行修改即可。

  2、介绍一下插件文件夹里面一些主要文件的作用和写法:
  Main.sublime-menu:插件的主菜单。里面的内容会添加到ST系统菜单中。

  我插件的这部分内容是:

[{    "id": "edit","children":[        {"caption": "清除剪贴板中空行并粘贴","command": "paste_without_blank_lines"}    ]}]


  第一行是JSON的结构定界符,即使不了解,只要照葫芦画瓢保持结构形式就可以了。
  第二行,表示向菜单id为edit的菜单(即“edit/编辑”菜单)中添加项目。要搞清楚id和caption不同,id用于标识真正的身份,caption只作为在菜单中的显示内容。

  注意:这里的ID不仅限于顶级菜单的ID,而是任意有ID的菜单项,根据你的插件用途进行选择即可(但最好不要给带有id而caption是“-”的项目添加子菜单,虽然能加进去,但看着太怪了)
  第三行是所添加命令菜单的显示名称和对应的要执行的指令ID。指令ID是需要你自己起的,要避免与其它已有指令ID重复,最好起一个能表示你插件用途的名字。

  如果要添加多项命令菜单,各项之间要用逗号分开。注意:最后一项的后面就不要再加逗号了。
  另外,如果某个家伙写他的插件时这样干了:

[{    "id": "edit",    "caption":"Edit(E)",    "children":[        {"caption": "abc","command": "abc"}    ]}]


  就会使你汉化过的“编辑(E)”菜单还是显示英文“Edit(E)”,所以当你看到菜单发生这种现象,就要找到是哪个插件干的。不用急,就在这个菜单下面再看看还有哪一项是英文(即使不只一个也可以这样挨个查看一下),找到后,记住菜单的英文内容,再到我前面说的上一篇教程中介绍过的三个放置插件的目录中找到有类似名称的插件,用上一教程介绍的编辑方法打开菜单文件进行编辑然后保存,之后就又会正常了。

  好,结束了菜单文件,下面再给我们的插件增加一个在ST里可以快捷调用的键盘热键,这是通过下面的 Default (Windows).sublime-keymap 文件实现的,内容是:

[  { "keys": ["ctrl+alt+shift+l"], "command": "paste_without_blank_lines" }]

  command必须对应于菜单文件中的命令ID。
  另外还有Default (Linux).sublime-keymap 和 Default (OSX).sublime-keymap 两个文件。如果你的插件能够和想要支持它们,也可以加上。

  我们还可以利用 Default.sublime-commands 文件,在“Ctrl+Shift+P”的命令面板中增加插件所含的指令供调用。虽然稍微会增加点系统开销,不过感觉是个好习惯。中文名称在命令面板中同样可以搜索调用。

[  {"caption": "清除剪贴板空行并粘贴","command": "paste_without_blank_lines"}]

  PasteWithoutBlankLines.py 是插件命令的实现代码。ST的插件都是用PYTHON写的,PYTHON程序的扩展名是.PY。当一个插件只有一个PY文件时,该文件名和插件的名称可以不同,ST会自动调用这个唯一的PY程序。但当插件内有多个PY时,要么你把其余的PY放在子文件夹中进行调用,要么你就得用插件文件夹的名称作为主程序文件的名称,这样ST会在几个PY中挑选与插件文件夹相同名称的程序作为入口先执行。
  在我写这个教程之前,甚至直到现在,其实都没好好看过PYTHON语法,不过PYTHON程序还是比较容易阅读理解的,在汉化过程中顺便看看,结合ST的代码补全提示功能,已经足够用来写个简单的插件了。电脑技术层出不穷,不可能都去涉猎,但通过一个要做的实事,稍微学点东西,也是不错的事情。

  下面粘一下源码,已写有详细的注释:

import sublime, sublime_plugin   # 插件主程序必须要引用这两个基础类库。import re   # 本插件需要用到的正则表达式类库。class PasteWithoutBlankLinesCommand(sublime_plugin.TextCommand):    """       每个菜单命令都对应于一个类。注意类名的写法,是把菜单命令的下划线去掉,改成驼峰式写法,并且在末尾加上Command。        括号中 sublime_plugin.TextCommand 是此类的父类,表示此类是一个命令菜单的实际行为类。        如果是象在 Package Control 提供的操作面板中通过点击面板产生的命令,就要用 sublime_plugin.WindowCommand 作为父类,表示是窗口命令类。     """    def run(self, edit):  # ST插件机制会自动调用指令类的run方法,所以必须重载实现此方法以供执行。def表示定义一个方法。        s = sublime.get_clipboard()     # 获取剪切板内容        # 从ST文件视图配置中读取默认行结束符的类别(用操作系统表示)        line_ending = self.view.settings().get('default_line_ending')       # 根据不同系统进行不同的替换处理        if line_ending == 'windows':            s = re.compile('\n\r').sub('',s)           s = re.compile('\r\n\s*\r\n').sub('\r\n',s)       elif line_ending == 'mac':            s = re.compile('\r\r').sub('\r',s)            s = re.compile('\r\s*\r').sub('\r',s)       else: # unix / system            s = re.compile('\n\n').sub('\n',s)            s = re.compile('\n\s*\n').sub('\n',s)       sublime.set_clipboard(s)    # 修改剪贴板内容,此方法可使减肥过的剪贴板内容在别处也能使用        self.view.run_command('paste')    # 调用粘贴命令


  其中 sublime.get_clipboard、self.view.settings、sublime.set_clipboard 等都是ST的APIs,要想获得更多资料说明以写出属于你的复杂的插件,可以到ST的官方网站去查看API帮助文档。

  与Installed Packages文件夹同级的Packages文件夹,可以说是专为调试插件准备的,在其中无论是对菜单还是对命令实现的程序进行更改,都会即时反应到ST中。在写好之后,可以通过Package Control(简称PC)面板中的“create a package“项目找到你的插件,PC会自动给你的插件打包并生成到系统桌面上。如果不能正确生成,你可以用我在教程的上一部分中讲的方法自己手动压缩改名。

  现在,你可以自己使用,也可以把插件打包发给朋友们使用,或放在能够下载的网址上。

  如果你希望在PC面板的安装插件列表中看到你自己的插件,供全世界的朋友使用,你需要接着看第三部分“ST插件发布”http://blog.csdn.net/theforever/article/details/8967507。

原创粉丝点击