sublime Text3 插件编写教程_第一课



 今天给大家分享一下编写一个Sublime Text3 插件的流程以及使用插件解决的一个实际问题。

 

  一、开发插件的前提条件

  • 开发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文档,理解我代码的内容:


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运行后:

  

 

  

  今天的分享就到这里,下一篇继续分析。如果大家觉得还可以呀,记得推荐呦。

欢迎大家支持我公众号:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值