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


  今天給大家分享一下編寫一個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/
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM