今天给大家分享一下编写一个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文档,理解我代码的内容:

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/
 

sublime Text3 插件编写教程_第一课的更多相关文章

  1. Sublime Text3 插件安装教程

    链接地址:http://jingyan.baidu.com/article/4d58d541caeeaa9dd4e9c093.html

  2. sublime text3插件使用

    sublime text 使用BUG解决 一.安装emmet.Package Control插件ctrl+shift+p -> install package ->emmet(Zen Co ...

  3. 【】Nessus安全测试插件编写教程

    Nessus安全测试插件编写教程 作者:Renaud Deraison 翻译:nixe0n 1.怎样编写一个高效的Nessus安全测试插件 在Nessus安全测试系统中, 所有的安全测试都是由ness ...

  4. Sublime text3插件安装方法

    一.安装sublime text3插件的方法: 1.Ctrl+~键,调出console,将下面代码复制到底部命令行,回车: import urllib.request,os; pf = 'Packag ...

  5. sublime text3插件安装及使用

    sublime官网下载地址:http://www.sublimetext.com/ 我用的是SubLime text3,插件安装命令地址:https://packagecontrol.io/insta ...

  6. typecho插件编写教程1 - 从HelloWorld说起

    typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...

  7. sublime Text3 插件

    sublime  Text3 插件大全以及使用方法 参考网址: https://www.cnblogs.com/qqing/p/6872195.html

  8. ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...

  9. Sublime Text3 插件收录

    收录常用的Sublime Text3 插件, 方便安装使用,免得每次一个个的搜, 欢迎补充 安装方法直接打开install package 搜索安装 1. Babel 支持react jsx语法 2. ...

随机推荐

  1. C++中的RTTI机制解析

    RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...

  2. Python 前端之JQuery

    查找: 选择器 筛选器 操作: CSS 属性 文本 事件: 优化 扩展: Form表单验证 Ajax: 偷偷发请求 www.php100.com/manual/jquery http://blog.j ...

  3. TJI读书笔记07-初始化

    TJI读书笔记07-初始化 成员初始化 构造方法初始化 初始化块 初始化的顺序 成员初始化 java尽量去保证每个变量在使用前都会得到初始化. 对于方法局部变量,java不会自动初始化他们,如果没有显 ...

  4. dockerfile学习与详解

    1,什么是dockerfile? dockerfile是相当于docker使用的一个脚本,作用是便于实现自定义的镜像image,用语docker build [OPTIONS] PATH ,只需要指定 ...

  5. ajax请求后根据条件进行页面跳转

    $.ajx({ url: "@Url.Action("DetectCorporationCompetencyCreated", "DataBase") ...

  6. 计算机病毒实践汇总二:bufferzone沙盘使用体验

    在尝试学习分析的过程中,判断结论不一定准确,只是一些我自己的思考和探索.敬请批评指正! 1. 安装bufferzone及其简单使用 (1)安装BufferZone BufferZone的msi安装文件 ...

  7. 详解Oracle DELETE和TRUNCATE 的区别(摘)

    语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...

  8. protobuff 配合 libevent 在Linux 和windows 下的使用

    protobuff 配合 libevent 在Linux 和windows 下的使用待补全. libprotobuf.lib libproto-lite.lib libprotoc.lib

  9. 如何在其他电脑上运行VS2005编译的DEBUG版应用程序

    做项目的过程中,遇到这样的问题:在自己的电脑上用VS2005编译好的DEBUG版程序在其它的没有安装VS2005的电脑上没有办法运行,郁闷至极啊. 直 接拷贝文件后,错误信息如下:"This ...

  10. 开源PLM软件Aras详解五 如何让ItemType显示在TOC上

    通过上一边ItemType我们大概了解,那么如何让ItemType显示在左侧的菜单上呢,又如何设置增删查改的权限呢,接下来将为演示. 在上一篇中,我们知道了ItemType的结构图,如下图 那么如何让 ...