Tabby VSCode 扩展全功能演进指南:从代码补全到 Chat、Inline Edit 与 Git 集成
Tabby 是一款开源的 Self-hosted AI 编程助手,其 VSCode 客户端(clients/vscode 目录)通过连接自托管的 Tabby Server,在编辑器内提供实时多行代码补全、代码问答 Chat、内联编辑(Inline Edit)与 Git 提交信息生成等能力。本文以扩展官方 CHANGELOG.md 为主线,结合仓库内扩展源码与配置声明,系统梳理从早期 0.1.2 到 1.26.0 各版本的核心功能、配置项、快捷键与实现原理,帮助你完整掌握 Tabby VSCode 扩展的使用方式与内部机制。
Tabby 扩展的 Chat 视图,可从活动栏(Activity Bar)打开并直接与 AI 助手对话(图片来源:扩展内置 walkthrough 资源)
一、扩展定位与安装
Tabby VSCode 扩展的工程定义位于 clients/vscode/package.json,其声明信息明确:
- 扩展 ID:
TabbyML.vscode-tabby,采用 Apache-2.0 许可证; - 功能关键词包括:AI、代码补全(code completion)、IntelliSense 等;
- 支持 Node 与 Browser 两种运行环境(
main指向dist/node/extension.js,browser指向dist/browser/extension.js),因此既可以在桌面版 VSCode 中使用,也可以作为 Web 扩展在浏览器中运行; - 最低要求 VSCode 版本
^1.82.0(该要求自 0.5.0 起生效,见 CHANGELOG 0.5.0 的 Incompatible Changes)。
安装方式按 clients/vscode/README.md 的说明:打开快速打开面板(Ctrl/Cmd+P)后粘贴以下命令并回车:
ext install TabbyML.vscode-tabby
安装完成后,先完成自托管 Tabby Server 的部署,然后使用命令面板中的 Tabby: Connect to Server... 连接服务器并填写 token 即可开始使用。
二、功能总览:五大核心能力
结合 CHANGELOG 与 package.json 的 contributes.commands 声明,扩展的能力可以归纳为以下五个模块:
| 模块 | 核心能力 | 典型命令 |
|---|---|---|
| Code Completion | 实时多行/整函数补全、多候选、手动触发、按语言禁用 | Tabby: Trigger Code Completion Manually |
| Chat | 代码问答、@ 引用文件/符号/@changes diff、Code Review、最近历史 |
Tabby: Explain This、Tabby: Code Review |
| Inline Edit | 对选中代码进行流式编辑并预览 diff、接受/放弃 | Tabby: Start Inline Editing |
| Git 集成 | 生成提交信息、生成分支名建议 | Tabby: Generate Commit Message、Tabby: Create Branch with Suggestions |
| 连接与配置 | 服务器连接、token 管理、代理、匿名遥测开关 | Tabby: Connect to Server...、Tabby: Update Token... |
扩展通过 viewsContainers.activitybar 在活动栏注册了名为 Tabby 的容器,其中包含一个 Webview 类型的 Chat 视图(tabby.chatView);同时在 editor/context(编辑器右键菜单)、scm/title(源代码管理标题栏)、terminal/context(终端右键菜单)等多个位置注册了入口,构成完整的工作流闭环。
三、Chat 面板:从 1.7.3 到 1.26.0 的演进
Chat 是 CHANGELOG 中笔墨最多的模块。它最早以“聊天视图”形式出现在 1.7.3(可从活动栏访问),此后每个版本都在强化上下文能力与交互体验。
3.1 上下文引用:@ 与右键菜单
从 1.20.0 起,在 Chat 面板输入框中使用 @ 即可快速选择当前打开的文件作为对话上下文(要求 Tabby Server 0.24.0+);1.22.0 扩展为可以引用符号(函数、变量等,要求 Server 0.25.0+);1.26.0 进一步支持 @changes 将当前 Git diff 直接纳入上下文。1.14.0 引入的动态指示器会在输入框显示当前选中文本,明确告知用户哪些内容会被用作上下文。
与此对应,源码 clients/vscode/src/chat/context.ts 负责收集上下文,而扩展声明了 Tabby: Add Selection to Chat(Ctrl/Cmd+L)与 Tabby: Add File to Chat 两个命令,可通过右键菜单或快捷键将选区/文件送入对话。1.16.0 起 Chat 响应中引用的符号支持点击跳转到定义处(要求 Server 0.21.2/0.22.0+)。
3.2 代码块操作:Smart Apply 与执行建议脚本
- 1.14.0 引入 “Smart Apply” 按钮:Chat 生成的代码块可直接在当前编辑器中应用修改(要求最新版 Tabby Server);
- 1.26.0 新增对代码组件中建议 Shell 脚本的“直接执行”按钮,体验类似于
Apply in Editor; - 1.26.0 还新增
Code Review右键菜单选项:选中代码后可直接让 Tabby 审查并添加评论。
3.3 历史记录与会话保持
- 1.24.0 支持在 Chat 面板查看最近对话历史(要求 Server 0.26.0+),面板视图标题栏提供
New Chat与Chat History按钮(见 package.json 的view/title菜单); - 1.20.0 起,将 Chat 面板拖到不同视图组时对话内容得以保留(要求 Server 0.24.0+);同版本还默认以当前活动编辑器作为上下文;
- 1.18.0 支持显式选择已配置的 Git 仓库作为对话上下文,并支持使用 Notebook 编辑器的当前选中内容作为上下文。
从实现上看,Chat 面板既可作为侧边栏视图,也可通过 Tabby: Open Chat in Editor 在编辑器组中以标签页打开(1.12.0)。源码 clients/vscode/src/chat/chatPanel.ts 展示了如何用 createWebviewPanel 创建面板,并通过 retainContextWhenHidden 保持会话状态;clients/vscode/src/chat/sidePanel.ts 则对应侧边栏形态。
四、Code Completion:补全策略与按语言禁用
代码补全始终是扩展的核心。CHANGELOG 中与补全相关的关键演进包括:
- 1.26.0:支持针对特定语言禁用补全,可通过状态栏菜单或高级设置
inlineCompletion.disabledLanguages配置;对应的切换命令为Tabby: Enable/Disable Inline Completion for Current Language; - 1.16.0:补全候选窗口打开时仍可基于选中项提供内联补全;接受使用了符号的补全后自动补充 import 语句;新增后处理过滤器,修复部分模型补全缩进多出空格的问题;
- 1.12.3:补全上下文增强,支持收集最近浏览过的编辑器中的代码片段;
- 1.5.3:为补全请求附带额外上下文,包括文件路径、Git 仓库信息、相关声明代码片段与最近编辑的代码片段;
- 0.6.0:引入手动触发模式,
Alt + \手动触发,取代原先的启用/禁用开关。
补全的触发与展示由 clients/vscode/src/InlineCompletionProvider.ts 实现:它实现 VSCode 的 InlineCompletionItemProvider,通过 tabby-agent 的 LSP 协议发起 InlineCompletionRequest,并管理 automatic / manual 两种触发模式;状态栏加载指示是否显示,取决于是否有进行中的请求(isLoading,该逻辑在 1.12.5 修复了重复注册导致的指示不更新问题)。
4.1 触发模式与快捷键
| 设置 | 取值 | 说明 |
|---|---|---|
inlineCompletion.triggerMode |
automatic(默认)/ manual |
自动:停止输入后触发;手动:按 Alt + \ 触发 |
两种触发模式都要求在补全请求“自动触发模式下”显示加载指示器(1.1.0 引入)。手动模式下的触发键绑定见 package.json 的 keybindings 段:alt+\,并且仅在 editorTextFocus && !editorHasSelection && !inlineSuggestionsVisible 时生效。
4.2 补全接受键位:vscode-style 与 tabby-style
自 0.1.2 引入 Tabby-Style 键位、0.2.1 起默认改为 VSCode 风格后,键位方案通过 tabby.keybindings 设置切换(1.4.0 修复了 macOS 上 cmd+right 接受下一个单词的问题):
| 键位方案 | 接受下一行 | 接受整个补全 | 接受下一个单词 |
|---|---|---|---|
| vscode-style(默认) | - | Tab |
Ctrl/Cmd + RightArrow |
| tabby-style(实验性) | Tab |
Ctrl + Tab |
Ctrl/Cmd + RightArrow |
4.3 按语言禁用补全的实现
clients/vscode/src/Config.ts 中 disabledLanguages 读取高级设置 inlineCompletion.disabledLanguages(默认空数组,即全部启用);clients/vscode/src/StatusBarItem.ts 的 checkIfCurrentLanguageDisabled 会读取当前编辑器 languageId 并据此在状态栏显示 $(x) Tabby 与提示 “disabled for files”。同时,命令面板(clients/vscode/src/commands/commandPalette.ts)会动态展示 “Enable/Disable completions for <当前语言>” 项,一键切换。
五、Inline Edit:内联编辑工作流
Inline Edit 提供“在编辑器内直接编辑选中代码并预览 diff”的能力,其演进脉络为:
- 1.7.3:作为实验性功能引入,选中文本后按
Ctrl/Cmd + I启动; - 1.10.0:命令
Tabby: Edit...更名为Tabby: Start Inline Editing;编辑过程的流式步骤合并为一次 undo/redo 操作; - 1.12.0:在快速修复菜单中引入 “explain or fix errors using Tabby” 动作;
- 1.22.0:可用
@将选中文件加入内联编辑上下文,编辑预览支持字符级 diff 的着色装饰; - 1.24.0:内联编辑预览中为
Accept/Discard动作增加快捷键提示; - 1.26.0:支持用
@快速选择Symbols(符号)作为内联编辑上下文。
对应的命令与键位在 package.json 中完整声明:
| 命令 | 标题 | 默认键位 |
|---|---|---|
tabby.chat.edit.start |
Start Inline Editing | Ctrl/Cmd + I |
tabby.chat.edit.stop |
Stop Inline Editing | Esc(编辑进行中) |
tabby.chat.edit.accept |
Accept Changes | Ctrl/Cmd + Enter |
tabby.chat.edit.discard |
Discard Changes | Esc(解析预览中) |
实现层面,clients/vscode/src/inline-edit/index.ts 中的 InlineEditController 会锁定编辑器光标位置(防止流式输出时选区跳动),通过 client.chat.provideEdit 以 previewChanges 格式发起请求,并在结束时释放选区;contextVariables.chatEditInProgress 等上下文变量用于控制键位 when 条件。编辑历史由 chatEdit.history(默认 20 条,0 表示禁用)控制,可通过 clients/vscode/src/Config.ts 的 maxChatEditHistory 读取。
六、Git 集成:提交信息与分支名建议
Git 相关能力在 CHANGELOG 中从实验走向成熟:
- 1.6.2:引入实验性的“生成提交信息”功能(Generate Commit Messages);
- 1.10.0:在源代码管理(SCM)视图标题栏加入生成提交信息的按钮(
tabby.chat.generateCommitMessage,带$(sparkle)图标); - 1.10.2:增强提交信息生成的后处理,修复部分场景下引号未被移除的问题;
- 1.26.0:
Generate Commit Messages命令改进——生成提交信息后,若当前仍处于main/master分支,Tabby 会自动提示创建新分支并给出建议分支名;同时新增Tabby: Create Branch with Suggestions命令,可从命令面板访问。
分支名建议的实现位于 clients/vscode/src/commands/branchQuickPick.ts:BranchQuickPick 通过 client.chat.generateBranchName 请求候选分支名,对输入做 300ms 防抖,并对相同输入做结果缓存(cache Map),过滤掉与输入完全相同的名称;建议项带 $(sparkle) 图标,用户既可以选择建议也可以直接输入新分支名创建。
七、连接、认证与配置体系
7.1 连接服务器与 token 管理
clients/vscode/src/commands/connectToServer.ts 中的 ConnectToServerWidget 实现了完整的连接流程:
- 输入 Tabby Server 的 URL,展示最近连接过的服务器列表(按
updatedAt排序)供快速选择,默认项为http://localhost:8080; - 若该服务器没有保存 token,弹出输入框(
auth_+ 32 位字符占位符,密码模式)收集 token; - 调用
fetchAgentStatusInfo({ recheckConnection: true })校验连接,断开或未授权时给出明确的模态错误与操作按钮(“Select Server” / “Update Token”)。
token 按服务器端点保存在扩展的 globalState(server.serverRecords)中,clients/vscode/src/Config.ts 负责读写,并会自动把旧版本遗留的 server.pastServerConfigs 迁移为新结构。1.16.0 起 Tabby: Connect to Server... 流程更加精简并带有服务器历史列表。
另外,自 1.2.0 起 VSCode 中设置的 token 优先于 agent 配置文件中的 token;Tabby Cloud 需要手动设置 token(不再自动打开认证页抓取)。
7.2 配置项全览
扩展的设置定义在 package.json 的 contributes.configuration 中,顶层前缀为 tabby:
| 配置项 | 类型/默认值 | 说明 |
|---|---|---|
tabby.endpoint |
string,默认 http://localhost:8080 |
Tabby Server 端点,建议通过 Tabby: Connect to Server... 命令设置 |
tabby.keybindings |
vscode-style(默认)/ tabby-style |
补全接受键位方案 |
tabby.config.telemetry |
boolean,默认 false |
关闭匿名使用数据上报(默认即不上报) |
tabby.settings.advanced.inlineCompletion.triggerMode |
automatic(默认)/ manual |
补全触发模式 |
tabby.settings.advanced.inlineCompletion.disabledLanguages |
string[],默认 [] |
禁用补全的语言 ID 列表 |
tabby.settings.advanced.chatEdit.history |
integer,默认 20 |
内联编辑最近命令历史上限,0 关闭记录 |
clients/vscode/src/Config.ts 的 buildClientProvidedConfig 会把这些设置组装为 ClientProvidedConfig 下发给 tabby-agent(LSP 客户端),包括代理(proxy.url / proxy.authorization)、服务器(server.endpoint / server.token)、补全触发模式、键位与匿名遥测开关。
7.3 HTTP 代理支持
代理能力经历了明确演进:
- 0.5.0:不再处理系统代理环境变量(
http_proxy、https_proxy、all_proxy、no_proxy),因当时不支持 https-over-http 与 socks 代理,请求会失败; - 1.8.2:支持通过环境变量或配置文件设置 HTTP 代理;
- 1.10.1:支持使用 VSCode 设置中的 http 代理配置;
- 1.16.0:默认不再使用 VSCode 设置中的 HTTP 代理,改为通过开关启用。
当前开关位于高级设置 tabby.settings.advanced.useVSCodeProxy(默认 true,见 clients/vscode/src/Config.ts 的 useVSCodeProxy),启用时读取 VSCode 的 http.proxy / https.proxy 与 http.proxyAuthorization 作为 proxy.url / proxy.authorization。
7.4 从 config.toml 到 VSCode 设置
早期版本(0.1.2、0.3.0、0.4.0)通过 $HOME/.tabby/agent/config.toml 读取配置,0.4.0 将用户数据目录迁移到 $HOME/.tabby-client/agent 以避免与 Tabby Server 数据冲突,并提供模板 config.toml;1.0.0 清理了 config.toml 模板中的废弃选项。1.1.0 的 config.toml 模板新增 server.auth 与 completion.timeout 两个配置项。1.24.0 起,扩展允许在用户授权后让其他扩展读取 Tabby Server 配置。
八、状态栏:一站式状态与命令入口
状态栏图标由 clients/vscode/src/StatusBarItem.ts 实现,点击后打开 Tabby 命令面板(tabby.commandPalette.trigger)。状态栏根据语言客户端状态与 Agent 状态切换图标与颜色:
| 状态 | 图标 | 颜色 | 含义 |
|---|---|---|---|
| Initializing / Connecting / Fetching | $(loading~spin) |
正常 | 初始化或请求进行中 |
| Unauthorized | $(key) |
警告 | token 无效,需要更新 |
| Disconnected | $(debug-disconnect) |
警告 | 服务器连接失败 |
| Ready(自动触发) | $(check) |
正常 | 就绪 |
| Ready(手动触发) | $(chevron-right) |
正常 | 就绪(手动模式) |
| 当前语言已禁用 | $(x) |
正常 | 补全对该语言关闭 |
| 响应过慢 / 触发限流 | $(warning) |
警告 | completionResponseSlow / rateLimitExceeded |
1.10.0 起状态栏支持点击弹出新版命令面板 UI(clients/vscode/src/commands/commandPalette.ts),其中按 Status / Chat / Code Completion / Settings / Help 分区展示:可一键切换自动补全、按语言启停补全、连接服务器、更新 token、打开设置与日志。0.6.1 降低了匿名使用数据的上报频率,0.6.0 起可在扩展设置中退出匿名上报。
九、命令行面板、快速修复与终端上下文
- 快速修复菜单:1.12.0 起可通过
Explain This/Fix This修复错误(见tabby.chat.explainCodeBlock等命令);1.10.1 在快速修复菜单加入Edit with Tabby入口; - 命令面板:除常规命令外,package.json 还声明了
Tabby: Quick Start(交互式 walkthrough)、Tabby: Online Help...、Tabby: Reset Ignored Issues等辅助命令; - 终端集成:扩展声明了
tabby.terminal.explainSelection(Explain)与tabby.terminal.addSelectionToChat(Add Selection to Chat),可在终端右键菜单中把选中内容交给 Tabby 解释或加入对话。
新版 Tabby 命令面板,集中展示状态、聊天、补全、设置与帮助入口(图片来源:扩展内置 walkthrough 资源)
十、实验性功能与质量优化演进
CHANGELOG 还记录了补全质量相关的实验功能与大量细节修复,值得了解其来龙去脉:
10.1 实验性补全质量特性(1.0.0–1.3.x)
1.1.0 在 config.toml 中新增以下实验开关(默认关闭,设为 true 启用):
| 配置项 | 作用 |
|---|---|
completion.prompt.experimentalStripAutoClosingCharacters |
剥离 prompt 后缀中的自动闭合括号/引号,在 FIM 模式下生成更多行 |
postprocess.limitScope.indentation.experimentalKeepBlockScopeWhenCompletingLine |
按缩进限制补全范围时,若补全延续当前行则改用块级作用域 |
postprocess.limitScope.experimentalSyntax |
使用语法解析器限制补全范围 |
postprocess.calculateReplaceRange.experimentalSyntax |
使用语法解析器计算补全替换范围,避免重复的自动闭合括号/引号 |
后续版本对这些特性做了启用/禁用调整:1.3.0 默认启用“剥离自动闭合字符”与“基于语法的后处理”;1.3.1 默认禁用“基于语法的替换范围计算”;1.3.2 默认禁用“剥离 prompt 后缀自动闭合字符”与“基于语法的补全范围限制”。
1.0.0 还加入了自动闭合字符检查以改进内联补全体验,并优化了部分接受补全时的缓存效率;0.4.0 起补全建议按缩进上下文过滤,优先补全当前行或逻辑块,并引入自适应防抖(adaptive debouncing);0.3.0 为自动补全请求加入超时(默认 5 秒)与响应时间统计,过慢时通知用户;1.3.0 移除了补全请求超时上限,改为在请求过慢时显示警告状态栏图标。
10.2 值得注意的兼容性要点
- 服务器版本联动:Chat 的诸多能力(
@引用文件/符号、历史记录、Smart Apply、Code Review、符号跳转等)都依赖对应版本的 Tabby Server,使用时请将服务器升级到 CHANGELOG 中标注的最低版本(0.24.0 / 0.25.0 / 0.26.0 / 0.27.0 等); - Web 扩展:1.12.4 修复了浏览器端初始化失败问题,1.14.0 修复了浏览器中打开远程仓库(如 GitHub 仓库)时内联补全不生效的问题;
- 端点配置:1.7.4 / 1.12.3 两次修复了端点配置以斜杠结尾导致 Chat 面板不显示的问题;
- 数据目录:0.4.1 将旧目录中的 Tabby Cloud 授权 token 与匿名追踪 ID 迁移到新数据目录。
结语
从 0.1.2 的“配置文件读取 + 基础补全”到 1.26.0 的“Chat 上下文全家桶 + 代码审查 + 分支建议”,Tabby VSCode 扩展在 clients/vscode/CHANGELOG.md 中记录了完整的功能演进轨迹。若想深入了解实现细节,可以继续阅读扩展源码中的 Config.ts、StatusBarItem.ts、connectToServer.ts、InlineCompletionProvider.ts 与 inline-edit/index.ts,并结合 package.json 中的命令、菜单、键位与配置声明,构造出适合自己的 AI 辅助编码工作流。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.2 K634
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown300
jforgamejforgame是一个一站式游戏服务器开发框架。包含游戏服务器开发所需要的各种组件,比如网关,socket服务端与客户端,自定义高效消息编解码,游戏热更新,游戏通用工具等等。包含游戏服,跨服,匹配服,后台管理系统等实现,同时提供大量业务案例以供学习。亦可用于其他socket应用,例如及时聊天等。Java101
fizz-gateway-nodeAn Aggregation API Gateway in Java . FizzGate 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。Java60
certd开源SSL证书管理工具;全自动证书申请、更新、续期;通配符证书,泛域名证书申请;证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔;https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署JavaScript60
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python280