ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 Zed 中配置 Jsonnet 语言支持:安装扩展、语言服务器与 Tanka 导入解析实战指南

在 Zed 中配置 Jsonnet 语言支持:安装扩展、语言服务器与 Tanka 导入解析实战指南 在 Zed 中配置 Jsonnet 语言支持安装扩展、语言服务器与 Tanka 导入解析实战指南【免费下载链接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.项目地址: https://gitcode.com/GitHub_Trending/ze/zedJsonnet 是面向 Kubernetes、Grafana 等场景广泛使用的配置即代码语言而 Zed 通过社区维护的 Jsonnet 扩展提供完整支持由 Tree-sitter 语法树驱动高亮与结构导航由jsonnet-language-server提供补全、诊断、格式化等语义能力。读完本篇你将掌握在 Zed 中启用 Jsonnet 语言支持、通过settings.json的lsp配置块向语言服务器透传工作区参数以及为 Tanka 项目配置resolve_paths_with_tanka让 import 路径正确解析的完整方法。Jsonnet 支持的整体架构Jsonnet 并非 Zed 内置语言在 语言支持总览 中未标注*其能力由社区维护的 Jsonnet 扩展提供。官方文档 Jsonnet 语言页 明确指出该扩展由两部分技术栈构成Tree-sitter语法解析器来自sourcegraph/tree-sitter-jsonnet负责语法高亮、括号匹配、大纲outline等基于语法树的功能Language Server语义后端使用grafana/jsonnet-language-server负责补全、错误诊断、跳转定义、格式化等功能。这与 Zed 的通用语言支持模型完全一致——正如 配置语言支持 所概括的Tree-sitter 处理结构类特性LSP 处理语义类特性。理解这两层分工很重要因为本文后面的配置只作用于语言服务器这一层。从扩展系统内部看一个语言扩展通常由语言元数据config.toml、语法注册extension.toml中的[grammars.xxx]、Tree-sitter 查询highlights.scm等以及语言服务器适配组成详见 语言扩展开发文档。社区扩展narqo/zed-jsonnet正是按照这套机制将 Jsonnet 语言接入 Zed 的。安装 Jsonnet 扩展安装步骤如下打开 Zed 的扩展面板快捷键由zed::Extensions动作触发也可通过菜单栏进入在扩展画廊中搜索Jsonnet找到社区扩展后点击安装安装完成后打开.jsonnet/.libsonnet文件Zed 会自动启动jsonnet-language-server。关于扩展的安装位置扩展安装文档 给出了各平台默认目录Linux 为$XDG_DATA_HOME/zed/extensions或~/.local/share/zed/extensionsmacOS 为~/Library/Application Support/Zed/extensionsWindows 为%LOCALAPPDATA%\Zed\extensions。其中installed子目录存放扩展源码work子目录存放扩展自身下载的语言服务器等运行时文件。提示如果团队希望统一预装扩展可在设置中配置auto_install_extensions参见 全部设置参考 中的对应条目使 Zed 在启动时自动安装指定扩展。当 Jsonnet 扩展被加载后Zed 会按 配置语言支持 中描述的流程自动下载或从PATH中寻找jsonnet-language-server可执行文件并启动它。通过lsp配置块传递语言服务器参数Jsonnet 扩展所依赖的jsonnet-language-server支持自定义配置。这些工作区配置通过settings.json中的lsp设置项传给语言服务器适配器adapter名就是jsonnet-language-server。下面是一个完整的配置示例它让语言服务器借助 tanka一个基于 Jsonnet 的 Kubernetes 配置工具来解析 import 路径{ lsp: { jsonnet-language-server: { settings: { resolve_paths_with_tanka: true } } } }配置要点解读lsp是 Zed 设置中的顶层键其下的子键对应各个语言服务器适配器的名称。由于 Zed 的自动补全会列出所有已识别的 LSP 适配器而不仅是当前语言已启用的那些你在敲jsonnet-language-server时即可获得候选提示settings子键用于承载通过 LSPworkspace/configuration请求下发给服务器的配置。这种机制与initialization_options不同后者只在服务器启动时通过initialize请求发送一次修改后需要重启服务器才能生效而settings允许服务器在运行期间多次主动查询适合存放导入路径解析、格式化偏好这类工作区级配置。关于两层配置机制的区别配置语言支持 中也有专门说明概括如下配置通道下发方式生效时机典型用途initialization_optionsinitialize请求携带一次需重启语言服务器rust-analyzer、clangd 等仅支持此类配置的服务器settingsworkspace/configuration请求按需查询服务器运行期可多次获取tailwindcss-language-server、jsonnet-language-server 等多数服务器binaryZed 进程启动服务器时的命令行重启生效指定替代二进制、附加参数与环境变量resolve_paths_with_tanka让 Tanka 项目 import 解析正确的关键开关settings中唯一核心参数即resolve_paths_with_tanka布尔值。默认情况下jsonnet-language-server按常规方式解析 Jsonnet 的 import/local 路径而 Tanka 项目会在目录结构中引入与普通 Jsonnet 项目不同的 import 寻址约定例如相对某个jsonnetfile.json/ vendor 目录展开引用。当把该开关置为true时语言服务器会改用 Tanka 的 import 解析策略来定位文件从而使跨文件跳转、补全和诊断在 Tanka 工程内保持正确。适用场景包括直接维护 Tanka environments / 库结构、通过tk命令渲染 Kubernetes 清单的仓库依赖 Jsonnet Bundlerjb拉取 vendor 依赖、需要服务器识别 vendor 化 import 的项目对纯 Jsonnet 项目而言保持默认不配置或置false即可。从该选项的语义resolve pathswithtanka可以推断它并不修改 Jsonnet 语言本身的解析规则而是替换路径解析这一环节的实现策略。若你的项目同时使用多种解析约定可以结合 模型行modelines 等方式按文件微调但一般情况下在项目级配置文件中统一打开该开关即可。配置文件放在哪里lsp配置可以写在两类settings.json中用户全局级Linux 为~/.config/zed/settings.json作用于本机所有项目项目级仓库根目录下的.zed/settings.json随项目提交、便于团队共享同一份语言服务器配置正如 配置语言支持 中所举例的放置方式。建议对 Tanka 项目优先使用项目级配置例如在仓库的.zed/settings.json中写入上面的 JSON 片段所有协作者打开该仓库即自动生效。从设置存储看lsp配置的分层合并若想理解为什么用户级与项目级配置都能生效、以及同名键如何覆盖可以查看 Zed 的设置存储实现 crates/settings/src/settings_store.rs。从该文件的结构可以看到SettingsStore内部同时维护了default_settings、user_settings、global_settings、extension_settings、server_settings以及以(WorktreeId, RelPath)为键、按工作树局部路径划分的local_settings最终通过多级合并merged_settings得到某个缓冲区实际生效的设置值。这意味着lsp下的配置遵循 Zed 一贯的覆盖语义项目级local设置优先于用户级global设置用户级优先于默认值同一服务器键名下若两侧都写了settings则按上述层级整块替换而非深合并。因此排查配置没生效问题时应确认是否同时在多级配置里写了不同的lsp.jsonnet-language-server内容。另外Zed 要求在lsp中使用嵌套对象而不是点分隔字符串。例如若要表达嵌套键必须写成嵌套 JSON 对象的形式——配置语言支持 中 TypeScript 一例专门强调了 VSCode 风格preferences.strictNullChecks这类点号写法在 Zed 中不被支持。所以对于resolve_paths_with_tanka也要放在settings对象内部、保持扁平的嵌套对象结构。进一步定制二进制路径、环境变量与开关控制lsp配置块还能控制语言服务器的启动方式可参考 配置语言支持 中的binary用法若希望使用系统已安装而非 Zed 自动下载的jsonnet-language-server或者想为其追加启动参数与环境变量可扩展配置{ lsp: { jsonnet-language-server: { binary: { path: /path/to/jsonnet-language-server, arguments: [--log-levelinfo], env: { JSONNET_PATH: /path/to/vendor } }, settings: { resolve_paths_with_tanka: true } } } }其中path指向替代可执行文件arguments为追加的启动参数env注入额外环境变量。需要说明的是binary变更与initialization_options一样在重启语言服务器后才生效例如重新打开文件或重启 Zed。此外若某个大仓库想整体关闭该语言的语义功能仅保留 Tree-sitter 高亮可在languages块中关闭语言服务器{ languages: { Jsonnet: { enable_language_server: false } } }同理若jsonnet-language-server提供格式化能力且你想在保存时自动格式化可把 Jsonnet 的formatter设为language_server并开启format_on_save格式化相关的通用写法同样参考 配置语言支持 与 语言设置参考。小结在 Zed 中使用 Jsonnet 的完整链路可以概括为三件事启用通过扩展画廊安装社区 Jsonnet 扩展让 Zed 获得 Tree-sitter 语法与jsonnet-language-server适配配置在用户级settings.json或项目级.zed/settings.json的lsp.jsonnet-language-server.settings中写入服务器参数适配场景Tanka 工程打开resolve_paths_with_tanka: true普通 Jsonnet 项目维持默认即可。如果你需要扩展其他语言的同类能力可继续阅读 语言支持总览含全部内置与社区语言索引、配置语言支持lsp、initialization_options、binary、enable_language_server等机制的完整说明以及 Jsonnet 语言页本主题的官方原始文档。【免费下载链接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.项目地址: https://gitcode.com/GitHub_Trending/ze/zed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表