Ctrl+U(Windows/Linux)或Cmd+U(macOS)是唯一真正回退光标位置的快捷键,仅将光标退回到上一次显式跳转(如F12、Ctrl+F回车、Ctrl+Shift+O)的落点,不撤销编辑,也不记录鼠标点击、方向键移动或滚动操作,且历史仅限当前编辑器窗口内有效。

Ctrl+U 是唯一真·回退光标位置的快捷键
它不撤销代码,只把光标退回到上一次「显式跳转」的落点。比如你按 F12 进入函数定义、Ctrl+F 查找后按回车选中、Ctrl+Shift+O 选中符号跳转——这些都会被 cursorUndo 记住。Ctrl+U(Windows/Linux)或 Cmd+U(macOS)就是触发它的快捷键。
常见误区:
- 鼠标随便点一下,Ctrl+U 不会响应(VSCode 明确不记录纯鼠标点击)
- 方向键挪了几下、滚动条拖了拖,也不算「显式移动」,不会进栈
- 窗口重启后历史清空,哪怕刚打开同一文件,Ctrl+U 也失效
它只在当前编辑器窗口内有效,不跨标签页保留状态,也不依赖语言服务或插件。
Alt+← 和 Ctrl+– 不是回退光标,而是回退跳转路径
Alt+←(Windows/Linux)或 Ctrl+–(macOS)绑定的是 workbench.action.navigateBack,只对语义化跳转生效:比如 F12、Ctrl+Click、Shift+F12、Ctrl+P 后回车。它不管你在哪敲过字,只管你“从哪跳过来”。
容易踩的坑:
- 点击大纲视图(Outline)默认不记录,除非设了 "editor.gotoLocation.multipleDefinitions": "goto"
- Ctrl+G 跳行号、鼠标滚轮滚动、手动拖动滚动条——全都不进导航栈
- 焦点不在编辑器里(比如当前在终端或搜索框),快捷键直接被忽略
- 多文件连跳(A→B→C),按一次只回 C→B,得按两次才到 A
快捷键失灵时,命令面板是最稳的兜底方式
别猜是不是输入法或系统拦截,直接用命令面板绕过所有映射问题:
- 按 Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(macOS)
- 输入 Last Edit Location 回车 → 秒回最后一次敲字/删字符的位置(和跳转无关)
- 输入 Go Back 回车 → 等价于 Alt+←,但更可靠
如果命令搜不到,检查 keybindings.json 是否被覆盖:
- 搜索 workbench.action.navigateBack
- 搜索 editor.action.lastEditAt
- 确认没被其他扩展或自定义规则禁用
真正容易被忽略的细节:VSCode 从不自动记录“你看哪一行”
它只忠实地记下“你有没有主动发起一次跳转”。光标点一下、滚一下、缩放一下——全不算。多光标时,只有主光标(最后一个创建的)参与历史记录;中间执行过格式化、重命名、自动保存等操作,也会覆盖掉之前的“最后位置”。
所以别指望它记住你三分钟前扫过的一行注释——它只记得你 F12 过、Ctrl+Click 过、或者 Ctrl+F 后按回车确认过的那个落点。


















