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

69次阅读
没有评论

共计 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 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-07发表,共计4425字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)