千家信息网

linux中怎么利用CTags开发一个Sublime Text代码补完插件

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,小编给大家分享一下linux中怎么利用CTags开发一个Sublime Text代码补完插件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一
千家信息网最后更新 2025年12月02日linux中怎么利用CTags开发一个Sublime Text代码补完插件

小编给大家分享一下linux中怎么利用CTags开发一个Sublime Text代码补完插件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

开始编写

新建插件

刚开始接触 Sublime Text 插件的编写,当然需要先了解 Sublime Text 提供的各种接口,为此,我去 Sublime Text 的官网找到了相关文档:How to Create a Sublime Text Plugin,以及 Sublime Text Unofficial Documentation。

首先,在 Sublime Text 中选择 "Tools -> Developer -> New Plugin" 新建一个最基本的插件文档:

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

  • WindowCommand Class:通过 Window 对象提供当前窗口的引用

  • ApplicationCommand Class:这个类没有引用任何特定窗口或文件/缓冲区,因此很少使用

2 种事件监听类型:

  • EventListener Class:监听 Sublime Text 中各种事件并执行一次命令

  • ViewEventListener Class:为 EventListener 提供类似事件处理的类,但绑定到特定的 view。

2 种输入处理程序:

  • TextInputHandler Class:可用于接受 Command Palette 中的文本输入。

  • ListInputHandler Class:可用于接受来自 Command Palette 中列表项的选择输入。

因为我要实现的功能比较简单,只需要监听输入事件并触发自动完成功能,因此需要用到 EventListener Class。在该类下面找到了 on_query_completions 方法用来处理触发自动完成时执行的命令。接着修改一下刚才的代码:

import sublimeimport sublime_plugin class CTagsAutoComplete(sublime_plugin.EventListener):    def on_query_completions(self, view, prefix, locations):
  • view:当前视图

  • prefix:触发自动完成时输入的文字

  • locations: 触发自动完成时输入在缓存区中的位置,可以通过这个参数判断语言来执行不同命令

  • 返回类型:

    • return None

    • return [["trigger \t hint", "contents"]...],其中 \t hint 为可选内容,给自动完成的函数名称添加一个提示

    • return (results, flag),其中 results 是包含自动完成语句的 list,如上;flag 是一个额外参数,可用来控制是否显示 Sublime Text 自带的自动完成功能

读取 CTags 文件

为了读取 .tag 文件,首先得判断当前项目是否打开,同时 .tag 文件是否存在,然后读取 .tag 文件中的所有内容:

import sublimeimport sublime_pluginimport osimport re class CTagsAutoComplete(sublime_plugin.EventListener):    def on_query_completions(self, view, prefix, locations):        results = []         ctags_paths = [folder + '\.tags' for folder in view.window().folders()]        ctags_rows  = []         for ctags_path in ctags_paths:            if not is_file_exist(view, ctags_path):                return []            ctags_path = str(ctags_path)            ctags_file = open(ctags_path, encoding = 'utf-8')            ctags_rows += ctags_file.readlines()            ctags_file.close() def is_file_exist(view, file):    if (not view.window().folders() or not os.path.exists(file)):        return False    return True

通过上述操作,即可读取当前项目下所有的 .tag 文件中的内容。

分析 CTags 文件

首先是获取 .tags 文件中,包含 prefix 的行:

for rows in ctags_rows:    target = re.findall('^' + prefix + '.*', rows)

一旦找到,就通过正则表达式对该行数据进行处理:

if target:    matched = re.split('\t', str(target[0]))    trigger = matched[0] # 返回的***个参数,函数名称    trigger += '\t(%s)' % 'CTags' # 给函数名称后加上标识 'CTags'    contents = re.findall(prefix + '[0-9a-zA-Z_]*\(.*\)', str(matched[2])) # 返回的第二个参数,函数的具体定义    if (len(matched) > 1 and contents):        results.append((trigger, contents[0]))        results = list(set(results)) # 去除重复的函数        results.sort() # 排序

处理完成之后就可以返回了,考虑到***只显示 .tags 中的函数,我不需要显示 Sublime Text 自带的自动完成功能(提取当前页面中的变量和函数),因此我的返回结果如下:

return (results, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS)
添加配置文件

考虑到能够关闭插件的功能,因此需要添加一个配置文件,用来指定不开启插件功能的语言,这里我参考了 "All AutoComplete" 的代码:

def plugin_loaded():    global settings    settings = sublime.load_settings('CTagsAutoComplete.sublime-settings') def is_disabled_in(scope):    excluded_scopes = settings.get("exclude_from_completion", [])    for excluded_scope in excluded_scopes:        if scope.find(excluded_scope) != -1:            return True    return False if is_disabled_in(view.scope_name(locations[0])):    return []

这里用到的配置文件需要添加到插件所在的文件夹中,名称为 CTagsAutoComplete.sublime-settings,其内容为:

{    // An array of syntax names to exclude from being autocompleted.    "exclude_from_completion": [        "css",        "html"    ]}
添加设置文件

有了配置文件,还需要在 Sublime Text 的 "Preferences -> Package settings" 下添加相应的设置,同样也是放在插件所在文件夹中,名称为 Main.sublime-menu

[    {        "caption": "Preferences",        "mnemonic": "n",        "id": "preferences",        "children": [            {                "caption": "Package Settings",                "mnemonic": "P",                "id": "package-settings",                "children": [                    {                        "caption": "CTagsAutoComplete",                        "children": [                            {                                "command": "open_file",                                "args": {                                    "file": "${packages}/CTagsAutoComplete/CTagsAutoComplete.sublime-settings"                                },                                "caption": "Settings"                            }                        ]                    }                ]            }        ]    }]

以上是"linux中怎么利用CTags开发一个Sublime Text代码补完插件"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 插件 输入 内容 函数 名称 功能 命令 文件夹 处理 代码 事件 参数 对象 类型 配置 篇文章 参考 监听 开发 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云服务器拿来做啥 部队网络安全形势会议发言 山德希尔数据库 互联网科技需要哪些法律保障 数据库表的最大长度 中国电信 数据库 手机 pg数据库语法区别 国家网络安全办公室主任是谁 暴雪美版服务器怎么下载 银行软件开发难吗 怎么查数据库空间使用情况 上海轩和网络技术是哪个软件 服务器一天用多少电 开源数据库实施工程师 安徽智能软件开发配件 100周年网络安全工作总结报告 西安软件开发前景怎么样 魔兽世界多少个服务器 软件开发能力认证cim 做一个官网买哪种服务器 杭州工业软件开发要求 周星驰配音软件开发 卫生行业数据库安全解决方案 广州直播软件开发中心 金山区高科技软件开发使用方法 如何建数据库保存到桌面 普陀区信息软件开发采购 纬创软件开发部长 我国有全球领先的互联网科技企业 英雄联盟怎么一直无法连接服务器
0