Sublime Text3 插件編寫教程_第一課

今天給大家分享一下編寫一個(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é)得還可以呀舟铜,記得推薦呦戈盈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谆刨,隨后出現(xiàn)的幾起案子塘娶,更是在濱河造成了極大的恐慌,老刑警劉巖痊夭,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁岸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡她我,警方通過(guò)查閱死者的電腦和手機(jī)虹曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門迫横,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人酝碳,你說(shuō)我怎么就攤上這事矾踱。” “怎么了疏哗?”我有些...
    開(kāi)封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵呛讲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我返奉,道長(zhǎng)圣蝎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任衡瓶,我火速辦了婚禮徘公,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哮针。我一直安慰自己关面,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布十厢。 她就那樣靜靜地躺著等太,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛮放。 梳的紋絲不亂的頭發(fā)上缩抡,一...
    開(kāi)封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音包颁,去河邊找鬼瞻想。 笑死,一個(gè)胖子當(dāng)著我的面吹牛娩嚼,可吹牛的內(nèi)容都是我干的蘑险。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岳悟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佃迄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贵少,我...
    開(kāi)封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呵俏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后滔灶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體普碎,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年宽气,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了随常。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萄涯,死狀恐怖绪氛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涝影,我是刑警寧澤枣察,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站燃逻,受9級(jí)特大地震影響序目,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伯襟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一猿涨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姆怪,春花似錦叛赚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至溪掀,卻和暖如春事镣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揪胃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工璃哟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喊递。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓沮稚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親册舞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕴掏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容