新闻详情

新闻详情

首页 / 资讯中心 / 详情

VsCode插件开发(三)菜单:package.json 中 contributes 配置与 TaoToken 接入骨架

发布时间:2026/10/7 14:37:34来源:尧图网络
VsCode插件开发(三)菜单:package.json 中 contributes 配置与 TaoToken 接入骨架
1. 从一次菜单不显示说起contributes 到底管什么如果你正在写 VS Code 插件大概率会遇到这个场景命令写好了registerCommand也注册了按CtrlShiftP能搜到但右键菜单里死活不出现。我第一次做插件菜单时就在这卡了半天最后发现是package.json里contributes.menus的when条件写错了。VS Code 插件开发里package.json的contributes字段就是插件的“说明书”。它告诉 VS Code我这个插件要往哪些位置塞菜单、菜单点了触发哪个命令、什么条件下才显示。而真正干活的逻辑写在extension.ts里通过vscode.commands.registerCommand注册。两者靠command这个字符串 ID 对上号对不上就是“菜单点了没反应”。这一篇聚焦三件事contributes.menus的菜单项声明与命令绑定、when与group的实战用法、以及给插件加一个调用大模型接口的骨架——用 TaoToken 的统一 Key/API 通道把settings.json配置和请求验证跑通。适合已经能跑起一个 Hello World 插件、想搞清楚菜单机制并顺手接上接口链路的开发者。TaoToken 在这里的角色是“统一入口”你不用在插件里硬编码某一家模型的地址和密钥而是把 base URL 和 Key 放进配置插件通过一个兼容接口去调用。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 后面配置里会用到。2. 前置准备插件骨架与 TaoToken 通道2.1 插件工程的最小结构先用官方脚手架起一个 TypeScript 插件npm install -g yo generator-code yo code选择New Extension (TypeScript)起名比如good-tool。生成后目录里最关键的两个文件是package.json和src/extension.ts。前者声明“我有什么”后者实现“我怎么做”。package.json里和菜单相关的核心是contributes它下面可以挂commands、menus、configuration等。commands负责把命令注册到命令面板menus负责把命令挂到具体 UI 位置。很多人只写了menus没写commands结果命令面板搜不到菜单也可能不显示这是第一个坑。2.2 为什么在插件里接 TaoToken插件里如果要调用模型能力常见做法是直接写死某个服务的 URL 和 Key。问题是换模型、换 Key、团队协作时都要改代码重新打包。更稳的做法是把这些抽到配置里插件只认一个 base URL 和一个 Key。TaoToken 提供统一 Key/API 通道base URL 用https://taotoken.net/apiKey 在控制台生成。这样插件代码里只出现一个地址模型切换在服务侧完成插件本身不用动。下面先把配置骨架搭好再回到菜单。2.3 在 package.json 里声明配置项在contributes.configuration里加两个配置让用户能在设置里填 Key 和模型configuration: { title: Good Tool, properties: { goodTool.apiKey: { type: string, default: , description: TaoToken API Key在控制台生成 }, goodTool.model: { type: string, default: claude-3-5-sonnet, description: 调用的模型名称 } } }这样在 VS Code 设置里搜goodTool就能看到这两项。Key 不建议提交到仓库本地用settings.json填即可。3. 可复制配置menus 声明与命令绑定3.1 完整的 menus 配置在package.json的contributes下加menus。下面这段是编辑器标题栏菜单只在 JSON 文件里显示点击触发good-tool.updateRoutemenus: { editor/title: [ { when: resourceLangId json, command: good-tool.updateRoute, group: navigation, alt: good-tool.updateRoute } ] }同时要在contributes.commands里声明这个命令否则命令面板里找不到commands: [ { command: good-tool.updateRoute, title: 更新路由, category: Good Tool } ]command这个字符串是唯一纽带menus里写什么extension.ts里registerCommand就得写什么。3.2 菜单出现的位置对照不同位置对应不同的 key常用的几个位置 key出现的地方editor/title编辑器标题栏editor/context编辑器右键菜单explorer/context资源管理器右键菜单view/title左侧视图标题栏view/item/context视图项右键菜单commandPalette控制命令是否出现在命令面板commandPalette比较特殊它不显示菜单而是控制命令面板里是否可见常配合when做隐藏。3.3 when 条件组合when决定菜单何时出现多个条件用、||、!组合when: editorFocus isWindows resourceLangId javascript常用变量resourceLangId javascript判断文件语言resourceFilename test.js判断文件名isLinux/isMac/isWindows判断系统editorFocus判断编辑器有焦点editorHasSelection判断有选中文本view someViewId判断视图 ID。我试过把when写成resourceLangId json但文件是.jsonc结果菜单不出现——.jsonc的语言 ID 也是json这个没问题真正踩的坑是写成了resourceLangId .json多了个点条件永远不成立。3.4 group 分组与排序group控制菜单项在组内的排序。editor/context的默认组从前往后是navigation、1_modification、9_cutcopypaste、z_commands。navigation永远排最前z_commands是最后一个默认组。explorer/context的默认组包括navigation、2_workspace、3_compare、4_search、5_cutcopypaste、7_modification。想让自己的菜单靠前用navigation想插在中间用带数字前缀的组名数字越小越靠前。3.5 extension.ts 里的命令实现与接口调用命令声明好了逻辑在extension.tsimport * as vscode from vscode; export function activate(context: vscode.ExtensionContext) { const disposable vscode.commands.registerCommand( good-tool.updateRoute, async () { const config vscode.workspace.getConfiguration(goodTool); const apiKey config.getstring(apiKey); const model config.getstring(model); if (!apiKey) { vscode.window.showWarningMessage(请先在设置里填写 goodTool.apiKey); return; } const editor vscode.window.activeTextEditor; const selected editor?.document.getText(editor.selection) ?? ; try { const res await fetch(https://taotoken.net/api/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model, messages: [{ role: user, content: selected || 你好 }] }) }); const data await res.json(); const text data.choices?.[0]?.message?.content ?? JSON.stringify(data); vscode.window.showInformationMessage(text.slice(0, 200)); } catch (err) { vscode.window.showErrorMessage(请求失败${err}); } } ); context.subscriptions.push(disposable); }注意 Node 18 才有全局fetchVS Code 新版内置的 Node 版本够用。如果报fetch is not defined升级 VS Code 或改用https模块。3.6 settings.json 配置骨架在用户或工作区的settings.json里填{ goodTool.apiKey: 你的 TaoToken Key, goodTool.model: claude-3-5-sonnet }Key 在控制台生成地址是 https://taotoken.net/console 。填完保存插件读配置时会自动拿到。4. 验证请求从菜单点击到接口返回4.1 启动调试按F5启动扩展开发宿主窗口。在新窗口里打开一个.json文件编辑器标题栏应该出现“更新路由”按钮。如果没出现先检查when条件里的语言 ID 是否匹配。4.2 触发命令并观察结果选中一段文本点标题栏按钮。如果 Key 没填会弹出警告填了 Key会发请求到https://taotoken.net/api/v1/chat/completions返回内容以通知形式显示前 200 字符。成功时你会看到模型返回的文本片段。失败时看错误信息401 通常是 Key 无效404 是路径写错超时是网络问题。4.3 用命令面板二次验证按CtrlShiftP输入“更新路由”如果能搜到并执行说明contributes.commands声明正确。搜不到就是commands里漏了声明或者commandID 和registerCommand不一致。4.4 验证配置读取在命令里加一行console.log(config)打开“帮助 切换开发人员工具”看控制台输出确认apiKey和model读到了值。这一步能快速区分“配置没读到”和“请求发失败”。5. 本篇常见错排查5.1 菜单不显示先查when条件。把when临时删掉如果菜单出现了就是条件写错。常见错误语言 ID 拼错、用了不存在的变量、写成。再查menus的 key 是否写对editor/title和editor/title/context是两个不同位置写错位置菜单不会出现在预期的地方。5.2 菜单点了没反应九成是commandID 不匹配。menus里的command、commands里的command、registerCommand的第一个参数三处必须完全一致大小写敏感。5.3 命令面板搜不到命令contributes.commands里没声明或者被commandPalette的when隐藏了。检查有没有写commandPalette: [{ command: ..., when: false }]这类配置。5.4 请求返回 401Key 没填、填错、或者带了多余空格。在设置里重新粘贴一次注意别把换行符带进去。Key 在 https://taotoken.net/api-keys 生成。5.5 fetch 报错VS Code 版本太旧内置 Node 不支持全局fetch。升级 VS Code或者改用node-fetch并注意打包时的依赖处理。5.6 配置改了不生效getConfiguration读的是当前作用域的配置。工作区设置会覆盖用户设置检查是不是在另一个作用域里填了空值。6. 把链路固定下来菜单、配置、接口各就各位菜单这块核心就三处对齐menus声明位置和条件、commands声明命令、registerCommand实现逻辑三者的commandID 必须一致。when控制显示时机group控制排序这两个是调优项不影响功能是否跑通。接口这块把 base URL 固定为https://taotoken.net/apiKey 和模型名走配置。这样插件代码里不出现具体服务商换模型只改设置。配置项在contributes.configuration声明用户在settings.json填值命令里用getConfiguration读取。如果你后面要做长期编码类插件或者 Agent 形态的工具可以考虑 Coding Plan 这类按周期计费的方式地址是 https://taotoken.net/coding-plan 。单纯验证模型返回用模型对话页面对比一下输出即可https://taotoken.net/models 。接入文档在 https://taotoken.net/doc API Keys 管理在 https://taotoken.net/api-keys 。下一步可以做的把菜单挂到explorer/context对选中的文件做处理或者加一个view/title菜单在自定义视图里触发。菜单位置换了when和group跟着调命令实现基本不用动。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/10/6 15:16:42

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/10/7 8:13:40

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/6 15:18:24

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/6 16:48:59

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/7 12:13:57

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/6 16:58:56

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉