Simple Hide Files 多选 Hide 只生效一个?让 Codex 走 TaoToken 改 main.js
2026/9/20 0:47:57 网站建设 项目流程

Simple Hide Files 多选 Hide 只生效一个,是 vscode / cursor 上一类很具体的插件排障题。想改插件的 main.js,用走 TaoToken 通道的 Codex 比自己啃压缩代码省事,先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建 API Key,再把 Codex 的 Base URL 填成 https://taotoken.net/api。

现象本身不复杂:在资源管理器里按住 Ctrl 点选三四个文件,右键点 Hide,回头打开 settings.json 一看,files.exclude 里只多出一条路径。反复试几次,每次还是只藏一个,剩下的文件照旧躺在目录里。装上的是 sguerri 出品的 Simple Hide Files 0.2.6,单选 Hide 一直正常,多选就瘸腿,说明问题不在「能不能写 files.exclude」,而在挂到 hideFiles.addToHiddenFiles 那条命令分支只拿到了一个 Uri。网上流传的老办法是进扩展目录,把 out/main.js 整段替换成别人改好的版本——能用,但你不知道替换进去的是什么,插件一升级还会被覆盖。这里换个更稳的走法:先定位到具体分支,再让 Codex 对照另一条 addMultipleToHiddenFiles 路径,把只接受单 Uri 的地方补成遍历数组批量写入。TaoToken 只提供 Key 和模型通道,不替插件去读写文件、也不参与 Hide 逻辑,改代码这件事仍然由 Codex 在你本机完成。

1. 多选 Hide 只写一条:先把现象钉死

1.1 复现步骤与三个可疑点

先做一次干净的复现。新建一个空工作区,放五个文件,比如 a.txt、b.txt、c.txt、d.txt、e.txt。在侧边栏按住 Ctrl(macOS 用 Cmd)选出 a、b、c 三个,右键菜单点 Hide。然后用Ctrl + Shift + P打开命令面板,执行Preferences: Open Workspace Settings (JSON),看 files.exclude 里到底写了几条。

如果只多出一条,或者多出一条但文件名对不上,别急着去改代码,先把三个可疑点排掉:

  • 写入层级不对:插件可能把规则写进了 User 级设置,而工作区级设置把 User 级覆盖了。表现是「设置里明明有,目录里文件还在」。
  • 路径形态不对:写进去的是绝对路径,或者带了盘符,而 files.exclude 需要的是相对工作区根目录的路径,匹配自然失败。
  • 命令分支只收单个 Uri:多选时编辑器把选中项作为数组传进来,代码里只取了第一个。

前两个点用肉眼就能判断:打开设置 JSON,看键名是相对路径还是C:/...这种绝对路径;再确认你改的是 Workspace 还是 WorkspaceFolder 层级。把这两条排除之后,范围就收窄到第三种——也就是命令实现本身。这一步花五分钟,能省掉后面半小时的瞎改。

顺带说一句:不管是 vscode 还是 cursor,扩展安装目录结构是一样的,只是根目录名不同。cursor 在~/.cursor/extensions/,vscode 在~/.vscode/extensions/,Windows 上则分别落在C:/Users/<你的用户名>/.cursor/extensions/C:/Users/<你的用户名>/.vscode/extensions/下。

1.2 在 out/main.js 里找 addToHiddenFiles 的注册点

先确认版本目录名,本案例是sguerri.simple-hide-files-0.2.6-universal。进到out/目录,打开 main.js。文件是编译压缩过的,变量名基本是单字母,不要试图通读,用编辑器搜索三个关键词就够:

  • registerCommand:找到所有命令注册入口。
  • addToHiddenFiles:单选 Hide 走的命令名。
  • addMultipleToHiddenFiles:如果存在,说明作者写过多选版本;如果只有名字没有实现,那更说明入口没接上。

再顺手看一眼同目录的package.json,在contributes.commands里能看到命令的准确 id,在contributes.menus里能看到右键菜单绑的是哪个 id。这一步很关键:如果菜单绑的是单选命令,那么无论你在代码里怎么改多选逻辑,右键进来的永远是单个 Uri,问题就不在函数体,而在命令绑定。把这两处对齐之后,你才知道改动应该落在哪一行。

2. 让 Codex 打开 main.js:Base URL 指向 https://taotoken.net/api

2.1 先在 TaoToken 创建 Key

准备工作就两件:一把 Key,一个模型 ID。打开 TaoToken 注册账号,进控制台创建 API Key,记成占位符YOUR_API_KEY。模型 ID 不要凭记忆写,去模型广场看当天的列表,挑一个适合读代码的,记作YOUR_MODEL_ID;具体有哪些、哪个更合适,以模型广场当时列表为准。

这里有一个高频踩坑点:官网落地页和接口地址是两个东西。注册、建 Key、看模型、看用量,都在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 上做;而填进工具里的 Base URL 是https://taotoken.net/api末尾不要加/v1,也不要往这个地址上挂任何查询参数。

2.2 ~/.codex/config.toml 里的 model_provider 与 base_url

Codex 的配置文件在用户目录下:macOS / Linux 是~/.codex/config.toml,Windows 是C:\Users\<你的用户名>\.codex\config.toml。注意这里是 Codex 自己的 TOML 结构,不要往里塞ANTHROPIC_*那套变量,那是别的工具用的。

model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"

几个字段的含义:

字段填什么说明
modelYOUR_MODEL_ID以模型广场当时列表为准,别自己拼后缀
base_urlhttps://taotoken.net/api末尾不加/v1
env_keyTAOTOKEN_API_KEY环境变量名,值才是你的 Key
wire_apichat按所选通道的文档填,不确定就看模型说明

Key 不要硬写进 TOML,用环境变量传:

export TAOTOKEN_API_KEY=YOUR_API_KEY

Windows PowerShell 里对应$env:TAOTOKEN_API_KEY="YOUR_API_KEY"。配完之后先跑一句最简单的提问,确认通道是通的,再让它去碰插件文件——顺序反了的话,你会分不清是通道问题还是代码问题。

2.3 递给 Codex 的排障提示词

提示词决定它改得准不准。别只说「帮我修复多选 Hide」,那样它很可能重写整个函数。按「先解释、再动手」的节奏给:

请打开这个文件(直接给出 out/main.js 的完整路径)。 先不要改代码,做三件事: 1. 找出 registerCommand 里注册 hideFiles.addToHiddenFiles 和 hideFiles.addMultipleToHiddenFiles 的位置,贴出这两处代码片段; 2. 对照 package.json 的 contributes.commands / contributes.menus, 说明右键菜单当前绑定的是哪个命令 id; 3. 指出单选分支里,哪一个变量最终只承载了一个 Uri。 解释完等我说「可以改」,再动手。

这套问法有两个好处:一是强制它先读上下文再落笔,二是你能在它动手之前判断它有没有找对地方。如果它一上来就开始重写压缩函数,直接打断,把任务拆小。另外,明确告诉它只在本机读写你打开的这个文件,不要碰任何构建脚本、不要执行安装命令、不要动工作区里的业务代码。

3. 把只接受单 Uri 的分支改成批量写入

3.1 addMultipleToHiddenFiles 到底差在哪

大部分这类插件的实现套路是:单选命令拿到一个 Uri,拼一个{ 相对路径: true }对象,然后update('files.exclude', ...);多选命令按理说应该拿到 Uri 数组,循环拼对象,再一次性写进去。问题往往出在中间那层「取参数」的包装上——外面是数组,里面写了args[0]

让 Codex 把两条路径并排贴出来,你能一眼看出差别:多选版本里大概率有一个for或者map,单选版本里没有。要补的不是新功能,而是把单选版本缺的那层遍历补上,或者干脆让右键菜单在多选时走多选命令。两种改法都行,哪种改动小选哪种。

3.2 一份可对照的批量写入实现

下面是批量写入的骨架,用来和 Codex 改出来的结果对照。压缩文件里变量名不同,重点是结构:入参先归一化成数组,一次读出当前配置,循环补键,最后写回。

const vscode = require('vscode'); async function addToHiddenFiles(input) { // 把单个 Uri、Uri 数组、以及 (uri, uris) 两种调用形态统一成数组 const list = Array.isArray(input) ? input : [input]; if (!list.length) { return; } const folders = vscode.workspace.workspaceFolders; if (!folders || !folders.length) { vscode.window.showWarningMessage('No workspace folder opened'); return; } const cfg = vscode.workspace.getConfiguration(); const next = Object.assign({}, cfg.get('files.exclude') || {}); for (const uri of list) { const rel = vscode.workspace.asRelativePath(uri, false); next[rel] = true; } await cfg.update('files.exclude', next, vscode.ConfigurationTarget.WorkspaceFolder); vscode.window.showInformationMessage('Hidden ' + list.length + ' items'); }

命令注册那层同样要改,让两种调用形态都能进来:

vscode.commands.registerCommand('hideFiles.addToHiddenFiles', (uri, uris) => { const targets = Array.isArray(uris) && uris.length ? uris : [uri]; return addToHiddenFiles(targets); });

两个细节值得盯住:一是ConfigurationTarget要和插件原本写的一致,原来写 Workspace 就别改成 User,否则会出现「设置里能看到、文件没藏」;二是提示文案,原文案是Settings updated,改成Hidden N items之后,你一眼就能从提示里读出这次写进了几条,验证阶段非常省事。

3.3 改前备份、改后核 diff

main.js 是编译产物,压缩后的代码只要动错一个括号,整个插件就静默失效——不报错,只是命令没反应。所以改之前先把原文件复制一份,命名成main.js.bak,放在同目录,方便回滚。

改完之后让 Codex 输出一份改动说明:改了哪个函数、动了哪几行、为什么。你不需要看懂全部压缩代码,但要看懂它改的那三五行。如果它顺手把别的函数重排了、或者「顺便优化」了无关逻辑,让它回退重来。压缩文件里没有类型检查兜底,只做最小改动是唯一稳妥的策略。

4. 重启 cursor / vscode 后的验证与失败分支

4.1 验证清单:提示从 Settings updated 变成 Hidden N items

扩展代码是启动时加载的,改完必须完全退出编辑器再打开——不是 Reload Window 那种重载,直接关掉进程再起。然后:

  1. 选中多个文件(比如四个),右键点 Hide。
  2. 看右下角提示:是不是Hidden 4 items
  3. 打开 Workspace Settings (JSON),数一下 files.exclude 里新增了几条。
  4. 回侧边栏看文件是不是真的消失了。

三条都过,说明补丁生效。只有第一条变了、第二条没变,那多半是写入层级的问题,回去检查ConfigurationTarget

4.2 还是不生效:三条分支排查

如果一切照旧,只藏一个,按下面的顺序查:

  • 菜单没绑到多选命令:多选时编辑器传进来的参数形态和你以为的不一样。在命令回调第一行加一句console.log(uri, uris),打开Help > Toggle Developer Tools看输出,最直接。
  • 只有第一个 Uri 有值:说明数组参数被截断了,检查回调签名是不是只声明了一个形参,或者中间某个包装函数写了args[0]
  • 写进去了但没匹配上:确认写的是相对路径。如果写进去的是带盘符的绝对路径,files.exclude 匹配不到,文件自然不会消失。

这三条对应的是三个不同层面:绑定、传参、写入形态。逐条排,不要一次性全改。

4.3 插件升级会把 main.js 覆盖掉

最后提醒一句:你的改动在扩展目录里,插件一升级,整个目录会被新版本替换,补丁就没了。所以留个习惯——把改好的 main.js 单独存一份在项目外的目录,顺手记下版本号;升级插件之后,先按 4.1 的清单复验一遍,失效了再把补丁重新应用一次。如果这个需求对团队里多个人都成立,比起每人改一份,更值得考虑的是把这条补丁提给作者,或者干脆写一个自己的小扩展。

5. 这次的边界,以及改完之后去哪儿对账

再划一次边界,免得后面混淆:这次动手改的是本机扩展目录里的 main.js,改代码的是走 TaoToken 通道的 Codex,TaoToken 本身不读你的文件、不碰 files.exclude,也不参与任何 Hide 逻辑。它负责的是模型通道——你在这一步唯一要做对的事,就是 Base URL 填https://taotoken.net/api(不加/v1),Key 用YOUR_API_KEY占位,值从官网创建。

验证完之后有个收尾动作值得做:回到 TaoToken 模型对话,用同一把 Key 发一条消息,确认模型 ID 和通道都正常;如果打算长期拿它读代码、改压缩文件,可以去 Coding Plan 看看套餐够不够用;Key 的创建和轮换在 控制台 API Keys 里做。顺带核对一下这次排障消耗的调用量,做到心里有数,比事后发现问题再回头翻记录轻松得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询