READMESource: main@050a72f1
dsh-font-settings
DSH(DeepSeek Harness)字体设置插件:在设置页自由定制全局字体、字号、字重,支持中英文字体分离、独立代码字号与字体、回滚字体兜底。使用系统已安装字体,无需联网加载。配置持久化到 <dshHome>/settings.yaml,跨实例同步。
✨ 功能
字体
| 设置项 | 说明 |
|---|---|
| 西文字体 | 拉丁字母、数字、符号优先使用(Inter、Roboto、Segoe UI 等预设 + 自定义) |
| 中文字体 | 汉字与中文标点独立设置(微软雅黑、思源黑体、霞鹜文楷等预设 + 自定义) |
| 代码字体 | 代码块/终端等宽字体(JetBrains Mono、Fira Code、Cascadia Code 等 + 自定义) |
| 回滚字体 | 主字体缺字时兜底显示,正文和代码都生效 |
字体栈自动组合:西文 → 中文 → 回滚 → sans-serif,浏览器按序匹配,缺字自动回退。
字号
| 设置项 | 范围 | 说明 |
|---|---|---|
| 全局内容字号 | 10~24px | 消息正文,标题、表格等自动派生 |
| 代码字号 | 9~20px | 代码块与行内代码独立控制(默认 12px,保持 DSH 原样) |
字号的底层使用 --dsh-content-font-size(内容)和直接重写 --dsw-font-markdown-code 简写 token(代码),DSH 自动派生行高等偏移。
字重
| 设置项 | 范围 | 说明 |
|---|---|---|
| 全局正文 | 300/400/500/600/700 | 消息正文、表格小字 |
| 标题 | 300~700 | h1~h4 各级标题(默认 700) |
| 界面元素 | 300~700 | 菜单、按钮、标签等 UI 文字 |
| 代码 | 300~700 | 代码块与行内代码、终端 |
通过重写 DSH 的 --dsw-font-* CSS 简写 token 实现(简写包含字重,改子变量无效)。
搜索与分组
- 字体下拉按风格分组(西文:无衬线体 / 衬线体;中文:黑体 / 宋体 / 楷体;代码:Nerd Font / 等宽)
- 顶部搜索框实时过滤所有字体列表
- 自定义字体自动记录最近使用(上限 5 个)
导入导出
- 导出配置:将当前所有字体设置下载为 JSON 文件
- 导入配置:从 JSON 文件恢复设置并立即应用
- 格式:
{ format: "dsh-font-settings", version: 1, settings: { ... } }
持久化
- settings.yaml(优先):写入
<dshHome>/settings.yaml的ui-font段,跨浏览器/跨实例同步 - localStorage(回退):本地浏览器持久化,settings.yaml 不可用时自动降级
📦 安装
在 chat profile 下安装:
dsh plugin --profile chat add github:BakaCirno233/dsh-font-settings
安装后需重启 DSH Desktop 生效。
⚙️ 使用
- 打开 DSH Desktop 的 设置页
- 找到 「字体设置」 面板
- 调整字体/字号/字重/代码选项,实时预览
- 点 「保存设置」 写入本地存储与 settings.yaml
- 面板底部显示当前持久化模式(已同步 / 仅本进程 / 仅浏览器本地)
🔧 本地开发
git clone https://github.com/BakaCirno233/dsh-font-settings.git
cd dsh-font-settings
将插件 link 进 profile:
// C:\Users\<你>\.dsh\profiles\chat\package.json
{
"dependencies": {
"dsh-font-settings": "link:D:/path/to/dsh-font-settings"
},
"dsh": {
"profile": {
"bundles": [ "...", "dsh-font-settings" ]
}
}
}
link:依赖在 pnpm 中通过 junction 实现,repo 文件改动即时生效到 profile。修改后重启 DSH 加载新 bundle。
🗂 项目结构
dsh-font-settings/
├── package.json # 插件清单(dsh.client.inject + dsh.bundle.patch 声明)
├── index.js # host 端入口:注册 ui-font 设置命名空间
├── client.js # 浏览器端:设置面板 + 字体应用引擎 + settings.yaml 同步
├── cordis.patch.yml # bundle 挂载声明
├── ARCHITECTURE.md # DSH 字体 token 体系调研与架构决策
└── 需求文档.md # 原始功能需求
📝 技术要点
- 使用
--dsw-font-familyCSS 变量控制全局字体;西文+中文分离后手动组合字体栈 - 使用
--dsh-content-font-size控制内容字号,DSH 自动衍生 h1~h4/base/table/small 各级字号与行高 - 代码字号通过重写
--dsw-font-markdown-code/--dsw-font-markdown-code-blockfont 简写 token 实现(改-font-size子变量无效,因为组件引用的是font: var(--token)简写) - 字重控制同样需要重写简写 token(如
--dsw-font-markdown-base嵌入 weight 400) - host 端
index.js使用 CommonJS(package.json未设置"type": "module"),避免 DSH 以 ESM 解析导致崩溃 - client 端须在
module.exports声明inject: ["slots"]以正确获取 cordis 服务 ctx.get("settingsScope")是可选查询(不要求 inject 声明),但在 bundle 插件上下文中服务可能晚于 apply 激活,实现中采用有限次重试(8s 内)确保绑定- 配置优先级:host settings.yaml > localStorage > 默认值;写时双写
📄 License
MIT
No comments yet. Be the first to write one.