Sublime插件开发——简单的代码模板插件

最近一段一直使用sublime进行golang开发,整体感觉很不错,虽然比不上eclipse之类IDE强大,但是用起来很轻巧便捷,开发golang完全做够了。由于有一部分代码复用率很高,经常要用到,而自己记性特别差也懒得每次自己敲,就希望能够像其他IDE的插件那样能直接插入代码模板,于是就研究了下sublime的插件开发(网上有很多人推荐Gist,但是发现由于网络原因适用Gist插件很慢,每次都要等很长时间)。

装过插件的都知道sublime的插件采用python开发的,所以如果想要开发需要对python有初步的掌握。之所以说初步是因为sublime插件开发实际上是使用python调用subline提供的接口进行开发,就像MFC那样,你并不需要去关注每个动作底层是如何实现的(看了下应该

),只需要调用这些动作接口完成一套操作即可。

入门开发过程这里不再赘述,这里有一篇入门教程已经讲得很好了,在加上官方接口文档,应该还是比较简单的:

下边就主要介绍一下我的这个小插件的开发

一、功能确定

还是老规矩,工欲善其事,必先利其器,我们先来确定下插件的功能。由于第一次开发,所以只要满足基本需求就行,不打算开发的太复杂,就确定了一下功能:

  • 将选中的代码添加到模板库里边
  • 从模板库里边选择指定代码插入到当前位置
  • 可以完成一些变量替换,如将模板中的{{date}}替换成当前日期

二、功能设计

我们来逐一分析这三个功能。首先第一个实现方式有很多,我们可以将所有模板都存在同一个文件中,适用分界符进行取分,但是如果这样的话我们无论删除修改添加时多要把所有模板遍历一遍进行判断,会变得很麻烦。所以可以直接将每个模板存一个文件,文件名直接以模板名命名,这样处理起来非常方便,可能有人说这样岂不是会生成一大堆文件,多了之后查找会不会很慢?我一直觉得任何程序设计要兼顾平衡实现的复杂度和性能才行,而不是一味偏激的只追求一方面。如sublime中我们平时常用的代码模板其实很有限,一般几十个而已(多了估计也记不住),对此直接单独写文件完全没问题,反而如果为了高效再去搞套索引,那就有点杀鸡用宰牛刀了。当然,其实为了方便使用,我们这里按照文件夹分组存放更合理些,不过目前懒得弄了,先这样吧。
    插入代码就很简单了,先遍历模板文件夹读出所有文件名供选择,然后读取对应文件插入到光标位置即可。
    变量替换就更简单了,插入前变量替换即可。当然,为了实现自定义变量需要添加一个配置文件。

三、代码实现

    代码不细讲了,之前的教程文档看过的话下边代码就很简单了。    
    首先看下代码结构:

template  #模板文件夹
codemanage.py #插件代码
Default (XXX).sublime-keymap #快捷键配置文件,XXX值平台
var-map.conf  #替换变量配置文件,key=value

codemanage.py代码如下:

#-*- 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应该可以看出来非常简单。

四、总结

现在虽然功能还不算完善,但是使用起来已经
很方便了。可以看出sublime插件开发还是比较简单的,入门之后就可以很轻松的定制自己的轻量级IDE了。

插件地址:
github

Sublime插件开发——简单的代码模板插件

时间: 2024-10-18 19:54:02

Sublime插件开发——简单的代码模板插件的相关文章

【Chrome】Chrome插件开发(一)插件的简单实现

不同浏览器插件开发比较 Chrome的插件开发起来最简单,总体上看没什么新的技术,开发语言就是javascript,web前端工程师能很快上手. Firefox的插件开发则复杂许多,涉及到环境的搭建和一些WEB以外的技术. IE的插件开发就更复杂了,需要熟悉C++和COM技术,当然还要装微软的Visual Studio. 这里有篇老外写的文章,对比Chrome.Opera和Firefox的插件开发的:http://blog.nparashuram.com/2011/10/writing-brow

Sublime Text 中使用Git插件连接GitHub

sublime Text的另一个强大之处在于它提供了非常丰富的插件,可以帮助程序员来适合大多数语言的开发.这些插件通过它自己的Package Controll(包管理)组件来安装,非常方便.一般常用的插件包括: Zen Coding -- 一种快速编写HTML/CSS代码的方法JQuery package -- jQuery的代码包,jQuery的自动不全功能给jQuery程序员带来极大的方便.JS Format -- JS的格式化工具JsMinifier -- JS的压缩工具,基于Google

给Sublime Text 2安装CTags插件

以Windows操作系统为例介绍安装过程: 安装ctags应用程序. 到CTags的官方网站下载最新版本,解压后将ctags.exe文件放到系统的搜索路径中. 安装Sublime Text 2的Package Control功能. 打开Sublime Text 2,使用快捷键ctrl+`呼出命令行,执行如下命令: importurllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();

图片延迟加载并等比缩放,一个简单的JQuery插件

使用方法: $(".viewArea img").zoom({height:74,width:103}); (function($){    $.fn.zoom = function(settings){                //一些默认配置:                settings = $.extend({                    height:0,                    width:0,                    load

【UI插件】简单的日历插件(下)—— 学习MVC思想

前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么就应该考虑其它UI库的接入问题 这个意思就是,我们的系统中所有UI插件应该有一些统一行为,我们如果希望统一为所有的插件加一点什么东西,需要有位置可加 这个意味着,可能我们所有的插件需要继承至一个抽象的UI类,并且该类提供了通用的几个事件点 ② 上次做的日历插件虽然说是简单,其耦合还是比较严重的(其实

sublime text 3 语法检查插件

第一种方法:有点卡 先去下载对应的开发环境,安装到本地,例如php. 从Pakage Control中安装sublimelinter和sublimelinter-*,*为所用的语言,例如sublimelinter-php,不需要做其他配置,直接即可使用. 这下各种方便,可以丢弃ide了. 第二种方法: 在编译系统增加 { "cmd": ["php","-l","$file"],} 相查就查,轻松+愉快,还不卡界面 sublim

Sublime Text 3 配置 PHPCS 插件

Download php code sniffer addon via Package Control in ST3. Download The php-cs-fixer File From This Website => cs.sensiolabs.org/ (Direct Link => cs.sensiolabs.org/get/php-cs-fixer.phar) Copy Downloaded File To Your php.exe directory (mine is C:/XA

sublime Text 3安装sublimecodeIntel插件

下载:https://github.com/SublimeCodeIntel/SublimeCodeIntel   解压到:  data/pacakges目录 安装 Package Control插件管理  参考:http://www.th7.cn/web/js/201411/68112.shtml 首次使用前也是需要安装的 使用Ctrl+`(Esc键下方)快捷键或者通过View->Show Console菜单打开命令行 将以下代码复制后粘贴到如上图中"<代码粘贴处>"

10秒钟sublime text 3安装SVN插件

注意:此处我提前已经安装了towerSVN,你可能需要提前安装好 towerSVN,之前安装redis之后我才明白,安装插件时安装软件好像 是一个必要的步骤,也就是说安装插件只是让你能在这里使用你已 经安装的这个软件而已--我目前的认识还不是很透彻,猜测应该是 这花样的,请自行理解和百度.Windowds10中sublime text 3安装SVN插件,参考博客: http://www.bbtang.info/script/853.html,找到Windows中安装 SVN插件