今天給大家分享一下編寫一個(gè)Sublime Text3 插件的流程以及使用插件解決的一個(gè)實(shí)際問(wèn)題宛裕。
(我的新書《Python爬蟲(chóng)開(kāi)發(fā)與項(xiàng)目實(shí)戰(zhàn)》發(fā)布了正驻,大家在這里可以看到樣章)
一谆奥、開(kāi)發(fā)插件的前提條件
開(kāi)發(fā)sublime插件用到的是Python語(yǔ)言哎榴,因此必須懂Python語(yǔ)言的基礎(chǔ)語(yǔ)法琼蚯。學(xué)習(xí)Python語(yǔ)言蜕着,推薦學(xué)習(xí)廖雪峰的Python教程(http://www.liaoxuefeng.com/)谋竖。
編寫插件處理文本用到正則表達(dá)式的地方非常多,盡量了解正則表達(dá)式語(yǔ)法承匣。學(xué)習(xí)正則表達(dá)式蓖乘,推薦正則表達(dá)式30分鐘入門教程(http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html)。
二韧骗、新建插件
1. 通過(guò)Tools -> New Plugin...來(lái)打開(kāi)一個(gè)初始化的插件編輯文件嘉抒。
初始化后的插件有如下內(nèi)容:
2. 通過(guò)Preferences -> Browse Packages...打開(kāi)Packages文件夾,在該文件夾下建立個(gè)子文件夾袍暴,名字為你想開(kāi)發(fā)的插件名字些侍,如:defineReplace。
回到插件開(kāi)發(fā)的初始化編輯器頁(yè)面政模,通過(guò) ctrl+s 保存這個(gè)文件岗宣,并放到你建立的子文件夾下,文件名如:defineReplace.py 淋样。
3耗式、通過(guò) ctrl+` 快捷鍵或者View -> Show Console 打開(kāi)SublimeText的控制臺(tái)。
并在輸入框執(zhí)行如下的命令:view.run_command('example')
執(zhí)行結(jié)果如下习蓬,第一行插入了Hello,World!:
4纽什、ExampleCommand類名字改為你想要的插件名字措嵌,如: definereplaceCommand(將Command之前的名稱先全部小寫躲叼,當(dāng)然還有其他方式),然后就可以開(kāi)發(fā)該插件對(duì)應(yīng)的功能了,當(dāng)然這時(shí)候輸入的命令也變成了view.run_command('definereplace'),這樣執(zhí)行才有效企巢。
注意:command命令的名稱是根據(jù)大寫字符進(jìn)行拆分的枫慷,如果定義的是class DefineRePlaceCommand,那么輸入的命令是view.run_command('define_re_place'),拆分出來(lái)的單詞需要全部小寫,中間以下劃線相連接。
5或听、通過(guò)官方的API文檔查找你需要的接口探孝,文檔見(jiàn):http://www.sublimetext.com/docs/3/api_reference.html
二、編寫插件
下面我分享一下我寫的一個(gè)插件誉裆,這個(gè)插件的功能是將verilog文件中的define定義顿颅,全部替換成真實(shí)的值。
將文件中的宏定義替換成真實(shí)的值:
下面將我插件的源代碼分享一下足丢,并且提供了詳細(xì)的注釋粱腻,大家可以對(duì)照著API文檔,理解我代碼的內(nèi)容:
import sublime, sublime_plugin
import re,os
class definereplaceCommand(sublime_plugin.TextCommand):
def run(self, edit):
#找到要替換的文檔中include包含的文件斩跌,將他們的文件路徑添加到一個(gè)list中
starts = self.view.find_all('`include\s+"(.+)"',0)
includes_file=[]
#正則表達(dá)式匹配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)
print(include_file)
includes_file.append(include_file)
if len(includes_file) < 1:
return
###然后要做的是打開(kāi)所有的include文件,并讀取文件內(nèi)容耀鸦,將里面的define定義存成字典
#獲取當(dāng)前文件的文件路徑
file_name = self.view.file_name()
file_path = os.path.dirname(file_name)
define_value={}
#正則表達(dá)式匹配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)
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()
###最后是將打開(kāi)文檔中的define定義全部替換成真實(shí)的值
#首先找到文檔中引用的宏定義
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:
#找到宏定義的位置,并從存儲(chǔ)的define_value字典中查找真實(shí)的值袖订,進(jìn)行替換氮帐。
self.view.replace(edit,start,define_value[content])
else:
startpoint = start.b
三、綁定快捷鍵
在defineReplace文件夾下新建映射文件洛姑,文件名是固定的揪漩。
這兩個(gè)文件分別對(duì)應(yīng)著不同的平臺(tái)windows和linux,當(dāng)然在Mac平臺(tái)是Default (OSX).sublime-keymap吏口。文件內(nèi)容如下:
[
{ "keys": ["ctrl+shift+r"], "command": "definereplace"}
]
keys代表對(duì)應(yīng)的快捷鍵奄容,command代表著要執(zhí)行的命令。
四产徊、運(yùn)行效果
運(yùn)行前:
ctrl+shift+r運(yùn)行后:
今天的分享就到這里昂勒,下一篇繼續(xù)分析。如果大家覺(jué)得還可以呀舟铜,記得推薦呦戈盈。