Sublime Text 插件开发流程

Sublime Text 是个轻量而强悍的跨平台文本编辑器,它具有很强的扩展能力。Sublime的自动补全,语言定义,代码片段,宏定义,快捷键绑定,鼠标事件绑定和插件。都是通过文件构成的包来实现。一个包就是在'Packages'目录下的一个文件夹,也可以把一个包打成一个zip文件,然后把扩展名改成.sublime-package。Sublime默认捆绑了很多包。大部分的包都是跟特定语言相关的。其中有2个包:Default和User。
Default包里包含了所有标准的键盘绑定,菜单定义,文件配置和一大堆用python写的插件。可以参考这些现成的插件进行开发。
User包总是在最后加载。通过在User包里的自定义文件,允许用户重写所有默认行为。

要写好插件首先要了解 Sublime插件开发API手册;另外,sublime插件需要使用python开发,它内置了python环境。了解这些之后,便可以开始开发自己的插件了。下面我们来一个简单的示例(以SublimeText 2为例):

Sublime Text 2 插件开发示例:

1.通过Tools > New Plugin…菜单就可以自动创建一个插件的样板。

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        # 0 代表文件起始位置,如果要在光标位置可改成:self.view.sel()[0].b
        self.view.insert(edit, 0, "Hello, World!")

#import了2个模块,创建了一个command的类。   
  • 保存的时候要创建一个包。保存弹出框默认是在Packages\User目录下
    我们要创建一个自己的包保存。在Packages目录下创建一个myplugin目录:
    然后把文件保存在myplugin目录下命名为myplugin.py。
    myplugin.py这个文件也可以是其它名字,但必须要.py文件后缀,最好跟插件目录的名称一致。

2.打开sublime的控制台 ctrl+`。这其实就是一个Python控制台,可以在里面运行python代码。在控制台输入:
view.run_command('example')
就可以看到"Hello World"被插入在当前编辑文件的开头。

  • sublime给插件提供了3中类型的command.
    -Text Commands提供了对当前View对象(就是正在编辑的文件)内容的访问。
    -Window Commands提供里对当前编辑器Window对象的引用。
    -Application Commands不提供对任何window或者文件的引用,而且也很少用到。

sublime会把所有继承自sublime_plugin(TextCommand,WindowCommand,ApplicationCommand)
的类都去掉Command后缀,然后把驼峰格式转换成下划线格式,当做command的名称

3.为了方便使用插件,还需要给它定义一个快捷键。在我们的插件目录下,创建:
Default (Windows).sublime-keymap、Default (Linux).sublime-keymap和Default (OSX).sublime-keymap这3个文件,它们分别对应的不同平台。
如果我们是windows系统,那么打开刚才所创建的Default (Windows).sublime-keymap文件,输入:

[
    {"keys": ["F12"], "command": "example"}
]
  • 现在只要按F12就可以在当前编辑文件的开头插入"Hello, World!", 如果需要传入参数就要加一个 args,现在我们改下插件代码,插入"Hello, World!"之后让它自动换行:
import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    #接收一个参数 char ,拼接到 "Hello, World!" 后面
    def run(self, edit, char):
        self.view.insert(edit, 0, "Hello, World!" + char)

#key-bindings 改成:
[
    // 这里我们传了一个换行符过去,args中参数的命名要和插件代码中接收的参数名一致。否则会出错
    {"keys": ["F12"], "command": "example","args":{"char": "\n"}}
]

  • 现在按 F12之后每插入一行"Hello, World!" 都会自动换行。调试时可以打开python控制台【ctrl + `】,如果出错可以看到信息。

修改菜单

sublime有个很爽的事就是通过创建 .sublime-menu文件就可以修改菜单。配置文件需要根据要修改的菜单类型来命名:
Main.sublime-menu 控制了程序的主菜单
Side Bar.sublime-menu 控制侧边栏文件或者目录的右键菜单
Context.sublime-menu 控制处于编辑状态的文件右键菜单

#下面在 Edit 的菜单里添加一个菜单项。
[
    {
        "id": "edit", 
        "children": 
        [ 
            {"id": "wrap"}, 
            { "command": "example" ,"args":{"char":"\n"}} 
        ] 
    } 
]
*注意这里的id的就一个已经存在的菜单结构。
#或者我们可以自己添加一列菜单列表:
[   
    {
        "caption": "babybus",
        // 键盘访问键
        "mnemonic": "x",
        "id": "bb",
        "children":
        [
            { "command": "example", "args":{"char":"\n"}, "caption": "HelloWorld"},  
        ]
    }
]
* 之后sublime上会多出一个名为"babybus"的菜单选项卡,鼠标点击之后底下会出现一个"HelloWorld" 菜单和设定的快捷键:

Paste_Image.png

插件安装

Sublime支持zip文件或者一个包目录来分享插件包。把包目录打包成一个zip文件,
然后把后缀改成.sublime-package,把这个文件放到Sublime Text 2安装目录下的【Installed Packages目录】重启sublime就安装完成了。


除了 Tools 下的 New Plugin 外,还有一个 New Snippet, 它的作用是保存一些经常使用的代码块,然后在编辑器中只要输入触发条件的字符+TAB键,便可自动补全代码块。

示例(js 代码的注释部分):

<snippet>
    <content><![CDATA[
/**
 *${1:function Instructions} 
 *@parames   ${2:parame name}    [description]
 *@return    ${3:return value}   [description]
 *@author    ${4:Name}   <${5:123456789}@qq.com>
 */
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>/**</tabTrigger>
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>source.js</scope>

    <description>/**</description>
</snippet>

#结构说明:

<snippet>
    <content><![CDATA[ 你需要插入的代码片段${1:name} ]]></content>

    可选:快捷键,利用Tab自动补全代码的功能 
    <tabTrigger>/**</tabTrigger>

    可选:使用范围,不填写代表对所有文件有效。附:source.css和test.html分别对应不同文件。 
    <scope>source.js</scope>
    
    可选:在snippet菜单中的显示说明(支持中文)。如果不定义,菜单则显示当前文件的文件名。 
    <description>My Fancy Snippet</description>
</snippet>

${1:name}表示代码插入后,光标所停留的位置,可同时插入多个。其中:name为自定义参数(可选)。
${2}表示代码插入后,按Tab键,光标会根据顺序跳转到相应位置(以此类推)。
  • 创建文件 filename.sublime-snippet 保存以上代码,放入myplugin 文件夹; 在 .js 文件中输入 /** 之后按 TAB键,便可自动生成一段注释!

自动提示:

  • Sublime支持很多种语言的自动提示功能,这里面我们来介绍一下如何对javascript代码进行自动语法提示!

1.创建一个 js.sublime-completions 文件,输入一下内容:

{  
    // 这里需要根据不同语言进行修改后缀,这里是 .js,如果是其他语言只要把js改成例如 lua、php等
    "scope": "source.js - keyword.control.js - constant.language.js - string",

    "completions":
    [
        # 一些会出现自动提示的单词
        "if", "else", "return", "false", "true", "break",   
        #输入fn 时会出现 fn-function的自动提示选项
        { "trigger": "fn-function", "contents": "function ${1:fuction_name}() {\n   //${2:to-do}\n}" }        
    ]
}
  • 将 js.sublime-completions 文件保存至 myplugin 目录, 在 .js 文件中输入 fn 时会出现 fn-function的自动提示选项,点击选项会自动生成一个空函数(按Tab键光标会依次跳转并选中 function_name 和 to-do):
 function function_name() {
    //to-do
}

  • Sublime Text 2 的插件开发差不多就是这样。简单的功能我们可以自己动手实现,如果需要开发一些比较复杂功能的插件就需要多熟悉 sublime 插件的 API了,在Packages目录下的Defualt文件夹也有很多插件的例子,值得参考,例如:
  • Packages/Default/duplicate_line.py:复制一行或者单词
  • Packages/Default/goto_line.py:提示输入,定位到行
  • Packages/Default/font.py:读取设置,调整字体
  • Packages/Default/mark.py:侧边栏添加图标
  • Packages/Default/trim_trailing_whitespace.py:保存前,去掉尾部空格
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容