书签本质是标记“思考上下文”而非静态行号,需在逻辑入口行(如函数定义首行)打标;命名应采用“作用域+意图”两段式(如auth: validatetoken);默认不持久,须配置"bookmarks.persisted": true方可跨会话保存。

书签不是“标记行”,而是标记“你正在思考的上下文”
很多人装完 Bookmarks 插件后,第一反应是“给关键函数打个点”,结果调试时跳过去发现光标停在空行、注释行,甚至已经删掉的代码位置上。问题不在插件,而在于误把书签当成了静态锚点——它实际记录的是「当时光标所在行号」,不感知语义。你在 userService.ts 第 42 行打了个书签,后来在这行前面插入了 5 行日志,那书签就跑到新第 47 行去了,可能正对着一个 // TODO 注释。
真正管用的做法是:在逻辑块的「入口行」打书签,而不是变量赋值行或 return 行。比如函数定义首行、 if 条件判断行、 try 块起始行。这些位置相对稳定,即使加了空行或注释,行号偏移也小。
- 避免在循环体内部打书签——一旦增删迭代逻辑,行号极易漂移
- 别依赖单行书签定位整个逻辑段;配合
// #region [NAME]折叠标记一起用更可靠 - 如果必须标记某变量初始化,优先选其声明行(
const user = ...),而非后续修改行(user.status = 'active')
带标签书签怎么命名才不翻车
Ctrl+Alt+L 打的带标签书签,本质是靠名字检索的导航入口。但很多人随便输 fix、bug、here,结果 Bookmarks: List 一搜全是模糊匹配,根本分不清哪个对应哪个模块。
推荐用「作用域+意图」两段式命名,中间用英文冒号分隔:
-
auth: validateToken—— 不是token check -
payment: handleRefundEdge—— 不是refund bug -
ui: sidebarCollapseToggle—— 不是sidebar fix
这样在命令面板输入 Bookmarks: List 后,直接输 auth: 就能筛出所有鉴权相关书签,输 payment:h 能命中 handleRefundEdge。命名越具体,后期维护成本越低。
跨文件调试时书签顺序为什么总乱
按 Ctrl+Alt+Down 跳转,你以为是“下一个逻辑位置”,其实它严格按「添加时间先后」遍历——你先在 api.ts 打了书签,再在 store.ts 打,最后在 router.ts 打,那跳转顺序就是 api → store → router,和文件路径、函数调用链完全无关。
这在串行调试时很顺手,但在并行分析多个模块时反而拖慢节奏。解决办法有两个:
- 用
Bookmarks: List(默认快捷键Ctrl+Shift+O→ 输入该命令)打开列表,手动点击目标书签——它支持按文件名排序、模糊搜索,比盲跳靠谱 - 对同一类逻辑批量打书签时,刻意控制添加顺序:比如先统一在所有 service 文件里打完,再打所有 controller,这样
Down跳转才有意义
注意:Ctrl+Alt+J 是跳回「最近一次添加的书签」,不是列表里的“上一个”,容易和 Up 混淆,建议少用。
重启 VSCode 后书签消失?别急着重打
默认情况下,Bookmarks 插件的书签只存在内存里。关掉窗口、重启 VSCode、甚至只是崩溃一次,所有书签就清零——这不是 bug,是设计如此。很多开发者反复踩坑,直到看到 .vscode/bookmarks.json 文件被创建才意识到要开持久化。
必须手动开启,否则所有跨文件、跨会话的导航努力都白费:
- 打开设置 JSON(
Ctrl+,→ 右上角齿轮图标 → “打开设置(JSON)”) - 加一行:
"bookmarks.persisted": true - 保存,重启 VSCode(或重新加载窗口)
开启后,书签会存到当前工作区根目录下的 .vscode/bookmarks.json。这个文件不会被 Git 跟踪,也不该提交——它本就是个人导航习惯的本地快照。多人协作时,各自维护自己的书签即可。
最常被忽略的一点:如果你用了 VSCode Settings Sync,记得把这个配置项也同步过去,否则换设备登录后依然不持久。











