sublime插件开发
在写前端代码的时候, vs
虽然有比较完美的智能提示和格式化, 但是字体太大和占用内存太大, 而且比起纯代码编辑器还是卡了一点, 所以一般还是习惯使用sublime
来写html
等前端代码. 但是最近有一点用得很不舒服的就是代码格式化.
sublime
是没有自己的代码格式化的, 需要格式化都需要使用插件来完成, 而我目前使用的有HTML-CSS-JS Prettify
, 格式化出来的效果还是比较好的, 唯一有一点不舒服的就是会有一点点卡顿的感觉, 在js
文件比较大的时候更明显.
而有时候在复制一些代码时, 特别是使用ESLint
格式化的代码, 在粘贴到sublime
里面的时候, 由于ESLint
默认的缩进是2
行, 而项目组里面的代码都是4
行缩进的, 贴进来以后就显得很不协调, 即使是用带格式的粘贴ctrl + shift + v
也不能解决这个问题, 只能默认缩进到当前行, 但是里面的缩进还是2
行. 而每次粘贴完成代码以后使用一次格式化又感觉有点卡和不爽, 所以想自己写个小插件来解决这个问题.
首先新建一个plugins
, 点击Tool -> New Plugin...
会出现一个默认的Hello World
文件, 能发现它的语法是python
. 然后用ctrl + ~
打开控制台, 保存该文件到Packages
下demo
目录, 文件名为demo.py
. 保存的时候就能看到控制台出现提示, reloading plugin ...
, 表示插件读取到了. 既然是python
, 那么测试一下, 发现不支持print 'a'
这种语法可知python
版本为3.x
.
运行方式, 在.py
文件中, 主函数名为xAxBxCommand
, 那么在控制台中输入view.run_command('x_ax_bx')
即可运行该插件. 剩下的就是开发python
了. 打开vs
, 建个python
工程, 写好转换函数, 贴进来就可以使用了.
首先是获取剪切板内容, 查API
可得使用函数sublime.get_clipboard()
即可获取当前剪切板内容. 剩下就是简单的修改字符串函数了.
1 | clipboardStr = sublime.get_clipboard() |
首先是把\t
转换成空格, clipboardStr = clipboardStr.expandtabs(4)
.
然后是把行分割成数组, 这里有个问题是window
中, 行结尾符可能是\r\n
也可能是\n
, 这里处理方法是如果有\r\n
即使用\r\n
做分隔符.
1 | split_symbol = '\n' |
如果当前剪切板只有一行, 那么就直接调用paste_and_indent
(ctrl + shift + v)粘贴即可.
1 | if len(s_list) == 1: |
如果超过一行, 那么先将每行都往前缩进最小的空格数量, 即去掉多余的空格, 按本来的缩进排列, 这里存在一个问题是, 可能在复制的时候第一行是没有复制到空格而是直接复制得代码, 所以需要特殊处理一下.
再计算每行的最小前置空格差, 如果最小相差为2
, 那么说明这段代码的原始tab
占空格为2
个, 否则为4
个. 如果tab
占空格为2
的话, 那么将每行的前置空格数量翻倍即可.
1 | preIndent = 0 |
然后将值设置到剪切板中, 调用paste_and_indent
即可.
1 | sublime.set_clipboard(clipboardStr) |
然后去设置一个快捷键, 建立一个Default (Windows).sublime-keymap
文件, 内容为:
1 | [ |
这里直接覆盖了原始的ctrl + shift + v
命令. command
即PasteWithTabCommand
的驼峰转换小写形式. 再加一个菜单文件Main.sublime-menu
, 内容:
1 | [ |
所有代码见git