Issue 114 - ShaoClean/Alune GitHub Wiki

Issue #114:代码主题与字体设置

背景与目标

原文件浏览已有 Prism 语法高亮,但颜色复用界面变量,代码字体和字号写死。用户反馈的纯文本现象仍需结合其具体文件、版本和网络状态定位;不能将现有高亮等同于独立主题系统。本实现新增可配置的代码阅读体验,同时保留现有只读文件访问和降级边界。

方案

设置入口为「外观 → 代码阅读」,与现有设置样式一致。内置 Catppuccin Latte、Frappé、Macchiato、Mocha,浅色默认 Latte、深色默认 Mocha。提供代码字体、10–32px 字号、TypeScript/Python/JSON 示例预览及恢复默认。字体不可用时自动回退至系统等宽字体,行号和正文共享字体与行高。

沿用 initializeAppearance 解析 Alune 显式浅色/深色或跟随系统的实际模式;两种模式各保存一个主题 ID。选择列表禁用并解释不匹配主题,store 操作、配置读取和最终渲染也检查类型。安装只增加主题,不自动启用、不修改 Alune 外观。重置代码设置恢复 Latte/Mocha 与默认字体,保留已安装主题。

文件浏览和预览复用 CodeView。Prism 继续按语言生成 React token,主题通过 CSS 变量应用背景、前景、语法颜色/字形、行号和选区,不重新创建 token DOM。系统外观切换保留选区和滚动;进入设置后返回文件,通过按仓库/路径隔离、有界的内存缓存恢复滚动。偏好由原工作区存储通道保存,Web 为 localStorage,桌面为原子写入的 workspace.json;不修改工作区业务状态。

自定义主题兼容范围

首期支持最多 1 MB 的独立 VS Code Color Theme JSON / JSONC(含注释及尾随逗号),每设备最多 32 个。必须明确声明 type: "light" 或 "dark",并有可映射的 tokenColors 语法前景色。名称取 name 或文件名,来源展示文件名。仅保存归一化后的颜色、字形与元数据,不加载远程资源。

  • 编辑器颜色:editor.background、editor.foreground、editorGutter.background、editorLineNumber.foreground、editor.selectionBackground。支持十六进制 3/4/6/8 位颜色。
  • 简单 scope:字符串、逗号分隔和字符串数组按最长已知前缀映射到 Prism 的注释、关键字、字符串、数字、常量、函数、类型、标签、属性、正则、变量、标点、运算符、增删类别。类别内同优先级后规则覆盖前规则;颜色和字形分别比较优先级。语言后缀映射为通用类别,因此不是完整 TextMate 语义。
  • 字形:粗体、斜体、下划线、删除线及空样式重置。缺失颜色沿用对应默认主题;未支持的 scope/语义规则给出兼容提示。
  • 不支持 .vsix、主题市场、include 外部文件、上下文 scope 与 semanticTokenColors。Diff 不在本次字体/主题作用范围内。

主题安装失败有具体错误,保留原设置。恢复时重新验证主题数据,丢弃损坏项;缺失、错配、卸载的所选主题回退到对应内置默认值并提示。未知语言、大文件继续显示纯文本;高亮加载失败新增说明,仍可选择复制。

验收

  • 主题、字体、字号与三种语言预览可用,并在本设备持久化。
  • 四款 Catppuccin 无需安装,浅深色分类正确。
  • 自定义主题可导入、选择、恢复、卸载,无效格式和类型有反馈。
  • 深浅色选择、恢复和实际应用严格匹配,分别记住偏好。
  • 跟随系统动态切换有效;显式模式不被系统变化覆盖。
  • 损坏、缺失、卸载及错配配置有匹配默认值和提示。
  • macOS 本地与真实 SSH 阅读一致;选区、滚动、设置返回、未知语言和大文件降级通过。
  • Windows/Linux 原生桌面验收(当前环境未运行)。

详细命令、边界、截图与平台限制见 验证记录。

回退

删除代码外观偏好或点击恢复默认即可恢复对应内置主题。旧版本忽略新增 codeAppearance 字段;其写回设置可能移除该字段。Wiki 历史与代码分别维护。