共计 4425 个字符,预计需要花费 12 分钟才能阅读完成。
自动写代码机器人,免费开通
丸趣 TV 小编给大家分享一下 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!)
这里的 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 对象提供对选定文件 / 缓冲区的内容的访问。
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 代码补完插件”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!
向 AI 问一下细节
丸趣 TV 网 – 提供最优质的资源集合!