sublime text用来做开发真的非常棒,这种高度可定制的文本编辑器太吸引人,而强大的 packagecontrol 已经可以解决我们绝大部分需求,但作为一名爱折腾的程序员,必须要自己的撸一把,造一回轮子玩玩,于是……

项目结构

....Default (Linux).sublime-keymap
....Default (OSX).sublime-keymap
....Default (Windows).sublime-keymap
....GenerateFolderOfString.py
....GenerateFolderOfString.sublime-settings
....Main.sublime-menu

基本上已经涵盖绝大部分功能所需文件。*.sublime-keymap 快捷键、*.py 核心文件、*.sublime-settings 配置文件、*.sublime-menu 菜单项配置文件。

*.py

可以通过 toolsNew Plugin... 来生成一个简单所必须的 Python 代码模块。

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

然后我们将文件保存至 C:\Users\asdf\AppData\Roaming\Sublime Text 3\Packages\DemoPlugin,至于名称无所谓这里用 DemoPlugin.py;View – Show Console,运行:view.run_command('example'),就会在当前的文件里插入 Hello, World!。

注意这里运行命令是 example,即插件名,这和 class ExampleCommand(sublime_plugin.TextCommand):ExampleCommand 所对应,只不过去掉 Command,并且用下划线符号命名替换驼峰式命名。假如我们用 GenerateFolderOfStringCommand 得到的命令必须是 view.run_command("generate_folder_of_string")

Command 类型

sublime text 有三种不同 Command 类型,分别:

  • Text Commands:通过 View 对象访问被选定文件或缓存区。
  • Window Commands:通过 Window 对象,可引用当前窗口。
  • Application Commands:没有引用任何特定的窗口,文件或者缓存区,很少使用。

同一个插件里面可以同时使用不同 Command 类型。

比如:

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

class WinExampleCommand(sublime_plugin.WindowCommand):
    def run(self):
        self.window.show_input_panel(
            "请输入要查询的文本",
            "",
            self.on_text,
            None,
            None)
        pass

Application Commands 并不是很了解,而对于另外两种其实也是带着包含关系,即 Window Commands 通常是运用在菜单中对应的命令,可以访问当前所有打开文件的 View 对象;相反 Text Commands 只允许对当前激活状态下文件的 View 对象。而 View 对象才是我们核心的对象,因为我们需要用它来给文件插入文本、获取选中的文本并给予加工等等。

所有这一切我们都可以使用 Python 语言来做任何你想做的事,包括访问远程文件。当然这可能会涉及到一些性能问题,但你不需要担心,因为你可以使用线程来解决这些问题。详细可参考后面的文档,由于我对 Python 语言了解只停留粗浅部分,所以具体自行发挥。

*.sublime-keymap

在IDE里面应该说有句谚语:能用快捷键决不用鼠标,而 sublime text 有个其它 IDE 所不具备的功能就是 Command Palette... 命令面板,要知道我们永远不可能记住所有快捷键,但我们可以记得一些单词,按 Ctrl+Shift+P 可以快速打开命令面板,我们可以搜索出需要执行的一切命令,而每个条目的后面也会有相应的快捷键提醒。

而这些快捷键就是通过 *.sublime-keymap 设置,内容:

[
    {
        "keys": ["ctrl+alt+g,ctrl+t"],
        "command": "do_generate_folder_of_string"
    }
]

以上相当于同时按下 ctrl+alt+g,ctrl+t 执行 do_generate_folder_of_string 命令。

而针对不同系统需要创建不同文件,格式按:Default (platform).sublime-keymap 来命令,其中有效的platform为:Windows, Linux, OSX,可以参考项目结构规则。

*.sublime-settings

很多插件我们可以修改一些配置信息以达到个性化,比如打开Package Control的debug功能,只需要:Preferences-Package Settings-Package Control-Setting Default(或Setting User),来开启 "debug": true

配置文件是一个标准的json文件,比如:

{
    // 前缀字符
    "prefix_character": "....",
    // 开始等级
    "start_level": 1
}

配置文件是可以出现在不同文件中,所有配置文件中定义的相同名称都会被合并,当然这会有一个合并的顺序规则,比如Windows下:

Packages/Default/Preferences.sublime-settings
Packages/Default/Preferences (Windows).sublime-settings
Packages/User/Preferences.sublime-settings
Packages/Python/Python.sublime-settings
Packages/User/Python.sublime-settings

其实有点晕,而我有一种比较不会出错办法,即在插件包下创建一个 demo.sublime-settings,然后通过 *.sublime-menu 配置一个用于访问该配置文件的路径,这样就确保我们访问的配置文件只有一个。

读取配置信息

settings = sublime.load_settings('GenerateFolderOfString.sublime-settings')
# 读取start_level
settings.get('start_level')
# 设置start_level为5
settings.set('start_level', 5)

*.sublime-menu

随便我们一味着推荐用快捷键,但设置相应的菜单也是必须的,就拿上面的配置信息文件,我们需要给他一个配置入口,否则还得去找包文件,好不蛋疼。

(type).sublime-menu,其中 type 有效类型包括:

  • Main:菜单栏。
  • Context:右击菜单栏。

首先 Main.sublime-menu 创建一个入口:

[{  
    "id": "preferences", "children":[{
        "id": "package-settings",
        "children": [{
            "caption": "Generate Folder Of String",
            "children": [{
                "caption": "Settings",
                "command": "generate_folder_of_string_set_settings"
            }]
        }]
    }]
}] 

其次创建 generate_folder_of_string_set_settings 命令:

class GenerateFolderOfStringSetSettingsCommand(sublime_plugin.TextCommand):
  def run(self, edit):
    self.view.window().open_file(PLUGIN_FOLDER + "/" + SETTINGS_FILE)

这样我们可以通过 Preferences-Package Settings-Generate Folder Of String-Settings 打开配置文件。

总结

其实 sublime text 开发插件非常简单,只要懂得一点 Python 语言,大可创建一些非常有意思的插件。而以上可能是插件有主要部分,但典型的插件所需要资源可以包括:

  • 构建系统(.sublime-build
  • 快捷键绑定(.sublime-keymap
  • 宏处理(.sublime-macro
  • 菜单(.sublime-menu
  • py(.py
  • 配置文件(.sublime-settings
  • 代码片断(.sublime-snippet
  • 语法定义(.tmLanguage
  • 元数据(.tmPreferences
  • 主题(.sublime-theme

怎么样,非常丰富,所以 sublime text 是一个可以创建世界的编辑器,难怪那么多人喜欢它。

参考文档