【CodeBuddy 基本功】编辑器双雄:默认快捷键与键位定制
本文是【CodeBuddy 基本功】系列第 1/5 篇。系列共 5 篇:① 编辑器双雄 ② 编辑器到工作台 ③ 插件与 Ricing ④ 技巧组合 ⑤ 长期视角。
AI 越能写,读、审、跳的频次越高——键盘效率的回报,反而比 AI 出现之前更高。
过去两年,两拨人同时涌向了基于 VS Code 内核的 AI IDE(CodeBuddy、Cursor、Windsurf 等):从 IntelliJ、Xcode、Visual Studio 被拉回来的老手,和 vibe coding 带来的新人。AI 这一面足够性感,补全、Chat、Agent 接管了越来越多的日常。对它的关注顺理成章地盖住了另一面——编辑器自身的基础能力。这一面不够性感,甚至有点 nerd。
AI 压缩了写代码的成本,却放大了它周围的一切 :读代码、审 diff、跳定义、对照运行结果,这些动作还在编辑器里完成,而且因为 AI 产出变多,频次比从前更高。编辑器基本功的回报,反而比 AI 出现之前更大。
这个系列把视线从 AI 层暂时挪开,去看那些上不了发布会标题、但每天都在帮人省下几秒钟的细节。本系列结合日常工作实践,梳理 AI IDE 中 AI 之外的编辑器基本功,覆盖快捷键、配置、插件、组合技等方面操作,希望给大家在日常工作和 Vibe 过程中提供一些顺手可用的高杠杆技巧。本文技巧同样适用于 VS Code 及其衍生发行版。
作为系列开篇,本篇聚焦”手怎么动”——键盘效率和键位定制这对编辑器双雄。
01 键盘 :从工程级、导航级到编辑级的快捷键速查与场景化解释,外加 Command Palette 这根”命令总线”。
02 键位 :当默认键位不够用,如何用 keybindings.json 、 when 表达式、Chord Keys 把操作语言改成你自己的。
读完你会带走:5 个高杠杆快捷键( Cmd+P / Ctrl+R / 多光标 / F12 / Ctrl+- )、键位定制的基础三件套,以及”AI 之后操作语言反而变重了”这个看法。
平台约定(系列级):本系列快捷键以 macOS 为主标注。Windows/Linux 用户: Cmd → Ctrl , Opt → Alt ,个别差异会单独说明。
快捷键的意义不在敲得快,在于不打断:手伸向鼠标的那一下,注意力就从”做什么”掉到了”怎么点”。
一个具体场景:Agent 改完 6 个文件,你要逐个确认有没有改错。用鼠标在文件树、diff、调用链之间来回找,每次手离开键盘都是一次中断;换成 Cmd+P 跳文件、 F12 / Shift+F12 看定义和引用、 Ctrl+- 回到上一个位置,整个验收过程手不离键盘。AI 产出越多,这种读、审、跳的频次越高,键盘省下的也越多。
下面的表格是 速查表 ,不是背诵清单。推荐扫一眼有个印象,遇到场景再回来查。按操作范围从大到小分三组——工程级(项目与窗口)、导航级(项目内查找)、编辑级(文本操作)。
快捷键
作用
说明
Ctrl+R
打开最近项目列表
支持输入过滤,替代 File > Open Recent
Cmd+J
切换面板显示
拉起/收起底部面板(默认含终端)
Cmd+Shift+P
Command Palette
任意命令入口,快捷键不记得时从这里找
Cmd+\\
拆分编辑器
并排查看两个文件
Cmd+1 / 2 / 3
切换编辑器组
拆分状态下在各组之间跳转
Cmd+W
关闭当前标签
Opt+Cmd+T
关闭其他标签
浏览过十几个文件后清桌面
Cmd+Shift+T
恢复上一个关闭的标签
Cmd+,
打开设置
进入 settings.json 的入口
Cmd+0
聚焦侧边栏
与 Cmd+B (切换显示)配对:一个控制可见性,一个控制焦点
Cmd+K Cmd+S
打开快捷键设置
进入键位自定义的入口
Cmd+K Shift+Enter
固定/取消固定标签
防止预览模式替换当前标签
Opt+Z
切换自动换行
看长行日志或 minified 代码时一键切换
这组里使用频次最高的是 Ctrl+R ,打开最近项目列表,支持模糊匹配过滤。当跨项目切换变得无摩擦(亚秒级),你会更频繁地在仓库之间比对实现、复用配置。 Ctrl+R 在所有 VS Code 系编辑器中行为一致,macOS 与 Windows/Linux 使用相同键位。
Cmd+Shift+P 是这一切的兜底。键位忘了、命令找不到、新装的扩展不知道怎么触发,先按 Cmd+Shift+P 。它重要到值得单独一节讲清楚:
Command Palette 不是”快捷键速查表”,它是 VS Code 的 统一命令总线 。所有功能(内置的、插件注册的、用户自定义的)最终都以”命令”的形式挂在这根总线上。 Cmd+Shift+P 打开的就是这根总线的搜索界面。
模糊搜索是全量的 。输入 format 能找到 Format Document 、 Format Selection 、 Format Modified Lines ,以及所有插件注册的含 format 关键字的命令。不需要记命令全名,记住一个关键词片段就够。搜索算法是 fuzzy match, fmtdoc 也能匹配到 Format Document 。
前缀决定搜索范围 。Command Palette 本质上和 Cmd+P (Quick Open)共享同一个输入框,区别只是默认前缀不同:
入口
等价于
默认前缀
Cmd+P
Quick Open
无(搜文件名)
Cmd+Shift+P
Command Palette
> (搜命令)
在 Cmd+P 的输入框里手动键入 > 就变成了 Command Palette;反过来,在 Command Palette 里删掉 > 就变成了文件搜索。两者是同一个输入框的两种模式。
最近使用的命令排在前面 。Command Palette 的排序不是字母序,你上次用过的命令会被提到顶部。高频命令用几次之后,输入一两个字母就能命中。这意味着 Command Palette 的效率会随使用时间递增,它在学习你的习惯。
右侧显示已绑定的键位 。搜到一个命令,右侧如果有快捷键就显示在那里。每次用 Command Palette 触发命令时顺便看一眼,看三次就记住了,下次直接按。从 Command Palette 走向快捷键,是 VS Code 设计的正常升级路径。
没有键位的命令可以直接绑 。搜到一个命令后,右键 → Configure Keybinding ,直接跳到键位设置面板并自动填好命令 ID。这是从”发现功能”到”固化为键位”的最短路径。
Command Palette 在整篇文章里会反复出现。把它理解为 VS Code 的”搜索引擎”比”菜单”更准确:你不需要知道功能在哪个菜单下,只需要知道它叫什么,或者它大概叫什么的一个片段。
快捷键
作用
说明
Cmd+P
快速打开文件
模糊匹配文件名,带前缀可路由到不同搜索范围
Cmd+Shift+F
全局搜索
跨文件内容搜索,支持正则
Cmd+Shift+O
跳到文件内符号
函数、类、变量的快速定位
Cmd+T
跨工作区符号搜索
不限当前文件,搜全工作区的函数/类/变量
Cmd+Shift+;
聚焦面包屑导航
键盘操作路径和符号层级; Cmd+Shift+. 则聚焦并选中
Ctrl+G
跳到指定行
macOS 少数也用 Ctrl 的快捷键之一
Cmd+Shift+E
聚焦资源管理器
需要查看文件树时
Cmd+B
切换侧边栏
需要更大编辑区时收起;与 Cmd+0 (聚焦)配对
Cmd+Shift+V
Markdown 预览
Cmd+P 是这组的核心。它本质上是一个分流入口,行为由前缀决定:
前缀
行为
无前缀
按文件名模糊搜索
@
跳到当前文件的符号(函数、类、变量)
:
跳到行号
>
等价于 Command Palette
?
列出所有可用前缀
记住一个键位,覆盖四种搜索范围。 Cmd+P 不是”打开文件”的快捷键。 它是模糊搜索路由器 。
Cmd+Shift+O 是当前文件内的符号跳转, Cmd+T 是跨工作区的符号搜索。后者在大型项目里是查找任意函数定义入口的最快路径,比文件名搜索更接近”按语义找位置”。
面包屑导航(Breadcrumbs)是常被忽略的内置入口。聚焦它有两个键,区别在于要不要顺带展开下拉。
Cmd+Shift+; (聚焦)只把焦点移到面包屑栏、停在当前节点,不弹任何东西,适合先用 ← / → 横向换段——切到上级目录或同级的另一个文件,到位后再按 ↓ 展开。 Cmd+Shift+. (聚焦并选中)在聚焦的同时立刻展开当前节点的下拉,直接打字过滤、回车跳转,相当于从面包屑进入”当前文件符号跳转”。任一节点上 ↓ 或 Space 开合下拉, Esc 退出。嵌套较深的项目结构里,这比从文件树展开多层目录更直接。
前三组覆盖了从工程到编辑的操作入口。下一组要解决的是另一个维度:跳出去之后怎么回来。
快捷键
作用
说明
F12
跳到定义
切换到符号定义所在的位置
Opt+F12
原位预览定义
弹窗显示定义内容, Esc 关闭
Cmd+F12
跳到实现
接口/抽象方法的具体实现
Cmd+K F12
在侧边打开定义
拆分编辑器,并排看调用点和定义
Shift+F12
跳到引用
列出符号的所有调用点
Ctrl+-
导航后退
返回上一个光标位置
Ctrl+Shift+-
导航前进
与后退配对
Cmd+K Cmd+Q
跳到上一次编辑位置
比 Ctrl+- 更精准,不是光标历史,是编辑历史
Cmd+K Cmd+I
原位显示 hover
弹窗显示当前符号的类型/文档, Esc 关闭
跳转最被低估的不是”怎么跳过去”,是”怎么跳回来”。 Ctrl+- 是浏览器式后退键,按一次回到上一个光标位置。有了它,”跳定义→看引用→跳回来”才是闭环。
F12 跳到定义会切换文件焦点; Opt+F12 在原位弹窗显示定义内容,Esc 关闭。读小段定义用 Peek,避免离开当前上下文;读完整文件用 Goto。 Cmd+K Cmd+I 更轻,只显示 hover 信息(类型签名、文档注释),适合”我只想确认这个变量是什么类型”的场景。
这张表是全章最长的一张。不要试图一次记住,遇到具体场景时回来查就好。
折叠/展开是少数不能直接套用 Cmd → Ctrl 的差异项:macOS 默认 Cmd+Option+[ / ] ,Win/Linux 默认 Ctrl+Shift+[ / ] 。
多光标 。典型场景:给一组 JSON 字段名批量加引号。选中所有字段行, Opt+Shift+I 在每行末尾插入光标, Home 跳到行首输入引号, End 跳到行尾输入引号。一次建立多个光标,统一执行相同动作。原来需要正则替换或逐行手动,多光标把它降为线性编辑操作。
F2 与 Cmd+D 的区别 。两者都可以批量处理相同内容,但层次不同。 F2 基于 LSP 的符号引用,作用于语言层面的符号定义和引用,跨文件、跨作用域准确; Cmd+D 是字面文本匹配,在当前文件内按相同字符串扩展选区。重构变量名用 F2 ;需要字面替换时用 Cmd+D 。混用的结果是漏改引用或误改注释中的同形词。
智能选区扩展 。 Opt+Shift+→ (macOS: Ctrl+Shift+Cmd+→ )按语法结构逐层扩展选区:单词 → 表达式 → 语句 → 代码块。每次扩展都对应一个语法边界,不依赖手动拖选或括号计数。 Opt+Shift+← 逐层收缩。
快捷键不适合批量记忆。ZSA 键盘团队的 观察 (https://blog.zsa.io/vscode-tips/)描述了一个常见的模式:初期是刻意记忆,到某个节点后,使用者在准备触发鼠标操作之前自动产生”应该有快捷键”的念头。 这个转变发生后,新快捷键的获取速度加快 。驱动力从主动学习变成了对摩擦的消除反应。
实际可行的起步方式:从本章选出两到三个今天就能用上的,形成肌肉记忆后再扩展。优先级最高的三个是 Cmd+P (文件导航)、 Ctrl+R (项目切换)、多光标( Opt+Shift+I / Cmd+D ),这三个覆盖的操作场景频次高,且相对其他快捷键更容易触发使用动机。
另一个加速这个转变的工具是 Key Promoter (https://github.com/donebd/vscode-keypromoter) ,VS Code 上对 IntelliJ 同名插件的移植。它在两种场景下提示:用鼠标点击编辑器内有快捷键的功能、或检测到低效编辑模式(字符删词、方向键代替 Ctrl+Left 、字符选区等),弹出对应的快捷键建议。本地处理、无遥测,可调整提示频率。
它不解决”哪个快捷键值得记”的问题,但解决”我根本没意识到这个动作有快捷键”的盲区,把摩擦点暴露给你,剩下的还是你自己挑两三个内化。
上一节用的是 VS Code 自带的键位。它覆盖了大部分高频操作,但有两类场景处理不了:某个高频命令没有默认快捷键,或者默认键位与手型不顺。解法都是同一个入口: keybindings.json 。
定制键位不是为了和别人不一样,是把编辑器的操作语言从”厂商给你的”变成”你给自己定义的”。代价是理解四样东西:键位绑定的基本结构、 when 表达式、Chord Keys、以及 VS Code 相对 Vim/Emacs 的能力边界。
打开方式有两个: Cmd+K Cmd+S 进入快捷键设置的图形界面,右上角有个图标切换到 JSON 编辑;或者 Cmd+Shift+P → Preferences: Open Keyboard Shortcuts (JSON) 。图形界面适合浏览和搜索已有绑定;JSON 适合批量编辑和版本管理。
[ { "key" : "cmd+shift+l" , "command" : "editor.action.transformToLowercase" , "when" : "editorTextFocus" } ]
三个字段: key 指定按键, command 指定触发的命令 ID, when 指定生效条件。 command 的完整列表可以在图形界面搜索,也可以通过 Command Palette 里命令右侧的齿轮图标直接跳到 JSON。
默认绑定不需要写进这个文件。 keybindings.json 只存自定义项:覆盖默认的、新增的、或者显式关闭某个默认绑定( command 前加 – )。
when 是键位定制真正的核心。它让同一个按键在不同上下文下执行不同的命令。
[ { "key" : "cmd+j" , "command" : "workbench.action.togglePanel" , "when" : "!terminalFocus" }, { "key" : "cmd+j" , "command" : "workbench.action.terminal.toggleTerminal" , "when" : "terminalFocus" } ]
这组绑定的效果:光标在编辑器里按 Cmd+J 切换面板,光标在终端里按 Cmd+J 专门切换终端。同一个键位,两种行为,由当前焦点决定。
条件
含义
editorTextFocus
光标在编辑器文本区
terminalFocus
光标在终端
editorLangId == ‘python’
当前文件是 Python
resourceExtname == ‘.md’
当前文件是 Markdown
editorHasSelection
有选中文本
inDebugMode
正在调试
sideBarVisible
侧边栏可见
条件支持逻辑组合: && 、 || 、 ! 、相等比较、字符串匹配。完整的上下文键(context keys)列表见 VS Code 官方文档 when clause contexts (https://code.visualstudio.com/api/references/when-clause-contexts)。
when 的好处是,同一组按键可以在编辑器、终端、调试等不同状态下复用。按键数量有限,但上下文可以很多—— when 把键位从一对一映射变成了按上下文分叉的多映射。
AI 协作时代给 when 加了一组新上下文键。大部分 AI IDE 内置了 inlineSuggestionVisible (inline 建议正在显示)、 hasUndecidedChatEditingResource (有未决的 AI 编辑)等条件。这意味着同一个 Esc 在不同 AI 状态下可以被定向到不同动作:关掉建议 / 取消选区 / 退出 Peek,不会互相打架。AI 协作没有改变 when 的机制,只是让”上下文无限”这件事变得更具体了。
Chord Keys 是两步按键序列。VS Code 默认就用了不少, Cmd+K Cmd+S (打开快捷键设置)、 Cmd+K Z (进入 Zen Mode)、 Cmd+K Cmd+T (选主题)。
测试相关的 Chord 是另一个完整命名空间的范例: Cmd+; 之后跟不同的二级键覆盖整套测试动作, Cmd+; A 跑全部测试、 Cmd+; F 跑当前文件、 Cmd+; E 重跑上一次失败的、 Cmd+; L 重跑上一次运行、 Cmd+; Cmd+X 取消运行中的测试。一个前缀挂十几条命令,避免”测试相关的快捷键散落在 F5 / Ctrl+T / Cmd+R 之间互相打架”。这种命名空间式的设计是 Chord Keys 的典型用法。
{ "key" : "cmd+k cmd+d" , "command" : "editor.action.formatDocument" , "when" : "editorTextFocus" }
Chord Keys 的用途是解决单层键位不够用的问题。按键组合的数量有上限,把 Cmd+K 作为”命名空间”前缀,后面可以挂很多二级按键,就像文件路径里的目录。
代价是按键路径长了,触发速度下降。Chord Keys 适合低频但需要明确调用的操作。
值得从 VS Code 的视野里跳出来看一眼。Neovim 社区用 which-key.nvim (https://github.com/folke/which-key.nvim) 解决了”按下前缀键后不知道下一步能按什么”的发现性问题,按 <leader> 后弹出浮窗,列出所有可用的后续键位。VS Code 的 Chord Keys 在设计上是同构的( Cmd+K 就是一个前缀节点),但至今没有对等的原生发现机制, Cmd+K 之后你只能靠记忆或翻设置面板。
这是 VS Code 键位体系的一个已知体验缺口:发现性(discoverability)依赖用户主动查找,没有原位提示。当前的应对策略是:把高频 Chord Keys 写进自己的速查表(像本系列做的事),或者在 keybindings.json 里给自己的 Chord 序列加注释,人工补偿工具缺位。
结合 when 里的 editorLangId ,同一个按键可以在不同语言文件里做不同的事。
{ "key" : "cmd+b" , "command" : "editor.action.insertSnippet" , "args" : { "snippet" : "** ${TM_SELECTED_TEXT}$0 **" }, "when" : "editorTextFocus && editorLangId == 'markdown'" }
这个绑定的效果:写 Markdown 时 Cmd+B 给选中文本加粗,写代码时 Cmd+B 仍是默认的切换侧边栏。
Per-language 绑定的典型场景:写 Markdown 时的粗体/斜体/链接、写 LaTeX 时的 \textbf{} 、写 Python 时的快速 print(f”{…}”) 包裹、写某个特定框架时的常用模板插入。它把键位定制从”全局操作层”下沉到”语言特定层”,不同语言文件拥有不同的操作语言。
VS Code 的键位系统和 Vim/Emacs 有一个实质差别: keybindings.json 是 声明式 的,不是脚本。它只能把按键映射到已注册的命令 ID,加上 when 过滤和可选的 args 。Vim 的 Vimscript/Lua、Emacs 的 Elisp 那种”按键里写任意逻辑”的能力,不在这套模型里。
大多数时候这不是问题, when 表达式覆盖的上下文够丰富。少数场景会撞到边界:一键触发多步动作(保存 + 格式化 + 暂存到 Git)、根据文件类型分支、需要读写持久状态。
多步动作是最常见的一种。VS Code 1.77(2023)之后内置了 runCommands ,两三步组合已经不需要扩展:
// keybindings.json { "key" : "cmd+alt+s" , "command" : "runCommands" , "args" :{ "commands" :[ "editor.action.formatDocument" , "workbench.action.files.save" , "git.stage" ] } }
更复杂的(条件分支、失败重试、语言级限定、变量替换)需要装扩展。社区事实标准是 multi-command (https://marketplace.visualstudio.com/items?itemName=ryuta46.multi-command),它把序列和 when / languages / onFail / repeat 等正交维度组合起来,配置写在 settings.json 里,按键绑定调用命令 ID 触发。
keybindings.json 是映射层,不是逻辑层。真需要逻辑层时,要么用内置 runCommands 做简单拼接,要么把逻辑下沉到扩展。半小时可以写出一个把命令 ID 暴露给键位的最小扩展,参考官方 Your First Extension (https://code.visualstudio.com/api/get-started/your-first-extension) 文档。
VS Code 注册的命令远多于默认绑定的快捷键。Command Palette 能搜到的命令里,有相当一部分是”功能存在但没默认键位”,能用、但要靠 Cmd+Shift+P 翻菜单触发。下面这些是日常操作里频次足够、值得自己挑键位绑上的:
命令 ID作用
命令 ID作用
editor.action.transformToUppercase
选区转大写
editor.action.transformToLowercase
选区转小写
editor.action.transformToTitlecase
选区转 Title Case
editor.action.transformToSnakecase
选区转 snake_case
editor.action.transformToKebabcase
选区转 kebab-case
editor.action.transformToCamelcase
选区转 camelCase
editor.action.transformToPascalcase
选区转 PascalCase
editor.action.sortLinesAscending
选中多行按字母升序排序
写代码时频繁需要在命名风格之间转换(接口字段 camelCase、Python 变量 snake_case、URL 路径 kebab-case),手动改既慢又容易拼错。前七条挑两三个常用的绑到 Chord Keys 下(如 Cmd+K Shift+U / Cmd+K Shift+L / Cmd+K Shift+C ,避免和已有默认绑定冲突),比每次开 Command Palette 搜更顺。 sortLinesAscending 在整理 import 列表、配置项、枚举值时高频。
下一组是编辑器与编辑管理,管标签、管 diff 视图、管格式化:
命令 ID作用
命令 ID作用
workbench.action.closeEditorsToTheRight
关闭右侧所有标签
workbench.action.closeEditorsToTheLeft
关闭左侧所有标签
editor.action.toggleStickyScroll
切换 Sticky Scroll(顶部固定显示当前作用域)
editor.action.formatChanges
只格式化改动过的部分(Git diff 范围)
workbench.action.compareEditor.swapSides
在 diff 视图里交换左右两侧
命令 ID
作用
默认键位
copyFilePath
复制当前文件绝对路径
资源管理器聚焦时 Opt+Cmd+C ,编辑器聚焦时 Cmd+K Opt+Cmd+C
copyRelativeFilePath
复制当前文件相对路径
资源管理器聚焦时 Shift+Opt+Cmd+C ,编辑器聚焦时 Cmd+K Shift+Opt+Cmd+C
editor.action.organizeImports
整理 import,删除未使用、排序、分组
Shift+Opt+O
editor.action.selectAllMatches
搜索时一次选中所有匹配项,直接进入多光标模式
搜索框内 Opt+Enter
closeEditorsToTheRight 配合”主标签固定在最左 + 临时探索往右开”的工作流,探索完一批文件想清理时,比 Cmd+W 一个一个关快得多。 formatChanges 是 formatDocument 的精确版本,老项目里整文件格式化会污染 git blame,只格式化本次改动是更安全的默认。
这些命令的键位选择没有标准答案,大量留白是 VS Code 默认绑定刻意留给用户的空间。Command Palette 搜命令时留意右侧没有快捷键标记的项,挑那些”我每周都要用 Command Palette 触发三次以上”的,绑一个手记得住的键位。
CodeBuddy AI 操作 (默认无键位,通过 Command Palette 触发):
命令 ID
作用
tencentcloud.codingcopilot.chat.startNewChat
新建一轮 AI 对话
这个命令默认没有键位,但使用频次足够高,绑一个 Chord(如 `Cmd+K N`)比每次开 Command Palette 搜命令名快。
一点期待 :希望 CodeBuddy 可以暴露更多的 Command Palette 以及键位绑定,包括但不限于跳转对话、查找历史、切换模型的,现阶段只能通过 UI 操作处理,交互体验略有打断。
本篇解决的是”手怎么动”:先用默认快捷键把读、审、跳、改的高频动作脱离鼠标,再用 keybindings.json + when + Chord Keys 把不顺手的地方改成自己的操作语言。如果只带走三件事,那就是—— Cmd+P 是模糊搜索路由器、 Ctrl+- 让跳转闭环、 when 让一个键在不同上下文做不同的事。
不必贪多。从今天就能用上的两三个快捷键开始,等”应该有快捷键”的念头自动冒出来,剩下的会越学越快。
手的问题解完了。下一篇解决编辑器的问题——当默认行为不符合预期时,不用忍,改配置。我们会从快捷键走向 settings.json ,把编辑器从一个文本框,调成一个真正属于你的工作台。
互动一下 :你现在每天用得最顺手的那一个快捷键是什么?又有哪个动作你一直在用鼠标、其实早该绑个键位?欢迎在评论区留下你的高杠杆操作。
👍 觉得有用? 点 ❤️ 「 在看 」,让更多AI学习者看到这条消息。