最近一段一直使用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. Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)

    这篇文章主要介绍服务器架构. 网络服务需要面对两个挑战. 第一个问题是核心挑战,要编写出能够正确处理请求并构造合适响应的代码. 第二个挑战是如何将网络代码部署到随系统自动启动的Windows服务或者是 ...

  2. C#数据类型 值传递和引用传递

    /// <summary> /// 电脑类 /// </summary> public class Computer { public string Type { get; s ...

  3. JavaScript 函数(方法)

    1 定义 1.1 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 语法: 函数就是包裹在大括号中的代码块,前面使用了关键词 function function 方法名(参数列表){ 代码 ...

  4. window下安装php调试工具xdebug

    1.https://xdebug.org/wizard.php在方框中输入本地phpinfo.php中的内容会提示对应要安装的版本, 2.https://xdebug.org/download.php ...

  5. Echarts获取数据绘制图表

    这次是利用mui框架实现一个手机移动端的项目.基本的框架已经实现,主要来获取数据实现一个图表的展示. 首先引入插件:echarts.js <script src="../resourc ...

  6. 小目标 | DAX高级实践-Power BI与Excel联合应用

    · 适用人群:数据分析专业人士,在数据分析方向需求发展人士 · 应用场景:数据汇报.数据可视化展现.数据建模分析 · 掌握难度:★★★★☆ 本期讲师 DAX高级实践-Power BI与Excel联合应 ...

  7. 激光推送报错:APNs is not available,please check your provisioning profile and certification 和 设置别名问题 app not registed, give up set tag:

    前几天,项目中用到了推送功能,就集成了激光,遇到了2个问题,就给大家分享一下, 第一个问题: 在集成的过程是按照激光的文档做的,但是最后配置完了,一运行,就打印出这么一句话, APNs is not ...

  8. pip和apt-get换源

    pip换源 一下方法对pip和pip3同时起作用 永久换源 运行一下命令: cd ~/.pip 如果提示目录不存在的话,我们要自行创建一个,再进入目录 mkdir ~/.pip cd ~/.pip 在 ...

  9. Python-OpenCV中的resize()函数

    改变图像大小意味着改变尺寸,无论是单独的高或宽,还是两者.也可以按比例调整图像大小. 这里将介绍resize()函数的语法及实例. 语法 函数原型 cv2.resize(src, dsize[, ds ...

  10. 【0624作业】使用Scanner类输入并显示会员卡号

    package com.work0624; /** * 练习题 * 使用Scanner类输入并显示会员卡号 * @author L */ import java.util.Scanner; publi ...