让sublime可以和visual studio一样自动在运算符前后添加空格的插件
用过vs的人都知道,vs会自动在代码中运算符的前后加空格,比如 i=1; 换行后会自动变成i = 1;
开始觉得这个挺烦的,后来习惯了,发现这个功能还是挺好的,然代码更清晰.
最近换了sublimetext3,也想有类似功能,找了好久,没有发现很满意的,于是就自己动手了
代码很简单
使用方法(仅限于sublimetext3, 2的话没试过):
在sublimetext3根目录的Data/Packages目录下见一个叫InsertSpace的目录
InsertSpace目录下建一个文件InsertSpace.py, 把InsertSpace的代码复制下来在粘贴到这个文件
然后复制键绑定的代码,粘贴到键绑定文件中
OK
注意:这个键绑定只在c,c++,py,cs文件中起作用,我是用来写c的,所以只做了c运算符
要在其他文件中起作用,修改键绑定代码中:
{ “key”: “selector”, ……
行,加入相应的文件scope名即可,其他代码文件运算符可能不一样,要做相应修改
insertSpace.py
import sublime, sublime_plugin
req_single_op_all = '(([\+\-\*/%=<>\|&\^\?]|(<<)|(>>))(=)|(!=))|((?<=[\w ])((<<)|(>>)|(&&)|(\|\|)|[\+\-\*/%=<>\|&\^\?])(?=[\w ]))'
#这个正则表达式匹配:
#+ - * / % = < > | & ^ ? << >> && || != += -= *= /= %= &= ^= |= <<= >>=
reg_tri_op = '\?[\w ]*:'
#三目运算符?:,需要特殊处理,因为':'号在switc case语句中前后不需要加空格
reg_comma = '(,|;)(?=[\w])'
#','';'运算符,需要特殊处理,因为一般','';'前面不加空格,而后面加空格
char_to_ins = ' '
class OpUnit:
subplg = None
subedit = None
def __init__(self, regex, ins_func):
self.regex = regex
self.ins_func = ins_func
#对于一般的运算符,前后都要加空格
@staticmethod
def singleOpInsert(begin, end):
view = OpUnit.subplg.view
edit = OpUnit.subedit
if view.substr(begin - 1) != char_to_ins:
view.insert(edit, begin, char_to_ins)
if view.substr(end + 1) != char_to_ins:
view.insert(edit, end + 1, char_to_ins)
elif view.substr(end) != char_to_ins:
view.insert(edit, end, char_to_ins)
#对于三目运算符,?号前后不加空格(因为已经在匹配普通运算符时加了空格),':'号前后才加空格
@staticmethod
def triOpInsert(begin, end):
view = OpUnit.subplg.view
edit = OpUnit.subedit
if view.substr(end - 2) != char_to_ins:
view.insert(edit, end - 1, char_to_ins)
if view.substr(end + 1) != char_to_ins:
view.insert(edit, end + 1, char_to_ins)
elif view.substr(end) != char_to_ins:
view.insert(edit, end, char_to_ins)
#对于','';'运算符,只在后面加空格
@staticmethod
def commaOpInsert(begin, end):
view = OpUnit.subplg.view
edit = OpUnit.subedit
if view.substr(end) != char_to_ins:
view.insert(edit, end, char_to_ins)
op_units = (OpUnit(req_single_op_all, OpUnit.singleOpInsert),
OpUnit(reg_tri_op, OpUnit.triOpInsert),
OpUnit(reg_comma, OpUnit.commaOpInsert))
class InsertSpaceCommand(sublime_plugin.TextCommand):
def run(self, edit):
cur_region = self.view.sel()[0]
(cur_row,cur_col) = self.view.rowcol(cur_region.end()) #获得当前光标所在位置的行列
OpUnit.subplg = self
OpUnit.subedit = edit
for op in op_units:
regex = op.regex
op_func = op.ins_func
#find函数会找到start_pos后第一个匹配正则表达式的region,
start_pos = self.view.text_point(cur_row , 0)
matched_region = self.view.find(regex, start_pos)
(row, col) = self.view.rowcol(matched_region.end())
while row == cur_row: #如果匹配到的文本已经不再当前行,则不再匹配
begin = matched_region.begin()
end = matched_region.end()
if begin < 0 or end < 0:
break;
op_func(begin,end)
start_pos = end + 1
matched_region = self.view.find(regex, start_pos)
(row, col) = self.view.rowcol(matched_region.end())
self.view.run_command("insert", {"characters": "\n"})
#最后需要插入一个换行符, 因为这是与enter键绑定的,它覆盖了默认的一个enter键绑定,所以要手动插入换行
按键绑定
{ "keys": ["enter"], "command": "insert_space", "context":
[
{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
{ "key": "following_text", "operator": "not_regex_contains", "operand": "^\\}", "match_all": true },
{ "key": "selector", "operator": "equal", "operand": "(source.c, source.c++, source.python, source.cs)", "match_all": true },
{ "key": "panel_has_focus", "operator": "not_equal", "operand": true},
{ "key": "auto_complete_visible", "operator": "equal", "operand": false},
]
},
让sublime可以和visual studio一样自动在运算符前后添加空格的插件的更多相关文章
- Visual Studio 20**自动添加头部注释信息
关于Visual Studio 20**自动添加头部注释信息 作为一个万年潜水党,不关这一篇文章技术含量如何,也算是一个好的开始吧. 在日常的开发中我们经常需要为类库添加注释和版权等信息,这样 ...
- visual studio 2015将已有项目添加到码云(gitee)
visual studio 2015将已有项目添加到码云的步骤包括:gitee新建项目.清空项目及VS发布项目 1.gitee新建项目 2.清空项目 清空项目则会将vs项目的master分支发布到gi ...
- Visual Studio 2012自动添加注释(如版权信息等)
转自:http://blog.163.com/guohuan88328@126/blog/static/69430778201381553150156/ 如何使用Visual Studio 2012给 ...
- (转) bicabo Visual Studio 2012自动添加注释(如版权信息等)
如何使用Visual Studio 2012给程序文件的头部自动添加如下的注释? /********************************************************** ...
- Visual Studio 2012自动添加注释(如版权信息等)
http://blog.csdn.net/jiejiaozhufu/article/details/16357721注释宏的原码 /********************************** ...
- 关于Visual Studio 20**自动添加头部注释信息
作为一个万年潜水党,不管这一篇文章技术含量如何,也算是一个好的开始吧. 在日常的开发中我们经常需要为类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们 ...
- 关于Visual Studio 2010自动添加头部注释信息
作为一个万年潜水党,不关这一篇文章技术含量如何,也算是一个好的开始吧. 在日常的开发中我们经常需要为类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们 ...
- Visual Studio 2010自动添加头部注释信息
在日常的开发中我们经常需要为我们的类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们可以把这些信息保存在Visual Studio 2010类库模版文件里 ...
- Visual Studio常用小技巧一:代码段+快捷键+插件=效率
用了visual studio 5年多,也该给自己做下备忘录了.每次进新的组换新的电脑,安装自己熟悉的环境又得重新配置,不做些备忘老会忘记一些东西.工具用的好,效率自然翻倍. 1,代码段 在Visua ...
随机推荐
- LiveSwitch白皮书
https://www.frozenmountain.com/media/1224/frozen-mountain-software-liveswitch-white-paper.pdf —————— ...
- 集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误。
集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误. 解决的方法是添加类型的判断. LinkedList接口(在代码的使用过程中 ...
- 外部访问docker容器(docker run -p/-P 指令)
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P(大写) 或 -p (小写) 参数来指定端口映射. (1)当使用 -P 标记时,Docker 会随机映射一个 49000~4990 ...
- a,abbr,address,area,article, aside, audio标签文档
<a>标签 download属性 <!-- 下载hello.txt --> <a href="test.txt" download="hel ...
- SQUAD的rnet复现踩坑记
在港科大rnet(https://github.com/HKUST-KnowComp/R-Net) 实现的基础上做了复现 采用melt框架训练,原因是港科大实现在工程上不是很完美,包括固定了batch ...
- linux下vi或vim操作Found a swap file by the name的原因及解决方法
在linux下用vi或vim打开Test.java文件时 [root@localhost tmp]# vi Test.java出现了如下信息: E325: ATTENTION Found a s ...
- Oracle 行列转置
两种简单的行列转置 1.固定列数的行列转换如student subject grade--------- ---------- --------student1 语文 80st ...
- Linux下的搜索查找命令的详解(find)
4.find Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项 ...
- Spring Security http标签的use-expressions="true"属性
如果声明为true,那么在access属性要用hasRole()这样写: <intercept-url pattern="/secure/extreme/**" access ...
- Hibernate HQL一对多 在一方的查询
首先说一句:是版本的问题! 在多对多或者多对一,从一中查找多中查询某些语句时容易出现 我写的hql为: from Department as d where d.employees.name='Tom ...