热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sublimeText3插件编写教程_第一课

今天给大家分享一下编写一个SublimeText3插件的流程以及使用插件解决的一个实际问题。(我的新书《Python爬虫开发与项目实战》出版了,大家可以看一下样章)一、开发插件的前提条件

  今天给大家分享一下编写一个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/
 

 


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
author-avatar
24吴梦琦_581
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有