:Schema 校驗(yàn)與 Prettier 格式化配置指南)
Zed 中 JSON / JSONC 的編輯體驗(yàn)Schema 校驗(yàn)與 Prettier 格式化配置指南【免費(fèi)下載鏈接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ze/zed本篇技術(shù)指南聚焦 Zed 編輯器對(duì) JSON 與 JSONC 語(yǔ)言的內(nèi)置支持講解從語(yǔ)法解析、語(yǔ)言服務(wù)器接入、package.json/tsconfig.json自動(dòng) Schema 校驗(yàn)到通過(guò)$schema與settings.json兩種方式為任意 JSON 文件綁定校驗(yàn) Schema以及.jsonc文件使用 Prettier 格式化時(shí)尾逗號(hào)的規(guī)避方案。讀完你可以在 Zed 中為 LSP、Zed 自身配置文件乃至自定義 JSON 格式獲得「編輯器 校驗(yàn) 格式化」的一站式配置能力。JSON 語(yǔ)言支持總覽JSON 支持在 Zed 中開(kāi)箱即用native support不需要安裝任何擴(kuò)展語(yǔ)法解析基于 tree-sitter-json 語(yǔ)法樹(shù)提供高亮、折疊、括號(hào)配對(duì)等編輯能力語(yǔ)言服務(wù)器默認(rèn)接入由 zed-industries 維護(hù)的 json-language-server負(fù)責(zé)校驗(yàn)與格式化。在代碼層面這兩者分別對(duì)應(yīng) Zed 內(nèi)置語(yǔ)言注冊(cè)與 LSP 適配器。查看 crates/languages/src/lib.rs 可以看到內(nèi)置語(yǔ)言表里同時(shí)注冊(cè)了兩種語(yǔ)言名稱LanguageInfo { name: json, adapters: vec![json_lsp_adapter.clone(), node_version_lsp_adapter], ... }, LanguageInfo { name: jsonc, adapters: vec![json_lsp_adapter], ... },注意 JSON 語(yǔ)言額外掛載了node_version_lsp_adapterpackage-version-server它負(fù)責(zé)在編輯package.json這類文件時(shí)提供包版本等補(bǔ)充信息。JSONC允許單行注釋的 JSON 超集Zed 還支持 JSON 的超集JSONCJSON with Comments即在 JSON 文件中允許出現(xiàn)//單行注釋與/* */塊注釋。Zed 自身的大量配置文件如settings.json、keymap.json、tasks.json正是以此形式書寫。在file_types默認(rèn)配置中assets/settings/default.json 將這些常見(jiàn)配置文件默認(rèn)歸入 JSONC 語(yǔ)言file_types: { JSONC: [ **/.zed/*.json, **/.vscode/**/*.json, **/{zed,Zed}/{settings,keymap,tasks,debug}.json, tsconfig*.json ] }因此你可以在這些文件里放心書寫注釋而 Zed 自己的 schema 也會(huì)正確識(shí)別它們見(jiàn)下文「Zed 內(nèi)建 Schema 關(guān)聯(lián)」。注釋的快捷切換在 JSONC 文件中Zed 綁定了注釋切換命令editor::ToggleComments可對(duì)當(dāng)前行或選區(qū)添加/移除注釋macOScmd-/Linux / Windowsctrl-/對(duì)應(yīng)的默認(rèn)鍵位配置可分別在 assets/keymaps/default-macos.jsoncmd-/: [editor::ToggleComments, ...]與 assets/keymaps/default-linux.jsonctrl-/: [editor::ToggleComments, ...]中找到。JSONC 的 Prettier 格式化與尾逗號(hào)規(guī)避當(dāng)你在 Zed 中對(duì)*.jsonc擴(kuò)展名文件執(zhí)行Format Document或開(kāi)啟了format_on_save保存時(shí)自動(dòng)格式化時(shí)Zed 默認(rèn)會(huì)調(diào)用Prettier作為格式化器。默認(rèn)設(shè)置層面JSON與JSONC兩種語(yǔ)言的 formatter 都被允許使用 Prettier見(jiàn) assets/settings/default.json。已知問(wèn)題.jsonc文件的尾逗號(hào)Prettier 上游存在一個(gè)公開(kāi) issue當(dāng)文件擴(kuò)展名為.jsonc時(shí)Prettier 會(huì)錯(cuò)誤地給文件加上尾逗號(hào)。因?yàn)槲捕禾?hào)只對(duì) JSONC / JavaScript 這類語(yǔ)法合法對(duì)嚴(yán)格 JSON 不合法這會(huì)導(dǎo)致 JSONC 文件被「格式化」后反而變得不標(biāo)準(zhǔn)。需要注意的是只有擴(kuò)展名為*.jsonc的文件受影響采用 JSONC 語(yǔ)法但擴(kuò)展名仍為.json的文件例如.zed/settings.json不受影響。規(guī)避方案在.prettierrc中 override在項(xiàng)目根目錄的.prettierrc配置文件中加入如下覆蓋規(guī)則即可讓 Prettier 對(duì).jsonc文件改用json解析器并關(guān)閉尾逗號(hào){ overrides: [ { files: [*.jsonc], options: { parser: json, trailingComma: none } } ] }其中parser: json讓 Prettier 以嚴(yán)格 JSON 方式解析、避免產(chǎn)出注釋或尾逗號(hào)相關(guān)的意外行為trailingComma: none顯式禁止添加尾逗號(hào)。該配置會(huì)隨項(xiàng)目生效覆蓋使用 Zed 內(nèi)置或項(xiàng)目安裝的 Prettier 進(jìn)行格式化時(shí)的默認(rèn)行為。JSON 語(yǔ)言服務(wù)器的接入機(jī)制Zed 內(nèi)置的 json-language-server 來(lái)自zed-industries/json-language-server基于vscode-langservers-extracted中的 VSCode JSON 語(yǔ)言服務(wù)器封裝。其完整接入邏輯位于 crates/languages/src/json.rs服務(wù)器入口位于node_modules/vscode-langservers-extracted/bin/vscode-json-language-server見(jiàn) json.rs由 Zed 通過(guò)內(nèi)置 Node 運(yùn)行時(shí)以 npm 自動(dòng)下載安裝vscode-langservers-extracted包如果你在$PATH中已安裝了vscode-json-language-serverZed 會(huì)優(yōu)先檢測(cè)并復(fù)用它以--stdio參數(shù)啟動(dòng)見(jiàn) json.rs語(yǔ)言服務(wù)器對(duì) JSON 文件同時(shí)開(kāi)啟格式化與校驗(yàn)?zāi)芰Σ⑾蚍?wù)器發(fā)送如下配置見(jiàn) workspace_configuration{ json: { format: { enable: true }, validate: { enable: true }, schemas: [] } }若你配置了 HTTP 代理Zed 還會(huì)把代理設(shè)置透?jìng)鹘o語(yǔ)言服務(wù)器用于遠(yuǎn)程拉取 Schemajson.http.proxy見(jiàn) json.rslanguage_ids將 JSON / JSONC 兩種語(yǔ)言分別映射為 LSP 側(cè)的json/jsonc見(jiàn) json.rs。Zed 內(nèi)建 Schema 關(guān)聯(lián)自動(dòng)校驗(yàn)Zed默認(rèn)開(kāi)箱即用地為package.json與tsconfig.json提供 JSON Schema 校驗(yàn)。這兩份 schema 以內(nèi)嵌資源形式編譯進(jìn)二進(jìn)制tsconfig、package.json的 schema 通過(guò)include_str!從 crates/json_schema_store/src/json_schema_store.rs 中的schemas/tsconfig.json、schemas/package.json載入在組裝文件關(guān)聯(lián)時(shí)Zed 會(huì)無(wú)條件注冊(cè)tsconfig.json、package.json兩條fileMatch規(guī)則見(jiàn) all_schema_file_associations。此外Zed 還為自己生態(tài)內(nèi)的配置類 JSON 文件預(yù)置了 schema 關(guān)聯(lián)例如settings.json、keymap.json、tasks.json、snippets等見(jiàn) json_schema_store.rs編輯這些文件時(shí)同樣能獲得實(shí)時(shí)校驗(yàn)與補(bǔ)全。這也解釋了為什么JSON語(yǔ)言的語(yǔ)言服務(wù)器適配器被標(biāo)記為is_primary_zed_json_schema_adapter見(jiàn) json.rs它是 Zed 自身配置 schema 的一等接入者。除上述內(nèi)建能力外json-language-server 也支持把項(xiàng)目文件中的 JSON Schema 定義、JSON Schema Store 提供的公共 schema或任何可公開(kāi)訪問(wèn) URL 上的 schema 用于 JSON 文件校驗(yàn)。方式一在文件內(nèi)通過(guò)$schema內(nèi)聯(lián)指定 Schema如果你希望跟隨文件本身攜帶 schema 信息適合分發(fā)給他人使用、或文件位置固定可以在 JSON 文件的頂層加入$schema鍵指向你的 schema 文件地址。以配合lua-language-server使用的.luarc.json為例{ $schema: https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json, runtime.version: Lua 5.4 }打開(kāi)該文件后Zed 的 json-language-server 會(huì)拉取該 schema為runtime.version等字段提供校驗(yàn)、補(bǔ)全與懸停文檔。方式二在 settings.json 中按路徑關(guān)聯(lián) Schema當(dāng)你不希望在每個(gè)文件里都寫$schema時(shí)可以在 Zed 的 settings.json 中為lsp→json-language-server→settings配置json.schemas數(shù)組用fileMatch與url的配對(duì)把 schema 批量綁定到匹配的文件路徑上{ lsp: { json-language-server: { settings: { json: { schemas: [ { fileMatch: [config/*.json], url: ./schemas/custom-schema.json }, { fileMatch: [*.config.json], url: ~/global-schemas/shared.json }, { fileMatch: [*/*.luarc.json], url: https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json } ] } } } } }fileMatch支持 glob 通配模式url支持三種形式url 前綴 / 形式解析規(guī)則示例./相對(duì)于工作區(qū)worktree根目錄解析./schemas/custom-schema.json→項(xiàng)目根/schemas/custom-schema.json~/展開(kāi)為你的主目錄home directory~/global-schemas/shared.json→~/. 主目錄/global-schemas/shared.jsonhttps://直接作為遠(yuǎn)程 URL 拉取Schema Store 或其他公共地址路徑解析的具體實(shí)現(xiàn)位于 crates/languages/src/json.rs 的worktree_root函數(shù)中它遍歷 settings 內(nèi)json.schemas數(shù)組把以.或~開(kāi)頭的url統(tǒng)一交給resolve_relative_path解析為絕對(duì)路徑后再發(fā)送給語(yǔ)言服務(wù)器其余形式如完整http(s)://則原樣透?jìng)?。透?jìng)?json-language-server 的全部受支持設(shè)置除了schemas你還可以通過(guò)在 Zed 的 settings.json 中為json-language-server指定任意受支持設(shè)置將其透?jìng)鹘o語(yǔ)言服務(wù)器。例如{ lsp: { json-language-server: { settings: { json: { validate: { enable: true }, format: { enable: true }, schemas: [] } } } } }Zed 會(huì)把你提供的這部分 settings 與自身生成的默認(rèn)配置做深合并參見(jiàn) workspace_configuration 中對(duì)language_server_settings的合并邏輯因此你既可以只補(bǔ)充個(gè)別鍵也可以整體覆蓋默認(rèn)行為。完整的可配置項(xiàng)以 json-language-server 官方 README 的 settings 清單為準(zhǔn)。驗(yàn)證與排查配置是否真正生效可以通過(guò)語(yǔ)言服務(wù)器日志直接觀察 Zed 發(fā)送給 json-language-server 的完整配置。在 Zed 中執(zhí)行命令面板里的dev: open language server logs選擇json-language-server分組下的Server Info即可查看格式化、校驗(yàn)與全部 schema 關(guān)聯(lián)是否按預(yù)期下發(fā)該提示同樣寫在 json.rs 的源碼注釋中。小結(jié)總結(jié)一下在 Zed 中解鎖 JSON / JSONC 完整能力的三條主線開(kāi)箱即用JSON 與 JSONC 均為內(nèi)置語(yǔ)言語(yǔ)法解析、json-language-server自動(dòng)安裝、package.json/tsconfig.json自動(dòng) schema 校驗(yàn)全部默認(rèn)生效JSONC 中可放心使用注釋并按cmd-//ctrl-/快捷切換Schema 綁定需要自定義校驗(yàn)時(shí)單文件用頂層$schema批量場(chǎng)景在 settings.json 中通過(guò)json.schemasfileMatch完成./、~/、https://三類 url 分別解析為工作區(qū)路徑、主目錄路徑與遠(yuǎn)程地址格式化*.jsonc走 Prettier 時(shí)若出現(xiàn)尾逗號(hào)在.prettierrc中以parser: jsontrailingComma: none的 override 規(guī)則規(guī)避即可。延伸閱讀語(yǔ)言服務(wù)器適配器實(shí)現(xiàn)crates/languages/src/json.rsJSON / JSONC 語(yǔ)言注冊(cè)crates/languages/src/lib.rs內(nèi)建 Schema 關(guān)聯(lián)與 Zed 配置類文件 schemacrates/json_schema_store/src/json_schema_store.rsJSONC 默認(rèn)文件類型與格式化允許配置assets/settings/default.json注釋切換默認(rèn)鍵位assets/keymaps/default-linux.json、assets/keymaps/default-macos.json【免費(fèi)下載鏈接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ze/zed創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考