Sublime插件開發——簡單的代碼模板插件

    最近一段一直使用sublime進行golang開發,總體感受很不錯,雖然比不上eclipse之類IDE強大,可是用起來很輕巧便捷,開發golang徹底作夠了。因爲有一部分代碼複用率很高,常常要用到,而本身記性特別差也懶得每次本身敲,就但願可以像其餘IDE的插件那樣能直接插入代碼模板,因而就研究了下sublime的插件開發(網上有不少人推薦Gist,可是發現因爲網絡緣由適用Gist插件很慢,每次都要等很長時間)。
    裝過插件的都知道sublime的插件採用python開發的,因此若是想要開發須要對python有初步的掌握。之因此說初步是由於sublime插件開發其實是使用python調用subline提供的接口進行開發,就像MFC那樣,你並不須要去關注每一個動做底層是如何實現的(看了下應該 ),只須要調用這些動做接口完成一套操做便可。
    入門開發過程這裏再也不贅述,這裏有一篇入門教程已經講得很好了,在加上官方接口文檔,應該仍是比較簡單的:
    下邊就主要介紹一下個人這個小插件的開發

1、功能肯定

    仍是老規矩,工欲善其事,必先利其器,咱們先來肯定下插件的功能。因爲第一次開發,因此只要知足基本需求就行,不打算開發的太複雜,就肯定了一下功能:
  • 將選中的代碼添加到模板庫裏邊
  • 從模板庫裏邊選擇指定代碼插入到當前位置
  • 能夠完成一些變量替換,如將模板中的{{date}}替換成當前日期


2、功能設計

    咱們來逐一分析這三個功能。首先第一個實現方式有不少,咱們能夠將全部模板都存在同一個文件中,適用分界符進行取分,可是若是這樣的話咱們不管刪除修改添加時多要把全部模板遍歷一遍進行判斷,會變得很麻煩。因此能夠直接將每一個模板存一個文件,文件名直接以模板名命名,這樣處理起來很是方便,可能有人說這樣豈不是會生成一大堆文件,多了以後查找會不會很慢?我一直以爲任何程序設計要兼顧平衡實現的複雜度和性能才行,而不是一味偏激的只追求一方面。如sublime中咱們平時經常使用的代碼模板其實頗有限,通常幾十個而已(多了估計也記不住),對此直接單獨寫文件徹底沒問題,反而若是爲了高效再去搞套索引,那就有點殺雞用宰牛刀了。固然,其實爲了方便使用,咱們這裏按照文件夾分組存放更合理些,不過目前懶得弄了,先這樣吧。
    插入代碼就很簡單了,先遍歷模板文件夾讀出全部文件名供選擇,而後讀取對應文件插入到光標位置便可。
    變量替換就更簡單了,插入前變量替換便可。固然,爲了實現自定義變量須要添加一個配置文件。

3、代碼實現

    代碼不細講了,以前的教程文檔看過的話下邊代碼就很簡單了。    
    首先看下代碼結構:


template  #模板文件夾
codemanage.py #插件代碼
Default (XXX).sublime-keymap #快捷鍵配置文件,XXX值平臺
var-map.conf  #替換變量配置文件,key=value

    codemanage.py代碼以下:
html

#-*- coding: UTF-8 -*-
import sublime, sublime_plugin
import os
import os.path
import time
import sys

reload(sys)   
sys.setdefaultencoding('utf8')

#寫入模板,若是是新模板按照模板名建立一個文件,若是是舊模板則覆蓋寫原文件
class CodeTplAddCommand(sublime_plugin.TextCommand):
	def run(self,edit):
		#獲取當前選中內容
		selstr = ''
		sels = self.view.sel()
		for sel in sels:
			value = self.view.substr(sel)
			if value == '':
				continue
			selstr = selstr + value + '\n'

		if selstr == '':
			sublime.message_dialog("Select content is empty.")
			return

		def on_done(name):
			if name=='':
				sublime.message_dialog("Template name is empty.")
				return
			#寫入文件
			path = os.path.join(sublime.packages_path(),"CodeManage","template",name+".ctpl")
			try:
				f = open(path, 'w')
				print selstr
				selstr.encode("gbk")
				f.write(selstr)
			except Exception, e:
				print e
				sublime.message_dialog("Write template file fail:"+str(e))
				return
			finally:
				f.close()

		def on_change(name):
			return

		def on_cancel():
			return

		#輸入模板名
		self.view.window().show_input_panel('Plese input the code template name','template',on_done,on_change,on_cancel)

#將對應模板插入當前位置
class CodeTplInsertCommand(sublime_plugin.TextCommand):
	def run(self,edit):
		filenames = []
		rootdir= os.path.join(sublime.packages_path(),"CodeManage","template")
		for p,d,files in os.walk(rootdir):
			filenames = files

		def on_sel_done(selvalue):
			if selvalue==-1:
				return
			filename = filenames[selvalue]
			content = ''

			if filename=='':
				sublime.message_dialog("Template is not exist.")
				return
			path = os.path.join(sublime.packages_path(),"CodeManage","template",filename)

			try:
				f =  open(path, 'r')
				content = f.read()
				if content=='':
					sublime.message_dialog("Template file is empty")
					return
				content = ReplaceVar(content)
			except Exception, e:
				sublime.message_dialog("Open template file fail:"+str(e))
				return
			finally:
				f.close()
			
			#把內容插入當前位置
			sels = self.view.sel()
			for sel in sels:
				self.view.insert(edit,sel.begin(),content)

		#打開選擇列表
		self.view.window().show_quick_panel(filenames,on_sel_done)

#處理一些模板替換變量
#將模板中{{XXX}}的變量替換成配置文件中的變量({{data}}等信息直接替換)
def ReplaceVar(content):
	varmap = {
		'{{date}}':time.strftime('%Y-%m-%d',time.localtime(time.time()))
	}
	#讀取變量
	try:
		path = os.path.join(sublime.packages_path(),"CodeManage","var-map.conf")
		f =  open(path, 'r')
		for line in f.readlines():
			if line=='':
				continue
			value = line.split("=")
			varmap["{{"+value[0]+"}}"] = value[1]
	except Exception, e:
		sublime.message_dialog("Open var-map file fail:"+str(e))
		return
	finally:
		f.close()
	
	for (k,v) in varmap.items():
		content = content.replace(k,v)
	return content
    懂python應該能夠看出來很是簡單。

4、總結

     如今雖然功能還不算完善,可是使用起來已經 很方便了。能夠看出sublime插件開發仍是比較簡單的,入門以後就能夠很輕鬆的定製本身的輕量級IDE了。
    插件地址: github
相關文章
相關標籤/搜索