thief-book-turboEnglish | 中文 一款 VSCode 摸鱼看书扩展:把 TXT 小说渲染在状态栏上阅读。多编码不乱码、秒翻页、低内存,并自带书签、全文搜索、章节跳转,进度按书记忆、重启自动续读。
快速使用
命令(Cmd/Ctrl+Shift+P →
|
| 命令 ID | 说明 |
|---|---|
thief-book-turbo.getNextPage |
下一页 |
thief-book-turbo.getPreviousPage |
上一页 |
thief-book-turbo.getJumpingPage |
快捷翻页(输入页码) |
thief-book-turbo.displayCode |
老板键(切换工作区/Git 状态 / 正文) |
thief-book-turbo.reloadBook |
重新加载(更换书籍后使用) |
thief-book-turbo.addBookMark |
添加书签 |
thief-book-turbo.showBookMarkList |
打开书签列表(支持跳转/删除) |
thief-book-turbo.jumpToChapter |
章节跳转(解析"第X章/回/卷/节") |
thief-book-turbo.searchInBook |
全文搜索(书内找词跳转) |
快捷键
| 快捷键 (mac) | 快捷键 (win) | 功能 |
|---|---|---|
cmd + , |
ctrl + alt + , |
上一页 |
cmd + . |
ctrl + alt + . |
下一页 |
cmd + ; |
ctrl + alt + ; |
快捷翻页 |
cmd + ' |
ctrl + alt + ' |
添加书签 |
cmd + m |
ctrl + m |
老板键 |
配置项(设置 → 搜索 thief-book-turbo)
| 配置 | 默认值 | 说明 |
|---|---|---|
thief-book-turbo.filePath |
(空) | TXT 小说绝对路径 |
thief-book-turbo.pageSize |
50 |
每页字符数(英文书自动 ×2) |
thief-book-turbo.isEnglish |
false |
是否为英文书籍 |
thief-book-turbo.encoding |
auto |
auto 自动检测;或手动 utf-8 / gbk / gb2312 / big5 / shift_jis / euc-jp / euc-kr / utf-16le / utf-16be |
thief-book-turbo.lineBreak |
" " |
换行在状态栏中的替代符号 |
thief-book-turbo.statusBarAlign |
left |
状态栏对齐方式:left(贴近中央,默认)或 right(排在内置 ln/col、编码、语言等项右边),切换即时生效 |
thief-book-turbo.currPageNumber |
1 |
兼容回退页码(新版本每本书独立记忆进度,优先使用 globalState) |
核心特性
1. 多编码 TXT 不乱码
自动检测 TXT 文件编码(jschardet + iconv-lite),支持:
- UTF-8(含带 BOM)
- GBK / GB2312 / GB18030(最常见的国标中文编码)
- Big5(繁体)
- Shift-JIS / EUC-JP(日文)
- EUC-KR(韩文)
- UTF-16LE / UTF-16BE(带 BOM 自动识别)
- ISO-8859 / windows-125x 等单字节编码
检测策略(src/textEncoding.js):BOM 优先 → UTF-8 严格校验(采样 1MB)→ jschardet 采样检测(前 64KB,置信度 ≥0.8 才信任)→ 回退链 utf-8 → gbk → big5 按解码质量择优。小样本(几 KB)检测不可靠的问题由回退链兜底。
如果自动检测仍不理想,可在设置中手动指定编码(见上方配置表)。
2. 性能优化
- 吃内存更少:全书只保留一份解码后的文本,不做全文正则清洗生成副本;换行等清洗只在翻页时对当前页执行
- 翻页更流畅:状态栏使用常驻
StatusBarItem(连续翻页不闪烁、不抢其他扩展的消息),翻页为 O(每页字符数) 纯内存截取 - 启动不卡顿:
workspace.fs.readFile异步读取;编码检测仅采样 64KB(全量检测慢 13 倍) - 进度记忆:页码实时写回全局配置,重启后自动恢复到上次阅读位置
3. 实用功能
- 章节跳转:自动解析"第X章/回/卷/节"(懒加载并缓存索引),QuickPick 列表一键定位
- 全文搜索:书内关键词搜索(最多 50 处命中,带上下文摘要),选择后直接跳到所在页
- 进度按书隔离:每本书独立记忆页码(
globalState),换书互不干扰 - 页码写入防抖:连续翻页时 1 秒合并写一次,减少持久化 IO
- 配置变更自动重载:修改
filePath/encoding/pageSize后自动重新加载,无需手动 reload - 分片解码:大文件解码分块进行并让出事件循环,加载全程 UI 不冻结
- 状态栏对齐可调:
statusBarAlign支持left(贴近中央)与right(排在内置状态项右侧),切换即时生效
4. 修复的原版问题
- 页码从 1 开始,不再丢掉每本书的开头内容(原版 off-by-one bug)
getJumpingPage(0)正确视为跳转到第 1 页(原版会误走输入框分支)- 书签删除按对象引用匹配,同名书签不会误删
相对旧版(Thief-Book)的新增与改善
本扩展由原版 better-thief-book(Thief Book)改造而来,在保留"状态栏摸鱼看书"核心用法的基础上,补齐了编码兼容与性能短板。
🆕 新增功能
| 功能 | 说明 |
|---|---|
| 章节跳转 | 自动解析中英文章节(第X章/回/卷/节、序章/楔子/番外、Chapter/Part/Volume + 数字/罗马数字),QuickPick 一键定位 |
| 全文搜索 | 书内关键词搜索(最多 50 处、带上下文摘要),结果按距当前页最近排序,选择即跳转 |
| 进度按书隔离 | 每本书独立记忆页码(globalState),换书互不干扰,重启自动续读 |
| 配置变更自动重载 | 修改 filePath / encoding / pageSize 后自动重新加载,无需手动 reload |
| 多语言支持 | 跟随 VSCode 界面语言自动切换中文 / 英文(含命令标题、配置描述、状态栏提示) |
| 手动编码指定 | 自动检测失败时可强制指定 gbk / big5 / utf-16le 等编码,兜底解决顽固乱码 |
| 老板键伪装升级 | 一键切换为"工作区/Git 状态"(文件 · modified、分支 · N changes),不再暴露固定假文本 |
| 状态栏对齐可调 | 新增 statusBarAlign 配置,内容可在状态栏左右两侧自由切换 |
⚡ 性能与健壮性改善
| 改善点 | 原版(Thief-Book) | 本版(thief-book-turbo) |
|---|---|---|
| 编码支持 | 仅 UTF-8,GBK/Big5 必乱码 | jschardet + iconv-lite 自动检测,GBK/Big5/Shift-JIS/EUC-KR 等 30+ 编码不乱码 |
| 内存占用 | 全文多次 replace 生成多份副本 |
全书单副本,清洗只在翻页时对当前页执行;1250 万字 GC 后常驻仅 ~72MB |
| 翻页体验 | setStatusBarMessage 频繁闪烁、抢消息 |
常驻 StatusBarItem,翻页 0.002ms/次,亚毫秒级连续翻页 |
| 启动速度 | 同步读取阻塞界面 | 异步读取 + 分片解码(让出事件循环)+ 编码检测仅采样 64KB,38MB 全本 300ms 加载 |
| 页码正确性 | off-by-one:第 1 页丢失开头 50 字 | 页码从 1 正确开始 |
| 健壮性 | — | 路径首尾空格防御(trim)、页码写入防抖(1s 合并)、书签删除按引用匹配(防同名误删) |
测试
测试书籍已做脱敏处理(统一编号,不标注真实书名与来源)。所有书籍 txt 已被
.gitignore的*.txt规则排除,不会入库。
模拟用户测试(data/ 目录,20 本书全量回归,2026-08-31)
node --expose-gc test/simulateUser.js 依次模拟真实阅读会话:打开书 → 翻页 ×20 → 上一页 ×10 → 随机跳页(首/中/后段乱码抽查)→ 全文搜索 → 章节解析 → 添加书签 → 老板键 → reload 重置,每本书 7 项断言(第一页/翻页/跳页乱码/搜索/书签/老板键/reload)全部通过。
| 编号 | 大小 | 编码 | 字符数 | 加载 | 下一页 | 章节 | 结果 |
|---|---|---|---|---|---|---|---|
| 测试书-01 | 22.85MB | gbk 自动识别 | 1292 万 | 179ms | 0.002ms | 1091 | 全部 OK(无乱码) |
| 测试书-02 | 22.68MB | utf-8 | 813 万 | 100ms | 0.003ms | 2360 | 全部 OK |
| 测试书-03 | 22.19MB | utf-8(BOM) | 862 万 | 101ms | 0.003ms | — | 全部 OK |
| 测试书-04 | 17.63MB | gbk 自动识别 | 1023 万 | 185ms | 0.004ms | 969 | 全部 OK(无乱码) |
| 测试书-05 | 15.71MB | utf-8 | 607 万 | 70ms | 0.004ms | 1269 | 全部 OK |
| 测试书-06 | 14.41MB | utf-8 | 512 万 | 67ms | 0.004ms | 1300 | 全部 OK |
| 测试书-07 | 11.22MB | utf-8 | 403 万 | 76ms | 0.002ms | 1128 | 全部 OK |
| 测试书-08 | 7.83MB | utf-8 | 284 万 | 59ms | 0.002ms | 1027 | 全部 OK |
| 测试书-09 | 7.09MB | utf-8 | 401 万 | 34ms | 0.003ms | 256 | 全部 OK |
| 测试书-10 | 5.68MB | utf-8 | 201 万 | 48ms | 0.002ms | — | 全部 OK |
| 测试书-11 | 5.01MB | utf-8 | 180 万 | 24ms | 0.002ms | — | 全部 OK |
| 测试书-12 | 4.56MB | utf-8 | 163 万 | 41ms | 0.003ms | — | 全部 OK |
| 测试书-13 | 2.30MB | utf-8 | 83 万 | 39ms | 0.002ms | 287 | 全部 OK |
| 测试书-14 | 0.64MB | utf-8 | 22 万 | 6ms | 0.002ms | — | 全部 OK |
| 测试书-15 | 0.50MB | utf-8 | 18 万 | 4ms | 0.002ms | 10 | 全部 OK |
| 测试书-16 | 0.49MB | utf-8 | 18 万 | 4ms | 0.003ms | 7 | 全部 OK |
| 测试书-17 | 0.41MB | utf-8 | 14 万 | 4ms | 0.003ms | 42 | 全部 OK |
| 测试书-18 | 0.32MB | utf-8 | 11 万 | 3ms | 0.003ms | — | 全部 OK |
| 测试书-19 | 0.17MB | utf-8 | 6 万 | 1ms | 0.003ms | — | 全部 OK |
| 测试书-20 | 0.08MB | utf-8 | 3 万 | 12ms | 0.020ms | — | 全部 OK |
测试集含 2 本 GBK 大部头(1023 万 / 1292 万字符)自动识别正确、零乱码;最大单本 258,373 页,加载 179ms、翻页 0.002ms/次。GC 后单书常驻内存 47.7~78.5MB(RSS 随测试进程累计升高属正常)。
极限场景基准(node --expose-gc test/benchBook.js)
| 指标 | 结果 |
|---|---|
| 编码识别 | 自动识别正确,全书无乱码(抽样页 U+FFFD = 0) |
| 加载耗时 | 分片解码,UI 全程不冻结 |
| 翻页速度 | 亚毫秒级(60fps 标准为 16ms) |
| 随机跳页 | O(每页字符数) 纯内存截取 |
| 常驻内存 | GC 后 ~72MB(1250 万字全本) |
本地安装与打包
# 本地安装已打包好的 vsix(也可以在 VSCode 扩展面板 → ... → 从 VSIX 安装)
code --install-extension build/thief-book-turbo-0.1.7.vsix
# 重新打包(--no-yarn 是因为项目有 yarn.lock 但使用 npm)
bash build-vsix.sh # 默认读取 package.json 的 version
bash build-vsix.sh 0.1.7 # 或指定版本号
# 提示:若 npm 缓存目录被锁定(EPERM),指定全新缓存目录即可:
# npm_config_cache="C:/Users/dan/AppData/Local/Temp/npm-cache-turbo" npx --yes @vscode/vsce package --no-yarn --out build/thief-book-turbo-0.1.7.vsix
打包产物约 740KB,仅包含运行时依赖(iconv-lite / jschardet / safer-buffer)、src/ 源码、doc/ 图片(含 README 使用的 usage.png)与双语 nls;data/ 测试书籍、test/ 测试代码等均不进入包内(见 build-vsix.sh)。
开发调试
# 依赖安装(jschardet / iconv-lite);npm 走本地代理 127.0.0.1:7897(见 .npmrc)
npm install
# 编码 + 分页逻辑单元测试(34 项,不依赖 vscode)
node test/runEncodingTest.js
# 模拟用户真实阅读会话(遍历 data/ 下所有 txt:翻页/跳页/搜索/章节/书签/老板键/reload)
node --expose-gc test/simulateUser.js
node --expose-gc test/simulateUser.js "D:/books/任意小说.txt"
# 性能基准(默认测 data/ 下最大的测试书,可传任意 txt 路径)
node --expose-gc test/benchBook.js
node --expose-gc test/benchBook.js "D:/books/任意小说.txt"
# 在 VSCode 中调试:F5 启动扩展宿主(需 devDependencies 已安装)
更新日志
v0.1.7(2026-08-31)
- 🐛 修复:默认 50 字/页时状态栏正文被截断(只剩 33 字 +
…)的问题。显示上限改为动态跟随 pageSize(当页正文 + 24 余量),默认配置下整页内容 + 页码完整显示、绝不截断正文;仅当 pageSize 调到远超状态栏物理宽度时才截断,且始终保留尾部页码、全文在 tooltip。
v0.1.6(2026-08-31)
- 🐛 修复:状态栏
[当前页]/[总页数]显示不全的问题。超长文本截断时不再从头部硬切,而是优先保留尾部页码——只截断正文部分,页码始终完整显示,全文仍可在 tooltip 中查看。
v0.1.5(2026-08-31)
- ✨ 新增配置
thief-book-turbo.statusBarAlign:left(贴近状态栏中央,默认)/right(排在内置 ln/col、编码、语言等状态项右侧),切换即时生效 - 🐛 修复:状态栏内容大屏贴边、小屏拥挤的问题(左侧改为低优先级贴近中央,右侧改为排在内置项右边、通知铃铛左边)
FAQ
Q: 打开书后状态栏没显示内容?
A: 检查 thief-book-turbo.filePath 是否指向正确的 TXT 绝对路径,然后执行 thief-book-turbo.reloadBook。
Q: 显示乱码怎么办?
A: 先在设置里看插件状态栏 tooltip 显示的识别编码是否正确;不对的话手动设置 thief-book-turbo.encoding 为实际编码(如 gbk),再 reloadBook。
Q: 为什么每次只显示 50 个字?
A: 状态栏空间有限,这是刻意的分页设计。连续按快捷键即可"连续翻页",或调大 pageSize。
Q: 小说内容在状态栏的位置不满意?
A: 设置 thief-book-turbo.statusBarAlign:left 让内容贴近状态栏中央(默认),right 让内容排在内置 ln/col、编码、语言等状态项的右边,切换即时生效。
Q: 换书之后页码不对?
A: 执行 thief-book-turbo.reloadBook 会重置页码并重新加载新书。修改设置后配置变更也会自动重载。
