前言
最近工作中使用 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 雙引號。
