news 2026/9/28 21:26:48

Oni2 变更日志深度解读:搜索忽略规则、editorLangId 上下文键与窗口布局移动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oni2 变更日志深度解读:搜索忽略规则、editorLangId 上下文键与窗口布局移动
  • 开发工具
  • 代码编辑器
  • 桌面应用

【免费下载链接】oni2

Native, lightweight modal code editor

项目地址:https://gitcode.com/gh_mirrors/on/oni2
点击查看免费下载

本文基于开源仓库 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 FixesSCM 修复 "Git: Checkout to" 命令#3791(修复 #2525)
Bug Fixes补全项解析增强容错性#3800(修复 #3787)
Bug Fixes布局实现窗口移动(shift)操作#3798(修复 #3777)
Documentation澄清 license key bounty 指南#3801
Documentation补充#与Control+L命令文档(感谢 @dingfanATyykj)#3826
Dependenciesvscode-exthost 升级到 1.58.2#3831
InfrastructureCI 复用 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

项目地址:https://gitcode.com/gh_mirrors/on/oni2
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 21:25:07

大模型时代的开发提效实践:从 Prompt 工程到 AI Agent 开发

大模型时代的开发提效实践:从 Prompt 工程到 AI Agent 开发 一、引言2026 年,大模型已经深度融入软件开发的每一个环节。从代码补全、单元测试生成,到能自主规划任务的 AI Agent,AI 正在把程序员从大量重复劳动中解放出来。本文结…

作者头像 李华
网站建设 2026/9/28 21:23:42

论文重复率和AI率都没达标?10款降AI工具对比,哪些支持双降?

论文重复率和AI率都没达标?10款降AI工具对比,哪些支持双降? 知网AIGC检测系统又更新了,AI率变高,网上的各种免费降AI率提示词试了一个又一个,AIGC疑似度还是没变化? 学校要求AI率低于20%&…

作者头像 李华