极速定位
F3 就地存,树里单击就跳回那一行;加过书签的行,行尾直接把书签名画出来。
在编辑器里任意位置按 F3(或右键第一项「添加sjz书签」)就地存下一个书签,
右侧工具窗口是一棵可分组、可拖拽的书签树,单击就跳回去。
书签全部落在本机一个 SQLite 文件里(~/bookmark_v2.db),不依赖任何服务。
在 Java 文件里它还会记住「这个书签属于哪个方法」——代码上下挪动、git pull 之后,
书签会按「方法首行 + 偏移」自己跟回去,而不是傻等在原来那个行号上。
F3 就地存,树里单击就跳回那一行;加过书签的行,行尾直接把书签名画出来。
Java 文件记「类 + 方法 + 参数 + 偏移」,git pull 或切分支之后自己归位,不是死守行号。
一个 SQLite 文件装下全部书签,可导出 JSON、可定时自动备份,不需要账号、不需要联网。
shijinze 或
Bookmark-Shijinze,点 Install 再重启就好,不要钱、不需要激活码。
也可以点下面那颗按钮先去市场页看一眼。
IDE 自带的书签能用,只是到了「几十个书签 + 一份天天在动的代码」这个量级上就有点吃力。 下面这张表只列本插件有、自带确实没有的几件事,口径是 IntelliJ IDEA 2024.2 自带的 Bookmarks。
⚠ 说明白一点:最后那行的「共用一份书签」是同一台机器上两个项目读同一个本地库, 不是云同步、也不是团队共享——这个插件没有服务端,也不上传任何书签内容。
~/bookmark_v2.db,不在 IDE 的插件目录里,重装 IDE 不受影响。一段从头到尾的实机录屏:建目录、加书签、跳转、搜索、拖拽排序,都在里面。下面的图解教程是把它拆成一步一图。
从「在市场里搜到它」到「搜索书签」,七步。点图可以放大看。截图都是在 macOS 上截的,Windows / Linux 下位置一样。
Settings → Plugins → Marketplace,搜索框里敲 shijinze
(或者整名 Bookmark-Shijinze),结果里那条作者写着「史锦泽」的就是。
点 Install,装完按提示重启 IDE。免费,不需要激活码、也不需要机器码。
左边红框是设置里的 Plugins 那一项,右边是搜到的插件详情。 图里显示的版本是 3.1.5,那是截图当时的版本 —— 现在市场上的最新版是 5.0.2; 按钮显示 Disable 是因为截图那台机器已经装过了,你第一次看到的会是 Install。
重启后 IDE 右侧边栏会多出一个书签图标,点开就是「史锦泽的书签」。 要是右边没看到,就从左下角的工具窗口列表里找 shijinze-bookmark(图里红框那个菜单)。 面板本身是三段:最上面搜索框,中间一棵书签树,节点前面挂着红旗 / 三角 / 文件夹图标。
红字写的是「如果右侧没有,则在左侧的插件列表中找到 shijinze-bookmark」, 右下角那个放大的小图标就是它在侧边栏上的样子。 图里面板底部那排「刷新 / 使用教程 / 下一个(F3)」按钮是老版本的, 当前版本这三件事已经收进工具窗标题栏(搜索框 + 刷新 + 设置齿轮)。
在书签树里右键任意一个目录(或者树的空白处),菜单里第一项就是 「添加书签目录」;同一个菜单里还有删除节点、重命名、展开节点、折叠节点。 目录可以一层套一层,也可以整个拖到别的目录下面 —— 这是它和「单层书签列表」最直接的差别。
红字写着「在目录中右键添加目录」。这张图里的菜单是精简版; 当前版本点在节点上是完整菜单(10 项,多出修改行号、设置父书签、导出此节点、 导出全部书签、从文件导入等),点在空白处是 5 项。
光标停在想标记的那一行,右键 → 菜单第一项「添加sjz书签」,或者直接按 F3。 弹出的对话框四行:文件(只读)、行号(可改)、添加到哪个目录(只读)、名称 —— 名称默认就是当前这行代码,多数时候直接回车。 同一位置再按一次 F3,对话框会变成「更新书签」,底下是取消 / 删除书签 / 更新书签三颗按钮。
红字写着「在任意代码处右键添加书签」,菜单最上面那条带小红旗的就是。 右边那棵树里,红旗是叶子书签、文件夹是目录 —— 存完之后这一行的行尾还会用淡紫色粗体把书签名写出来。
在书签树里单击书签的文字就跳到对应文件的那一行;点图标是展开 / 折叠, 双击文字也是展开 / 折叠,点空白处清空选中 —— 分得很清楚,不会误触。 书签指向的文件不在当前项目里时,跳之前会先问一句要不要在当前窗口打开。
⚠ 图上的红字写的是「双击书签任意位置即可跳转」,那是老版本的说法: 当前版本单击文字就跳,双击留给了展开 / 折叠。截图里的效果是一样的 —— 左边编辑器已经定位到书签所在的那一行。
面板顶上的搜索框(占位字是「搜索书签」)里随便敲个关键字,整棵树会自动展开、
命中的部分红色加粗标出来。只按书签名称匹配,不匹配文件路径;
Esc 清空,F3 跳到下一个匹配项。
⚠ 这个 F3 是搜索框自己的按键处理,和「添加书签」的全局 F3 不是一回事。
红字写着「任意关键字搜索」。图里搜的是「不允许」, 两条命中的书签名里那三个字被单独染红,其余节点照样留在树上不动。
面板标题栏右边那颗齿轮直接进插件设置(也可以走 IDE 的 Settings → Bookmark-Shijinze)。 里面只有两个页签:项目管理(一张表:项目名称 / 别名 / 项目 id / 书签数 / 当前同步至, 可软删除、可恢复、可导出导入、有一颗「插件信息」把库位置和统计全摊开)和 自动备份(默认关着,开了按天 + 整点在后台跑)。
红色箭头指的就是齿轮。顺带解释一下树最上面那行
项目名(远程同步id:6c022897):那串 id 是本机项目的标识,
用来在设置里把两个项目指到同一份书签上,和云同步没有任何关系(这个插件没有服务端)。
名字里带着 IDEA,是因为它最早为 IDEA 写的;但它依赖的是 IntelliJ 平台本身,不是 Java 那套。 所以凡是基于 IntelliJ 平台的 IDE 都能装。下面 12 格里,前 11 格是 JetBrains 家基于该平台的 IDE, 最后一格 Android Studio 是 Google 基于 IntelliJ IDEA 社区版做的,同样能装; 浅底那三格是自带 Java 支持、因而「方法锚点」也能生效的;其余的照样能用,只是方法锚点那一层退掉,退回纯行号书签。
plugin.xml 里写的是 <depends>com.intellij.modules.platform</depends>——
平台模块,每个基于 IntelliJ 平台的 IDE 都有。
如果这里写的是 com.intellij.java,那才叫「只有装了 Java 插件的 IDE 能用」。
<depends optional="true" config-file="bookmark-java.xml">com.intellij.java</depends>,
源码注释原文是「仅在带 Java 的 IDE 中加载,缺失时书签退回普通行号逻辑」。
而 bookmark-java.xml 里一个扩展点都没注册,方法锚点纯靠运行期 API 调用实现。
JavaMethodResolver)引用了 Java PSI;
外面统一由 MethodAnchorSupport 包一层 try / catch(Throwable),
一旦捕获到(IDE 里没有 Java 插件 → 链接失败)就把 unavailable 置位,
此后所有调用直接返回 null,不会反复抛链接错误、也不会刷日志。
.java 文件生效,
同一个项目里的 xml / yml / js 文件同样是纯行号书签;索引还没建完(dumb 模式)时也会跳过。
untilBuild
显式设成了 null,注释写着「对 2026.2(build 262)及以后所有版本开放」),
而市场上那条记录写的范围是 242.0–252.*。
所以如果哪天 IDE 升得太新、市场提示不兼容,可以走下面的第二条路自己构建一份装上。
不想往下翻的话,这六条就是它和「IDE 自带书签」最不一样的地方。
右键菜单第一项「添加sjz书签」,快捷键 F3。同一位置已经有书签时,它自动变成「更新书签」对话框——改名称、改行号,或者直接删掉。
工具窗口停靠在右侧,侧边栏上写的是「史锦泽的书签」。可以建目录分组、拖拽排序与移动,单击跳代码、双击折叠展开。
加过书签的行,行尾会用淡紫色粗体把书签名渲染出来(超过 40 个字符截断)。不用切到工具窗口就知道这行当初为什么被标。
Java 文件里会记下「类 + 方法名 + 参数类型 + 相对方法首行的偏移」。git pull、切分支、别人在上面加了 20 行之后,书签按方法首行 + 偏移重新落位。
一个 SQLite 文件 ~/bookmark_v2.db(WAL 模式、连接池大小 1),没有必须登录的账号、没有必须连上的服务器。
整个项目或某一棵子树导成 JSON,导入时按规则判重合并;另有 SQLite 自动备份(默认关着,开了就按天 + 整点在后台自己跑)。
下面全是已经写好、每天在用的功能,没有「即将支持」。按用途分成六组,点标签可以直接跳。 上面图解教程里那七步是最常用的一小半,这里是完整清单。
editor.linePainter 扩展点,在书签所在行的行尾直接画出书签名,
颜色 #9999FF、粗体;文本超过 40 个字符会截断成省略号。
它是画上去的、不是插进文件的,不影响文件内容。
Esc 清空、F3 跳到下一个匹配项。
⚠ 这个 F3 是搜索框自己的按键处理,和上面「添加书签」的全局 F3 不是一回事。
行号是最不稳的东西——同事在你上面加了 20 行,你所有书签就全错位了。
这一组就是为了解决它。前提说清楚:只在装了 Java 插件的 IDE 里、且只对 .java 文件生效,
其余情况整块跳过,书签退回纯行号(其它功能一点不受影响)。
save() 不会互相认错。
RangeMarker 跟踪每条书签的位置,
写库做 300 毫秒防抖 + 批量提交(不是敲一个字写一次库);
编辑触发的重新锚定另有一层 700 毫秒防抖,连续输入时只在停顿之后跑一次。
.java(同一个项目里的 xml / yml / js 也一样);
③ IDE 还在建索引(dumb 模式)。跳过就是安安静静地不做,不弹窗、不报错。
~/Bookmark-Shijinze-Export,
文件名形如 bookmarks-项目名-yyyyMMdd-HHmmss.json。
.db 文件副本 / .sql 脚本)、保留份数(默认 10)、
备份目录(默认 ~/Bookmark-Shijinze-Backup)。
.db 走 SQLite 的 VACUUM INTO 出一份一致的副本(兼容 WAL,可直接替换还原),
.sql 则导出建表语句加全量 INSERT。
bookmark_v2-时间戳.db|.sql 这个名字模式,
绝不动备份目录里其它文件——万一你把目录设成了别的常用文件夹也不会误删。
~/bookmark_v2.db,表名就叫 bookmark。
它不在 IDE 的插件目录里,也就不会因为重装插件、换 IDE 版本而跟着没了。
~/bookmark_v2.db 拷到新机器同一位置;
或者用 JSON 导出全部书签再在新机器上导入(导入自带判重合并);
或者提前打开自动备份,从备份目录里拿一份 .db 副本还原。
八句大白话,说完就完了。
RangeMarker 跟着日常编辑走,不是一改就全错。
VACUUM INTO 出一致副本),
重装 IDE、换机器都能接得上。
六个最常被问到的。
shijinze,点 Install,重启。
免费,不需要激活码、不需要机器码,也没有试用期。
~/bookmark_v2.db,一个普通 SQLite 文件。
没有服务端,书签内容不上传;唯一的网络动作是写记录时顺手取一次 IP 归属地当元信息。
~/bookmark_v2.db 拷过去;或者右键「导出全部书签」出 JSON,
在新机器上导入(自带判重合并);或者提前开自动备份,从备份目录拿一份副本还原。
./gradlew buildPlugin 出一个 zip 从磁盘装。
两条路:市场直接装(推荐,三步),或者自己构建一个 zip 从磁盘装(IDE 太新、或者想改代码时走这条)。
shijinze 或 Bookmark-Shijinze,
认准作者是「史锦泽」的那条。装完按提示重启 IDE。
什么时候需要它:IDE 版本比市场那条记录的上限还新、公司网络连不上 Marketplace、 或者你想改两行代码自己用。仓库自带 Gradle Wrapper,不用先装 Gradle。
cd shijinze-bookMark-ideaPlugin
build/distributions/ 下,文件名带版本号。
./gradlew buildPlugin
# 产物:build/distributions/Bookmark-Shijinze-5.0.2.zip
./gradlew runIde
gradle.properties 为准。