首页/新闻资讯/正文详情

Onivim 2 架构解析:基于 ReasonML 与 Elm/Redux 风格的原生编辑器状态管理

发布时间:2026/9/27 10:26:55 来源:云帆数科 栏目:资讯中心
Onivim 2 架构解析:基于 ReasonML 与 Elm/Redux 风格的原生编辑器状态管理
开发工具代码编辑器桌面应用【免费下载链接】oni2Native, lightweight modal code editor项目地址https://gitcode.com/gh_mirrors/on/oni2点击查看免费下载导读本文以官方开发文档《Architecture Overview》为主线深入剖析 Onivim 2一个原生、轻量的模态代码编辑器的总体架构从 Revery 渲染框架、ReasonML/OCaml 函数式编程栈到仿 Elm/Redux 的 Action–State–Reducer–Updater–Store 状态管理模型再到 Vim 内核集成与测试体系。读完本文你将理解 Onivim 2 如何把 Web 生态熟悉的架构思想编译成高性能原生代码并能在src、test、integration_test等目录中快速定位各类核心模块。总体架构Revery ReasonML 的原生应用Onivim 2 是一个基于 Revery UI 框架、使用 ReasonML 编写的原生应用。ReasonML 的语法与 JavaScript 相似核心思想也与 React、Redux、Elm Architecture 一脉相承——但这一切最终被编译为高性能原生代码而非运行在浏览器或 Node 环境中。项目刻意采用函数式取向的代码库这正是 ReasonML/OCaml 的强项OCaml 的编译器乃至垃圾回收器都为构建高性能函数式应用做了深度优化。因此Onivim 2 得以在保持 Web 开发者熟悉的心智模型的同时获得原生应用的启动速度与渲染性能。从当前仓库结构看源码主体位于src目录其中src/Core — 跨应用共享的核心类型与工具src/Model — 应用状态state的描述与归约逻辑src/Store — 将状态与外部副作用连接起来的存储层src/UI — 用户界面与渲染src/Feature — 按功能域拆分的模块缓冲区、编辑器、终端、搜索等src/Exthost — 扩展宿主相关模块src/bin_editor —Oni2_editor.exe的入口需要注意的是官方架构文档写作时使用的是src/editor/Core、src/editor/Model这类带editor中间层的旧目录结构而当前仓库已将其扁平化为上述布局阅读源码时以当前结构为准。核心概念仿 Elm/Redux 的状态管理词汇表架构文档给出了一套与 Web 生态一一对应的核心概念这也是理解整个代码库的钥匙Action描述一次状态变更的信息载荷等同于 Redux 中的 action。在代码中它是 src/Model/Actions.re 里定义的一个带标签联合类型variant。State / Model二者互换使用均指应用状态。对应 src/Model/State.re 中的type t。Reducer形如(state, action) newState的纯函数依据 action 计算新状态。对应 src/Store/Reducer.re 的reduce函数。Updater形如(state, action) (state, effects)的函数与 Reducer 类似但额外处理副作用灵感来自 Elm Architecture。Store Connector大致相当于 Redux 中的 middleware负责把外部世界Vim、剪贴板、扩展宿主等接入 store。Store由 State、Updater 与一组 Store Connector 组成等价于 Redux 的 store。另一个重要思想是UI 是 state 的纯函数——给定相同的 stateUI 渲染结果必然一致这对从 React 背景迁移过来的开发者非常熟悉。这些状态管理基础设施actions、state、reducers、updaters、store由一个 reason 原生库 isolinear 提供实现。数据流从按键到渲染的完整链路结合源码可以还原一条完整的数据流输入事件键盘事件KeyDown、TextInput从 src/Input 进入编码为 src/Model/Actions.re 中的KeyDown、TextInput等 action。Store 线程调度src/Store/StoreThread.re 是整个状态管理枢纽。它的文件头注释明确写道状态更新运行在与渲染并行的独立线程中以榨取架构上的极致性能StoreThread.re#L1-L8。Reducer 归约action 被送入 src/Store/Reducer.re 的reduce函数通过switch模式匹配逐一分发产出新的State.tReducer.re#L9-L31。Connector 副作用各 Store Connector 监听状态变化并触发外部副作用同时把外部事件如 Vim 回调反向转成 action 重新分发。UI 纯函数渲染新状态驱动 src/UI/Root.re顶层 UI与 src/UI/EditorSurface.re缓冲区渲染重绘。从源码看Onivim 2 已将功能按域拆分为大量Feature_*模块如Feature_Buffers、Feature_Editor、Feature_Terminal、Feature_QuickOpen等State 中的每个域都有对应字段见 src/Model/State.re 的type tState.re#L461-L500。这也意味着 Action 联合类型中大量构造子直接包着某个 Feature 的消息类型例如Buffers(Feature_Buffers.msg)、Configuration(Feature_Configuration.msg)Actions.re#L11-L31形成顶层薄归约 功能域自归约的树状结构。Model 三巨头State / Actions / Reducer官方文档特别点名了 Model 层三个最重要的模块它们正是这套架构的心脏src/Model/State.re应用状态类型定义。type t由数十个字段组成覆盖缓冲区、剪贴板、主题、命令、诊断、终端、扩展宿主、语法高亮等几乎全部编辑器子系统的状态是单一事实来源single source of truth。src/Model/Actions.re所有 action 的类型定义。它以[deriving show]注解派生可读的调试输出构造子覆盖Init、KeyDown、TextInput、CommandInvoked、Buffers、Configuration、Exthost、WindowTitleSet等Actions.re#L10-L80。src/Store/Reducer.re顶层归约函数。reduce: (State.t, Actions.t) State.t先整体更新bufferRenderers与lifecycle两个子状态再对SetGrammarRepository、WindowMaximized、ReallyQuitting等少数全局 action 直接改写顶层状态其余交给各 Feature 的 reducer 处理Reducer.re#L9-L31。Store 与 StoreThread并行线程中的状态中枢src/Store/Oni_Store.re 的模块注释概括了 Store 库的职责负责管理 Model 随时间的变化以及跨集成的协调任何影响编辑器状态的变化都应建模为 Action并通过相应的 reducer/updater 汇聚处理。src/Store/StoreThread.re 是 store 的入口它承担以下关键工作启动各 Store Connector例如CommandStoreConnector.start()与VimStoreConnector.start(...)后者返回(vimUpdater, vimStream)通过 Isolinear 的Stream.create()建立流式连接StoreThread.re#L117-L124。发现扩展discoverExtensions按Bundled内置、Development开发目录、用户扩展三类分别扫描支持通过 CLI 开关禁用扩展加载StoreThread.re#L20-L66。初始化扩展宿主与语法仓库从扩展中提取语法信息构建GrammarRepository并创建扩展宿主客户端StoreThread.re#L108-L150。桥接剪贴板与窗口回调把剪贴板读写、窗口最大化/最小化/关闭等原生能力以回调参数注入 store。Vim 内核libvim 与 reason-libvimVim 是 Onivim 2 的核心。架构上分为两个组件libvimVim 的一个 fork与平台和终端解耦作为核心缓冲区编辑引擎通过简洁的 C API 暴露能力。reason-libvimlibvim的 Reason 绑定位于 src/reason-libvim其.rei接口文件直观地呈现了可用 API。Onivim 2 通过一个 Store Connector——src/Store/VimStoreConnector.re 与reason-libvim集成。从源码可以看到它如何把 Vim 事件反向接入 redux 式数据流注册剪贴板 provider依据vim.useSystemClipboard配置决定是否从系统剪贴板拉取值VimStoreConnector.re#L36-L62通过Vim.onVersion在版本变化时分发OpenFileByPath(oni://Version, ...)actionVimStoreConnector.re#L64-L72通过Vim.Buffer.onLineEndingsChanged、Vim.Buffer.onFiletypeChanged等回调把换行符变化、文件类型变化等转译为Feature_Buffers的 action 再分发VimStoreConnector.re#L74-L84。这套机制保证了 Vim 的编辑语义模式、寄存器、按键序列与 Onivim 2 自身的 UI 状态始终保持同步。ReveryUI 框架与生命周期管理Revery 是伴随 Onivim 2 诞生的 UI 框架目标是让开发者以 React/Redux 的体验构建快速、原生、跨平台的应用。它负责应用生命周期管理提供App.start、App.createWindow、UI.start等 API用于启动应用、创建窗口、启动 UI。架构文档指出的入口文件为 src/bin_editor/Oni2_editor.re即Oni2_editor.exe的 main 入口它调用上述 Revery API 完成应用启动。UI 层关键文件包括src/UI/Root.re顶层 UI 组件src/UI/EditorSurface.re缓冲区渲染的核心位置。Extension Host从Coming soon到已成形的扩展体系架构文档写作时Extension Host 一栏还标注着Coming soon!。但从当前仓库结构看扩展宿主已经从设计蓝图落地为完整实现src/Exthost下包含扩展扫描、消息协议、语法与工作区数据等模块src/Feature/Feature_Exthost.re等把扩展消息纳入顶层 actionStore 层则有 src/Store/ExtensionClientStoreConnector.re 负责把扩展宿主接入 storeStoreThread中通过ExtensionClient.create(...)创建客户端并订阅其事件流。此外仓库还内置了extensionsVS Code 生态的语法/语言扩展与development_extensions开发调试用扩展两个目录可作为扩展体系的实际样例。测试体系单元测试与集成测试对于一个由小团队维护的跨平台项目测试覆盖至关重要。Onivim 2 维护两类测试单元测试Unit Tests位于test目录命令为esy test run首次运行前需执行esy test install安装测试依赖。测试与src源码 1 对 1 组织例如src/Core/LineNumber.re的测试对应 test/Core/LineNumberTests.re。单元测试隔离验证某段代码依赖尽量最小化。仓库中test下按Core、Model、Service、Exthost、Feature、Syntax等子目录镜像源码结构。集成测试Integration Tests位于integration_test目录。每个集成测试都是独立的可执行文件会像真实应用一样初始化一整套 Store——唯一区别是 headless无 UI。运行方式有两种全部运行用esy integrationtest run单个运行用esy integrationtest x Test-Name.exe。例如 integration_test/Regression1671Test.re、integration_test/SyntaxHighlightTreesitterTest.re。学习资源文档为希望进一步了解 ReasonML 与架构思想的读者给出了建议方向均为外部站点此处仅作名称列举供自行检索ReasonML 官方文档、sketch.sh 交互式 REPL、Revery Playground架构理念方面则推荐 Elm Architecture 官方指南、Redux 文档与 React 文档。结合本文的源码指引推荐的实际进阶路径是先读 src/Model/State.re 与 src/Model/Actions.re 建立整体印象再顺着 src/Store/StoreThread.re 的启动流程梳理各 Store Connector最后挑选一个integration_test用例如 integration_test/TypingBatchedTest.re跟踪完整数据流即可快速掌握这套 Elm/Redux 风格原生架构的精髓。赞分享开发工具代码编辑器桌面应用【免费下载链接】oni2Native, lightweight modal code editor项目地址https://gitcode.com/gh_mirrors/on/oni2点击查看免费下载相关推荐Onivim 2架构深度解析从Electron到原生ReasonMLOnivim 2架构深度解析从Electron到原生ReasonML 本文深入分析了Onivim 2从基于Electron的v1架构演进到原生ReasonML开发工具代码编辑器桌面应用Webamp 浏览器版 Winamp 2 架构解析Redux 状态管理、Web Audio 音频引擎与原生皮肤渲染管线Webamp 浏览器版 Winamp 2 架构解析Redux 状态管理、Web Audio 音频引擎与原生皮肤渲染管线 Webamp 是一个用浏览器技术重新实前端音视频CKEditor5编辑器状态管理Redux集成与状态同步CKEditor5编辑器状态管理Redux集成与状态同步 痛点与挑战编辑器状态管理的困境 你是否曾面临以下问题多组件共享编辑器内容时出现数据不一致复杂表前端富文本UI组件上一篇如何一键导出微信聊天记录Mac用户的终极数据自由指南下一篇国家中小学智慧教育平台电子课本下载器简单三步获取官方教材的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

固件黑盒解包与打包实战:从零构建嵌入式固件分析工具链
固件黑盒解包与打包实战:从零构建嵌入式固件分析工具链

接手这份固件的时候,我整个人是懵的。文件倒是完整,一个几百 MB 的 bin 镜像,但没人能说清楚它内部怎么分区、用什么文件系统、启动流程走到哪一步、改动后怎么打包回去。前任离职时交接文档只有一句话:“这个是整包固件&#xff… · 2026/9/27 10:26:55

搞懂网站建设中意思,避开建站报价陷阱
搞懂网站建设中意思,避开建站报价陷阱

搞懂网站建设中意思,避开建站报价陷阱 网站做好了没人访问,这才是最让人心碎的结局。很多老板花大价钱,拿着【建站报价】单签了合同,结果上线三个月,百度搜不到,谷歌没排名,后台数据一片惨淡。别急着怪搜索引擎算法,问题往往出在“网站建设中意思”这… · 2026/9/27 10:26:55

3个实战案例拆解网站编辑怎么赚钱的底层逻辑
3个实战案例拆解网站编辑怎么赚钱的底层逻辑

3个实战案例拆解网站编辑怎么赚钱的底层逻辑 很多小白问,自己不会代码想做网站,到底能不能靠这个吃饭?说实话,十年前这行看代码,现在这行看内容转化。我看过太多实战案例,那些月入过万的网站编辑,代码水平未必比程序员强,但他们懂怎么把文字变成钱。… · 2026/9/27 10:26:55

STM32F103 窗口看门狗 WWDG 实战:窗口期计算、喂狗时机与复位周期实测
STM32F103 窗口看门狗 WWDG 实战:窗口期计算、喂狗时机与复位周期实测

文章目录摘要前言WWDG 工作原理:一个带"时间笼子"的看门狗窗口期数学推导:先把时间算明白方案决策:为什么是 WWDG 而不是 IWDG硬件准备与测试环境CubeMX 配置与寄存器级解释容易遗漏的步骤:调试冻结与中断使能核心代码实… · 2026/9/27 11:57:54

小米开源编程助手 MIMO Code 上手:VS Code 配置 TaoToken 与简单使用测试
小米开源编程助手 MIMO Code 上手:VS Code 配置 TaoToken 与简单使用测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:57:47

图解步骤拆解响应式网站的意义:告别域名服务器搞不懂的坑
图解步骤拆解响应式网站的意义:告别域名服务器搞不懂的坑

图解步骤拆解响应式网站的意义:告别域名服务器搞不懂的坑 域名服务器配置报错,后台代码看不懂,这种“域名服务器搞不懂”的焦虑,是90%中小企业老板在接触网站建设时的第一道坎。别急着找外包公司,先看懂这套 图解步骤 ,你就能明白为什么… · 2026/9/27 11:57:47

运行 Appium + Python Client + 夜神模拟器:TaoToken 统一 Key 接入与 adb 配置实战
运行 Appium + Python Client + 夜神模拟器:TaoToken 统一 Key 接入与 adb 配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:57:47

科来流量分析结合MCP自动化:用Codex与cmdl.exe打通TaoToken配置链路
科来流量分析结合MCP自动化:用Codex与cmdl.exe打通TaoToken配置链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:57:41

手机发一条消息,Cursor 就在你电脑上帮你写好代码了:TaoToken 统一 Key 接入 Cursor CLI 配置实战
手机发一条消息,Cursor 就在你电脑上帮你写好代码了:TaoToken 统一 Key 接入 Cursor CLI 配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:57:41

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码