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插件开发——简单的代码模板插件的更多相关文章
- sublime插件开发手记
原:http://blog.hickwu.com/sublime插件开发手记 标题: sublime插件开发手记 时间: 2014-01-05 14:58:02 正文: 插件基本结构 基本插件实现 ...
- Sublime Text3下的markdown插件的安装及配置
Sublime Text3下的markdown插件的安装及配置 安装准备--安装Package Control 安装MarkdownEditing 安装Markdown Preview或OmniMar ...
- Sublime Text 中使用Git插件连接GitHub
sublime Text的另一个强大之处在于它提供了非常丰富的插件,可以帮助程序员来适合大多数语言的开发.这些插件通过它自己的Package Controll(包管理)组件来安装,非常方便.一般常用的 ...
- sublime插件开发教程1
学习sublime插件开发 好处有很多 比方说微信小程序插件 他官方自带的功能太鸡肋了 可以开发个sublime插件 写智能提示 甩掉微信几条街 sublime插件是用python开发的 所以学习s ...
- XMPP即时通讯协议使用(五)——搭建简单的Openfire插件
前言 在开发Openfire插件前需要构建完成服务器源码编辑环境,具体操作步骤请参照Openfire服务器源码编译的了解. 开发简单的Openfire插件 1.已构建完成的Openfire源码结构如下 ...
- 大前端工程化之写一个简单的webpack插件
今天写一个简单的webpack插件,来学习一下webpack插件 webpack插件机制可以使开发者在webpack构建过程中加入自己的行为,来针对自己项目中的一些需求做一些定制化 首先我们得知道一个 ...
- Sublime 3 如何配置SVN插件
在sublime里面安装svn的插件,就可以在sublime的操作界面里面进行相关svn操作,这样就不用再回到文件系统中,进行相关svn的操作. 1.在进入sublime界面后,点击顶部菜单“Pref ...
- 【UI插件】简单的日历插件(下)—— 学习MVC思想
前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么 ...
- Awesomplete - 零依赖的简单自动完成插件
Awesomplete 是一款超轻量级的,可定制的,简单的自动完成插件,零依赖,使用现代化标准构建.你可以简单地添加 awesomplete 样式,让它自动处理(你仍然可以通过指定 HTML 属性配置 ...
随机推荐
- Java选择排序算法
package com.jckb; /**选择排序 * * @author gx *算法原理: *第一个数和后面每个数进行比较,如果大于后面的数就进行位置交换, *第一次比较结束后得到了最小值 */ ...
- P4868 天天和不可描述
http://www.tyvj.cn/p/4868 思路: 本想用站做的,但发现要用很多站同时做,还要来回倒. 我怕超时,所以换了种做法. 因为每遇到一次括号都要把输出方向改变,而括号是成对存在的,所 ...
- 一个很好用的侧滑框架ICSDrawerController实现的 QQ 侧滑及换肤功能
使用ICSDrawerController 实现侧滑功能 在ICSDrawerController 第三方上做了修改实现,QQ 点击头像打开关抽屉头像渐变的效果 - (void)hiddenHeadV ...
- 关于dataTable 生成JSON 树
背景: POSTGRESL + C# + DHTMLX SUIT 一个表生成一个JSON串,这个不是很麻烦: 1.在数据库(postges)中: json_agg(row_to_json(t)) ...
- linux命令行—《命令行快速入门》
pwd print working directory 打印工作目录 hostname my computer's network name 电脑在网络中的名称 mkdir make director ...
- HDU 5489 Removed Interval (LIS,变形)
题意: 给出一个n个元素的序列,要求从中删除任一段长度为L的连续子序列,问删除后的LIS是多少?(n<=10w, L<=n ,元素可能为负) 思路: 如果会O(nlogn)求普通LIS的算 ...
- ABAP,Java和JavaScript的序列化,反序列化
ABAP 1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_xstring和xml_xstring_to_abap实现两种格式的互换. ...
- 2018.4.22 深入理解Java的接口和抽象类
前言 对于面向对象编程来说,抽象是他的一大特征之一.在Java中,可以通过两种形式来体现oop 的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初雪的时候会以为他们可以随意互 ...
- cpp代码调试,调试扑克牌的代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...
- 在无TNS配置时,登录到数据库。
sqlplus user/pw@ip:port/servicename sqlplus user/pwd@tnsname sqlplus user/pwd---aix sqlplus /nolog&g ...