喜欢使用 Sublime Text 的朋友们都知道,Sublime Text 相当于 Linux 上的 Vim,它们都具有很强的可扩展功能,功能多样的同时速度也很快,对于处理小型文件和项目效率特别高,因此如果不是特别复杂的项目,我一般都是用 Sublime Text 编写以及编译的。然而在用 Sublime Text 开发的过程中,我发现了一个问题:Sublime Text 本身的自动完成功能只搜索当前视图中正在编辑文件的函数,当我想用其他文件中自定义的函数时,是没有自动完成功能的,当自定义函数过多时,效率会大大降低,于是我开始寻找具有相关功能的插件。
一开始我用了非常热门的 “SublimeCodeIntel” 插件,试了一下的确非常好用,但是可惜的是,这个插件不支持 C/C++,而且占用的空间非常大,追求简洁轻便的我不得不另辟蹊径。后来又找到一款 “All AutoComplete” 插件,这款插件扩展了 Sublime Text 默认的自动完成功能,可以在当前视图打开的所有文件里面寻找定义的函数和变量,尽管用起来效果不错,但是它的问题也很明显,必须要同时打开多个文件才行,非常不方便,于是我又放弃了。
在 Package Control 上找了许久,也没能找到我想要的插件,于是我开始考虑不如自己写一个这样的插件,刚好借此机会入门 Python。这时我刚好想到能不能利用 CTags,它能把当前项目中的所有自定义函数提取出来,生成 .tags 文件,并提供符号跳转功能,只要提取 .tags 文件里面的信息,用正则匹配,然后添加到 Sublime Text 的自动完成函数中不就行了。为了完成这个插件,我在网上搜索相关信息,找到相关素材并重新构思了一下,同时参考了 All Complete 插件的源码。
需要注意到是,在 Sublime Text 下安装 CTags 的方法这里不会提到,因此麻烦各位自行查询。
插件构思
读取设置,设置中添加的语言禁用插件功能
检测 .tag 文件是否存在,不存在则直接 return
读取当前文件夹中的 .tag 文件
正则匹配函数名
正则匹配函数体
添加到自动完成的接口上
开始编写
新建插件
刚开始接触 Sublime Text 插件的编写,当然需要先了解 Sublime Text 提供的各种接口,为此,我去 Sublime Text 的官网找到了相关文档:How to Create a Sublime Text Plugin,以及 Sublime Text Unofficial Documentation
首先,选择 “Tools -> Developer -> New Plugin” 新建一个最基本的插件文档
import sublime
import sublime_plugin
class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")
这里的 sublime
和 sublime_plugin
是 Sublime 必需的模块,其中具体的类和方法可以参考官方的 API Reference
接着,把这个文件保存到 “Package”(默认的保存位置 “User” 的上一层)的 “CTagsAutoComplete” 文件夹(新建)下,并命名为 “CTagsAutoComplete.py”。尽管命名并没有什么限制,但最好还是以插件的名称来统一命名。
然后回到 Sublime Text 中,通过快捷键 Ctrl+`
进入 Sublime Text 的 Command Console,然后输入 view.run_command('example')
,如果下方显示 “Hello World”,说明插件已经正常加载。
这里之所以直接用 ‘example’,是因为 Command 命令的名称是根据大写字符进行拆分的,例子中的 ExampleCommand 在 Command 中 为 ‘example_command’,直接输入 ‘example’ 也可以访问
文中的术语
Window
:Sublime Text 的当前窗口对象View
:Sublime Text 当前窗口中打开的视图对象Command Palette
:Sublime Text 中通过快捷键Ctrl+Shift+P
打开的交互式列表
确定插件接口类型
Sublime Text 下的插件命令有3种命令类型(都来自于 sublime_plugin 模块):
TextCommand Class:通过
View
对象提供对选定文件/缓冲区的内容的访问。