sublime Text3 插件编写教程_第一课
今天给大家分享一下编写一个Sublime Text3 插件的流程以及使用插件解决的一个实际问题。(我的新书《Python爬虫开发与项目实战》出版了,大家可以看一下样章)
一、开发插件的前提条件
- 开发sublime插件用到的是Python语言,因此必须懂Python语言的基础语法。学习Python语言,推荐学习廖雪峰的Python教程(http://www.liaoxuefeng.com/)。
- 编写插件处理文本用到正则表达式的地方非常多,尽量了解正则表达式语法。学习正则表达式,推荐正则表达式30分钟入门教程(http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html)。
二、新建插件
1. 通过Tools -> New Plugin...来打开一个初始化的插件编辑文件。
初始化后的插件有如下内容:
2. 通过Preferences -> Browse Packages...打开Packages文件夹,在该文件夹下建立个子文件夹,名字为你想开发的插件名字,如:defineReplace。
回到插件开发的初始化编辑器页面,通过 ctrl+s 保存这个文件,并放到你建立的子文件夹下,文件名如:defineReplace.py 。
3、通过 ctrl+` 快捷键或者View -> Show Console 打开SublimeText的控制台。
并在输入框执行如下的命令:view.run_command('example')
执行结果如下,第一行插入了Hello,World!:
4、ExampleCommand类名字改为你想要的插件名字,如: definereplaceCommand(将Command之前的名称先全部小写,当然还有其他方式),然后就可以开发该插件对应的功能了,当然这时候输入的命令也变成了view.run_command('definereplace'),这样执行才有效。
注意:command命令的名称是根据大写字符进行拆分的,如果定义的是class DefineRePlaceCommand,那么输入的命令是view.run_command('define_re_place'),拆分出来的单词需要全部小写,中间以下划线相连接。
5、通过官方的API文档查找你需要的接口,文档见:http://www.sublimetext.com/docs/3/api_reference.html
二、编写插件
下面我分享一下我写的一个插件,这个插件的功能是将verilog文件中的define定义,全部替换成真实的值。
将文件中的宏定义替换成真实的值:
下面将我插件的源代码分享一下,并且提供了详细的注释,大家可以对照着API文档,理解我代码的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import sublime, sublime_plugin import re,os class definereplaceCommand(sublime_plugin.TextCommand): def run( self , edit): #找到要替换的文档中include包含的文件,将他们的文件路径添加到一个list中 starts = self .view.find_all( '`include\s+"(.+)"' , 0 ) includes_file = [] #正则表达式匹配include中的文件名称。例如:`include "./define_cpu.v" pattern = '`include\s+"(.+)"' for start in starts: #截取匹配到的字符串 include_str = self .view.substr(sublime.Region(start.a,start.b)) if re.match(pattern,include_str): match_include = re.search(pattern,include_str) include_file = match_include.group( 1 ) includes_file.append(include_file) if len (includes_file) < 1 : return ###然后要做的是打开所有的include文件,并读取文件内容,将里面的define定义存成字典 #获取当前文件的文件路径 file_name = self .view.file_name() file_path = os.path.dirname(file_name) define_value = {} #正则表达式匹配include文件中定义的define的值,例如define_cpu.v中的 #`define P_C_ADDR_1 9'b0110_0000_0 pattern = '`define\s+(\S+)\s+(\S+)\s' for include_file in includes_file: #获取要读取文件的完整路径 file_full_path = os.path.join(file_path,include_file) with open (file_full_path, 'rb' ) as fileReader: content = fileReader.read() try : content = content.decode( 'utf-8' ) except : content = content.decode( 'gbk' ) matchs_def_val = re.findall(pattern,content) print (matchs_def_val) for def_val in matchs_def_val: define = def_val[ 0 ] value = def_val[ 1 ] if len (define.strip()) > 0 and len (value.strip()) > 0 : define_value[define.strip()] = value.strip() ###最后是将打开文档中的define定义全部替换成真实的值 #首先找到文档中引用的宏定义 pattern = '`(\w+)' finds = self .view.find_all(pattern, 0 ) startpoint = 0 for i in range ( len (finds)): start = self .view.find(pattern,startpoint) content = self .view.substr(sublime.Region(start.a,start.b)).replace( '`' ,'') if define_value.get(content)! = None : #找到宏定义的位置,并从存储的define_value字典中查找真实的值,进行替换。 self .view.replace(edit,start,define_value[content]) else : startpoint = start.b |
三、绑定快捷键
在defineReplace文件夹下新建映射文件,文件名是固定的。
这两个文件分别对应着不同的平台windows和linux,当然在Mac平台是Default (OSX).sublime-keymap。文件内容如下:
1 2 3 | [ { "keys" : [ "ctrl+shift+r" ], "command" : "definereplace" } ] |
keys代表对应的快捷键,command代表着要执行的命令。
四、运行效果
运行前:
ctrl+shift+r运行后:
今天的分享就到这里,下一篇继续分析。如果大家觉得还可以呀,记得推荐呦。
欢迎大家支持我公众号:

本文章属于原创作品,欢迎大家转载分享。尊重原创,转载请注明来自:七夜的故事 http://www.cnblogs.com/qiyeboy/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?