当前位置: 首页 > news >正文

VS Code插件开发实战:一键复制代码引用提升团队协作效率

1. 项目概述:一个提升代码协作效率的编辑器插件

在团队协作开发或者日常的技术分享、问题排查中,我们经常需要告诉同事:“你看src/utils/validator.ts文件的第96到101行,这里的逻辑有问题。” 过去,我们可能需要手动复制文件路径,再敲上冒号和行号,不仅繁琐,还容易出错。今天要聊的这个项目——copy-code-reference,就是为了解决这个看似微小却高频的痛点而生的。它是一个VS Code(以及兼容的Cursor编辑器)扩展,核心功能就一句话:一键将当前文件的路径和选中的行号范围复制到剪贴板

它的输出格式非常干净:path/to/file.ts:96-101。如果你只选中了一行,或者没有选中任何内容(光标所在行),它会智能地输出单行引用,比如path/to/file.ts:96。这个格式是许多命令行工具(如grep -n)、代码审查系统和Markdown文档都广泛支持的链接或定位格式,直接粘贴到聊天窗口、Issue描述或者文档里,对方就能精准定位。

这个项目特别适合所有使用VS Code或Cursor进行开发的工程师,无论是前端、后端还是全栈。它不改变你的编码习惯,只是在你需要“指哪打哪”的时候,提供一个极其顺手的工具。接下来,我会从设计思路、开发细节、实操要点到深度定制,完整拆解这个插件的实现与应用,让你不仅能用好它,更能理解其背后的设计哲学,甚至可以根据自己的需求进行改造。

2. 核心设计思路与方案选型

2.1 为什么选择VS Code扩展这个形式?

首先,我们需要理解为什么这个功能要以扩展(Extension)的形式存在,而不是一个独立的脚本或应用程序。核心原因在于上下文集成操作流无缝性

一个代码引用必须包含两个核心信息:文件路径行号。要获取这两个信息,最直接、最准确的方式就是从编辑器本身获取。VS Code和Cursor提供了强大的扩展API,可以让我们直接访问当前活跃的编辑器(vscode.window.activeTextEditor),进而拿到文档URI和用户选中的文本范围(Selection)。如果脱离编辑器环境,我们可能需要通过操作系统API来获取当前焦点窗口、解析标题栏信息等,这种方法极其脆弱且跨平台兼容性差。

其次,开发者的操作流是“在编辑器中编码 -> 需要分享位置 -> 执行操作”。将这个操作以命令(Command)的形式集成到编辑器的命令面板(Command Palette)和快捷键体系中,实现了“所想即所得”。用户不需要切换窗口、运行额外脚本,思维和操作没有断层,效率提升是实质性的。

2.2 输出格式的深思熟虑:file:start-end

项目选择的path/to/file.ts:96-101格式,是一种事实上的标准,通常被称为“冒号格式”(colon format)。这个设计背后有几个关键的考量:

  1. 通用性:从古老的grep -n输出,到现代git blameag(The Silver Searcher)等命令行工具,都采用文件名:行号的格式。这使得插件输出可以直接用于后续的脚本处理。例如,你可以用code -g $(pbpaste)(macOS)或code -g $(xclip -o)(Linux)命令,直接用VS Code打开剪贴板中对应的文件和行。
  2. 可读性:对人类而言,这种格式一目了然。路径指明了文件,冒号后是行号,短横线表示范围。它比一些IDE生成的复杂URL(如vscode://file/...)更简洁,在纯文本环境中(如终端日志、SSH会话)也能无障碍阅读。
  3. 无歧义性:使用相对路径还是绝对路径?项目选择了相对路径(相对于当前打开的工作区根目录)。这是更实用的选择。在团队协作中,分享绝对路径/Users/Alice/projects/app/src/utils.ts:10是无效的,因为同事Bob的电脑上没有这个路径。而相对路径src/utils.ts:10则假设双方的项目结构一致,这在基于同一代码库协作时是成立的。插件通过vscode.workspace.asRelativePath()API智能地实现了这一点。

注意:这里的“相对路径”是相对于你在VS Code中打开的文件夹(工作区)的根目录。如果你在子文件夹中打开了文件,或者使用了多根工作区,插件会正确计算出相对于最近的工作区根目录的路径。

2.3 快捷键设计的平台适配性

插件默认的快捷键是Cmd+Alt+C(macOS)和Ctrl+Alt+C(Windows/Linux)。这个设计也值得推敲。

  • Alt键的选用:在Windows/Linux上,Ctrl+C是全局复制快捷键。为了避免冲突,必须加上修饰键。Alt是一个常见的选择,它通常不与核心编辑快捷键冲突。
  • 跨平台一致性:使用Cmd对应macOS的“Command”键,Ctrl对应其他系统的“Control”键,这是跨平台软件的标准做法。扩展的配置清单(package.json)中的keybindings字段可以分别定义,VS Code运行时会根据操作系统自动选择。
  • 可配置性:任何快捷键都可能与用户已有的习惯或其他扩展冲突。因此,插件将快捷键的定义权完全交给用户。文档中明确指引用户通过“键盘快捷方式”界面进行自定义,这是一个良好的用户体验设计,遵循了VS Code“一切皆可配置”的理念。

3. 插件核心实现细节解析

3.1 项目结构与核心文件

一个典型的VS Code扩展项目结构如下,copy-code-reference也基本遵循:

copy-code-reference/ ├── .vscode/ # VS Code工作区配置,如启动配置 ├── src/ │ └── extension.ts # **扩展的入口和核心逻辑文件** ├── package.json # **扩展的清单文件,定义元数据、命令、快捷键** ├── tsconfig.json # TypeScript编译配置 └── README.md # 项目说明文档

对于这个功能单一的插件,核心就是src/extension.tspackage.json

3.2package.json:扩展的“身份证”与“菜单”

package.json是VS Code识别扩展的必备文件,它定义了扩展的基本信息、激活事件、提供的命令以及贡献点(如快捷键)。

{ "name": "copy-code-reference", "displayName": "Copy Code Reference", "description": "Copies a reference to the current file and selected line range.", "version": "1.0.0", "engines": { "vscode": "^1.60.0" }, "categories": ["Other"], "activationEvents": ["onCommand:copy-code-reference.copy"], "main": "./out/extension.js", "contributes": { "commands": [{ "command": "copy-code-reference.copy", "title": "Copy Code Reference (file:startLine-endLine)" }], "keybindings": [{ "command": "copy-code-reference.copy", "key": "ctrl+alt+c", "mac": "cmd+alt+c", "when": "editorTextFocus" }] } }
  • activationEvents:"onCommand:copy-code-reference.copy"表示只有当用户尝试执行这个命令时,扩展的代码才会被加载和激活。这是一种“懒加载”机制,对于这种轻量级工具插件非常合适,避免了启动时加载所有扩展影响性能。
  • contributes.commands: 这里向VS Code注册了一个命令,并定义了它在命令面板中显示的名称。
  • contributes.keybindings: 这里定义了默认的键盘快捷键。when条件editorTextFocus确保了只有当焦点在文本编辑器内时,这个快捷键才生效,防止在其他界面(如侧边栏搜索框)误触发。

3.3extension.ts:核心逻辑的实现

这是所有魔法发生的地方。我们来看一下其核心函数activate和命令处理逻辑。

import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { // 注册命令 let disposable = vscode.commands.registerCommand('copy-code-reference.copy', () => { const editor = vscode.window.activeTextEditor; if (!editor) { vscode.window.showWarningMessage('No active editor found!'); return; } const document = editor.document; const selection = editor.selection; // 1. 获取文件相对于工作区的路径 const filePath = vscode.workspace.asRelativePath(document.uri); // 2. 计算行号(VS Code API的行号是从0开始的,所以需要+1) let lineReference: string; if (selection.isEmpty) { // 没有选择文本,使用光标所在行 lineReference = `${selection.start.line + 1}`; } else { // 选择了文本范围,格式化为 start-end const startLine = selection.start.line + 1; const endLine = selection.end.line + 1; // 注意:如果选择结束位置在第0列,通常意味着光标在行首,此时endLine需要-1。 // 但为了简单和符合直觉,大多数插件(包括这个)直接使用endLine。 // 更精确的做法是判断 selection.end.character === 0,这里做了简化。 lineReference = `${startLine}-${endLine}`; } // 3. 拼接最终字符串 const reference = `${filePath}:${lineReference}`; // 4. 写入剪贴板 vscode.env.clipboard.writeText(reference).then(() => { // 可选:显示一个短暂的确认提示 vscode.window.setStatusBarMessage(`Copied: ${reference}`, 3000); }); }); context.subscriptions.push(disposable); } export function deactivate() {}

关键点解析:

  1. 获取活跃编辑器vscode.window.activeTextEditor是API的入口。如果返回undefined,说明当前没有打开的文本编辑器(可能正在浏览设置或扩展市场),此时给出友好提示并退出。
  2. 相对路径转换vscode.workspace.asRelativePath(document.uri)是整个路径处理的核心。它会自动处理单根工作区、多根工作区等情况,返回最简洁、可共享的路径。
  3. 行号计算:VS Code内部的行号和列号都是从0开始索引的,但对外显示和大多数引用格式都是从1开始。所以这里需要+1。这是一个非常容易出错的细节。
  4. 选择范围处理selection.isEmpty判断是否有文本被高亮选中。如果没有,则使用光标所在的起始行(selection.start.line)。这里有一个潜在的边界情况:当用户用鼠标从某行开头拖拽到下一行开头时,selection.end可能位于下一行的第0列。严格来说,这意味着选中范围实际只到上一行的末尾。有些更严谨的实现会判断selection.end.character === 0,然后将endLine - 1。本项目采用了更直观的处理方式,直接使用endLine,这在大多数情况下符合用户的操作直觉(我选中了这几行)。
  5. 剪贴板操作vscode.env.clipboard.writeText()是VS Code提供的跨平台剪贴板API,无需依赖nodeclipboardy等第三方包,更加稳定可靠。
  6. 状态栏反馈:使用vscode.window.setStatusBarMessage在编辑器底部状态栏显示一个临时提示,告知用户操作成功。这是一个非阻塞、低调的反馈方式,比弹出信息框体验更好。

4. 从零开始:开发、调试与安装全流程

4.1 环境准备与项目初始化

假设你已经安装了Node.js(>=14.x)和VS Code。首先,你需要安装VS Code扩展开发的基础工具。

# 全局安装VS Code扩展打包和管理工具 npm install -g @vscode/vsce yo generator-code
  • @vscode/vsce:VS Code Extension Manager,用于打包和发布扩展。
  • yogenerator-code:Yeoman脚手架工具和VS Code扩展项目生成器。

然后,使用脚手架快速生成一个扩展项目骨架:

# 创建一个新目录并进入 mkdir my-copy-ref-extension cd my-copy-ref-extension # 运行Yeoman生成器 yo code

在交互式命令行中:

  1. 选择New Extension (TypeScript)
  2. 输入你的扩展名,例如copy-code-reference
  3. 输入标识符、描述等。
  4. 对于是否初始化Git仓库,按需选择。

生成的项目已经包含了package.jsonsrc/extension.tstsconfig.json以及调试配置。你可以用这个作为起点,将上面extension.ts的代码替换进去,并修改package.json中的contributes部分。

4.2 实时调试:F5的魔法

VS Code扩展开发最爽的一点就是“实时调试”。打开你刚创建的项目文件夹,直接按下F5

  1. 发生了什么?VS Code会启动一个“扩展开发宿主”窗口。这是一个全新的、独立的VS Code实例,但它会加载你当前正在开发的扩展。
  2. 如何测试?在这个新窗口中,随便打开一个文件,用鼠标或键盘选中几行代码。
  3. 执行命令
    • 按下默认的Ctrl+Alt+C(或Cmd+Alt+C)。
    • 或者,打开命令面板(Ctrl+Shift+P/Cmd+Shift+P),输入“Copy Code Reference”并执行。
  4. 验证结果:打开一个文本编辑器(如记事本或新的VS Code文件),按Ctrl+V粘贴。你应该能看到格式为文件路径:起始行-结束行的字符串。

调试技巧

  • 你可以在原开发窗口的src/extension.ts中设置断点,当在新窗口触发命令时,执行会在断点处暂停,你可以查看所有变量状态。
  • 开发窗口的“调试控制台”会输出扩展的日志信息,对于排查问题非常有用。

4.3 打包与永久安装

当你调试无误,功能稳定后,就可以打包成.vsix文件,分发给他人或自己永久安装了。

# 确保在项目根目录下 # 1. 安装项目依赖(如果package.json里有依赖) npm install # 2. 编译TypeScript代码 npm run compile # 或者使用VS Code的构建任务(Ctrl+Shift+B / Cmd+Shift+B) # 3. 使用vsce打包 vsce package

执行成功后,会在当前目录生成一个类似copy-code-reference-1.0.0.vsix的文件。

永久安装

  1. 在VS Code中,切换到“扩展”视图(侧边栏方块图标)。
  2. 点击右上角的“...”更多操作按钮。
  3. 选择“从VSIX安装...”。
  4. 在弹出的文件选择器中,找到并选中你刚刚生成的.vsix文件。

安装完成后,扩展就会出现在你的已安装扩展列表中,并在所有工作区中生效。你可以随时禁用或卸载它。

实操心得:在打包前,务必仔细检查package.json中的engines.vscode字段,它定义了扩展兼容的VS Code最低版本。如果你用到了较新的API,但这里版本号写低了,可能会导致在低版本VS Code上运行时出错。通常,可以查看你使用的API在哪个VS Code版本引入,将其作为最低版本要求。

5. 高级定制与功能拓展思路

基础功能已经很好用,但我们可以让它变得更强大,更贴合个人或团队的工作流。

5.1 自定义输出格式

也许你的团队使用不同的代码引用格式,比如Jira风格[文件|行号],或者想直接生成一个可点击的链接。我们可以通过修改extension.ts中的字符串拼接逻辑来实现,并最好将其设计为可配置的。

首先,在package.jsoncontributes部分添加配置项:

"contributes": { "configuration": { "title": "Copy Code Reference", "properties": { "copyCodeReference.format": { "type": "string", "default": "{file}:{start}-{end}", "description": "Output format. Placeholders: {file}, {start}, {end}. For single line, {end} is omitted." } } } }

然后,在extension.ts中读取配置并格式化:

import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { let disposable = vscode.commands.registerCommand('copy-code-reference.copy', () => { const editor = vscode.window.activeTextEditor; if (!editor) { return; } const config = vscode.workspace.getConfiguration('copyCodeReference'); const formatTemplate = config.get<string>('format') || '{file}:{start}-{end}'; const document = editor.document; const selection = editor.selection; const filePath = vscode.workspace.asRelativePath(document.uri); const startLine = selection.start.line + 1; let endLine = selection.end.line + 1; let reference: string; if (selection.isEmpty) { // 单行情况,可能不需要{end}占位符 reference = formatTemplate.replace('{file}', filePath).replace('{start}', startLine.toString()).replace('-{end}', '').replace('{end}', ''); } else { reference = formatTemplate.replace('{file}', filePath).replace('{start}', startLine.toString()).replace('{end}', endLine.toString()); } vscode.env.clipboard.writeText(reference); vscode.window.setStatusBarMessage(`Copied: ${reference}`, 2000); }); context.subscriptions.push(disposable); }

这样,用户就可以在VS Code设置(settings.json)中自定义格式了:

{ "copyCodeReference.format": "[{file}|L{start}-L{end}]" } // 输出示例:[src/app.ts|L10-L15]

5.2 集成远程开发与WSL

如果你使用VS Code的远程开发功能(连接到SSH服务器、WSL或容器),这个插件也能无缝工作。因为vscode.workspace.asRelativePath()和剪贴板API在远程上下文中是被正确代理的。复制出来的路径是远程机器上的路径(相对于远程工作区)。这对于在本地VS Code中操作远程代码并分享位置给同样能访问远程环境的同事,非常有用。

5.3 扩展为“复制GitHub/GitLab链接”

一个更高级的拓展思路是:不仅复制文件路径和行号,还能直接生成该代码在GitHub或GitLab仓库中的网页链接。这需要插件具备以下能力:

  1. 识别Git仓库:使用vscode.workspace.findFiles('.git', '**/.git', 1)或通过git命令判断当前工作区是否在Git仓库中。
  2. 获取远程仓库URL:执行git remote get-url origin命令,并解析出仓库的HTTPS或SSH地址,将其转换为网页基础URL(如将git@github.com:user/repo.git转为https://github.com/user/repo)。
  3. 获取当前分支或提交哈希:执行git rev-parse --abbrev-ref HEAD获取分支名,或git rev-parse HEAD获取完整提交哈希。
  4. 拼接URL:按照GitHub/GitLab的代码片段URL格式进行拼接。例如,GitHub的格式是:https://github.com/user/repo/blob/<branch|commit>/<file-path>#L<start>-L<end>

实现这个功能会使插件从一个简单的文本复制工具,升级为一个强大的协作工具。当然,这也会增加插件的复杂度和依赖(需要系统安装Git并可用)。

6. 常见问题排查与操作技巧

6.1 快捷键不生效?

这是最常见的问题。请按以下步骤排查:

  1. 检查焦点:确保光标在文本编辑器内,而不是在侧边栏、终端或搜索框中。快捷键绑定的when条件是editorTextFocus
  2. 检查冲突:打开命令面板(Ctrl+Shift+P/Cmd+Shift+P),输入“Preferences: Open Keyboard Shortcuts (JSON)”,查看是否有其他扩展或用户设置覆盖了Ctrl+Alt+CCmd+Alt+C。JSON文件中搜索copy-code-reference,看其绑定是否正确。
  3. 重新加载窗口:有时扩展加载可能有问题。执行“Developer: Reload Window”命令,或重启VS Code。
  4. 检查扩展是否激活:在扩展视图中,确认Copy Code Reference扩展已启用。可以尝试禁用再启用。

6.2 复制的内容格式不对(例如是绝对路径)?

  1. 确认工作区:插件输出的是相对于当前VS Code窗口打开的工作区根目录的路径。如果你只是单独打开了一个文件(File -> Open File),而没有打开包含它的文件夹(File -> Open Folder),那么asRelativePath可能无法计算相对路径,从而回退到绝对路径。最佳实践是始终以文件夹(项目)为单位打开
  2. 多根工作区:如果你打开了多个文件夹(多根工作区),插件会正确输出相对于该文件所属的根文件夹的路径。

6.3 行号范围感觉“多了一行”?

这是由文本选择行为导致的。当你用鼠标从第10行拖到第15行时,VS Code的Selection对象认为你选中了第10、11、12、13、14、15行的全部内容。所以endLine是15。但有时你可能只想选中到第14行末尾。更精确的插件逻辑应该这样处理:

let endLine = selection.end.line + 1; if (selection.end.character === 0 && !selection.isEmpty && selection.end.line > selection.start.line) { // 如果选择结束在某一行的第0列,且不是同一行,则认为是选中到了上一行的末尾 endLine = selection.end.line; // 注意,因为前面已经+1,这里要回退 }

你可以根据自己团队的约定,修改插件代码中的这部分逻辑。我个人认为,对于大多数“选中几行代码”的场景,直接包含endLine更符合直觉。

6.4 如何为特定语言或文件类型禁用此插件?

VS Code的快捷键绑定支持丰富的when条件上下文。你可以通过修改键盘快捷键来实现。例如,你不想在Markdown文件中触发这个快捷键:

  1. 打开键盘快捷键(JSON)。
  2. 添加一条规则,覆盖默认绑定,并加上!editorLangId == markdown条件。
{ "key": "ctrl+alt+c", "command": "-copy-code-reference.copy", // “-”号表示移除原有绑定 "when": "editorTextFocus" }, { "key": "ctrl+alt+c", "command": "copy-code-reference.copy", "when": "editorTextFocus && !editorLangId == markdown" // 在非Markdown文件中生效 }

6.5 开发时遇到“命令未找到”错误?

在扩展开发宿主窗口执行命令时,如果提示命令未找到,请检查:

  1. 编译:确保你的TypeScript代码已成功编译为JavaScript(out/extension.js)。在开发窗口按Ctrl+Shift+B(Cmd+Shift+B)执行构建任务。
  2. 注册:确认package.json中的commands部分和extension.ts中注册的命令ID完全一致。
  3. 重启宿主窗口:有时需要关闭扩展开发宿主窗口,在开发窗口重新按F5启动。

7. 总结与同类工具对比

copy-code-reference插件体现了一个优秀工具的核心特质:解决一个具体、高频的痛点,并且做到极致简单和可靠。它没有复杂的设置界面,没有冗余的功能,就是“一键复制,精准定位”。

我们可以将其与一些类似功能或插件对比:

  • VS Code内置的“复制路径”:VS Code有“复制路径”和“复制相对路径”命令,但它们不包含行号信息。你需要先复制路径,再手动查看并输入行号,步骤繁琐。
  • GitHub Copilot等AI助手:你可以让AI生成一段包含代码引用的描述,但这需要联网、需要组织语言,远不如一个快捷键直接。
  • 更复杂的代码片段分享插件:有些插件可以创建包含代码片段、高亮和上下文信息的精美分享链接(如PolacodeCodeSnap),但它们的目标是生成图片或富文本,用于演示或文档。copy-code-reference的目标是纯文本、机器可读、快速传递,场景不同。

我个人在实际项目中的体会是,这个插件已经成为肌肉记忆。在代码审查时,我会边看边用Ctrl+Alt+C复制有疑问的代码位置,然后粘贴到审查评论中。在线上故障应急群里,直接复制出错堆栈对应的源码位置,能让大家立刻聚焦。它缩短了从“看到问题”到“指出位置”的路径,让技术沟通的精度和效率都上了一个台阶。

最后,如果你觉得默认的快捷键Ctrl+Alt+C容易误触(它离Ctrl+C太近),我强烈建议你把它改成更顺手的组合。比如,我把它改成了Ctrl+Shift+C,因为Ctrl+C是复制内容,Ctrl+Shift+C是复制引用,逻辑上很连贯。改快捷键的方法,文章开头就提到了:打开键盘快捷方式,搜索“Copy Code Reference”,点击左侧的铅笔图标修改即可。一个好的工具,应该完全适配你的工作流,而不是让你去适应它。

http://www.jsqmd.com/news/769044/

相关文章:

  • 5分钟掌握Bili2Text:将B站视频智能转化为结构化文字稿
  • YOLO11涨点优化:Loss魔改 | NWD (Normalized Wasserstein Distance) 损失接入,专为Tiny微小目标检测量身定制
  • 从零构建现代化Web框架:Node.js+TypeScript实战解析
  • 用STM32的硬件I2C做个简易平衡仪:MPU6050数据获取与OLED显示实战
  • 如何彻底解决腾讯游戏ACE-Guard卡顿问题:终极性能优化指南
  • ESPTool终极指南:从零掌握ESP芯片烧录与调试的完整解决方案
  • 别再只扫22和80了!利用5985端口WinRM服务,手把手教你另一种Get Shell的方式
  • OpenClaw机械臂VCP通信工具箱:Python串口控制与自动化抓取实战
  • 复古游戏库搭建指南:从ROM整理到前端美化的完整实践
  • 如何高效使用抖音无水印下载器:5个核心技巧全解析
  • 【独家首发】VSCode 2026 Agent协作协议v2.3未公开文档泄露:含本地沙箱隔离机制、跨Agent记忆同步算法及IDE内核级Hook点清单
  • OpenClaw记忆插件基准测试:量化评估LLM智能体记忆模块性能
  • AI智能体平台实战:从架构解析到多智能体协作开发
  • WarcraftHelper终极指南:如何在现代电脑上完美运行魔兽争霸3
  • SketchUp STL插件终极指南:3D打印模型转换的完整解决方案
  • WatermarkRemover技术实现方案:基于LAMA模型的视频水印智能移除系统
  • 从稚晖君视频学到的:用KeyShot 10给AD设计的PCB做产品级渲染(附高质量封装库获取)
  • ARM64开发实战:用DC CIVAC指令搞定多核缓存一致性(附代码示例)
  • 高效QMC音频解密:3分钟解锁QQ音乐加密文件的专业方案
  • Windows终极解决方案:3步完美显示苹果HEIC照片缩略图
  • RPG Maker Decrypter终极指南:如何轻松解密和提取RPG游戏资源
  • 在线学习与实时预测:构建动态机器学习系统的实战指南
  • 财务报表怎么分析?一个公式搞定财务报表分析!
  • 广东工业大学考研辅导班机构选择:排行榜单与哪家好评测 - michalwang
  • MacType字体渲染终极指南:让Windows文字显示如macOS般清晰锐利
  • 紧急预警:VSCode 2026.3已废弃旧版AgriSDK接口!3类存量插件将在2026年Q3强制下线,迁移倒计时47天
  • Codex 使用详解
  • 新手教程使用Python在Taotoken上一分钟完成大模型API首次调用
  • ChatGPT CLI:零API成本,终端与MCP生态无缝集成AI助手
  • 广东酒店管理职业技术学院未来趋势:大湾区职教标杆的崛起之路 - 品牌策略师