这是本节的多页打印视图。 .
Crib 文档
Crib 还没有公开安装包。这里描述的是当前开发构建的行为,正式发布前可能还会调整;进度见发布状态。
常用入口
两个版本的区别,第一次打开时会发生什么。
版本前缀、筛选条件、符号与中文检索。
切到另一种语言的同一节,或两栏并排。
启用、停用、导入和恢复文档版本。
让编辑器和 AI 客户端查询离线文档。
已经完成什么,正式发布前还差什么。
文档地图
简介
Crib 是什么、收录哪些内容、怎样工作、现在到了哪一步。
使用指南
从安装到日常使用的每一个功能。
安装与首次启动 · 搜索 · 阅读与双语对照 · 笔记、书签与本地更正 · 片段 · 快捷键
资料库
获取和管理文档版本,更新、回滚和恢复,以及资料包格式。
管理资料库 · 版本与别名 · 下载、更新与恢复 · 资料包格式
集成
让其他程序使用 Crib 里的文档。
本地 API · MCP · 系统服务与全局快捷键 · 深链接
参考
数据存放位置、内容来源和常见问题。
1 - 简介
1.1 - Crib 是什么
Crib 是一款 macOS 应用,把 PostgreSQL 6.3 到 20devel 共 31 条版本线的中英文手册、一份结构化的 PostgreSQL Wiki,以及你自己的笔记和更正放在同一个本地资料库里。它不需要账号,不依赖网络,也不需要连接 PostgreSQL 服务器。

它解决什么问题
查 PostgreSQL 文档时常见的几个麻烦:
- 版本对不上。 生产库还在 9.6 或 12,网上搜到的却是最新版手册。Crib 收录每条版本线,搜索时可以直接写
PG96: vacuum。 - 符号搜不到。
->>、@@、\dC这类写法在通用搜索引擎里会被当成标点丢掉。Crib 先按精确名称匹配,再搜正文。 - 中英文来回找。 读中文手册遇到拿不准的句子,想看英文原文,往往要重新翻目录。Crib 一键切到另一种语言的同一节,也可以两栏对照。
- 断网或内网环境。 机房、飞机、隔离网络里打不开在线文档。Crib 首次启动就能离线阅读和搜索。
- 笔记散落各处。 排障时记下的结论和手册原文分开放,过一阵就找不到出处。Crib 的笔记、书签和更正挂在具体章节上,内容更新后会重新核对位置,找不到的单独列出。
适合谁
| 读者 | 典型用法 |
|---|---|
| DBA / SRE | 输入 pg12: max_connections 或“锁”,确认某个版本的参数和行为,把结论记成笔记 |
| 应用开发者 | 查运算符、函数重载、psql 命令和 SQLSTATE,复制代码片段 |
| 中文读者与译者 | 读中文,遇到疑问切英文同节;对译文写本地更正并导出 |
| 维护老系统的人 | 对比旧版本和新版本的手册、版本发布与安全信息 |
和其他方式的区别
| 在线手册 | 下载 HTML 或 PDF | Crib | |
|---|---|---|---|
| 断网可用 | 否 | 是 | 是 |
| 31 条版本线 | 按版本分开浏览 | 需要逐个下载 | 同一个资料库 |
| 中英文同节切换 | 否 | 否 | 是,基于章节标识对应 |
| 跨版本搜索 | 依赖站内搜索 | 否 | 是,可按版本、语言、类型限定 |
| 笔记与更正 | 否 | 自行管理 | 挂在章节上,可导出 |
Crib 借鉴了 Dash 的片段库、系统服务和本地 API 等用法。区别在于内容格式:Crib 的 .crib 资料包自带双语章节对应、版本信息和签名,不使用也不兼容 Dash docset。
它不做什么
- 不连接数据库,不执行 SQL。
- 不翻译。中文内容只来自已有的中文译本;某一节没有译文时,明确显示缺失,不拿英文冒充。
- 不改写官方原文。你的更正存在个人资料库里,与原文并列显示。
- 没有云同步。个人资料可以导出、导入和备份,但不会自动上传到任何地方。
现在的状态
Crib 还在开发中,没有公开安装包。本站文档描述的是当前开发构建的行为。已经完成和尚未完成的部分见发布状态。
接下来读什么
1.2 - 收录内容
Crib 的内容分两类:PostgreSQL 手册,每条版本线一个中英双语资料包;Wiki,一个独立的双语资料包。所有内容都来自固定版本的输入,构建时记录每个文件的来源和哈希,并用 Ed25519 签名。
手册
31 条版本线,每条一套英文、一套中文,共 62 套完整手册。每条线固定到一个确切的内容版本,不跟随上游自动更新;新的小版本发布后,以新的资料包修订号加入版本目录,旧版本保留。
| 版本线 | 内容版本 | 版本线 | 内容版本 | 版本线 | 内容版本 |
|---|---|---|---|---|---|
| 6.3 | 6.3.2 | 8.2 | 8.2.23 | 11 | 11.22 |
| 6.4 | 6.4.2 | 8.3 | 8.3.23 | 12 | 12.22 |
| 6.5 | 6.5.3 | 8.4 | 8.4.22 | 13 | 13.23 |
| 7.0 | 7.0.3 | 9.0 | 9.0.23 | 14 | 14.24 |
| 7.1 | 7.1.3 | 9.1 | 9.1.24 | 15 | 15.19 |
| 7.2 | 7.2.8 | 9.2 | 9.2.24 | 16 | 16.15 |
| 7.3 | 7.3.21 | 9.3 | 9.3.25 | 17 | 17.11 |
| 7.4 | 7.4.30 | 9.4 | 9.4.26 | 18 | 18.6(默认) |
| 8.0 | 8.0.26 | 9.5 | 9.5.25 | 19 | 19rc1(预览版) |
| 8.1 | 8.1.23 | 9.6 | 9.6.24 | 20 | 20devel(开发快照) |
| 10 | 10.23 |
19 固定为 19rc1,20 是 2026-10-16 的 20devel 开发快照。它们不会成为默认版本:总别名 pg 只指向正式版。用 pg19:、pgdevel: 前缀可以单独搜索它们,见版本与别名。
来源
- 英文手册:PostgreSQL 全球开发组发布的官方文档,按上表版本从固定的源码归档构建。19 和 20 缺少现成的 HTML 构建,从固定的源码输入补建。
- 中文手册:pgdoc 收录的各版本简体中文译本。每套手册保留原有的译者署名和版权声明,例如 18.6 中文版署名“翻译:冯若航,Pigsty 项目组”。
- 历史资源:6.3、6.4 等早期中文版缺失的 CSS 和图片,只从同一版本的另一语言版本或核实过的同版材料补齐,并逐个记录来源。
规模
| 项目 | 数量 |
|---|---|
| HTML 页面 | 54,887 |
| 可检索章节 | 409,439 |
| 中英文章节对应 | 77,580 对 |
| 缺失的必需资源 | 0 |
中英文章节对应只在两侧手册源码里都能找到唯一的章节声明、且 HTML 中有唯一的物理锚点时才建立;标题相同或自动生成的 ID 不算数。没有对应的章节,切换语言时回到最近的已对应父节,并明确提示。
已知缺口
- 原始手册中有 80 处历史失效链接和 235 处重复锚点,Crib 保留原样并在资料包审计中列出,不臆造目标。
- 本地 SVG 插图(PG 12–20 中的 GIN、页面布局、GEQO 等图)以静态图片显示,脚本与远程资源一律去除。
Wiki
Wiki 来自 pg.center 2026-10-24 的冻结快照,打成一个独立的双语资料包。它把散落在手册各处的对象整理成条目:一个配置参数、一个函数、一个等待事件各是一条,带类型、默认值、出现版本和来源。导航分六组共 30 个集合:
| 分组 | 集合 |
|---|---|
| 查询语言 | SQL 命令、数据类型、函数、运算符、SQLSTATE |
| 索引与存储 | 系统目录、索引访问方法、表访问方法、操作符族、存储参数、存储结构、OID 类型 |
| 运行与诊断 | 配置参数、执行计划、等待事件、锁、统计与指标、认证方法、预定义角色 |
| 客户端与协议 | psql 命令、命令行工具、连接参数、协议消息 |
| 扩展机制 | 外部数据包装器、扩展钩子、过程语言、全文检索组件、排序规则与编码、逻辑解码插件 |
| 版本 | 版本(汇总各版本的发布、安全公告与能力信息) |
前五组是 29 种实体集合;“版本”是组合视图,把版本发布、CVE 与能力矩阵放在一起看。
| 项目 | 数量 |
|---|---|
| 文档 | 12,143 |
| 章节 | 212,257 |
| 事实记录 | 459,513 |
| 原始对象 | 10,087 |
Wiki 的边界
- 不是每个集合在每个版本、每种语言都有覆盖。部分扩展集合只覆盖 PG 10–20,表访问方法从 PG 12 开始。
- “未观测到”和“已移除”是两回事。只有来源明确写出时才标记某项被移除,覆盖缺口不会被当成删除。
- 每条事实显示来源、版本和观测时间;某种语言没有正文时显示缺失,不用另一种语言填充。
- Wiki 中引用的外部网页和插图不随包下载。
你自己的资料
笔记、书签、标签、阅读历史、本地更正和片段不属于任何资料包,单独存放在用户目录里。卸载或更新文档版本不会删除它们。见笔记、书签与本地更正和用户数据与迁移。
1.3 - 工作原理
Crib 由两部分组成:构建端用 Go 把手册和 Wiki 做成签名的资料包和预建索引;macOS 应用用 SwiftUI、少量AppKit、WKWebView 和 SQLite FTS5 读取它们。应用运行时不需要网络服务,也不启动本地 HTTP 服务器(本地 API 是可选功能,默认关闭)。
flowchart LR
P["手册源码与 HTML<br>Wiki 冻结快照"] --> G["Go 构建工具<br>crib-pack"]
G --> B["签名资料包<br>.crib"]
G --> S["出厂搜索索引<br>seed"]
B --> V["应用:验签与安全解包"]
V --> W["后台构建新的搜索世代"]
S --> A["当前世代"]
W --> A
A --> Q["搜索"]
A --> R["阅读器 WKWebView"]
U["个人资料<br>user.sqlite"] --> R
U --> Q三类数据分开存放
| 数据 | 存放位置 | 谁可以写 |
|---|---|---|
| 文档内容:HTML、资源、章节、双语对应、精确名称键 | 只读的资料包 | 只有构建端,写入后签名 |
| 搜索索引 | 资料库里的“世代”(generation) | 应用的后台构建器,构建完成后不再修改 |
| 笔记、书签、标签、历史、本地更正 | 用户目录中的 user.sqlite | 只有个人资料模块 |
资料包导入器不能写个人资料库,个人资料也不建立指向资料包的级联删除。所以卸载一个版本不会删掉挂在上面的笔记,只会让它们暂时显示为目标不可用。
资料包
每条 PostgreSQL 版本线是一个双语原子包,Wiki 是另一个。包里有 manifest.json、签名、来源清单、章节数据库、两种语言的文档和许可文件。同一个版本、同一个修订号的文件字节永远不变;内容有变化就发新的修订号。格式细节见资料包格式。
应用只接受签名有效的包:检查清单签名、文件长度和哈希、ZIP 边界和资源清单,拒绝绝对路径和路径穿越。
搜索世代
搜索时只查一个聚合的 SQLite 数据库,不同时挂接多个包的数据库。这样所有版本的正文用同一套统计排序,结果可以直接比较。
这个聚合数据库叫一个“世代”。它由当前启用的资料包组合唯一决定:
- 完整离线版和 Core 版都随附一个出厂世代,首次启动直接使用,不需要建索引。
- 导入、更新、启用或停用资料包时,应用在后台从各包流式读取章节,写一个新的世代。
- 新世代验证通过后才原子切换。构建期间旧世代照常服务,已经打开的阅读窗口继续停在原来的世代上。
- 构建失败、被取消或磁盘不足时,保留原来的世代,不会出现一半新一半旧的状态。
只移动版本别名(例如 pg18 从 18.6 指向 18.7)不需要重建世代;只有实际更换资料包才重建。
搜索
查询先解析成结构化条件:版本前缀和 lang:、kind: 等过滤器来自白名单,其余是文本。用户输入不会直接拼进 SQL。排序分层进行:
- 当前范围内的精确名称和别名(
work_mem、->>、\dC、SQLSTATE 代码)。 - 名称前缀。
- 标题和章节名。
- 正文。
中文按连续汉字的重叠双字切分:“事务隔离”切成“事务、务隔、隔离”。单个汉字(例如“锁”)走标题和名称的字符索引,在有限范围内查,不扫描全库正文。构建端和应用使用同一个切分规则(analyzer),并用同一组测试样例核对。具体写法见搜索。
阅读器
正文是资料包里的 HTML,由 WKWebView 通过一个受限的内部地址读取:地址里带有资料包清单的摘要,只能访问该包内的文件,不能加载远程脚本或资源。切换语言时,按两种语言之间已验证的章节对应跳转,没有对应就回到父节并提示。
个人资料
user.sqlite 使用 WAL 和完整同步写入,每次保存在一个事务里比较修订号:两个编辑器同时改同一条笔记时,后保存的一方得到冲突提示,不会覆盖对方。迁移或备份使用 SQLite 在线备份,而不是复制正在使用的数据库文件。个人资料库打不开时,只停用个人功能,阅读和搜索照常工作。见笔记、书签与本地更正。
1.4 - 发布状态
Crib 没有公开安装包,也没有公开源码。本页按项目内部的发布计划整理,每个阶段单独标注;一项完成不代表其他项完成。
已完成
这些是源码层面的里程碑,在本地开发构建上验证过:
- 31 条版本线、62 套手册和 Wiki 全部构建、签名并通过完整性审计;完整离线版的出厂搜索索引可以直接使用。
- 搜索、阅读、双语切换与对照、笔记、书签、本地更正、片段、资料包管理、本地 API、MCP 和系统服务均已实现。
- 由 PGDash 改名为 Crib:产品、应用、用户目录和输出名称已统一;旧用户资料按一次性迁移复制,旧格式继续兼容。见用户数据与迁移。
- 签名版本目录 v3:每个版本带生命周期(默认、常规、历史、开发、不再提供),别名、搜索、资料库和阅读器共用同一个版本模型。
- Core 版加按需下载:内置 18.6 和启动索引,其余版本从签名目录下载,可断点续传。
- 2026-11-06 完成界面与文案重设计,资料包扩展名改为
.crib(旧的.pgdocpack继续有效)。
尚未完成
| 事项 | 现状 |
|---|---|
| 最终候选验收 | A01–A10 验收项尚未绑定到最终的 Crib 候选构建;历史验收不能直接沿用 |
| 真实桌面验收 | 已有离屏快照与隐藏窗口测试;可见窗口、实体键盘与输入法、辅助功能、MCP 客户端实际接入仍待验收 |
| 系统服务错误提示 | 服务菜单发现、查找和创建片段已在可见流程中验证;拒绝请求时的错误提示仍待证实 |
| 许可与再分发 | 应用代码尚未选定许可证;手册译文、Wiki 文本、字体和图片的再分发许可尚未逐项核对 |
| 生产资料包目录 | 计划发布在 repo.pigsty.io/doc/,尚未上传;需要验证匿名 HTTPS 下载、缓存和断点续传 |
| 正式签名 | 内容目前使用开发密钥签名,应用为 ad-hoc 签名;生产密钥、Developer ID 签名和 Apple 公证尚未进行 |
| 平台支持 | 只在 Apple Silicon、macOS 27 的开发机上实测;macOS 14 实机和 Intel Mac 尚未测试 |
| 安装与升级 | 安装、更新、回滚和备份的端到端测试待完成 |
“发布就绪”和“已发布”是两个独立的状态,目前都为否。
本站文档的适用范围
- 文档描述的是 2026-11-06 前后的开发构建。正式发布前,界面文字、默认快捷键和部分细节仍可能调整。
- 标注“尚未实测”“待验收”的行为,不要当作已经保证。
- 截图来自开发构建的离屏快照,与正式版可能略有差异。
进展更新发在开发日志。
2 - 使用指南
2.1 - 安装与首次启动
Crib 仍在开发中,没有公开下载,也没有确定价格和许可证。发布后安装包会放在下载页。本页描述的是当前开发构建的行为。开发构建只有临时签名,没有经过 Apple 公证。
系统要求
| 项目 | 现状 |
|---|---|
| 部署目标 | macOS 14 |
| 已测试 | 只在 Apple 芯片(arm64)的开发机上测试过 |
| 未测试 | 实际运行在 macOS 14 上、Intel Mac |
| 网络 | 首次启动和日常阅读、搜索都不需要;只有下载其他版本时需要 |
部署目标是编译设置,不等于已经在 macOS 14 上验证过。正式发布前会单列实测过的系统和机型。
两种版本
| 完整离线版 | Core | |
|---|---|---|
| 内置手册 | 全部 31 条版本线,中英文共 62 套 | PG 18.6 中英文手册 |
| 内置 Wiki | 有 | 无,按需下载 |
| 搜索索引 | 随应用附带,覆盖全部内置内容 | 随应用附带 18.6 的索引;下载其他版本后在本机建立 |
| 其他版本 | 不需要下载 | 从签名的版本目录选择安装 |
两种版本的区别在于随应用附带多少内容。Core 下载的每个资料包都会先校验签名,再建立索引、切换到新内容;下载失败或取消时,已安装的内容照常可用。获取和管理版本见资料库。
Core 按需下载所用的版本目录还没有在正式地址上线,在那之前 Core 无法联网下载其他版本。手头有 .crib 资料包文件时,可以在资料库中“导入资料包…”。
首次启动
- 打开 Crib。不需要账号,也不需要联网:两种版本都直接使用随应用附带的内容和索引。
- 窗口默认打开 PG 18 中文手册,内容版本是 18.6。搜索范围默认是“PG 18 · 简体中文 · 手册”。
- 按 ⌘ 加 L 开始搜索。搜索语法见搜索。
- 点工具栏的主页按钮(⇧ 加 ⌘ 加 H)可以回到主页,从“获取版本”“资料库”“搜索方案”“快捷键”四个入口继续设置。
本地 API 和三个全局快捷键默认关闭,不会在首次启动时请求权限。只有“搜索选中文字”全局快捷键需要辅助功能权限,开启时再授予。
个人资料放在哪里
设置、片段库、笔记、书签、更正、阅读历史和下载的资料包都存放在:
这个目录不在应用包内。卸载某个文档版本不会删除挂在上面的笔记和更正。各文件的用途见用户数据与迁移。
从 PGDash 迁移
Crib 以前叫 PGDash。如果本机有 ~/Library/Application Support/PGDash/,Crib 启动时会把它复制一份到新目录,旧目录原样保留,不修改也不删除。
- 迁移失败时,Crib 以只读方式运行:可以阅读和搜索内置内容,但笔记、书签、更正、阅读历史、下载和设置都不能修改。每次启动会重试;提示中也可以“重试迁移”或“跳过迁移…”。
- 跳过迁移后,Crib 从空白的个人资料开始,旧资料原样留在原目录。
- 已经有 Crib 资料时又发现旧资料,Crib 会提示“发现 PGDash 旧资料”,由你选择“迁移旧资料”或“不再提示”。选择迁移时,现有的 Crib 资料会整体移到一旁保留。
迁移的完整规则和恢复办法见用户数据与迁移。
2.2 - 搜索

搜索框
按 ⌘ 加 L 聚焦工具栏中的搜索框,⌘ 加 K 是备用快捷键。结果随输入更新。
| 按键 | 作用 |
|---|---|
| ↑ ↓ | 选择结果 |
| ↩ | 打开选中的结果;结果还没出来时,出来后打开第一条 |
| ⌘ 加 ↩ | 在新标签页打开 |
| Esc | 回到正文,查询保留 |
在结果上点右键可以“在新标签页打开”或“复制链接”。搜索框为空、或查询里只有筛选条件时,中间一栏显示当前范围的“目录”,而不是搜索结果。
搜索范围
工具栏下方的范围栏决定默认在哪里搜:
- 搜索方案:保存的范围,见搜索方案。
- 版本:例如“PG18 · 18.6”。选“默认版本”回到 PG 18;选“常规版本”搜索全部默认和常规版本。历史版本和开发版不在其中,在阅读区“版本”弹出框中打开“专家模式”后,这一项变为“全部已启用版本”,搜索也包含它们。
- 语言:中文、English 或全部语言。
- 资料类别:由左侧栏决定。“手册”只搜手册,“全部资料”包括 Wiki,点某个 Wiki 集合则只搜该集合。
新窗口的默认语言和版本在“设置 › 通用 › 默认搜索范围”中修改;设了默认搜索方案时以方案为准。
搜索语法
查询由关键词、版本前缀和筛选条件组成,顺序不限。前缀和筛选只作用于本次查询,并优先于范围栏。它们以“仅本次查询”标签显示在范围栏中,点标签可以单独移除;“清除筛选”移除全部筛选,保留关键词。
版本前缀
| 写法 | 含义 |
|---|---|
pg18: | PG 18。大小写不限,PG18: 相同 |
pg96:、pg9.6: | PG 9.6。10 以前的版本可以省略点号 |
[email protected]: | 指定内容版本 18.6;本机装的不是这个小版本时提示未安装,不用其他小版本代替 |
pg: | 默认版本,目前是 PG 18 |
pgdevel: | 开发版,目前是 20devel |
前缀后面可以不加空格,pg18:vacuum 等于 pg18: vacuum。
筛选条件
| 筛选 | 取值 | 作用 |
|---|---|---|
lang: | en、zh-Hans | 只搜这种语言的正文 |
branch: | 版本号,如 18、9.6 | 只搜这个版本;与版本前缀同时写时必须一致 |
domain: | manual、wiki、release、security、capability、provenance | 只搜手册、Wiki、发布、安全、能力或来源资料 |
collection: | Wiki 集合键,如 guc、func、sqlstate、psql、waitevent | 只搜这个 Wiki 集合 |
kind: | 集合键或 domain: 的取值 | 写集合键等于 collection:,写资料类型等于 domain: |
project: | postgresql,可写 pg | 目前只有这一个项目 |
左侧栏选的是“手册”时,搜索限定在手册内,collection:guc 不会有结果。先在侧栏选“全部资料”,或在查询里加 domain:wiki;更直接的办法是在侧栏点该集合。
其他规则:
- 同一种筛选写了两个不同的值,或版本前缀与
branch:指向不同版本,搜索会报错,不会替你挑一个。 - 中文输入法打出的全角冒号
:和全角字母、数字可以直接用。 - 不是筛选名的冒号按普通文字处理。粘贴报错时不必删掉
ERROR:、DETAIL:、错误:的冒号;x::int、localhost:5432也原样保留。 - 用英文双引号括起的短语要求在原文中连续出现。
- 查询最多 256 个字符。超过 32 个词时只用前 32 个,结果栏上方会提示。
示例
| 查询 | 含义 |
|---|---|
work_mem | 找配置参数,名称完全一致的条目排在最前 |
PG96: vacuum | 在 PG 9.6 中搜 vacuum |
[email protected]: max_connections lang:en | 在 18.6 英文手册中找 max_connections |
SELECT branch:18 lang:en | 在 PG 18 英文资料中找 SELECT |
->>、@@ | 运算符,标点原样参与匹配 |
\d+、\dC | psql 命令,区分大小写,只做精确匹配 |
23505 | SQLSTATE 代码,按字符串匹配 |
复制延迟、事务隔离 | 中文词语,按相邻两字匹配 |
锁 | 单个汉字,只匹配标题和名称 |
domain:wiki SELECT | 只在 Wiki 中找 SELECT |
匹配规则
结果先按名称匹配,再按标题和正文匹配。大致顺序是:名称、命令或定义完全一致,别名,名称前缀,章节标题,标题相关的章节,最后是正文。每条结果的说明行末尾标出匹配方式:精确、别名、前缀、标题、相关章节、正文或标题/名称;悬停可以看到解释。
- 大小写:普通英文标识符不区分大小写,
WORK_MEM与work_mem相同。含标点的名称和 psql 命令区分大小写,\dC与\dc是两个命令。 - 反斜杠:查询中有以
\开头的词时,只做精确匹配,不退回正文搜索。 - 英文词形:3 个字母以上的单词同时匹配常见词形,
lock也匹配 locks、locked、locking。末尾还没输完的英文词按前缀匹配,例如transaction isol。 - 中文:连续的汉字按相邻两字切分,“事务隔离”拆成“事务”“务隔”“隔离”,这几组都出现才算命中,不要求相邻。需要连续出现时加英文双引号。
- 单个汉字:只输入一个字时(如
锁),只匹配标题和名称中含这个字的条目,结果标为“标题/名称”。和其他词一起出现的单字按词首近似匹配,结果栏会提示“单个汉字只按标题和词首匹配,输入完整词语更准确”。 - 语言:英文标识符在中文手册里原样存在,在中文范围内搜
work_mem也能命中中文手册。写了lang:en就不会返回中文正文。
多版本结果
搜索多个版本时,同一种语言下的同一个对象合成一组:Wiki 按同一概念,手册按同一章节标识。没有可靠对应关系的同名条目各自单列。
- 结果栏顶部显示“N 组 · M 个版本”。
- 分组标题下有版本摘要,点它或按 → 展开,按 ← 收起。
- 折叠时按 ↩ 打开组内排在最前的一条。组内先列范围栏选定的版本,其余从新到旧。
搜索方案
范围栏最左边的“搜索方案”菜单保存常用范围:版本、语言、资料类别,以及可选的搜索框提示语和触发词。
- 调好范围栏,在菜单中选“将当前范围存为方案…”。
- 在“设置 › 搜索”中编辑、停用或删除方案,并可以指定“新窗口默认方案”。
- 给方案加触发词后,在搜索框输入
sql:select或sql select,这一次就按触发词为sql的方案搜索 select。删掉触发词即恢复范围栏原来的范围。
每个方案最多 8 个触发词,以英文字母开头,最长 32 个字符;不能使用 pg 开头的词和 lang、branch 等筛选名。方案里的“在结果中显示片段”可以单独关闭片段结果。
没有结果时
结果栏显示“没有结果”和实际搜索的关键词(不含筛选),并给出几个操作,都会保留关键词:
- 清除筛选:查询中有筛选条件时出现。
- 清除查询。
- 调整范围 › 搜索全部版本:从单个版本扩大到全部版本。
- 调整范围 › 仅搜索 PG N:回到正在阅读的版本和语言。
搜索未安装或已停用的版本(例如在 Core 中写 pg96:)时,Crib 会说明该版本未安装或未启用,状态栏出现“查看 PG96”,打开资料库获取或启用。
最近搜索
点搜索框左侧的放大镜,菜单中列出最近 12 条查询,选“清除最近搜索”可清空。按 ↩ 或打开某条结果时记录当前查询。
片段与个人资料
- 匹配的片段显示在结果最上方的“片段”分组中,见片段。在“设置 › 片段”中关闭“在搜索结果中显示片段”即可隐藏。
- 侧栏选中“个人资料”下的分类时,搜索框改为筛选笔记、更正、书签或阅读历史,按标题、正文和标签做字面匹配,不分词。
网页搜索
本地没找到时,结果栏底部的“网页搜索”在默认浏览器中打开外部搜索。默认启用 Google 和 Stack Overflow,DuckDuckGo 默认关闭。发送的只有查询文字,筛选条件会先去掉。
在“设置 › 网页搜索”中可以添加、停用、拖动排序或恢复默认。地址必须以 https:// 开头,用 {query} 标出查询文字的位置。阅读区“更多”菜单中的“在网页中搜索选中文字”使用同一份列表。
2.3 - 阅读与双语对照

窗口布局
窗口分三栏:
- 侧栏:资料分类。“手册”“全部资料”、六组 Wiki 集合,以及“个人资料”下的笔记、更正、书签、阅读历史、标签和待重新定位。
- 中间一栏:有查询时是“结果”,没有查询时是当前范围的“目录”,按手册顺序列出章节。
- 阅读区:标题下方写明正在读的版本、语言和资料类型,例如“PostgreSQL 18 · 中文 · 手册”。正文的版本和语言以这里为准,不以范围栏为准。
工具栏按钮可以隐藏侧栏或结果栏;“设置 › 通用 › 显示”中的“显示侧栏”“显示搜索结果栏”决定默认状态。
本页目录
阅读区右上角的“目录”按钮(⇧ 加 ⌘ 加 F,菜单名“筛选目录”)列出当前页面的全部章节,当前章节有标记。在“筛选章节”框中输入标题或对象名可以过滤。
| 按键 | 作用 |
|---|---|
| ↑ ↓ | 选择章节 |
| ↩ | 跳转 |
| ⌘ 加 ↩ | 在新标签页打开 |
| Esc | 关闭,回到正文 |
双语对照时,在哪一栏打开目录,就列出哪种语言的章节。目录不改变搜索框的查询和范围。
标签页与窗口
Crib 使用 macOS 原生窗口标签页。每个标签页有自己的查询、搜索范围、正文和前进后退记录。
| 操作 | 方法 |
|---|---|
| 新建标签页 | ⌘ 加 T |
| 在新标签页打开结果、目录或历史条目 | ⌘ 加 ↩,或右键“在新标签页打开” |
| 复制当前标签页 | 文件 › 复制标签页 |
| 重新打开关闭的标签页 | ⇧ 加 ⌘ 加 T |
| 上一个 / 下一个标签页 | ⇧ 加 ⌘ 加 [ / ⇧ 加 ⌘ 加 ] |
| 关闭标签页或窗口 | ⌘ 加 W |
“设置 › 通用 › 启动”中的“启动时恢复窗口和标签页”默认开启,恢复时包括查询、搜索范围和阅读位置。
后退与前进
⌘ 加 [ 和 ⌘ 加 ] 在当前标签页读过的页面之间后退、前进。按住工具栏的后退或前进按钮会列出可以跳到的页面;同样的列表也在“阅读 › 后退到 / 前进到”中。
这份记录只属于当前标签页。跨标签页、跨启动保留的阅读记录是“阅读历史”(⇧ 加 ⌘ 加 Y),见笔记、书签与本地更正。
页内查找
| 操作 | 按键 |
|---|---|
| 页内查找 | ⌘ 加 F |
| 查找下一个 / 上一个 | ⌘ 加 G / ⇧ 加 ⌘ 加 G |
| 用选中的文字查找 | ⌘ 加 E |
| 跳到选中的文字 | ⌘ 加 J |
查找栏右侧的“完成”关闭查找栏。双语对照时,查找作用于获得焦点的那一栏,查找栏左侧标出“中文正文”或“English 正文”。
切换语言
按 ⇧ 加 ⌘ 加 L,或点阅读区右上角的“English”/“中文”,打开另一种语言中对应的章节,并停在同一小节。
对应关系在构建资料包时确定,手册依据源码中的章节标识,不按标题或网址猜测。
- 当前小节在另一种语言中有对应时,直接打开。
- 没有对应时,Crib 逐级向上找,打开最近的有对应的上级章节。按钮的悬停提示写明“已定位到上级章节”。
- 对应关系不是逐段核对过的,提示“对应章节未逐段核对”。
- 一直找不到时,按钮不可用,提示“这一节还没有已核对的对应章节。”
双语对照
按 ⇧ 加 ⌘ 加 B,或点工具栏的“双语对照”按钮,阅读区分成两栏:左栏是当前正文,右栏是另一种语言的对应页面。
- 滚动任一栏,另一栏跳到对应的章节。对齐只到章节一级,不逐句对齐。
- 找不到对应章节时,右栏显示“没有对应章节”和原因。
- 阅读设置同时作用于两栏。
- 页内查找、“目录”和“在浏览器中打开”作用于获得焦点的那一栏;“更多”菜单中另有“在浏览器中打开 English 页面”或“中文页面”。
切换版本
阅读区右上角的“版本”按钮显示正在读的版本,并列出资料库中的其他版本。点某个版本的“阅读”,Crib 尽量停在同一位置:
- 先找同一章节标识;
- 找不到时打开上级章节或同名页面,提示“PG N 中没有这一节,已打开上级章节”之类的说明;
- 连页面都没有时打开该版本的目录首页。
未安装的版本显示“在资料库中显示”。打开“专家模式”后,列表也包括历史版本和开发版。安装与启用版本见资料库。
外观与缩放
浅色、深色或跟随系统在“设置 › 通用 › 显示 › 外观”中选择。正文排版在“设置 › 阅读”中调整,立即作用于所有窗口:
| 设置 | 范围 |
|---|---|
| 页面缩放 | 60%–300%,步长 10% |
| 字体 | 系统字体、衬线字体 |
| 字号 | 12–24 pt |
| 行距 | 1.30–2.00 |
| 行宽 | 适应窗口、紧凑 640 pt、标准 800 pt、宽 1040 pt |
⌘ 加 + / ⌘ 加 - 每次缩放 10%,⌘ 加 0 回到 100%,“阅读 › 放大到 200%”一步放大。“设置 › 阅读”底部的“恢复默认”重置以上各项。
复制与链接
- 代码:代码块右上角有“复制”按钮,复制后短暂显示“已复制”。
- 链接:“更多 › 复制链接”复制正在阅读的章节的
crib://链接;在结果上右键也有“复制链接”。链接带有章节和资料包标识,格式与打开规则见链接。 - 选中的文字:“更多”菜单中可以“搜索选中文字”,或用网页搜索查它。
在浏览器中打开
按 ⌥ 加 ⌘ 加 B,或选“更多 › 在浏览器中打开”,Crib 生成这一页的本地副本,用默认浏览器打开。副本是官方原文,不含你的笔记和更正,也不运行脚本。生成期间状态栏显示“正在准备页面…”,可以取消。
来源与许可
“更多 › 来源与许可”显示这一页的出处:
- 版本:项目、内容版本和渠道;
- 资料包及其修订号;
- 页面路径、锚点和章节标识;
- 页面和正文的校验值;
- “来源”和“许可”两个标签页,列出该资料包的来源清单和许可证。
2.4 - 笔记、书签与本地更正
笔记、书签、标签、阅读历史和更正统称个人资料,保存在 ~/Library/Application Support/Crib/ 中,与资料包分开。卸载或更新文档版本不会删除它们;个人资料出问题时,阅读和搜索照常可用。
侧栏“个人资料”下有笔记、更正、书签、阅读历史、标签和待重新定位六个分类。选中某个分类时,搜索框改为在其中按标题、正文和标签做字面筛选。
笔记
点工具栏的“笔记”按钮打开笔记面板,按 ⇧ 加 ⌘ 加 N 新建笔记。
- 新笔记的标题默认是当前章节的标题。新建时正文中有选中的文字,笔记就关联到这段原文,面板中显示“关联的原文”和“打开原文”。
- 以后要改关联位置,在正文中选中新的文字,点“关联当前选区”。
- 正文是 Markdown,“编辑”与“预览”之间切换。预览只打开
http、https和mailto链接。 - 标签写在“标签,用逗号分隔”一栏。
- “修订”菜单列出保存过的版本,“恢复修订 N”会把它存为一个新修订,不覆盖历史。
- 在侧栏“笔记”中右键可以“编辑笔记”“打开原文”或“删除笔记…”。删除会连同所有修订一起删除,无法撤销。
自动保存与冲突
停止输入片刻后笔记自动保存,面板底部依次显示“等待自动保存…”和“已自动保存 · 修订 N”。
- 保存失败时显示“保存失败:”和原因,草稿留在编辑器中,不会显示为已保存。
- 同一条笔记在两个窗口里都改过时,后保存的一份不会覆盖先保存的:它的编辑器显示保存失败,草稿保留。
- 导出、导入和备份前,Crib 先保存所有草稿;上面那种冲突的草稿另存为标题带“(冲突副本)”的新笔记并提示,之后的修改保存到这份副本。
- 退出时仍有无法保存的草稿,会弹出“无法保存个人资料”,可以“另存为副本并退出”“放弃修改并退出”或“继续编辑”。
草稿只在保存成功后才写入磁盘。应用崩溃或磁盘不可写时,最后一次保存之后的输入可能丢失。
书签
按 ⌘ 加 D 给当前章节加书签,同时弹出编辑框,可以改名称、加标签。书签在弹出时就已添加,“取消”只放弃这次的修改。加过书签的章节,工具栏的书签图标变为实心。
⇧ 加 ⌘ 加 D 打开书签列表,可以按标题、版本或标签筛选,⌘ 加 ↩ 在新标签页打开,“在侧栏中查看全部”转到侧栏的“书签”分类。
标签
笔记和书签都可以加标签。侧栏“标签”分类顶部的标签选择器按标签列出笔记;“书签”分类顶部也有同样的选择器。
阅读历史
打开过的章节记入阅读历史。⇧ 加 ⌘ 加 Y 打开历史列表,可以按标题或版本筛选;侧栏“阅读历史”显示全部。
- 保留最近 5,000 条、180 天以内的记录,连续重复打开同一处只记一次。超出的部分在启动时清理。
- 右键单条记录可以“从历史中删除”。在侧栏“阅读历史”分类中,“个人资料操作”菜单里的“清除阅读历史…”删除全部历史,不影响笔记、书签和更正,无法撤销。
阅读历史与标签页的后退、前进记录是两回事,后者见后退与前进。
更正
更正用来记下你对正文(通常是译文)的修改。它只保存在你的个人资料里,不改动官方原文。
- 在正文中选中要改的文字。选区要在同一章节内,只含正文。
- 选“阅读 › 更正选中文字…”,或阅读区“更多”菜单中的同名命令。
- 在“更正为”中写新文字,点“保存”。
保存后,阅读区顶部显示“N 处更正”。更正过的文字带底色和下划线,悬停可以看到原文。取消勾选“显示更正”即看到官方原文;“查看全部”转到侧栏“更正”分类。
- 更正只在保存它的版本和语言中显示,不会套用到另一种语言或其他版本。
- 更正绑定保存时的资料包和原文。资料包更新后,即使这段文字没变,更正也不再套用,列入“待重新定位”,状态为“原文已更新”。
- 在侧栏“更正”中右键可以“编辑更正”“恢复原文”或“删除更正…”。恢复原文会存为一个新修订;删除会移除全部修订,无法撤销。
- “在浏览器中打开”生成的页面只含官方原文,不含更正。
内容更新后重新定位
笔记和更正记住的是一段原文和它前后的文字。安装、更新或回滚资料包,以及导入个人资料之后,Crib 会重新核对每条记录的位置。也可以在“待重新定位”分类中点“重新定位”,或在“个人资料操作”菜单中选“重新定位全部”。
Crib 只在原文和保存时的前后文完全一致、并且只出现一次时自动找回位置。它不做近似匹配,也不会跳到另一种语言或另一个版本。找不到的记录列入“待重新定位”:
| 状态 | 含义 |
|---|---|
| 原文已更新 | 更正所在的资料包或原文变了,更正不再显示 |
| 原文出现多处 | 同样的文字和前后文出现了不止一次 |
| 找不到原文 | 页面还在,那段文字没有了 |
| 找不到原页面 | 页面不在资料库中,例如对应版本已卸载 |
点“打开记录”打开对应的笔记或更正:
- 笔记:在正文中选中新位置,点“关联当前选区”。旧的关联和每次核对的结果都会保留。
- 更正:对新原文重新选中文字,另建一条更正。
导出、导入与备份
这些命令在“个人资料操作”菜单中(侧栏个人资料分类标题右侧的“…”)。
| 命令 | 结果 |
|---|---|
| 导出个人资料… | 一个文件夹,默认名 Crib-personal,含全部笔记、更正、书签、阅读历史和修订 |
| 导出更正… | 同样格式的文件夹,默认名 Crib-corrections,只含更正 |
| 导入个人资料… | 选择一个导出的文件夹并合并进来 |
| 备份个人资料… | 一个 SQLite 文件,默认名 Crib-user-backup.sqlite |
导出的文件夹结构如下:
- 导入时,完全相同的条目跳过;与本机条目冲突的另存为副本,完成后提示“已导入 N 条,M 条冲突另存为副本”。
manifest.json记录了每个 Markdown 文件的校验值。只改动某个.md文件会使整个导出无法导入。导出格式用于在 Crib 之间搬运,不是通用的 Markdown 导入入口。- 导出和备份不能保存到 Crib 自己的数据文件夹里。
个人资料无法打开时
磁盘已满、文件损坏等原因导致个人资料无法打开时,Crib 只停用个人资料功能,阅读和搜索不受影响。侧栏个人资料分类中显示“无法打开个人资料”,有两个处理办法:
- 从备份恢复…:选择之前用“备份个人资料…”保存的文件。Crib 先检查备份,再替换;原文件改名保留。
- 新建个人资料…:确认后以空白的个人资料重新打开,原文件改名保留在原目录,不会删除。
启动时的提示默认按钮是“稍后处理”。如果提示的是“个人资料需要更新版本的 Crib”,说明文件完好,只是由更新版本的 Crib 写入;此时只提供“从备份恢复…”,更新 Crib 后即可正常使用。
2.5 - 片段
片段是常用的 SQL、命令或说明文字,保存在片段库中。用的时候填好参数,复制到剪贴板,再粘贴到需要的地方。Crib 不会在其他应用里自动展开片段。
片段库
片段库在“设置 › 片段”中,“文件 › 打开片段库”直接打开这一页。
- 顶部的“启用片段”和“在搜索结果中显示片段”都勾选时,片段才出现在主搜索结果中。
- 列表上方可以按名称、触发词或正文搜索,也可以按标签筛选。
- “新建片段…”新建;“更多操作”菜单中有“从剪贴板新建…”“导入片段库…”“导出片段库…”。
- 选中一个片段后可以“复制”“复制原文”“编辑…”“创建副本”或“删除”。
“文件”菜单中的“新建片段…”和“从剪贴板新建片段…”也会打开这一页并直接进入编辑。
新建与编辑
| 字段 | 规则 |
|---|---|
| 名称 | 必填,1–80 个字符,不能与其他片段重名(不分大小写) |
| 触发词 | 可选,1–32 个小写字母、数字、- 或 _,以字母开头,不能重复;搜索时也会匹配 |
| 语言 | 默认 SQL,最多 32 个字符;决定是否按 SQL 着色 |
| 标签 | 用逗号分隔,最多 20 个,每个不超过 40 个字符 |
| 正文 | 最多 1,000,000 个字符 |
新片段的正文默认是 SELECT * FROM __TABLE__;,可以直接改。
编辑器按键
| 按键 | 作用 |
|---|---|
| Tab | 在光标处插入 4 个空格;选中多行时整体增加缩进 |
| ⇧ 加 Tab | 每行去掉一个行首 Tab 或最多 4 个空格 |
| ↩ | 换行 |
| ⌘ 加 ↩ | 保存 |
| ⌃ 加 Tab / ⌃ 加 ⇧ 加 Tab | 离开正文,移到下一个 / 上一个控件 |
正文上方也有“增加缩进”“减少缩进”按钮。编辑器不会把引号、破折号自动替换成排版符号;每个编辑器有自己的撤销记录。用中文输入法选词时,保存会等组合输入结束后再进行。
参数与展开
正文中用分隔符括起的词是参数,复制时填写:
- 默认分隔符是两个下划线,
__TABLE__就是名为 TABLE 的参数。同名参数出现多次,只填一次。 - 参数名不能含空格或换行;只有开头没有结尾的分隔符按普通文字处理。
@date和@time换成复制时的日期和时间,默认格式分别是MM.dd.yyyy和HH:mm:ss。
分隔符和两种格式在“设置 › 片段”中修改。分隔符是 1–8 个字符,不能含字母或数字。日期格式点“查看写法”可以看到 yyyy、MM、dd、HH、mm、ss 等写法和示例,修改后要点“应用”才生效。
复制一个有参数的片段时,会打开“填写参数”:
- 逐个填写参数。确实要留空的,勾选该参数旁的“留空”。
- 下方“预览”实时显示结果。
- 全部参数填好或标为留空后,按 ⌘ 加 ↩ 或点“复制”。
没有参数的片段直接复制。“复制原文”不替换参数和日期时间,原样复制正文。
SQL 着色
语言写成 SQL、PostgreSQL、Postgres、pgsql、PLpgSQL 或 PL/pgSQL(不分大小写)时,编辑器、片段详情和参数预览按 SQL 着色:关键词、字符串、带引号的标识符、注释、数字和 $1 这类位置参数,包括 E'…' 字符串、$$ 引用和嵌套注释。
着色只是阅读辅助,不检查 SQL 是否正确。其他语言按普通文本显示。
在搜索结果中
搜索框有内容时,名称、触发词、正文、语言或标签中含查询文字的片段,显示在结果最上方的“片段”分组中。右键可以“复制正文”“展开并复制…”或“打开片段库”。
“设置 › 片段”中关闭“在搜索结果中显示片段”即可隐藏;单个搜索方案也可以关闭“在结果中显示片段”。
从其他应用创建
在其他应用中选中文字,选“服务 › 在 Crib 中创建片段”,Crib 打开新建片段,正文是选中的文字,名称是“所选文字片段”,确认后保存。菜单中没有这一项时的设置办法见系统服务。
片段库文件与共用
默认片段库是用户目录中的 snippets.json:
片段、参数分隔符和日期时间格式都保存在这个文件里。在“设置 › 片段”的“片段库”一行可以换文件:
- 另存为…:把当前片段库另存为新文件,并改用新文件。原文件保留,已有的同名文件不会被覆盖。
- 打开…:改用一个已有的片段库文件,不合并、不修改原来的库。要把片段合并进当前库,用“导入片段库…”,冲突的片段会自动改名。
当前用的是哪个文件只记在本机,不写进片段库本身。所以可以把片段库放进 iCloud Drive 等同步文件夹,在另一台 Mac 上“打开…”同一个文件。Crib 每两秒检查一次文件,别处的修改会自动出现。文件的传送由同步服务负责。
共用时要注意:
- 在别处被改过的片段,保存会被拒绝,草稿保留,可以“另存为新片段”。副本使用新的标识,触发词清空。
- 删除片段会同时从所有共用这个文件的 Mac 上删除。
- 文件丢失、只写了一半或来自更新版本的 Crib 时,片段库变为只读:已经载入的内容继续显示,从未载入时显示“片段库未载入”。Crib 不会自动新建一个空库代替它。文件恢复或打开另一个有效的库后即可继续编辑。
- 片段库文件上限 8 MiB,必须是普通文件,不能是符号链接。
2.6 - 快捷键
下表是开发构建的默认值,均可在“设置 › 快捷键”中修改,见修改快捷键。菜单和工具栏的悬停提示始终显示当前生效的组合。
搜索与查找
| 命令 | 默认 | 菜单 |
|---|---|---|
| 搜索资料库 | ⌘ 加 L | 编辑 |
| 搜索资料库(备用) | ⌘ 加 K | 编辑 |
| 页内查找 | ⌘ 加 F | 编辑 |
| 查找下一个 | ⌘ 加 G | 编辑 |
| 查找上一个 | ⇧ 加 ⌘ 加 G | 编辑 |
| 使用所选内容查找 | ⌘ 加 E | 编辑 |
| 跳到所选内容 | ⌘ 加 J | 编辑 |
| 筛选目录 | ⇧ 加 ⌘ 加 F | 编辑 |
阅读
| 命令 | 默认 | 菜单 |
|---|---|---|
| 切换语言 | ⇧ 加 ⌘ 加 L | 编辑 |
| 双语对照 | ⇧ 加 ⌘ 加 B | 阅读 |
| 后退 | ⌘ 加 [ | 阅读 |
| 前进 | ⌘ 加 ] | 阅读 |
| 返回主页 | ⇧ 加 ⌘ 加 H | 阅读 |
| 放大 | ⌘ 加 + | 阅读 |
| 缩小 | ⌘ 加 - | 阅读 |
| 实际大小 | ⌘ 加 0 | 阅读 |
| 在浏览器中打开 | ⌥ 加 ⌘ 加 B | 阅读 |
书签、历史与笔记
| 命令 | 默认 | 菜单 |
|---|---|---|
| 添加书签 | ⌘ 加 D | 书签 |
| 显示书签 | ⇧ 加 ⌘ 加 D | 书签 |
| 显示历史 | ⇧ 加 ⌘ 加 Y | 书签 |
| 新建笔记 | ⇧ 加 ⌘ 加 N | 文件 |
标签页
| 命令 | 默认 | 菜单 |
|---|---|---|
| 新建标签页 | ⌘ 加 T | 文件 |
| 重新打开关闭的标签页 | ⇧ 加 ⌘ 加 T | 文件 |
| 显示上一个标签页 | ⇧ 加 ⌘ 加 [ | 窗口 |
| 显示下一个标签页 | ⇧ 加 ⌘ 加 ] | 窗口 |
不能修改的按键
| 位置 | 按键 | 作用 |
|---|---|---|
| 全局 | ⌘ 加 , | 设置 |
| 全局 | ⌘ 加 W | 关闭标签页或窗口 |
| 搜索框与结果 | ↑ ↓ | 选择结果 |
| 搜索框与结果 | ↩ | 打开 |
| 搜索框与结果 | ⌘ 加 ↩ | 在新标签页打开 |
| 搜索框与结果 | Esc | 回到正文 |
| 结果列表 | → / ← | 展开 / 收起多版本结果 |
| 目录、书签、历史弹出框 | ↑ ↓、↩、⌘ 加 ↩、Esc | 选择、打开、在新标签页打开、关闭 |
| 填写片段参数 | ⌘ 加 ↩ | 复制 |
片段编辑器的按键见片段。用中文输入法选词时,↩、Esc 和方向键先交给输入法,选词结束后才执行上表中的操作。
修改快捷键
打开“设置 › 快捷键”,“命令”分组列出上面四张表中的全部命令。
- 点某个命令右侧的“修改”,输入框显示“按下快捷键…”。
- 按下新的组合:至少一个修饰键(⌘ ⌥ ⌃ ⇧)加一个按键。按 Esc 取消。
- 新组合立即生效。改过的命令旁出现“恢复默认”;没改过的命令旁是“停用”,停用后显示“已停用”。
两个命令不能用同一个组合,也不能与已开启的全局快捷键相同;重复时 Crib 会提示是哪两项冲突,设置保持不变。录制期间全局快捷键暂停。
全局快捷键
全局快捷键在其他应用处于前台时也能唤出 Crib。三个都默认关闭,在“设置 › 通用 › 全局快捷键”中逐个打开:
| 动作 | 默认组合 |
|---|---|
| 显示窗口 | ⌃ 加 ⌥ 加 ⌘ 加 Space |
| 打开搜索 | ⌥ 加 ⌘ 加 Space |
| 搜索选中文字 | ⌃ 加 ⌥ 加 ⌘ 加 D |
- 点“修改”录制新组合,规则与上面相同。组合被系统或其他应用占用时,该行显示原因和“重试”。
- “搜索选中文字”需要辅助功能权限,用“授予权限…”打开系统设置,授权后点“重新检查”。读不到选中文字时,可以在原应用中用“服务 › 在 Crib 中查找”。
- 组合按当前键盘布局解析,切换输入法后会重新注册。
设置页的开关与录制已经验证过;在其他应用处于前台时用实体键盘唤出 Crib,还没有实测。
全局快捷键、系统服务和其他集成方式的完整说明见集成。
3 - 资料库
3.1 - 管理资料库
资料库是 Crib 里已安装的全部文档。打开方式:菜单“资料库 → 管理资料库…”、工具栏的资料库按钮,或主页的“资料库”。菜单“资料库 → 获取更多版本…”和主页的“获取版本”直接打开“全部版本”。
已安装与全部版本
顶部的分段控件切换两种列表:
| 列表 | 内容 |
|---|---|
| 已安装 | 这台 Mac 上的资料包,包括已停用的 |
| 全部版本 | 已安装的,加上版本目录里还没安装的;未安装的行显示下载大小和安装后大小 |
列表按版本状态分组(默认、常规、历史版本……),含义见版本与别名。每行还标出来源(内置或自行安装)、占用空间,以及是否在当前搜索范围内。
筛选框接受版本号或别名,例如 18、pg17、[email protected]。输入能解析成一个确切版本的别名时,列表只显示那一项。
专家模式
专家模式默认关闭,这时列表只显示“默认”和“常规”两组。打开后,列表还显示历史版本、开发版、无法下载和状态未知的版本,不加版本前缀的搜索也会包含它们。
资料库和正文上方的“版本”弹窗里各有一个“专家模式”开关,两处改的是同一个设置。
启用与停用
已安装的每一行左侧有一个勾选框。勾选或取消后,行内显示“应用后启用”或“应用后停用”,底栏显示“有未应用的更改”。点“应用更改”生效,点“放弃更改”撤回。
- 同一个资料包只能启用一个修订。勾选某个修订时,同一资料包的其他修订会自动取消勾选。
- 已停用的行右侧有“启用”按钮,点它立即生效,不需要再点“应用更改”。
- 停用的版本仍在磁盘上,但不参与搜索,也不能从列表打开阅读。
应用更改时发生什么
- Crib 用勾选的资料包在后台建立一个新的搜索世代(generation)。进度面板依次显示“下载 → 校验 → 建立索引 → 启用”;不需要下载时从“校验”开始。
- 建立期间,旧的搜索世代照常提供搜索和阅读。点“继续阅读”可以关掉资料库窗口,任务在后台继续。
- 新世代建好后原子切换。之后的搜索使用新组合;已经打开的页面继续显示打开时的版本。
切换前点“取消”,旧组合保持不变。失败时资料库显示原因和“重试”。
卸载
只有自行安装的资料包有“卸载”按钮。App 内置的资料包不能卸载,只能停用。
卸载分两步:
- Crib 先切换到一个不含该资料包的组合,这一行标为“待移除”,显示“不再用于阅读和恢复后即可清理”。
- 文件在执行“维护 → 清理不再需要的资料”时删除,前提是没有打开的页面、当前组合或保留的旧组合还在使用它。
卸载不删除笔记、书签和更正。指向已卸载内容的个人资料会保留,内容重新安装后可以再次定位。
导入资料包
点资料库右上角的“导入资料包…”,选择一个 .crib 文件(旧扩展名 .pgdocpack 也可以),或一个已解开的资料包文件夹。导入不需要联网。
Crib 先检查磁盘空间,再解包并逐项校验:签名必须由 App 自带的可信根签发,每个文件的哈希必须与清单一致,数据库结构必须符合格式。通过后,新资料包立即启用,并替换同一资料包当前启用的修订。
以下情况会被拒绝:
- 与已安装的资料包同名同修订、内容却不同。
- 修订号低于当前启用的修订。要回到旧修订,用下面的“恢复资料组合…”。
- 签名密钥不在可信根里,或是开发密钥签名而当前构建不接受开发内容。
现在没有公开发布的资料包。开发构建只能导入用开发密钥签名的测试资料包。格式见资料包格式。
恢复资料组合
每次切换组合时,Crib 保留切换前启用的那一组,以便回退;更早的组合会被释放。
- 点底栏的“恢复资料组合…”,从菜单中选一个保留的组合。
- 预览窗口列出“现在启用 N 项,恢复后启用 M 项”,以及要启用、停用或替换的资料包、修订和语言。
- 点“恢复”。Crib 先完整校验目标组合,再切换。
- 资料库里有未应用的更改时不能恢复,先应用或放弃它们。
- 预览打开后如果组合被别的操作改变,点“刷新预览”后再确认。
- 已打开的页面、笔记和书签不受影响。
维护菜单
| 命令 | 作用 |
|---|---|
| 清理不再需要的资料 | 删除待移除的资料包,以及不再被当前组合、保留组合或打开的页面使用的搜索世代 |
| 备份个人资料… | 把笔记、书签、标签、阅读历史和更正备份成一个 SQLite 文件,见备份个人资料 |
启动时的修复提示
Crib 启动时如果发现当前组合不能用(例如 App 换新后原来内置的资料包不在了,或搜索世代损坏),会自动换到一个可用的组合,并在资料库顶部留一条提示,直到你点“知道了”。提示带“重新启用”按钮时,可以把之前启用的资料包重新启用。
“非正式发布”标记
资料库标题旁的“非正式发布”标记表示:这些资料用开发密钥签名,只用于本地测试。构建声明接受开发内容,或 App 自带的可信根是开发可信根时,就会显示这个标记。
Crib 还没有正式签名密钥,现在所有开发构建都会显示它。
3.2 - 版本与别名
收录的版本线
Crib 收录 31 条 PostgreSQL 手册版本线,每条一个中英双语资料包;Wiki 是另一个资料包。默认版本是 PostgreSQL 18(18.6),也是 pg 别名的目标;只内置一个版本的构建内置的就是它。
| 版本线 | 内容版本 | 别名 |
|---|---|---|
| 6.3 – 6.5 | 6.3.2、6.4.2、6.5.3 | pg63 … pg65,或 pg6.3 … pg6.5 |
| 7.0 – 7.4 | 7.0.3、7.1.3、7.2.8、7.3.21、7.4.30 | pg70 … pg74,或 pg7.0 … pg7.4 |
| 8.0 – 8.4 | 8.0.26、8.1.23、8.2.23、8.3.23、8.4.22 | pg80 … pg84,或 pg8.0 … pg8.4 |
| 9.0 – 9.6 | 9.0.23、9.1.24、9.2.24、9.3.25、9.4.26、9.5.25、9.6.24 | pg90 … pg96,或 pg9.0 … pg9.6 |
| 10 – 14 | 10.23、11.22、12.22、13.23、14.24 | pg10 … pg14 |
| 15 – 18 | 15.19、16.15、17.11、18.6 | pg15 … pg18 |
| 19 | 19rc1(预览版) | pg19 |
| 20 | 20devel(开发快照) | pg20、pgdevel |
| Wiki | r5 | pgwiki |
内容版本来自构建时固定的来源快照,不代表上游当前的最新小版本。
版本状态
版本目录给每个版本声明一种状态。状态由发布者写进签名目录,Crib 不按版本号、发布渠道或是否已安装去推断。
| 目录中的值 | 界面显示 | 普通列表和不带版本前缀的搜索 | 下载 |
|---|---|---|---|
default | 默认 | 包含 | 可以 |
active | 常规 | 包含 | 可以 |
historical | 历史版本 | 只在专家模式下包含 | 可以 |
devel | 开发版 | 只在专家模式下包含 | 可以 |
unavailable | 无法下载 | 只在专家模式下包含 | 不能;已安装的照常阅读和搜索 |
| (未声明) | 状态未知 | 只在专家模式下包含 | 可以 |
- 目录里只有一个默认版本,就是
pg指向的那个。开发版不能成为默认版本。 - “常规”只表示出现在普通列表里,不表示上游仍在维护。
- “状态未知”出现在不带状态字段的旧格式目录里。旧目录指定的默认版本仍出现在普通列表。
- 状态只决定版本出现在哪里、能不能新下载,不影响已安装内容的可读性。显式指定版本(版本前缀、版本菜单、书签、已打开的页面)照常可用,只要该版本已安装并启用。
- 还没有任何版本目录时,不带版本前缀的搜索只覆盖 App 内置的资料包。
本页不列出各版本的状态。状态由发布者在签名目录中决定,正式目录还没有发布。
列表里还会出现另一组状态:已启用、已停用、未安装、目录已过期、不在目录中、失败、待移除。它们描述这台 Mac 上的安装情况和最近一次操作,与上表的发布状态互相独立。
别名怎样解析
别名只存在于版本目录中,不对应额外的文件。解析规则:
- 输入转成 ASCII 小写,
PG18与pg18相同。含非 ASCII 字符的输入不是别名。 - 沿目录中的别名链一直走到一个确切版本,格式是
项目@内容版本,例如[email protected]。链不能有环,目标必须存在。 - 在这个版本里选出包含所需语言的资料包。现在每个版本是一个中英双语包。
| 输入 | 解析路径 |
|---|---|
pg | pg → pg18 → [email protected] |
pg18 | pg18 → [email protected] |
pg96 | pg96 → [email protected] |
pg9.6 | pg9.6 → pg96 → [email protected] |
pg19 | pg19 → pg@19rc1 |
pgdevel | pgdevel → pg20 → pg@20devel |
pgwiki | pgwiki → pgwiki@r5 |
[email protected] | 本身就是确切版本 |
pg是唯一的总别名,指向发布者选定的默认版本线。pg19、pg20不会自动变成pg。pg18这类版本线别名指向该线当前发布的小版本。版本号含点的旧版本线同时接受带点写法,如pg9.6、pg7.0。- 解析只读本机已缓存并校验过的目录,不需要联网。
别名不会换成别的小版本
别名总是解析到一个确切版本。目标不可用时,Crib 说明原因,不会改用同一版本线上已安装的其他小版本:
| 目标状态 | 搜索时的提示(以 18.7 为例) |
|---|---|
| 未安装 | PG18(18.7)未安装,请在资料库中下载后再搜索。 |
| 已停用 | PG18(18.7)未启用,请在资料库中启用后再搜索。 |
| 无法下载且未安装 | PG18(18.7)已无法下载,请改用已安装的版本。 |
假设发布者把 pg18 从 18.6 移到 18.7,而你只装了 18.6:资料库在“全部版本”里显示 18.7 未安装;已安装的 18.6 仍可用 [email protected] 或版本菜单打开。
发布新的小版本时,发布者新增一个文件和一条版本记录,再移动对应的版本线别名;18.6 的文件不会被覆盖或改名。只移动别名不会重建搜索索引,也不会改变已打开的页面。
在哪里用别名
- 搜索框的版本前缀:
PG18: vacuum、pg96: vacuum、[email protected]: max_connections lang:en。pg18:vacuum与pg18: vacuum相同。 - 资料库的筛选框。
- 本地 API 和 MCP 的搜索文本。
3.3 - 下载、更新与恢复
Crib 默认从 https://repo.pigsty.io/doc/catalog.json 获取版本目录。这个地址是规划中的正式目录,还没有上传,所以现在“刷新目录”拿不到正式目录。下文描述开发构建的行为,在本机测试目录上验证过,没有在公网 HTTPS 和 CDN 上测试。
什么时候联网
打开 Crib 或资料库都不联网。只有两个操作会联网:点“刷新目录”,以及点某个版本的“下载”。
已安装的内容不会过期,阅读和搜索始终离线完成。导入本地资料包也不需要联网。
版本目录
版本目录(catalog.json)列出可下载的版本、它们的状态、别名,以及每个归档的大小和哈希。开发构建可以内置一份签名的目录快照,所以第一次打开、没有联网时也能看到全部版本。
点“刷新目录”时,Crib 下载新目录并检查:
- 签名必须由 App 自带的可信根签发。服务器不能自己添加可信密钥。
- 修订号不能低于本机已有的目录;修订号相同而内容不同,只接受签发时间更晚的一份。否则视为回退或冲突,保留原来的目录。
- 已过期的目录不接受。
刷新失败不改动本机文件。资料库顶部显示“版本目录更新于 …”;刷新中可以点“取消”。
目录过期以后
目录带有效期,由发布者签名时写入。过期后,资料库显示“版本目录已过期,刷新后才能下载。”
- 版本列表照常显示,别名照常解析。
- 不能下载新版本,直到刷新到一份未过期的目录。
- 已安装的内容不受影响。
本机缓存的目录如果无法再通过校验(例如可信根换了密钥),Crib 跳过它,改用 App 内置的快照,并把旧文件移到用户目录的Distribution-rejected/,保留最近 5 份。目录中个别条目有问题时,只忽略那些条目,并在资料库提示;已安装的同一版本照常可读。
下载一个版本
在“全部版本”里点某一行的“下载”。进度面板显示“下载 → 校验 → 建立索引 → 启用”,下载阶段显示已下载和总字节数。
- 确认授权。 该版本必须在一份未过期的目录里,且状态不是“无法下载”。归档路径必须是目录给出的相对路径,只走同源 HTTPS,不跟随跨站重定向。
- 流式下载。 写入临时目录,总字节数以目录签名的大小为准。
- 校验。 核对长度、归档 SHA-256、ZIP 结构、清单哈希(必须等于目录记录的值)、清单签名、解包后的总大小。
- 解包。 解到暂存区,再逐个文件核对哈希并检查数据库结构。传输结束后再确认一次目录仍然授权这个版本。
- 建立索引。 在后台建立新的搜索世代,旧世代继续服务。
- 启用。 原子切换。新版本替换同一资料包当前启用的修订;旧修订仍已安装,状态变为“已停用”。
下载、校验或索引失败时,按钮变为“重试下载”。
断点续传
- 网络中断时(不包括你点“取消”),已下载的部分保存在用户目录的
Distribution-partials/中,保留 7 天。 - 再次下载同一个归档时,Crib 先重新计算已保存部分的哈希,再用
Range加If-Range(强 ETag 或 Last-Modified)请求剩余部分。 - 服务器返回 206 时必须带完全匹配的
Content-Range;返回 200 就从头重下。最终仍以目录签名的归档哈希为准。 - 点“取消”,或者校验、大小、路径检查失败时,已下载的部分直接丢弃。
- 单次下载最长 48 小时;连续 60 秒收不到数据视为中断,已下载部分保留以便续传。目录请求最长 600 秒。
失败、取消与磁盘空间
- 切换之前的任何失败、取消或磁盘空间不足,都保留原来的组合,不做切换。
- 资料包写入资料库之前先检查磁盘空间。
- 切换一旦完成,新组合就是当前组合,即使之后又报告了错误。重试前先看资料库里实际启用的是什么。
- 失败只记在这一个版本上。之前启用的旧修订照常可读。
更新到新的小版本
发布者发布新的小版本时,新增一个归档并移动版本线别名,例如把 pg18 从 18.6 移到 18.7;18.6 的文件不变。
刷新目录后,“全部版本”里出现 18.7,状态为未安装。刷新本身不会自动下载,也不会重建索引。下载 18.7 后,它替换 18.6 成为启用的修订;18.6 仍已安装,可以重新启用,也可以卸载。
下载或导入同一资料包中比当前启用修订更低的修订会被拒绝。要回到以前的修订,用“恢复资料组合…”。
Crib 没有自动更新。App 本身也没有公开的更新通道。
回到以前的组合
每次切换组合,Crib 保留切换前启用的那一组。在资料库底栏点“恢复资料组合…”可以预览并恢复,步骤见管理资料库。
启动时如果当前搜索世代损坏,或 App 换新后原来内置的资料包不在了,Crib 自动换到保留的组合或 App 内置的初始组合,并在资料库顶部提示。提示里的“重新启用”可以把之前启用的资料包重新启用。
个人资料不受影响
下载、导入、启用、停用、卸载和恢复组合都不写个人资料:笔记、书签、标签、阅读历史、更正、片段和设置。卸载一个版本后,挂在上面的笔记和书签保留;内容重新安装后可以再次定位。
3.4 - 资料包格式
现在没有公开的资料包,也没有正式签名密钥。发布目录规划在 https://repo.pigsty.io/doc/,还没有上传。本页描述开发构建和构建工具 crib-pack 实现的格式。
文件
资料包是一个 ZIP 文件(支持 ZIP64,条目为 stored 或 DEFLATE),条目按名称排序,时间戳固定。2026-11-06 起新发布的资料包以 .crib 结尾;之前签发的目录和归档使用 .pgdocpack,这些已签名的路径继续有效。版本目录里的归档路径只接受这两种结尾,.CRIB、.crib.zip 等都会被拒绝。
App 还没有注册 .crib 文件类型,双击不能导入;请用资料库的“导入资料包…”。
一个手册资料包的内容:
pg/18.6-r4.crib
- manifest.json清单:身份、版本、语言、文件列表与每个文件的哈希
- manifest.sig对 manifest.json 原始字节的 Ed25519 签名
- sources.json来源:上游修订、版次、修复记录和处理说明
- content.sqlite文档、章节、精确名称键、双语对应、链接和搜索词元
- documents/
- en/英文 HTML 与资源
- zh-Hans/简体中文 HTML 与资源
- licenses/许可文本,按语言分目录
Wiki 资料包的页面在 documents/<语言>/wiki/<集合>/ 下,另外带有原始来源记录和许可说明 licenses/center-sources.json。
清单
format_version- 资料包格式,现在是
1 schema_versioncontent.sqlite的结构版本,现在是1analyzer_id- 分词器标识
pgdash-han2-v1;旧名称属于格式身份,不随产品改名 pack_id- 资料包身份,如
postgresql/manual/18、postgresql/wiki project_id、branch、content_version、channel- 项目、版本线、内容版本、发布渠道
pack_revision- 修订号,同一
pack_id跨内容版本单调递增 languages["en", "zh-Hans"]min_reader_version- 能读取它的最低 Crib 版本
source_manifest_sha256sources.json的哈希files- 除清单和签名外每个文件的
path、bytes、sha256 licenses- 许可文件路径
trust- 签名类别;开发构建中是
development
清单之外出现未声明的文件,或任何文件与清单哈希不符,资料包都会被拒绝。Crib 用 manifest.json 原始字节的 SHA-256 标识一个已安装的资料包,链接里的 manifest 参数就是这个值。
签名与可信根
manifest.sig 是 {"key_id": "…", "signature": "<base64>"},签名对象是 manifest.json 的原始字节。目录 catalog.json 用同样的 Ed25519 签名。
公钥只来自 App 自带的 trust.json。资料包或服务器里的密钥都不会被信任。
key_policies可选。roles取pack、seed、catalog的子集;not_after必须是YYYY-MM-DDTHH:MM:SSZ。没有列出的密钥可签所有用途、永不过期。- 未知字段、空的
roles、不规范的日期、指向不存在密钥的策略都会让整个可信根被拒绝。 - 密钥过期只阻止获取(刷新目录、下载、导入)和发布端签名,已安装的内容照常可用。
- 从可信根删除密钥等于吊销。要退役一把密钥,先设
not_after。
开发签名的内容只在两种情况下被接受:构建在 Info.plist 中声明 CribDevelopmentContent=true,或测试环境设置CRIB_ALLOW_DEVELOPMENT_CONTENT=1。这时资料库显示“非正式发布”。
导入与下载时的检查
解包之前,Crib 先完整检查整个 ZIP,拒绝符号链接、特殊文件、加密条目、分卷、路径穿越、大小写或 Unicode 规范化后重名的路径、多余的尾部字节。
| 上限 | 值 |
|---|---|
| 条目数 | 65,000 |
| 单个文件 | 8 GiB |
| 解包后总大小 | 16 GiB |
| 压缩文件 | 20 GiB |
| 压缩比 | 1000:1 |
然后核对签名、每个文件的哈希、数据库结构和引用。同一 pack_id 同一修订号而内容不同的资料包会被拒绝。从目录下载时还要核对归档长度和 SHA-256、清单哈希和解包后大小,它们必须与目录记录一致。
发布目录
https://repo.pigsty.io/doc/(规划中)
- catalog.json签名目录:别名、版本与状态、每个归档的路径、大小和哈希
- pg/
- 18.6-r4.crib
- 17.11-r4.crib
- 9.6.24-r4.crib
- 20devel-r4.crib
- pgwiki/
- r5.crib
完整目录有 31 个手册归档和 1 个 Wiki 归档。文件名是内容版本加修订号。别名只写在 catalog.json 里,不复制文件,也不建符号链接。
catalog.json 是一个签名信封,解码后的载荷包含目录身份、修订号、签发和过期时间、默认别名、别名表和版本表:
这是节选,正式载荷还有 generated_at、expires_at、大小、结构版本等字段。版本状态 lifecycle 的含义见版本与别名。
客户端只使用目录给出的归档路径:一级目录加一个文件名,不接受绝对地址、查询串、片段、百分号转义、反斜杠和 ..,下载走与目录同源的 HTTPS。
不可变规则
- 同一个 URL 的字节永远不变。内容有任何更正,都发新的内容版本或更高的修订号。
- 修订号按
pack_id单调递增,换内容版本也不重置:18.6-r4 之后发布 18.7,修订号至少是 r5。 - 先上传并核对所有新归档,最后再替换
catalog.json。 - 目录修订号只增不减。
crib-pack distribute的--previous-catalog要求新修订号更大;--validity设定目录有效期,默认 720 小时,范围 24 小时到 400 天。
HTTP 缓存
这些是发布端的要求,还没有在真实服务器上配置和测试。
| 对象 | 响应头 |
|---|---|
catalog.json | Cache-Control: no-cache |
| 带版本和修订号的归档 | Cache-Control: public, max-age=31536000, immutable,Content-Length,强 ETag,支持 Range,不做内容转换 |
客户端续传时发送 Range 和 If-Range,规则见断点续传。
4 - 集成
4.1 - 本地 API
本地 API 默认关闭。启用后只监听 127.0.0.1,只读,只能访问当前已启用的资料包。笔记、书签、阅读历史、片段和更正都不对外开放。Crib 自己的搜索和阅读不经过这个接口。
启用
- 打开“设置 → 集成”,在“本地 API”中打开“启用本地 API”。
- “端口”填
0自动选择可用端口(默认),或指定1024–65535中的一个,再点“应用”。 - 启动后,设置页显示“地址”,并提供“复制 Schema 地址”“复制密钥”“更换密钥…”。
关闭开关或退出 Crib 后停止监听。资料库不可用时 API 不会启动,设置页显示原因和“重试”。
发现文件
客户端从用户目录读取地址和密钥,不要缓存自动分配的端口:
~/Library/Application Support/Crib/api/
- status.jsonbase_url、port、pid、instance_id、access_key_file、api_version
- access-key访问密钥
- server.lock正在服务的实例持有这把锁
api/目录权限是0700,两个文件是0600。status.json在服务就绪后才出现,正常关闭时删除。Crib 异常退出可能留下旧的status.json;下次启动时,只要没有实例持有server.lock,就会删掉它。- 密钥文件是符号链接、有多个硬链接、属于其他用户或权限公开时,Crib 拒绝使用。
- “更换密钥…”让旧密钥立即失效。随 App 附带的 MCP 程序自动使用新密钥;手动复制过密钥的工具需要重新复制。
先验证服务端,再发送密钥
Crib 崩溃后,原来的端口可能被其他本地进程占用。发送密钥之前,客户端必须确认对端持有同一把密钥:
- 检查
status.json中的pid进程仍然存在。 - 不带任何凭据请求
GET /auth/challenge?nonce=<nonce>,nonce是 32 个随机字节的 64 位小写十六进制。 - 服务端返回
{"algorithm":"hmac-sha256","proof":"<64 hex>","version":1}。 - 客户端计算
HMAC-SHA256(key = 访问密钥的 ASCII 字节, data = "crib-local-api/server-proof/v1\n127.0.0.1:<端口>\n<nonce>"),用常量时间比较与proof是否相等。相等才发送密钥。
端口写进了证明,占用端口的进程无法把挑战转发给别处的真实 Crib 来冒充。返回 404 的服务端应当拒绝,不能默认信任。
请求规则
/health、/schema、/auth/challenge不需要密钥;其余接口需要Authorization: Bearer <访问密钥>。密钥不要放进查询串。- 只支持
GET。响应是 JSON,带Cache-Control: no-store,发送后关闭连接。 Host必须是127.0.0.1:<端口>或localhost:<端口>。带Origin头的请求返回 403,所以网页里的脚本不能调用它。- 查询串按表单编码解析:
+是空格,字面加号写成%2B。未知参数、重复参数、非法转义都返回 400。
接口
| 路径 | 作用 |
|---|---|
GET /health | 服务状态与 API 版本 |
GET /schema | OpenAPI 描述 |
GET /auth/challenge | 服务端身份证明,见上文 |
GET /docsets/list | 当前搜索世代中已启用的资料包、版本、语言、摘要和修订 |
GET /search | 在已启用的资料中搜索 |
GET /sections/{key} | 读取一个章节的纯文本,必须带 generation |
搜索参数
text,- 搜索文本,支持 Crib 的过滤语法和
PG96:这类版本前缀;文本里的过滤优先于下面的参数 project, ,- 项目
branch, ,- 版本线;
*表示所有已启用版本 locale, ,zh-Hans或en;*表示所有语言domain,- 文档领域
collection,- Wiki 集合
limit, ,- 每页条数,1–50
offset, ,- 偏移,0–10000
generation,- 期望的搜索世代
兼容 Dash 的参数名 query、lang、max_results 分别等同于 text、locale、limit。同时给出一对时,值相同可以接受,值不同返回 400。请求的版本或语言没有安装或启用时返回错误,不会悄悄换成默认版本。
每条结果带 section_key、document_key、path、fragment、docset、pack_digest 等字段,以及两个地址:section_url 是带 generation 的章节接口路径,load_url 是在 Crib 中打开该章节的 crib:// 链接。
响应里的 has_more 和 next_offset 用于翻页;timed_out、cancelled、candidate_truncated 为真时结果不完整,不能当作完整结果使用。
读取章节
GET /sections/{key}?generation=<id>&offset=0&limit=16000
offset和limit按 Unicode 标量计数,不是字节,也不是 UTF-16 单元。默认 16,000,最大 50,000。- 跟随
next_offset继续读,直到它为null。 - 启用、停用或更新资料包后搜索世代会变。用旧 generation 请求返回 409
generation_changed,重新搜索后再读。
时间限制
- 每个请求有 3 秒执行预算。搜索本身超时返回 200 和
timed_out=true,带上已完成的部分结果;准备阶段就耗尽预算返回 504。 - 传输层另有 7 秒处理超时、8 秒连接截止;2 秒内没发完请求头的连接被关闭。最多同时 32 个连接。
错误码
| 状态码 | 含义 |
|---|---|
| 400 | 参数或查询无效 |
| 401 | 缺少密钥或密钥错误 |
| 403 | 来源受限,例如带 Origin 头 |
| 404 | 路径或章节不存在 |
| 409 | 搜索世代已变,或请求的范围没有安装、启用 |
| 503 | 资料库不可用,或请求被取消 |
| 504 | 执行或传输超时 |
响应中的 error 和 message 说明具体原因。
Python 示例
示例从发现文件读取地址和密钥,先验证服务端,再搜索并读取第一条结果。密钥不出现在终端或进程参数里。
与 Dash API 的差异
Crib 与 Dash 8.1.1 的本地 API 都有健康检查、Schema、资料包列表和搜索入口,并兼容 query、max_results 参数名。Crib 不支持 Dash 的 docset_identifiers、search_snippets 和 /docsets/enable_fts,默认范围、结果格式和分页上限也不同。依赖完整 Dash API 的客户端不能直接换成 Crib。
4.2 - MCP
Crib 随 App 附带一个 stdio MCP 程序 Crib.app/Contents/MacOS/CribMCP,不需要安装 Python、uv 或 Node。它通过本地 API 只读地搜索和读取已启用的文档。
协议已用官方 Python SDK 和一个本地 stdio 客户端验证:工具列表、搜索、读取、分页、别名和错误路径都通过。但还没有在任何真实编辑器或 AI 客户端中完成端到端验收。VS Code 已识别配置并显示 Start,工具发现、搜索和读取尚未完成验证。
前提
- Crib 正在运行。
- “设置 → 集成”中已启用本地 API。
MCP 程序不会自动启动 Crib,也不会替你启用 API。条件不满足时,工具调用返回 local_api_unavailable 和一句说明。
添加配置
- 打开“设置 → 集成”,在“MCP”中把“客户端”选为“通用”或“VS Code”。
- 点“复制配置”,粘贴到客户端的 MCP 设置里;VS Code 粘贴到工作区的
.vscode/mcp.json。已有配置时只合并crib条目,保留其他服务器。 - 客户端用其他配置格式时,点“复制命令”,从中取可执行文件路径和参数。
复制的内容已经带好实际路径,不含访问密钥。注意:
- JSON 里要写绝对路径,
~不会被展开。 - 移动 Crib.app 或换用别的用户目录后,需要重新复制。
- Crib 不会修改任何客户端的配置文件。
- 设置页显示“此版本不含 MCP 程序”时,说明这个构建没有附带
CribMCP。
安装在 /Applications、使用默认用户目录时,“通用”格式如下(<用户主目录> 换成实际路径):
“VS Code”格式用 servers,并带 "type": "stdio":
不传 --user-data 时,程序使用当前用户的 ~/Library/Application Support/Crib。
工具
| 工具 | 作用 |
|---|---|
list_installed_docsets | 列出已启用的资料包、版本、语言和当前搜索世代;可传入期望的 generation |
search_documentation | 在已启用的手册和 Wiki 中搜索 |
load_documentation_page | 用搜索结果中的 section_key 和 generation 读取一个章节的纯文本 |
search_documentation 的参数:
text, , required- 搜索文本,最多 256 个字符;支持 Crib 的过滤语法和
PG96: SELECT这类版本前缀,文本中的过滤优先 project,- 默认
postgresql branch,- 版本线,如
18、9.6;默认 18,*表示所有已启用版本 locale,zh-Hans或en;默认简体中文,*表示所有语言domain,- 文档领域
collection,- Wiki 集合
limit,- 每页条数,1–50,默认 20
offset,- 偏移,0–10000
generation,- 期望的搜索世代
load_documentation_page 的参数:
section_key, , required- 搜索结果里的
section_key generation, , required- 同一次搜索返回的
generation offset,- 起始位置,按 Unicode 标量计数,默认 0
limit,- 最多返回的 Unicode 标量数,默认 16,000,最大 50,000
每个工具同时返回 JSON structuredContent 和等价的文本内容。
分页与搜索世代
- 搜索结果用
has_more和next_offset翻页。timed_out、cancelled、candidate_truncated为真时结果不完整。 - 读取章节时跟随
next_offset,直到它为null。 - 搜索和列表都返回
generation。启用、停用或更新资料包后搜索世代会变,旧坐标的读取返回generation_changed错误;重新搜索,用新的section_key和generation再读。
安全与限制
- 每次调用都重新读取
api/status.json和api/access-key,所以 API 换了端口也能找到。 - 发送密钥前,程序检查记录的进程仍在运行,并完成
/auth/challenge验证;验证失败就不发送密钥,工具返回错误。 - 拒绝符号链接、权限不安全、所有者不对或有多个硬链接的发现文件。只连接与状态文件一致的
127.0.0.1地址和非特权端口;不走代理,不跟随重定向,不保存 cookie。单次请求 8 秒截止,响应最大 4 MiB。 - 工具只读文档:不包含个人资料,不能下载资料包、控制窗口或读取任意 URL。
- 每行一条 JSON-RPC 消息,单行最多 256 KiB,最多同时处理 8 个文档请求。标准输入关闭后取消全部请求并退出。
- 支持 MCP
2026-07-28的 stdio 传输,以及2025-11-25、2025-06-18、2025-03-26、2024-11-05的initialize握手;后两个版本没有用真实 SDK 客户端验证过。不提供 resources、prompts 和 sampling。
工具名称参照 Dash 的官方 MCP 适配器,参数和结果遵循 Crib 自己的约定:读取用 section_key 加 generation,不接受 Dash 的 load_url。依赖 Dash 全部工具的客户端不能直接换成 Crib。
4.3 - 系统服务与全局快捷键
两个服务
在其他应用中选中文字,从应用菜单或右键菜单的“服务”中选择:
| 服务 | 结果 | 选区上限 |
|---|---|---|
| 在 Crib 中查找 | 打开一个新的 Crib 窗口,用选中的文字(去掉首尾空白)搜索 | 256 个字符 |
| 在 Crib 中创建片段 | 打开“设置 → 片段”,新建一个未保存的片段草稿,正文与选区完全一致,缩进和换行都保留 | 1,000,000 个字符 |
Crib 只读取系统传给服务的文字,不读取也不改写剪贴板。
启用
- 把 Crib.app 放进“应用程序”文件夹。
- 在“系统设置 › 键盘 › 键盘快捷键 › 服务”中找到“在 Crib 中查找”和“在 Crib 中创建片段”,勾选启用。也可以在那里给它们指定快捷键。
“设置 → 集成 → 系统服务”里有同样的提示。
Crib 没在运行时
选择服务时如果 Crib 没有运行,macOS 会启动它。窗口准备好之前到达的请求先排队,最多 16 个,准备好后依次处理。
2026-10-29 在一个独立测试构建上实测通过:TextEdit 中两个服务的发现、已运行时查找、创建片段、连续两次片段请求、关闭最后一个窗口后查找,以及两个服务的冷启动。当前构建还没有重新实测。
被拒绝的请求
以下请求会被拒绝,不会排队重试:
- 没有选中文字,或选区只有空白。
- 选区含有制表符、换行之外的控制字符。
- 查找文字超过 256 个字符,或片段超过 1,000,000 个字符。
- 待处理的请求已有 16 个。
- 片段库是只读的。
被拒绝时,Crib 把原因返回给 macOS,并在 Crib 内记录这条错误。缩小选区或处理完积压后重新选择服务。
实测时在 TextEdit 中选中 257 个字符再调用“在 Crib 中查找”,没有看到任何错误提示,也无法证明这次请求到达了 Crib。单元测试证明超长输入会被拒绝,但用户能否看到提示还没有验证。
全局快捷键
全局快捷键在“设置 → 通用 → 全局快捷键”中,三项都默认关闭。打开右侧开关启用,点“修改”录制新的组合。
| 功能 | 默认组合 |
|---|---|
| 显示窗口 | ⌃⌥⌘Space |
| 打开搜索 | ⌥⌘Space |
| 搜索选中文字 | ⌃⌥⌘D |
- “搜索选中文字”需要辅助功能权限。设置页会显示“授予权限…”和“重新检查”。读不到选中文字时,可以改用服务菜单里的“在 Crib 中查找”。
- 组合被系统或其他应用占用时,设置页显示“…已被系统或其他应用占用,请换一个组合。”和“重试”。
- 快捷键按当前键盘布局解析,切换输入法后重新注册。不支持数字小键盘上的键;按下 ⌘ 后会变成其他字符的键也会被拒绝。
设置页的开关和录制在早期测试构建上实测通过。在其他应用中实际按下快捷键呼出 Crib,还没有实测。
4.4 - 深链接
Crib 注册了 crib 协议。点击一个 crib:// 链接,Crib 会打开它指向的章节。界面里把这类链接叫“链接”。
复制链接
- 在搜索结果上点右键,选“复制链接”。折叠起来的多版本结果,复制的是代表项那一条。
- 阅读时,从正文上方的“更多”菜单(版本、书签按钮右侧)选“复制链接”,复制正在阅读的章节。
- 本地 API 搜索结果中的
load_url也是这种链接,见本地 API。
复制得到的链接形如:
manifest 记录结果来自哪个资料包。搜索结果和阅读器各自用自己所属的搜索世代生成链接,不会把一个版本的结果链到另一个版本。
两种格式
crib://open
project, required- 项目,如
postgresql branch, required- 版本线,如
18、9.6;Wiki 为空 locale, requiredzh-Hans或ensection- 章节键,必须精确匹配
manifest- 资料包摘要,64 位小写十六进制;给出时必须与已启用资料包的摘要一致
concept、semantic- 没有
section时使用,必须恰好匹配一个章节
带 section 时,该章节必须存在于当前已启用的内容中,且项目、版本线、语言都与参数一致。未知参数、重复参数、超过 4096 字节的值都会让链接被拒绝。
crib://section
路径只有一段,就是精确的章节键;只允许一个可选的 manifest 参数,不能带片段、用户名、端口或其他参数。“复制链接”目前生成的是 crib://open 格式;这种短格式适合手写,或由脚本从本地 API 返回的 section_key 拼出来。
章节键和资料包摘要都来自签名资料包,详见资料包格式。
打不开时
Crib 只打开链接精确指向的章节,不会退而打开相似的页面或其他版本。打不开时,当前页面保持不变,Crib 显示:
| 提示 | 原因 |
|---|---|
| 无法打开链接:页面地址无效 | 链接格式不对,例如多了参数、路径不止一段、manifest 不是 64 位十六进制 |
| 无法打开链接:资料库中没有这个页面或文件 | 链接格式正确,但当前启用的内容里找不到:版本未安装或已停用,或 manifest 指向的修订不是当前启用的那个 |
版本已停用时,在资料库中启用后再点链接。
Crib 没有运行时点击链接、由链接启动 Crib 的情况还没有实测。Crib 打开后如果没有跳到目标章节,再点一次链接。
旧的 pgdash:// 链接
Crib 仍然注册 pgdash 协议,PGDash 时期复制的 pgdash://open?... 链接按上面相同的规则打开。PGDash 的 pgdash://search 没有实现,会被拒绝。Crib 自己只生成 crib:// 链接。
pgdoc:// 不是给用户的
阅读器内部用 pgdoc://<资料包摘要>/<路径> 加载资料包里的文件。这个协议不向系统注册,不能从其他应用打开,也不要把它当作链接保存。
5 - 参考
5.1 - 用户数据与迁移
用户目录
Crib 的数据在 ~/Library/Application Support/Crib/。下面列出与你有关的部分,有些文件在用到相应功能后才出现:
~/Library/Application Support/Crib/
- user.sqlite个人资料:笔记、书签、标签、阅读历史、更正
- preferences.json设置
- session.json窗口、标签页和阅读位置
- snippets.json片段库
- backups/个人资料库升级结构前自动做的备份
- Library/下载或导入的资料包、搜索世代和登记表
- packs/
- generations/
- registry.sqlite
- Distribution/版本目录缓存
- Distribution-partials/中断下载的已下载部分,保留 7 天
- Distribution-rejected/无法再通过校验的旧目录缓存,保留最近 5 份
- api/本地 API 的地址、密钥和锁,启用 API 后出现
- crib-migration.json从 PGDash 迁移的记录,迁移过才有
App 内置的资料包和初始搜索索引在 Crib.app/Contents/Resources/Library 里,只读,随 App 一起替换。
个人资料与内容
| 类别 | 文件 | 丢了会怎样 |
|---|---|---|
| 个人资料 | user.sqlite、snippets.json、preferences.json、session.json | 无法从别处恢复,需要自己备份 |
| 内容 | Library/、Distribution*/ | 可以重新下载或导入;内置内容随 App 恢复 |
| 运行状态 | api/ | 重新启用本地 API 时重建 |
下载、导入、启用、停用、卸载资料包和恢复资料组合都不写个人资料。卸载一个版本不会删除挂在上面的笔记。
备份个人资料
| 命令 | 位置 | 得到什么 |
|---|---|---|
| 备份个人资料… | “资料库 → 维护”,或个人资料列表的更多菜单 | 一个 SQLite 文件,默认名 Crib-user-backup.sqlite,含笔记、书签、标签、阅读历史和更正 |
| 导出个人资料… | 个人资料列表的更多菜单 | 一个可移植的文件夹,默认名 Crib-personal |
| 导出更正… | 个人资料列表的更多菜单 | 只含更正的文件夹,默认名 Crib-corrections |
| 导出片段库… | “设置 → 片段”的更多菜单 | 片段库文件 |
- 备份和导出前,Crib 先保存所有正在编辑的草稿。与其他编辑冲突的草稿另存为新笔记。
- 备份用 SQLite 的在线备份完成,包含尚未合并进主文件的已提交数据。Crib 运行时直接复制
user.sqlite可能漏掉这部分。 - 备份不能保存到 Crib 的用户目录里。
- 片段和设置不在个人资料备份里,片段要单独导出。
恢复个人资料
- 导入个人资料…:读入一个导出的文件夹,与现有个人资料合并;冲突的条目另存为副本,不覆盖。
- 从备份恢复…:只在个人资料打不开时出现(提示“无法打开个人资料”或“个人资料需要更新版本的 Crib”)。Crib 先打开备份的副本检查,通过后把原来的
user.sqlite改名为user-unreadable-<时间>.sqlite保留,再换上备份,然后重新打开。 - 新建个人资料…:个人资料打不开时,从空白开始;原文件同样改名保留。
个人资料打不开时,阅读和搜索照常可用,只有笔记、书签、更正和阅读历史停用。
从 PGDash 迁移
Crib 以前叫 PGDash,数据在 ~/Library/Application Support/PGDash/。Crib 启动时、打开任何数据之前,会检查是否需要迁移。
迁移过程
- 确认 PGDash 没有在运行。PGDash 仍在运行时迁移失败,提示退出 PGDash 后重试。
- 清点旧目录中每个文件的大小和 SHA-256。遇到符号链接、多个硬链接或特殊文件就停止。
- 把整个旧目录复制到用户资料目录旁边的暂存目录
.crib-migration-<编号>,再清点一次;复制期间旧目录有变化就停止。 - 用 SQLite 在线备份从副本重建
user.sqlite和Library/registry.sqlite,并把登记表里的路径改到新目录。 - 旧的
api/改名为legacy-api-<编号>存档。在 Crib 中需要重新启用本地 API。 - 写入迁移记录
crib-migration.json,同步到磁盘,然后一次性改名为Crib/。
旧目录从头到尾只读:不写入、不创建 WAL 文件,也不删除。迁移完成后它原样留在原处。
状态文件
迁移状态记在 ~/Library/Application Support/.Crib-migration-state.json,在 Crib 目录之外,因此失败的尝试不会被误认为已迁移。
| 状态 | 含义 |
|---|---|
pending | 正在迁移 |
failed | 上次迁移失败 |
done | 已完成 |
declined | 你选择了跳过,不再尝试 |
replaceRequested | 你要求用旧资料替换现有的 Crib 资料,下次启动时执行 |
迁移失败
迁移失败时不创建 Crib 目录,Crib 以只读方式运行:内置文档照常阅读和搜索,笔记、书签、更正、阅读历史、下载和设置都不能修改。每次启动都会重试。提示窗口有三个按钮:
- 重试迁移:立即再试一次,成功后 Crib 重新打开。
- 稍后处理:保持只读,下次启动再试。
- 跳过迁移…:确认后 Crib 从空白的个人资料开始,旧资料原样留在原目录,以后不再提示。
已有 Crib 资料时
如果 Crib 目录已经存在、没有迁移记录,而 PGDash 目录也还在,Crib 提示“发现 PGDash 旧资料”:
- 迁移旧资料:Crib 重新打开时,把现有 Crib 目录整体改名为
Crib-before-migration-<时间>保留,再迁移旧资料。迁移失败时改回原名。 - 稍后处理:下次启动再提示。
- 不再提示:继续使用现有的 Crib 资料。
迁移之后
环境变量
这些变量用于开发和测试,日常使用不需要设置。
CRIB_USER_DATA- 改用另一个用户目录。设置后不会自动从 PGDash 迁移
CRIB_MIGRATE_FROM- 指定迁移的来源目录
CRIB_LIBRARY- 用另一个资料库代替 App 内置的内容
CRIB_CATALOG_URL- 版本目录地址,默认
https://repo.pigsty.io/doc/catalog.json CRIB_ALLOW_DEVELOPMENT_CONTENT- 设为
1时接受开发签名的内容 CRIB_ALLOW_LOOPBACK_HTTP- 设为
1且可信根是开发可信根时,允许从127.0.0.1的 HTTP 地址获取目录
CRIB_LIBRARY、CRIB_CATALOG_URL和两个CRIB_ALLOW_*变量没有设置时,Crib 读取同名的旧变量PGDASH_*;两者都设置时以CRIB_*为准。PGDASH_USER_DATA不再指定 Crib 的用户目录,只被当作迁移来源。- 设置了任何
CRIB_*或PGDASH_*变量时,需要重新打开的操作(例如迁移完成后)只退出 Crib,不会自动重新打开。
5.2 - 来源与许可
Crib 自己的代码和它收录的内容是两回事:应用的许可证不会覆盖手册、译文、Wiki、字体和图片各自的权利。本页列出每类内容的来源和目前的许可状态。
应用代码尚未选定许可证,源码未公开。收录内容的再分发许可正在逐项核对,在核对完成前不会公开分发。本页是来源清单,不是新的授权。
内容来源
| 内容 | 来源 | 版权与许可 |
|---|---|---|
| 英文手册 | PostgreSQL 全球开发组发布的官方文档,按固定版本的源码归档构建 | 各版本手册自带法律声明(legal.sgml 或早期版本的引言),原样保留在资料包的 licenses/ 目录 |
| 中文手册 | pgdoc 收录的各版本简体中文译本 | 保留各版本原有的译者署名与版权声明;译文的授权与署名单独核对,不从英文原版的授权推定 |
| 历史资源(早期版本的 CSS、GIF) | 同一版本的另一语言版本或核实过的同版材料 | 逐个记录来源与哈希;6.3、6.4 的样式表是兼容样式,不冒充 1998 年的原始文件 |
| 手册插图(SVG) | 手册源码自带的本地 SVG | 转为静态图片显示,原始字节保留 |
| Wiki | pg.center 2026-10-24 的冻结快照 | 保留每条记录的原始来源、语言与证据;不推定 Center 原创文字或译文有统一授权 |
| 版本、安全与能力信息 | 版本发布归档、CVE 记录、能力矩阵 | 不同来源分别保留引用,不假定有共同授权 |
| Wiki 引用的外部网页与插图 | 原始链接 | 不随包下载,不推定任何许可 |
每个资料包里的 sources.json 记录了该包每个文件的来源和哈希,licenses/ 保存原始的法律声明。在应用里打开一页手册后,从阅读区右上角的“更多”菜单选择“来源与许可”,可以查看这一页所在资料包的来源清单和许可文件。
你自己的内容
笔记、书签、本地更正和片段属于你,存放在本机用户目录,不会打包进官方资料包,也不会被收集或上传。本地更正在阅读时明确标为“本地更正”,与官方原文区分。
应用依赖
macOS 应用只使用系统框架(SwiftUI、AppKit、WebKit、CryptoKit 等)和系统自带的 SQLite,没有引入第三方 Swift 包。构建端的 Go 工具依赖:
| 依赖 | 用途 | 许可 |
|---|---|---|
github.com/mattn/go-sqlite3 | SQLite 绑定 | MIT;内含的 SQLite 源码另有声明 |
github.com/yuin/goldmark | 渲染 Wiki 的 Markdown | MIT |
golang.org/x/net | 解析 HTML | BSD 风格 |
golang.org/x/text | Unicode 规范化 | BSD 风格 |
应用目前随包附带一份 Font Awesome Free 字体子集及其完整许可文本;2026-11-06 重设计后界面已改用系统的SF Symbols,这份字体会在后续打包改动中移除。
本站
本站文字采用 CC BY 4.0 许可,站点源码在 pgsty/crib.pgsty.com。站内截图来自 Crib 的开发构建,其中显示的手册内容版权归原作者与译者。
5.3 - 常见问题
现在能下载吗?
还不能。Crib 只有本地开发构建,Developer ID 签名、Apple 公证、内容再分发许可和生产资料包目录都还没完成。见发布状态和下载。
收费吗?开源吗?
都还没有定。应用代码尚未选定许可证,源码暂未公开。确定后会在下载页和开发日志写明。
需要联网吗?
日常使用不需要。手册和搜索索引随应用安装,首次启动断网就能阅读和搜索。以下操作会联网:
- 刷新版本目录、下载其他版本或 Wiki(Core 版);
- 点击搜索结果下方的网页搜索入口(在浏览器中打开);
- 打开手册或 Wiki 中的外部链接。
没有账号,没有云同步,也不收集使用数据。
支持哪些 Mac?
应用按 macOS 14 部署目标构建,目前只在 Apple Silicon、macOS 27 的开发机上实测。macOS 14 实机和 Intel Mac尚未测试,正式发布前不作支持承诺。
界面有英文吗?
没有。应用界面目前只有中文。文档内容是中英双语的,可以只读英文手册,搜索时用 lang:en 限定英文。
某一节只有英文、没有中文怎么办?
62 套手册都是完整的,但两种语言的章节不一定一一对应。切换语言时,如果当前小节没有已验证的对应,Crib 会回到最近的已对应父节并提示。Wiki 中某种语言没有正文时显示缺失,不用另一种语言填充。
能自己修改译文吗?
可以写本地更正:选中一段文字,写下修改后的内容。更正存在你的个人资料库里,阅读时与原文并列显示,不会改动资料包,也不会自动应用到其他版本或语言。更正可以导出,方便提交给译者。见笔记、书签与本地更正。
卸载一个版本,笔记会丢吗?
不会。笔记和更正存在独立的 user.sqlite 里。卸载后,挂在该版本上的笔记显示为目标不可用;重新安装后恢复定位。
和 Dash 有什么关系?
Crib 借鉴了 Dash 的片段库、系统服务和本地 API 等用法,但内容格式是自己的:.crib 资料包带双语章节对应、版本信息和签名,不兼容 Dash docset,也不使用 Kapeli 的文档源。
能用来查 Patroni、PgBouncer 等其他项目的文档吗?
目前不能。资料包格式本身不绑定 PostgreSQL,以后可以用同样的格式加入其他项目,但这些都还没有立项。
以前用过 PGDash,数据怎么办?
PGDash 是 Crib 开发期间的旧名。Crib 首次启动时把旧目录的个人资料复制到新目录,旧目录保持不动。见用户数据与迁移。
在哪里反馈问题?
Crib 的源码仓库暂未公开。对本站内容的意见可以在 pgsty/crib.pgsty.com 提 issue。