selection utilities 扩展已停更且不兼容 vscode 1.85+,原生 smartselect.expand/shrink 已覆盖其核心功能,更稳定无冲突;推荐用原生命令绑定快捷键或改用 expand region 实现括号级精准扩展。

Selection Utilities 扩展已停止维护,2025年起不再兼容 VSCode 1.85+,不建议新项目安装;原生 editor.action.smartSelect.expand 和 editor.action.smartSelect.shrink 已足够覆盖绝大多数场景,且更稳定、无冲突。
为什么 Selection Utilities 现在基本用不上
该扩展曾提供“选中函数体”“选中对象字面量”“跳转到上一个/下一个匹配块”等命令,但 VSCode 自 1.70 版本起大幅强化了原生智能选中逻辑,并在 1.80+ 中修复了 JSX/TSX/模板字符串内嵌表达式的边界识别问题。现在常见需求如:
- 光标在
fetch(url, { method: 'GET' })的method上 → 按Shift+Alt+→可依次选中'GET'→{ method: 'GET' }→ 整个fetch()调用 - 光标在 React 组件的
return (后 → 第二次扩展即选中整个 JSX 树根节点 - 在
const a = `${b + c}`中,光标落在b + c内 → 扩展可精准停在${}内部,不会误吞外层字符串
这些都不再依赖第三方扩展。而 Selection Utilities 的命令(如 selectionUtil.selectFunction)在新版中常报 command 'selectionUtil.selectFunction' not found 错误,且与 Bracket Pair Colorizer、Auto Close Tag 等活跃扩展存在键位和事件拦截冲突。
替代方案:用原生命令 + 精准快捷键绑定
直接在 keybindings.json 中显式绑定,绕过被插件覆盖的风险:
{
"key": "ctrl+shift+e",
"command": "editor.action.smartSelect.expand",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+shift+q",
"command": "editor.action.smartSelect.shrink",
"when": "editorTextFocus && !editorReadonly"
}
这样做的好处:
- 不依赖任何扩展,VSCode 启动即生效
- 避免
Ctrl+Shift+→被 Bracket Pair Colorizer 劫持(它常把该组合键映射成“高亮配对括号”,而非选中) - 可在不同语言模式下保持行为一致(比如 Python 中选中
def foo():块时,原生逻辑已支持缩进块识别)
真需要“括号级精确控制”时,换 Expand Region
如果你写的是 Lodash 链式调用、深层解构或嵌套 JSX(如 <div><span><a href="%7Bx%7D">{y}</a></span></div>),原生 smartSelect.expand 容易跳过中间层级(比如从 y 直接扩到最外层 div)。这时应装 Expand Region(作者 letrieu),它严格按括号/引号/标签层级递进:
- 默认仍用
Ctrl+Shift+→,但每次只向外匹配一层 ASCII 括号(()、{}、[]、''、""、<tag></tag>) - 支持配置
"expandRegion.exclude": ["'"]忽略单引号字符串 - 对 JSX 属性值(如
className="foo bar")和类型注解(如const x: string | number = ...)也能稳定停驻,不会跨出语法单元
它不模拟语法树,而是做括号配对扫描——简单、可预测、不黑盒。
容易被忽略的细节:光标位置决定一切
所有智能选中功能都极度依赖初始光标落点。哪怕只差一个字符,结果可能完全不同:
- 想选中
if (a > b) { console.log('yes') }的花括号内全部内容?光标必须落在{和}之间(哪怕只是空格),不能停在{上,否则第一次扩展只选中{ - 在
arr.map(x => x * 2)中,光标停在=>上会直接选中整个箭头函数;停在x * 2中间才先选x * 2 - JSX 中
<button onclick="{handleClick}"></button>,光标在handleClick内 → 扩展能选中整个{handleClick};光标在onClick=后空白处 → 只会按文本扩,不识别属性值边界
这不是 bug,是设计:它不猜你想干什么,只响应你当前聚焦的语法节点。所以别怪功能“不灵”,先挪一下光标。











