前言
最近工作中使用 yapi 做接口定义,其中有 json5 格式定义接口参数和返回值的功能,认为特别方便,相对于在界面填写或 json-schema各字段而言:
- 能够完全实现json 定义数据结构并且包含注释。
- 在对同一个资源的 CRUD 接口中,能灵活复用已定义结构。
在对 json5 编写过程中,经常需要格式化(处理缩进等),普通 json 格式化工具(无论网页版还是 sublime、idea 插件)无法对 json5 标准文档格式化。
但是,搜遍全网 json5格式化的库少之又少,并且基本是对 json5格式的字符串格式化为 json,不能保留注释,不能满足要求。唯一找到的基本满足要求的是rust语言实现的json5format,故利用其命令,实现了 sublime 格式化 json5 的插件——json5。
基本思路即为 sublime 插件逻辑作粘合剂,调用 json5format 命令进行格式化并替换原文。
本人非 Python 技术栈,所以,插件编写基本是用啥查啥,代码也许不够优雅,勿喷。
参考
版本
- sublime 4(build 4087)
- macos Big Sur 11.0.1
其他版本可以尝试,应该没啥兼容性问题。
正文
Mac安装 json5format命令
- clonejson5format 项目
- 构建可执行程序
- mv 到 /usr/local/bin/
- 赋予执行权限
(base) ~ cd ~/RustProject
(base) ~/RustProject git clone https://github.com/google/json5format.git
(base) ~/RustProject cd json5format
(base) ~/RustProject/json5format cargo build --examples
Compiling json5format v0.1.4 (/Users/wangbaoshan/RustProject/json5format)
Finished dev [unoptimized + debuginfo] target(s) in 3.15s
(base) ~/RustProject/json5format mv ./target/debug/examples/formatjson5 /usr/local/bin/
sublime安装 json5 插件
新建用户自定义插件
保存以下代码为 json5.py 文件,并放到 /Users/yourusername/Library/Application Support/Sublime Text/Packages/User/ 下:
import sublime
import sublime_plugin
import os
class Json5Command(sublime_plugin.TextCommand):
def run(self, edit):
# 获取全文
contents = self.view.substr(sublime.Region(0, self.view.size()))
# 创建中间文件夹
os.mkdir('/var/tmp/json5/')
# 创建中间文件并写入全文
fw = open('/var/tmp/json5/format.json','w')
fw.write(contents)
fw.close()
# 调用format命令格式化 json5 并且重写中间文件
os.system("formatjson5 -r /var/tmp/json5/format.json")
# 读取中间文件
fr = open('/var/tmp/json5/format.json','r')
formatContents = fr.read()
# 删除中间文件
os.remove('/var/tmp/json5/format.json')
# 删除中间文件夹
os.rmdir('/var/tmp/json5/')
# 删除全文
self.view.erase(edit, sublime.Region(0, self.view.size()))
# 插入全文
self.view.insert(edit, 0, formatContents)
设置快捷键
sublime窗口下:首选项-快捷键设置
在调出窗口右侧文件填写如下文本(可以设置你自己想要的快捷键)保存即可。
[
{ "keys": ["ctrl+command+5"], "command": "json5" },
]
使用
在正在编辑的tab 下,按ctrl+command+5对正在编辑的 json5 进行格式化,效果如下:
插件逻辑非常简单,容错能力非常有限
TODO
- 修改json5format源码,保留keyName 双引号。