前言¶
DeepSeek Harness 在设置里只开放了字号写入,字体族需要通过 CSS 令牌覆写。官方没有提供直接设置字体的接口。本插件在「设置」里新增一节「字体」,可从预设画廊选字体栈或手写,正文、代码字体立即生效并保存;同时接管正文/代码/终端字号。
这是什么¶
DSH 字体工坊(dsh-font-studio)是给 DeepSeek Harness 换字体的第三方插件,由 WuYiBaiZhi 维护。它解决两个问题:一是为官方未暴露的「字体族」提供设置入口,二是把字号调整能力扩展到终端。插件纯 JS、无依赖、无需构建,安装在宿主进程所在的 profile 中。
核心功能¶
正文 / 代码两组字体,各带预设画廊:苹方、微软雅黑、思源黑体、霞鹜文楷、宋体阅读、更纱黑体、JetBrains Mono、Cascadia Code、Fira Code、SF Mono、Consolas 等。每张卡片用该字体渲染 Aa 字体 123 进行实时预览。
自定义字体栈:直接手写 "LXGW WenKai", "Microsoft YaHei", serif,回车或点「应用」即可生效。
「我的字体」快捷清单:预设卡片墙最后一张是「+ 添加字体」卡片,样式与预设卡片相同但带虚线边框。点开后出现两个输入框(名字:中文名/英文名/字体文件里的 family 名都认;别名可选),点「添加并应用」后,该字体以卡片形式出现在卡片墙里,排在「+ 添加字体」卡片之前。卡片右上角有 × 可移除;点卡片一键切换。最多保存 24 条,存在 localStorage 键 dsh-font-studio:v1 中。
扫描本机字体:采用三级通道(按可靠性排序)。首选宿主扫盘:宿主进程注册 GET /dsh-font-studio/fonts,在 Node 里直接解析 C:\Windows\Fonts 与用户字体目录下的 .ttf/.otf/.ttc/.otc,读取 name 表获取家族名。.ttc / 超级 TTC 容器内每个字面都会被单独列出(例如 Sarasa-SuperTTC.ttc 里包含十几种更纱黑体),中英文名各取一个,中文名为主名、英文名为别名,拼进字体栈。扫描约 100ms,结果缓存 10 分钟,可通过「重新扫盘」按钮强制重读。兜底方案是浏览器原生的 navigator.queryLocalFonts()(若环境支持),以及渲染探测:用内置 90 个候选家族逐个用 canvas.measureText 量字宽,与「一定不存在的家族」比对,宽度变化即判定为本地存在。渲染探测只覆盖目录内的字体。
字号滑条:正文 10–22、代码 10–16、终端 10–20,与官方 FONT_SIZE_SPECS 一致。
即时保存:状态存在浏览器 localStorage,重启后自动应用。
全部恢复默认:清掉字体栈覆写,把官方字号还原成插件接管前的快照值,「我的字体」清单保留。
安装与启用¶
先取到本地:
git clone https://github.com/WuYiBaiZhi/dsh-font-studio
插件是纯 JS、无依赖、无需构建。把整个目录放进 profile 的 node_modules,再把包名加进 profile 的 package.json 两个地方:
// C:\Users\<你>\.dsh\profiles\desktop\package.json
{
"dependencies": { "dsh-font-studio": "link:<克隆到的目录>" },
"dsh": { "profile": { "bundles": [
// …已有的
"dsh-font-studio"
] } }
}
或者,如果环境里装了 dsh-super-injector,直接:
dev_install_package({ dir: "<克隆到的目录>", profile: "desktop" })
注意:profile 要用正在运行的那个(缺省值是 web,装错位置页面不会有反应;用 dsh web 启动的常见是 desktop)。
装上后刷新一次页面(客户端模块表在页面加载时拉取),打开 设置 → 字体。
原理¶
插件通过两种方式实现字体族覆写:在 <style> 里设置 body{--dsw-font-family: <栈> !important}、--dsw-font-family-brand、--ds-font-family-code、--dsw-font-mono。官方 theme 服务只暴露 getTheme/setTheme/setFontSize/register/overrideTokens,没有 setFontFamily;而 ThemePresenter 把 --dsh-font-family-* 写在 body 内联样式上,只有 !important 的作者样式能压过它。
字号走官方接口 ctx.theme.setFontSize(role, px),持久化由官方负责,UI 各处一致;若服务不在,则通过 body{--dsh-content-font-size: Npx !important} 兜底。
本机字体清单通过宿主 ctx.webServer.register({ kind:"prefix", path:"/dsh-font-studio" }) 注册同源路由,客户端同源 fetch;浏览器没有字体枚举接口,但宿主是 Node,能直接读字体文件、解开 TTC 容器。持久化使用 localStorage。
三条安全线:
- fail-open:拿不到主题服务、localStorage 不可用、插槽不存在、字体路由没注册时一律降级,绝不抛错,官方界面保持原样。字体路由注册失败有错峰重试(0/250/750/1500/3000/6000ms)。
- 不写别人的 DOM:只挂两个自持 <style>(#dsh-font-studio-typography / #dsh-font-studio-plugin-css),卸载时按 data-plugin 精确移除。
- 字体栈先清洗再拼 CSS:剥掉 ;{}<>、!important、换行与超长内容,杜绝把输入拼成样式注入。
接口¶
宿主侧提供 GET /dsh-font-studio/fonts(支持 GET/HEAD,?refresh=1 绕过 10 分钟缓存):
{
"ok": true,
"families": [{ "name": "更纱黑体 SC", "alias": "Sarasa Gothic SC", "file": "…\\Sarasa-SuperTTC.ttc" }],
"count": 42,
"files": 57,
"dirs": ["C:\\WINDOWS\\Fonts", "C:\\Users\\<你>\\AppData\\Local\\Microsoft\\Windows\\Fonts"],
"scannedAt": 1700000000000,
"cached": false
}
已知边界¶
终端字号只走官方服务(没有 CSS 变量兜底),没有主题服务时不显示终端字号这一行。
官方设置页自带的「字体」组依然在。在那边改字体,本插件的 !important 覆写会生效;想交还官方,在本插件里选「系统默认」即可。
若同时装了别的改字体的插件,两者都写 body 令牌,后挂的赢——同时只留一个。
宿主扫盘只读字体目录:用「临时安装/未落盘」方式加载的字体(例如某些软件的私有字体缓存)扫不到,手写家族名仍然有效。
家族名取 name 表的排版家族名(nameID 16,退回 nameID 1),所以 微软雅黑 Light 这类字重会归到 微软雅黑 下——CSS 本来就该按家族选字体、按字重选字形。
适用场景¶
适合需要在 DeepSeek Harness 中统一正文/代码/终端字体与字号、又希望利用本机已安装字体的开发者。插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证。
结尾¶
DSH 字体工坊把「换字体」这件事补齐了。安装后刷新页面,打开 设置 → 字体,即可从预设画廊选字体或手写栈,同时调整正文/代码/终端字号。如需查看源码或提交问题,可访问:
- GitHub:https://github.com/WuYiBaiZhi/dsh-font-studio