今天给你们分享一下编写一个Sublime Text3 插件的流程以及使用插件解决的一个实际问题。(个人新书《Python爬虫开发与项目实战》出版了,你们能够看一下样章)html
1、开发插件的前提条件python
二、新建插件linux
1. 经过Tools -> New Plugin...来打开一个初始化的插件编辑文件。web
初始化后的插件有以下内容:正则表达式
2. 经过Preferences -> Browse Packages...打开Packages文件夹,在该文件夹下创建个子文件夹,名字为你想开发的插件名字,如:defineReplace。windows
回到插件开发的初始化编辑器页面,经过 ctrl+s 保存这个文件,并放到你创建的子文件夹下,文件名如:defineReplace.py 。api
三、经过 ctrl+` 快捷键或者View -> Show Console 打开SublimeText的控制台。app
并在输入框执行以下的命令:view.run_command('example')编辑器
执行结果以下,第一行插入了Hello,World!:学习
四、ExampleCommand类名字改成你想要的插件名字,如: definereplaceCommand(将Command以前的名称先所有小写,固然还有其余方式),而后就能够开发该插件对应的功能了,固然这时候输入的命令也变成了view.run_command('definereplace'),这样执行才有效。
注意:command命令的名称是根据大写字符进行拆分的,若是定义的是class DefineRePlaceCommand,那么输入的命令是view.run_command('define_re_place'),拆分出来的单词须要所有小写,中间如下划线相链接。
五、经过官方的API文档查找你须要的接口,文档见:http://www.sublimetext.com/docs/3/api_reference.html
二、编写插件
下面我分享一下我写的一个插件,这个插件的功能是将verilog文件中的define定义,所有替换成真实的值。
将文件中的宏定义替换成真实的值:
下面将我插件的源代码分享一下,而且提供了详细的注释,你们能够对照着API文档,理解我代码的内容:
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。文件内容以下:
[ { "keys": ["ctrl+shift+r"], "command": "definereplace"} ]
keys表明对应的快捷键,command表明着要执行的命令。
四、运行效果
运行前:
ctrl+shift+r运行后:
今天的分享就到这里,下一篇继续分析。若是你们以为还能够呀,记得推荐呦。
欢迎你们支持我公众号:

本文章属于原创做品,欢迎你们转载分享。尊重原创,转载请注明来自:七夜的故事 http://www.cnblogs.com/qiyeboy/