今天給你們分享一下編寫一個Sublime Text3 插件的流程以及使用插件解決的一個實際問題。(個人新書《Python爬蟲開發與項目實戰》出版了,你們能夠看一下樣章)html
1、開發插件的前提條件python
二、新建插件linux
1. 經過Tools -> New Plugin...來打開一個初始化的插件編輯文件。web
初始化後的插件有以下內容:正則表達式
2. 經過Preferences -> Browse Packages...打開Packages文件夾,在該文件夾下創建個子文件夾,名字爲你想開發的插件名字,如:defineReplace。windows
回到插件開發的初始化編輯器頁面,經過 ctrl+s 保存這個文件,並放到你創建的子文件夾下,文件名如:defineReplace.py 。api
三、經過 ctrl+` 快捷鍵或者View -> Show Console 打開SublimeText的控制檯。app
並在輸入框執行以下的命令:view.run_command('example')編輯器
執行結果以下,第一行插入了Hello,World!:學習
四、ExampleCommand類名字改成你想要的插件名字,如: definereplaceCommand(將Command以前的名稱先所有小寫,固然還有其餘方式),而後就能夠開發該插件對應的功能了,固然這時候輸入的命令也變成了view.run_command('definereplace'),這樣執行纔有效。
注意:command命令的名稱是根據大寫字符進行拆分的,若是定義的是class DefineRePlaceCommand,那麼輸入的命令是view.run_command('define_re_place'),拆分出來的單詞須要所有小寫,中間如下劃線相鏈接。
五、經過官方的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/