- 开发工具
- 代码编辑器
- 桌面应用
【免费下载链接】oni2
Native, lightweight modal code editor
本文基于开源仓库 oni2(一个基于 ReasonML / Revery 构建的原生、轻量级模态代码编辑器)的 CHANGES_CURRENT.md 展开,逐条解读该版本待发布变更:搜索如何尊重
.gitignore、新增editorLangId上下文键、窗口布局移动的实现原理,以及 SCM 与补全解析等 Bug 修复背后的源码依据。读完本文,你将掌握这些变更的配置用法、实现链路与仓库内的可验证证据位置。
概览:本版本变更清单
CHANGES_CURRENT.md 是 oni2 的"当前版本待发布变更"日志,按Features、Bug Fixes、Performance、Documentation、Dependencies、Refactoring、Infrastructure七个维度组织。本版本的核心内容如下:
| 分类 | 条目 | 关联 Issue |
|---|---|---|
| Features | 搜索新增search.useIgnoreFiles配置项 | #3795(修复 #3792) |
| Features | 输入层新增editorLangId上下文键 | #3794(关联 #3783) |
| Bug Fixes | SCM 修复 "Git: Checkout to" 命令 | #3791(修复 #2525) |
| Bug Fixes | 补全项解析增强容错性 | #3800(修复 #3787) |
| Bug Fixes | 布局实现窗口移动(shift)操作 | #3798(修复 #3777) |
| Documentation | 澄清 license key bounty 指南 | #3801 |
| Documentation | 补充#与Control+L命令文档(感谢 @dingfanATyykj) | #3826 |
| Dependencies | vscode-exthost 升级到 1.58.2 | #3831 |
| Infrastructure | CI 复用 esy 安装步骤、修复 CentOS Docker 与 macOS 构建 | #3829 / #3832 / #3834 |
下面按类别深入解读每一项变更的配置用法与底层实现。
Features:搜索尊重.gitignore
新配置项search.useIgnoreFiles
本版本为搜索功能新增了配置项search.useIgnoreFiles(PR #3795,修复 #3792),用于控制搜索时是否遵循.gitignore等忽略文件规则。该配置的定义位于 src/Feature/Configuration/GlobalConfiguration.re 的Search模块:
module Search = { let followSymlinks = setting("search.followSymlinks", bool, ~default=true); let useIgnoreFiles = setting("search.useIgnoreFiles", bool, ~default=true); };配置项类型为bool,默认值为true,即默认行为是"尊重忽略文件"——搜索时跳过.gitignore所列的文件。其注册声明位于同一文件的contributions列表(GlobalConfiguration.re),因此它与其他配置一样,既可以在配置文件(如configuration.json)中静态设置,也可以被扩展动态修改。
底层实现:Ripgrep 参数映射
配置的生效链路贯穿Feature_Search→RipgrepSubscription→Service_Ripgrep→Core.Ripgrep。核心逻辑在 src/Core/Ripgrep.re:
let ignoreArgs = useIgnoreFiles ? [] : ["--no-ignore"];即当search.useIgnoreFiles为false时,Oni2 会向底层 ripgrep 进程追加--no-ignore参数,从而取消对.gitignore(以及全局 gitignore 文件)的遵循;为true(默认)时不追加任何参数,由 ripgrep 按默认行为读取忽略文件。同样的逻辑也应用于findInFiles(全局搜索)路径(src/Core/Ripgrep.re),最终拼装出的完整参数还包括--smart-case、--hidden、--files以及由files.exclude映射出的-g !xxx排除 glob(src/Core/Ripgrep.re)。
参数从配置到 ripgrep 的传递链路如下,可作为代码追踪路径:
- src/Feature/Search/Feature_Search.re:搜索功能读取
Search.useIgnoreFiles并传入订阅 - src/Store/RipgrepSubscription.re:订阅层把
useIgnoreFiles透传给服务层 - src/Service/Ripgrep/Service_Ripgrep.re:服务层转发给
Core.Ripgrep
使用示例
在 oni2 的配置文件中添加:
{ "search.useIgnoreFiles": false }即可让搜索(包括 Quick Open 的文件查找与"在文件中查找")不再受.gitignore约束,转而搜索仓库中被忽略的文件。需要说明的是,files.exclude(默认排除_esy、.git、node_modules,见 GlobalConfiguration.re)与search.useIgnoreFiles是两个独立机制:前者通过-g !glob 显式排除,后者控制是否读取忽略文件,两者可同时生效。
Features:新增editorLangId上下文键
定义与实现
PR #3794 为输入/键绑定系统新增了editorLangId上下文键(context key),其实现位于 src/Feature/Editor/Editor.re:
module ContextKeys = { open WhenExpr.ContextKeys.Schema; let editorLangId = string("editorLangId", ({buffer, _}) => { EditorBuffer.fileType(buffer) |> Oni_Core.Buffer.FileType.toString }); };editorLangId是一个字符串类型的上下文键,其值取自当前编辑器缓冲区(buffer)的fileType——即当前活动编辑器的语言标识符,与状态栏中显示的语言 ID 一致。它通过WhenExpr.ContextKeys.Schema注册进编辑器的 when 表达式上下文,供键绑定与扩展的when子句判断。
配置用法:按语言定制键绑定
这是该上下文键最主要的应用场景——让键绑定只在特定语言下生效。官方文档 docs/docs/configuration/key-bindings.md 给出了示例:
{ "keybindings": { "when": "editorFocus && editorLangId == typescript" } }editorLangId可以与其他上下文键(如editorFocus、insertMode、normalMode)自由组合。在仓库自带的扩展中也能看到它的实际使用,例如 extensions/typescript-language-features/package.json 中大量菜单/命令的when条件使用editorLangId == typescript、editorLangId == typescriptreact、editorLangId == javascript等来判断是否显示 TypeScript/JavaScript 相关操作;extensions/markdown-language-features/package.json 则使用editorLangId == markdown来限定 Markdown 预览与文档操作。这些第三方扩展菜单的when条件正是依赖 Oni2 提供的该上下文键才能在运行时正确求值。
Bug Fixes:SCM 修复 "Git: Checkout to" 命令
PR #3791 修复了 "Git: Checkout to" 命令(对应 issue #2525)。该命令来自内置 Git 扩展,其命令定义位于 extensions/git/package.nls.json:
"command.checkout": "Checkout to...", "command.checkoutDetached": "Checkout to (Detached)...",以及相关的配置项config.checkoutType(控制Checkout to...列出哪些类型的 git ref,见 extensions/git/package.nls.json)。从变更日志看,此修复属于 SCM(源代码管理)集成层面的行为修正,目的在于确保 "Checkout to..." 分支切换操作在 Oni2 的 SCM 视图中按预期工作。
Bug Fixes:补全项解析容错性增强
PR #3800 增强了补全项(completion item)解析的容错能力(修复 #3787)。补全请求与解析发生在扩展宿主(Exthost)与语言支持模块之间,相关请求定义位于 src/Exthost/Request.re,包括:
provideCompletionItems($provideCompletionItems方法):向语言服务器请求补全列表resolveCompletionItem($resolveCompletionItem方法):解析单个补全项的详细信息releaseCompletionItems($releaseCompletionItems方法):释放不再需要的补全缓存
这些请求的接口签名定义在 src/Exthost/Exthost.rei。该修复的目标是:当语言服务器返回的补全项数据存在异常(例如字段缺失或类型不符)时,Oni2 不再因单个条目解析失败而导致整个补全列表崩溃,而是跳过或降级处理异常条目,保证补全弹窗依然可用。测试端可见于 test/Exthost/LanguageFeaturesTest.re 的 "gets completion items" 用例。补全弹窗的使用方式为:插入模式下键入时自动弹出,Control+n/Down选择下一项,Control+p/Up选择上一项(见 docs/docs/using-onivim/language-features.md)。
Bug Fixes:布局实现窗口移动(window shift)
PR #3798 为布局(Layout)系统实现了"窗口移动"(window shift movement)能力(修复 #3777),即用户可以把某个编辑器窗口/分组的空间权重向左侧或右侧相邻窗口转移。核心算法位于 src/Feature/Layout/Layout.re:
shiftWeightFromLeft:将权重从nodes[index]左侧的节点转移给nodes[index],即向右"挤"空间shiftWeightFromRight:将权重从nodes[index]右侧的节点转移给nodes[index],即向左"挤"空间
两个函数都接受~delta(移动的权重增量)与index(目标节点索引),并在移动过程中扣除被消耗一侧的权重,防止权重溢出。该模块还内嵌了let%test_module "shiftWeightFromLeft"/"shiftWeightFromRight"测试模块(Layout.re),对正向增量、负向增量、超界增量(如delta=4.)等边界情况做了断言验证,最终在 Layout.re 中被布局更新逻辑调用,实现窗口间尺寸的实时重分配。
布局系统的相关配置项(见 docs/docs/configuration/settings.md)包括:
workbench.editor.showTabs(bool,默认true):是否显示编辑器标签页oni.layout.showLayoutTabs("always" | "smart" | "never",默认"smart"):布局标签页显示策略,"smart"仅在多于一个分组时显示oni.layout.layoutTabPosition("top" | "bottom",默认"bottom"):布局标签页位置oni.layout.singleTabMode(bool,默认false):为true时每个分组只容纳单个编辑器,关闭编辑器即关闭分组
窗口移动功能正是建立在这套分组/权重模型之上,属于对分组布局交互能力的补充。
Documentation、Dependencies 与 Infrastructure
文档更新
- #3801:澄清了关于 license key bounty(许可证密钥赏金)的指南边界,属于贡献者规则层面的说明性更新。
- #3826:文档补充了
#与Control+L两个命令的说明。#用于在搜索/命令场景中过滤,Control+L则是快速打开(Quick Open)等场景中的常用快捷键,与 docs/docs/configuration/key-bindings.md 的命令表(如Command+P / Control+P打开 Quick Open、Command+Shift+P / Control+Shift+P打开命令面板,见 key-bindings.md)相互印证。
依赖升级
- #3831:将 vscode-exthost 升级到 1.58.2。vscode-exthost 是 Oni2 用来与 VS Code 扩展通信的扩展宿主组件,其版本决定了所支持的扩展 API 子集。此次升级意味着扩展宿主同步了上游 1.58.2 版本的修复与 API 行为,为扩展生态提供更接近 VS Code 的兼容层。
CI 基础设施
- #3829:CI 中为 hygiene 检查(代码规范/卫生检查)复用已有的 esy 安装步骤,减少重复下载与构建时间。
- #3832:修复 CentOS Docker 构建(避免在 CentOS 基础镜像上构建失败)。
- #3834:修复 macOS 构建。
这三项都属于构建流水线的稳定性修复,不改变运行时行为,但对多平台发布流程(Linux 镜像与 macOS 产物)有直接价值。
小结
本版本变更集中在三个方向:搜索对忽略文件的尊重(search.useIgnoreFiles,通过 ripgrep--no-ignore参数实现)、键绑定系统按语言分流(editorLangId上下文键)、以及布局系统窗口移动能力(shiftWeightFromLeft/shiftWeightFromRight权重转移算法)。此外还包括 SCM Checkout 命令与补全解析的容错修复、exthost 升级到 1.58.2 以及多项 CI 构建修复。
- 配置项证据:src/Feature/Configuration/GlobalConfiguration.re
- ripgrep 参数映射证据:src/Core/Ripgrep.re
- 上下文键实现证据:src/Feature/Editor/Editor.re
- 布局移动算法证据:src/Feature/Layout/Layout.re
- 文档佐证:docs/docs/configuration/settings.md、docs/docs/configuration/key-bindings.md
- 开发工具
- 代码编辑器
- 桌面应用
【免费下载链接】oni2
Native, lightweight modal code editor
相关推荐
Backstage v1.1.0 变更日志深度解读:权限系统重构、搜索调度机制改造与认证 API 迁移指南
Backstage v1.1.0 变更日志深度解读:权限系统重构、搜索调度机制改造与认证 API 迁移指南 本篇文章基于当前仓库 docs/releases/v
开发者门户后端前端Litestar 3.0 变更日志深度解读:ASGIMiddleware 迁移、依赖瘦身与中断性变更迁移指南
Litestar 3.0 变更日志深度解读:ASGIMiddleware 迁移、依赖瘦身与中断性变更迁移指南 本文以 Litestar 仓库 3.0.0 变更日
后端Web框架Vitess v24.0.0 发布详解:窗口函数下推、Binlog 流式传输、结构化日志与关键破坏性变更
Vitess v24.0.0 发布详解:窗口函数下推、Binlog 流式传输、结构化日志与关键破坏性变更 Vitess v24.0.0 是数据库集群系统 Vit
数据库分布式数据库云原生后端数据存储
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考