ARTICLE DETAIL

资讯详情

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

Onivim 2 中 Reason/OCaml 语言支持全解析:基于原生语言服务器的 reason-vscode 扩展

Onivim 2 中 Reason/OCaml 语言支持全解析:基于原生语言服务器的 reason-vscode 扩展 开发工具代码编辑器桌面应用【免费下载链接】oni2Native, lightweight modal code editor项目地址https://gitcode.com/gh_mirrors/on/oni2点击查看免费下载reason-vscodejaredly.reason-vscode是一个随 Onivim 2 一起打包发布的 VS Code 兼容扩展其核心是一个用 Reason 编写并原生编译的语言服务器language server后端为 Reason、OCaml 与 Reason Lisp 三种语言提供悬停提示、自动补全、跳转定义、重命名、格式化等完整的 IDE 能力。本文以 extensions/reason-vscode/Readme.md 为骨架结合 package.json 的配置声明与 src/index.js 的客户端实现逐项讲解该扩展的功能、全部配置项、语言服务器启动逻辑与内置命令并说明它在 Onivim 2 扩展体系中的定位帮助你理解并上手这套 Reason/OCaml 开发环境。一、扩展概览从 vscode-reasonml 到原生编译的语言服务器原文档开宗明义该扩展基于vscode-reasonml但语言服务器后端完全用 Reason 编写并原生编译。也就是说它不像传统方案那样依赖 Node.js 实现的解析器或独立的二进制桥接而是把类型检查、补全、格式化等逻辑集中在一个原生语言服务器进程里通过 LSPLanguage Server Protocol与编辑器通信。在 Onivim 2 中这个扩展被当作内置bundled扩展随仓库分发src/Feature/Extensions/Model.re的Internal.filterBundled函数src/Feature/Extensions/Model.re明确把jaredly.reason-vscode列入打包过滤名单与vscode.typescript-language-features、vscode.css-language-features等一并视为开箱即用的内置扩展。因此在使用 Onivim 2 打开 Reason/OCaml 项目时该扩展会自动参与语言服务。扩展清单来自 package.json名称reason-vscode显示名Reason / OCaml LSP版本1.7.8发布者jaredly激活事件onLanguage:reason、onLanguage:ocaml、onLanguage:reason_lisp依赖vscode-languageclient^4.1.3、vscode-languageserver-types^3.14.0二、核心功能清单原文档列出的功能可归纳为“导航 重构 格式化 自动构建”四类且都有对应的 LSP 能力支撑类别功能说明代码洞察悬停提示hover goodness悬停显示符号的类型与定义信息代码洞察自动补全autocomplete基于类型上下文的成员补全代码洞察函数签名帮助调用时提示参数签名导航跳转到定义 / 预览定义jump-to-definition 与 preview-definition导航查找所有引用Find all references导航文档大纲 / 符号搜索document outline / symbol search代码透镜文件依赖列表在文件顶部显示其依赖dependencies_codelens默认开启代码透镜open使用分析显示从某个open中实际用到了哪些值opens_codelens默认开启代码透镜每个顶层值的类型每个顶层值的类型透镜per_value_codelens默认关闭重构高亮所有用法highlight all usages of a variable重构重命名变量rename a variable格式化格式化选中区format selection格式化格式化文档format document构建文件变更时自动运行 bsb / duneauto-run bsb / dune on file changeautoRebuild默认开启上面的截图正是这些能力的实拍悬停提示框给出了pathOfModuleOpen的完整定义与来源文件路径输入Belt.Array.后弹出成员补全列表并显示eqU的类型签名PROBLEMS 面板则展示了 Unbound value fail、Unbound module Belt.Array.List 等类型诊断。三、语言注册与语法高亮三种语言、四套语法扩展通过contributes.languages注册了三种语言package.json语言 ID别名文件扩展名语言配置reasonReason.re、.reireason.configuration.jsonocamlOCaml.ml、.mliocaml.configuration.jsonreason_lispReason Lisp.rel、.relireason-lisp.configuration.json语法高亮方面声明了四套 TextMate 语法package.jsonocaml.jsonscope 为source.ocamlreason.jsonscope 为source.reason约 2200 行规则覆盖属性、模式、表达式等完整语法结构reason-lisp.jsonscope 为source.reason_lispreason-markdown-codeblock.json注入 MarkdowninjectTo: text.html.markdown使 Markdown 中的 Reason 代码块也能正确高亮此外客户端在激活时还通过vscode.languages.setLanguageConfiguration为 Reason 注册了onEnterRulessrc/index.js实现多行注释的自动续写输入/**或/*!换行自动补**/前自动缩进等这些规则无法通过独立的 language-configuration.json 表达因此由代码动态注册。四、配置参考reason_language_server.*全部配置项原文档强调所有配置都以reason_language_server.为前缀。综合 Readme.md 与 package.json 中声明的完整配置属性整理如下配置键前缀reason_language_server.类型默认值说明format_widthnumber80格式化宽度控制 refmt / ocamlformat 的换行宽度per_value_codelensbooleanfalse是否在每个顶层值上以 code lens 显示类型dependencies_codelensbooleantrue是否在文件顶部列出其依赖opens_codelensbooleantrue是否显示从open中实际使用的值autoRebuildbooleantrue保存文件时自动运行 bsb构建项目locationstring—自定义语言服务器二进制路径主要用于调试refmtstring—自定义 refmt 二进制路径lispRefmtstring—reason-lisp 的 lispRefmt 二进制路径mlfmtstring—.ml/.mli格式化器路径仅出现在 package.json 中原文档未列出reloadOnChangebooleanfalse监视语言服务器二进制文件变化并自动重启开发语言服务器时使用show_debug_errorsbooleanfalse将语言服务器 stderr 输出到 VS Code 的 OUTPUT 面板show_module_path_on_hoverbooleanfalse悬停时显示模块路径仅出现在 package.json 中原文档未列出build_system_override_by_rootobject—按项目根目录uri 格式如file:///some/path/here覆盖构建系统探测结果其中build_system_override_by_root的值必须是如下枚举之一package.jsonbsb:4.0.7 dune:esy dune:opam:/abs/path/to/switch bsb-native:4.0.7:js bsb-native:4.0.7:bytecode bsb-native:4.0.7:native原文档特别提醒该配置仅当构建系统自动探测失效时才需要指定例如同一项目里同时存在bsconfig.json和dune文件时可以手动指定走 bsb 还是 dune。五、调试配置语言服务器开发者的工具集原文档指出下面这组配置对“正在开发语言服务器”的人最有用.location为语言服务器指定自定义二进制位置。客户端在 src/index.js 的getLocation中先对它做路径校验相对路径会拼上工作区根目录路径不存在则返回 null再进入后续的自动探测逻辑。.refmt/.lispRefmt为 refmt 与 reason-lisp 的 refmt 指定自定义位置用于格式化链路。.reloadOnChange二进制更新时自动重启服务器。客户端通过startCheckingsrc/index.js以 500ms 间隔轮询二进制文件的mtime一旦晚于上次启动时间就触发restart()并弹出 DEBUG MODE: Will auto-restart the reason language server if it recompiles 提示——这是典型的“改完服务器代码重新编译后编辑器自动重载”的开发闭环。.show_debug_errors把语言服务器的 stderr 管道到 VS Code 的 OUTPUT 面板。该开关控制RevealOutputChannelOn开启时设为Error出错自动弹出输出面板关闭时为Neversrc/index.js。六、语言服务器的启动与探测逻辑虽然原文档把扩展定位为“原生 Reason 语言服务器”客户端但仓库内的客户端实现src/index.js展示了一套更完整的探测优先级值得开发者了解首先读取并校验reason_language_server.location指定的 RLS 二进制路径若工作区是 esy 项目目录下存在dune、dune-project、*.opam或esy.lock见isEsyProject且环境中有 esy则通过esy -q sh -c echo #{opam/ocaml-lsp-server.bin}查询 esy 托管的ocamllsp二进制位置若 esy 中找不到则尝试which ocamllsp从 PATH 中寻找以上都失败时回退到第 1 步的 RLS 二进制reason_language_server.location。也就是说运行时优先使用 esy / opam 环境中的ocaml-lsp-server其次才回退到原生的 Reason 语言服务器。语言客户端本身通过vscode-languageclient建立documentSelector覆盖reason、ocaml、reason_lisp三种语言src/index.js同时注册了两个文件监听器**/bsconfig.json与**/.merlin——前者对应 bsb 工程后者对应 OCaml 的传统 merlin 配置任一变化都会触发配置同步配合autoRebuild实现保存即构建的体验。七、内置命令五个实用操作扩展通过contributes.commands注册了 5 个命令package.json并在 src/index.js 中实现命令 ID作用底层机制reason-language-server.restart重启语言服务器停止旧 LanguageClient 并重新getLocation启动同时reason_language_server.location配置变更或工作区根目录变化也会自动触发重启src/index.jsreason-language-server.show_ppxed_source显示当前文件的 ppx 展开后源码通过虚拟 schemeppxed-source的 TextDocumentContentProvider 向服务器发custom:reasonLanguageServer/showPpxedSource请求仅对 Reason / OCaml 文件有效reason-language-server.show_ast显示当前文件的抽象语法树AST通过虚拟 schemeast-source发custom:reasonLanguageServer/showAst请求reason-language-server.create_interface为实现文件创建 interface 文件.rei/.mli若 interface 文件已存在则拒绝执行否则发custom:reasonLanguageServer/createInterface请求reason-language-server.dump_file_data导出当前文件的语言服务器内部数据发custom:reasonLanguageServer/dumpFileData请求其中ppxed-source与ast-source两个虚拟文档会随文件保存自动刷新onDidSaveTextDocument触发 provider 变更事件见 src/index.js非常适合用来观察宏展开前后的代码形态。八、代码片段Reason 常用结构速写扩展为 Reason 语言提供了内置 snippetssnippets/snippets.json覆盖最常见的语法骨架let (block)let ${1:pattern} { ... };functionlet ${1:name} (${2:args}) $0;function (block)let ${1:f} (${2:args}) { ... };module (block)module ${1:M} { ... };switchswitch ${1:scrutinee} { | ${2:pattern} ... };这些片段以prefix触发如输入let可选择函数或块配合类型化的自动补全可以显著提升 Reason 代码的书写效率。九、版权与许可原文档声明Copyright © 2018 Jared Forsyth and contributors基于 MIT License 分发。仓库内对应许可证文件为 extensions/reason-vscode/LICENSE.txt需要注意的是 package.json 的license字段填写的是ISC以包元数据与仓库许可证文件的实际内容为准。结语reason-vscode 是 Onivim 2 中 Reason/OCaml 语言体验的基石它以“原生编译的语言服务器后端”为设计初衷通过reason_language_server.*一套配置即可控制格式化宽度、三类 code lens、自动构建与调试重载运行时又能智能地在 esy 的 ocaml-lsp-server 与自建 RLS 之间切换并提供了查看 ppx 展开、AST 等深度调试命令。无论你是在 Onivim 2 中编写.re/.rei/.ml/.mli还是想基于该客户端二次开发语言服务器都可以从 extensions/reason-vscode/src/index.js 与 package.json 入手找到完整的调用链与配置契约。赞分享开发工具代码编辑器桌面应用【免费下载链接】oni2Native, lightweight modal code editor项目地址https://gitcode.com/gh_mirrors/on/oni2点击查看免费下载相关推荐github1s 中的 OCaml 语言支持ocaml-web 扩展的语言功能解析与配置指南github1s 中的 OCaml 语言支持ocaml web 扩展的语言功能解析与配置指南 导读 ocaml web 是 github1s 仓库中为 OCa开发工具前端NorthCinder 订单自动化完整指南把订单邮件变成本地订单台账退货截止前主动提醒你NorthCinder 订单自动化完整指南把订单邮件变成本地订单台账退货截止前主动提醒你 网购之后确认信、发货通知、物流更新、退货窗口说明会陆续散落进收件VSCode Java 语言支持扩展项目推荐VSCode Java 语言支持扩展项目推荐 项目基础介绍和主要编程语言 VSCode Java 语言支持扩展是由 Red Hat 开发者团队开发的开源项目旨上一篇visx/pattern 完全指南用 SVG 图案填充为 React 图表添加纹理下一篇YouTube.js PivotBarItem 节点解析详解移动端 Pivot 导航项的 API 与源码实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表