Sublime Text 3:利用CTags自动完成自定义函数

喜欢使用 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!")

这里的 sublimesublime_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 对象提供对选定文件/缓冲区的内容的访问。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值