最近一段一直使用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插件开发——简单的代码模板插件的更多相关文章

  1. sublime插件开发手记

    原:http://blog.hickwu.com/sublime插件开发手记   标题: sublime插件开发手记 时间: 2014-01-05 14:58:02 正文: 插件基本结构 基本插件实现 ...

  2. Sublime Text3下的markdown插件的安装及配置

    Sublime Text3下的markdown插件的安装及配置 安装准备--安装Package Control 安装MarkdownEditing 安装Markdown Preview或OmniMar ...

  3. Sublime Text 中使用Git插件连接GitHub

    sublime Text的另一个强大之处在于它提供了非常丰富的插件,可以帮助程序员来适合大多数语言的开发.这些插件通过它自己的Package Controll(包管理)组件来安装,非常方便.一般常用的 ...

  4. sublime插件开发教程1

    学习sublime插件开发 好处有很多 比方说微信小程序插件 他官方自带的功能太鸡肋了 可以开发个sublime插件 写智能提示 甩掉微信几条街 sublime插件是用python开发的  所以学习s ...

  5. XMPP即时通讯协议使用(五)——搭建简单的Openfire插件

    前言 在开发Openfire插件前需要构建完成服务器源码编辑环境,具体操作步骤请参照Openfire服务器源码编译的了解. 开发简单的Openfire插件 1.已构建完成的Openfire源码结构如下 ...

  6. 大前端工程化之写一个简单的webpack插件

    今天写一个简单的webpack插件,来学习一下webpack插件 webpack插件机制可以使开发者在webpack构建过程中加入自己的行为,来针对自己项目中的一些需求做一些定制化 首先我们得知道一个 ...

  7. Sublime 3 如何配置SVN插件

    在sublime里面安装svn的插件,就可以在sublime的操作界面里面进行相关svn操作,这样就不用再回到文件系统中,进行相关svn的操作. 1.在进入sublime界面后,点击顶部菜单“Pref ...

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

    前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么 ...

  9. Awesomplete - 零依赖的简单自动完成插件

    Awesomplete 是一款超轻量级的,可定制的,简单的自动完成插件,零依赖,使用现代化标准构建.你可以简单地添加 awesomplete 样式,让它自动处理(你仍然可以通过指定 HTML 属性配置 ...

随机推荐

  1. php文件缓存数据

    最近在做微信的摇一摇跑马活动,实现原理是用户摇动手机,通过ajax往数据库写入数据(小马跑的步数),然后PC端用过ajax每一秒钟从数据库中调取一次数据(小马跑的步数),然后显示在PC屏幕上,这样就会 ...

  2. Spring Cloud 熔断器

    目录 Spring Cloud 熔断器 Hystrix ribbon中使用hystrix feign中使用hystrix Spring Cloud 熔断器 在微服务架构中,根据业务来拆分成一个个的服务 ...

  3. Vue.js之vue-router路由

    vue学习的一系列,全部来自于表哥---表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 1概述 vue-r ...

  4. rest_framework序列化组件

    一.Django自带的序列化组件  ==>对象序列化成json格式的字符串 from django.core import serializers from django.core import ...

  5. MFC制作简单通讯录程序

    学习c++和MFC一段时间了,苦于没有项目实战,所以自己写了一个简单的简单通讯录程序,以前用c#写简单很多,例程是这本书上的实例,我的第一个winform程序也是从这本书上学的,总结c#写的话更简单, ...

  6. centos上手动安装最新版本ELK

    软件包下载地址:https://www.elastic.co/downloads/elasticsearch 1,安装es #tar zxvf elasticsearch-2.3.4.tar.gz # ...

  7. ZOJ 3469 Food Delivery (区间DP,经典)

    题意: 在x轴上有一家外卖餐馆,有n个顾客站在x轴上不同坐标上且叫了外卖,每个人的脾气不同,每1分钟没有收到外卖就会增加Fi点愤怒值,而外卖小哥的车是有速度的v-1/分钟,问怎样的送餐次序会让所有顾客 ...

  8. 2017乌鲁木齐网络赛 j 题

    题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...

  9. SC || 那些CheckStyle中的错误们

    lab5里给了我们一个checkstyle查代码风格的方法.. 然后 lab4代码 copy一份! 添加checkstyle! 项目 右键 checkstyle!(自信脸) 3s后——7256 war ...

  10. python中yield的用法详解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...