From 28072c7f90bc9edfcee50d30d860a6eadb1fc343 Mon Sep 17 00:00:00 2001 From: landaiqing Date: Tue, 18 Nov 2025 18:46:27 +0800 Subject: [PATCH] :pencil: Update document --- frontend/docs/.vitepress/config.ts | 25 ++- .../src/public/img/placeholder-backup.png | Bin 0 -> 14333 bytes .../src/public/img/placeholder-block-flow.png | Bin 0 -> 12324 bytes .../src/public/img/placeholder-extensions.png | Bin 0 -> 12920 bytes .../docs/src/public/img/placeholder-http.png | Bin 0 -> 12652 bytes .../src/public/img/placeholder-main-ui.png | Bin 0 -> 11009 bytes .../public/img/placeholder-multiwindow.png | Bin 0 -> 12069 bytes .../src/public/img/placeholder-settings.png | Bin 0 -> 12541 bytes .../src/public/img/placeholder-shortcuts.png | Bin 0 -> 13575 bytes .../src/public/img/placeholder-themes.png | Bin 0 -> 12641 bytes .../img/placeholder-troubleshooting.png | Bin 0 -> 12683 bytes frontend/docs/src/zh/guide/backup-update.md | 60 +++++ frontend/docs/src/zh/guide/block-syntax.md | 78 +++++++ frontend/docs/src/zh/guide/extensions.md | 42 ++++ frontend/docs/src/zh/guide/features.md | 207 ++++++------------ frontend/docs/src/zh/guide/getting-started.md | 153 ++++++------- frontend/docs/src/zh/guide/http-client.md | 72 ++++++ frontend/docs/src/zh/guide/installation.md | 112 +++++----- frontend/docs/src/zh/guide/introduction.md | 97 ++++---- .../docs/src/zh/guide/keyboard-shortcuts.md | 74 +++++++ .../docs/src/zh/guide/multiwindow-tabs.md | 67 ++++++ frontend/docs/src/zh/guide/settings.md | 71 ++++++ frontend/docs/src/zh/guide/themes.md | 44 ++++ frontend/docs/src/zh/guide/troubleshooting.md | 53 +++++ frontend/docs/src/zh/guide/ui-overview.md | 46 ++++ 25 files changed, 881 insertions(+), 320 deletions(-) create mode 100644 frontend/docs/src/public/img/placeholder-backup.png create mode 100644 frontend/docs/src/public/img/placeholder-block-flow.png create mode 100644 frontend/docs/src/public/img/placeholder-extensions.png create mode 100644 frontend/docs/src/public/img/placeholder-http.png create mode 100644 frontend/docs/src/public/img/placeholder-main-ui.png create mode 100644 frontend/docs/src/public/img/placeholder-multiwindow.png create mode 100644 frontend/docs/src/public/img/placeholder-settings.png create mode 100644 frontend/docs/src/public/img/placeholder-shortcuts.png create mode 100644 frontend/docs/src/public/img/placeholder-themes.png create mode 100644 frontend/docs/src/public/img/placeholder-troubleshooting.png create mode 100644 frontend/docs/src/zh/guide/backup-update.md create mode 100644 frontend/docs/src/zh/guide/block-syntax.md create mode 100644 frontend/docs/src/zh/guide/extensions.md create mode 100644 frontend/docs/src/zh/guide/http-client.md create mode 100644 frontend/docs/src/zh/guide/keyboard-shortcuts.md create mode 100644 frontend/docs/src/zh/guide/multiwindow-tabs.md create mode 100644 frontend/docs/src/zh/guide/settings.md create mode 100644 frontend/docs/src/zh/guide/themes.md create mode 100644 frontend/docs/src/zh/guide/troubleshooting.md create mode 100644 frontend/docs/src/zh/guide/ui-overview.md diff --git a/frontend/docs/.vitepress/config.ts b/frontend/docs/.vitepress/config.ts index 86b34a1..b969545 100644 --- a/frontend/docs/.vitepress/config.ts +++ b/frontend/docs/.vitepress/config.ts @@ -93,13 +93,32 @@ export default defineConfig({ items: [ {text: '简介', link: '/zh/guide/introduction'}, {text: '安装', link: '/zh/guide/installation'}, - {text: '快速开始', link: '/zh/guide/getting-started'} + {text: '快速开始', link: '/zh/guide/getting-started'}, + {text: '界面总览', link: '/zh/guide/ui-overview'}, + {text: '块语法与结构', link: '/zh/guide/block-syntax'} ] }, { - text: '功能特性', + text: '编辑与效率', items: [ - {text: '功能概览', link: '/zh/guide/features'} + {text: '键盘快捷键', link: '/zh/guide/keyboard-shortcuts'}, + {text: '多窗口与标签页', link: '/zh/guide/multiwindow-tabs'}, + {text: '扩展与插件', link: '/zh/guide/extensions'}, + {text: 'HTTP 客户端', link: '/zh/guide/http-client'} + ] + }, + { + text: '个性化与数据', + items: [ + {text: '设置与配置', link: '/zh/guide/settings'}, + {text: '主题与外观', link: '/zh/guide/themes'}, + {text: '备份与更新', link: '/zh/guide/backup-update'} + ] + }, + { + text: '问题处理', + items: [ + {text: '常见问题与故障排查', link: '/zh/guide/troubleshooting'} ] } ] diff --git a/frontend/docs/src/public/img/placeholder-backup.png b/frontend/docs/src/public/img/placeholder-backup.png new file mode 100644 index 0000000000000000000000000000000000000000..af1e660bf42590796c11320ca972145debc84acc GIT binary patch literal 14333 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 B8SnrA literal 0 HcmV?d00001 diff --git a/frontend/docs/src/public/img/placeholder-block-flow.png b/frontend/docs/src/public/img/placeholder-block-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..26418a409060c6e9deb904da557d957f66ed0f96 GIT binary patch literal 12324 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 literal 0 HcmV?d00001 diff --git a/frontend/docs/src/public/img/placeholder-extensions.png b/frontend/docs/src/public/img/placeholder-extensions.png new file mode 100644 index 0000000000000000000000000000000000000000..0c01ed0602e4adea6b5709f8a2afe5aa886138c7 GIT binary patch literal 12920 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 TI%*M%>aaL+@^GFh`r7{kOaSW# literal 0 HcmV?d00001 diff --git a/frontend/docs/src/public/img/placeholder-main-ui.png b/frontend/docs/src/public/img/placeholder-main-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7e2555f4785127d7de39ad805ec856c4ed43c8 GIT binary patch literal 11009 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 literal 0 HcmV?d00001 diff --git a/frontend/docs/src/public/img/placeholder-settings.png b/frontend/docs/src/public/img/placeholder-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..38987fd584be8534f1247394da2c06273e86c744 GIT binary patch literal 12541 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 QOWrwQe%7qm6mjSO0152#rT_o{ literal 0 HcmV?d00001 diff --git a/frontend/docs/src/public/img/placeholder-shortcuts.png b/frontend/docs/src/public/img/placeholder-shortcuts.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc8c562cd07ae51e82905444e1a1b884795a034 GIT binary patch literal 13575 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 literal 0 HcmV?d00001 diff --git a/frontend/docs/src/public/img/placeholder-themes.png b/frontend/docs/src/public/img/placeholder-themes.png new file mode 100644 index 0000000000000000000000000000000000000000..9619f75bc5ae2d40ce2edf522906bb341dc5417c GIT binary patch literal 12641 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 z%0A-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 替换为备份设置、推送状态、更新提示的截图。 + +## Git 备份 +`BackupService` 将 `dataPath` 转化为 Git 仓库,并提供自动/手动推送。 + +### 初始化 +1. 在设置 > 备份中开启「启用备份」。 +2. 填写远程仓库 URL(HTTPS 或 SSH)。 +3. 选择认证方式: + - **Token**:适用于 GitHub/Gitea https 仓库。 + - **SSH Key**:指定私钥路径和 passphrase。 + - **用户名/密码**:适合自建 HTTP 仓库。 +4. 点击“测试连接”(按钮在计划中,可先在终端测试)。 + +### 自动备份 +- 勾选 “自动备份” + 设置 `BackupInterval`(分钟)。 +- 服务会创建 ticker 定时 `git add -> commit -> push`。 +- Commit 消息形如 `Auto backup `,包含 `voidraft.db`, `extensions.json`, `config.json`, `voidraft_data.bin`。 + +### 手动推送 +- 打开工具栏消息中心或设置页点击“立即推送”。 +- `backupStore.pushToRemote` 会显示状态气泡(成功/失败提示 3~5 秒)。 + +### 常见问题 +| 提示 | 解决 | +| --- | --- | +| `repository not found` | 检查 Repo URL 与权限,必要时创建空仓库 | +| `authentication required` | 选择正确认证方式,确认 token scope(需 repo 权限) | +| `auto backup stopped` | 查看日志,可能是网络不通或凭据失效;修改配置后服务会自动重启 | + +## 自动更新 +`SelfUpdateService` 负责检测、下载、应用新版。 + +### 检查更新 +- 启动时若勾选 “自动更新” 会自动检查。 +- 也可在设置 > 更新点击 “检查更新” 或在工具栏更新图标处触发。 +- 服务优先访问 `primarySource`,失败时回退 `backupSource`。 + +### 下载与应用 +1. 检测到更新后,界面提示版本号与变更信息(从 Release Notes 获取)。 +2. 点击 “下载并安装” 后,后台执行下载,完成后提示“准备重启”。 +3. 选择 “立即重启” 将调用 `RestartApplication`,自动重新打开上次的文档。 +4. 若启用了 “更新前备份”,在下载前会触发一次 Git push。 + +### 失败处理 +| 场景 | 建议 | +| --- | --- | +| 下载失败 | 检查网络/代理,切换至备用源 | +| 校验失败 | 删除 `%LOCALAPPDATA%/voidraft/update-cache` 再重试 | +| 应用后无法启动 | 从 Git 备份回滚数据,下载旧版本安装包覆盖 | + +## 发布渠道 +- 官方 GitHub Releases:`https://github.com/landaiqing/voidraft/releases` +- 自建 Gitea:`https://git.landaiqing.cn/landaiqing/voidraft` +- 可在设置中替换 Owner/Repo/BaseURL,以指向企业私有镜像。 + +> 建议将备份仓库设为私有,并在更新前后验证数据完整性。若要接入 S3/OSS 等备份方式,可关注 roadmap 或自行扩展。 diff --git a/frontend/docs/src/zh/guide/block-syntax.md b/frontend/docs/src/zh/guide/block-syntax.md new file mode 100644 index 0000000..3850a43 --- /dev/null +++ b/frontend/docs/src/zh/guide/block-syntax.md @@ -0,0 +1,78 @@ +# 块语法与结构 + +![块语法占位](/img/placeholder-block-flow.png) +> 替换为展示分隔符(`∞∞∞language`)、块内容、语言标签的截图。 + +## 结构定义 +每个块都由 **分隔符 + 内容** 组成: + +``` +∞∞∞language[-a]\n +<内容> +``` + +- `language`:`lang-parser/languages.ts` 中的 token,例如 `text`、`javascript`、`python`、`md`、`http`、`math`、`sql`。 +- `-a`:可选自动检测后缀,表示忽略显式语言,由 `lang-detect/autodetect.ts` 根据内容猜测。 +- 内容允许空行;块之间无需额外空格。 + +`parser.ts` 会将块解析为: +```ts +{ + language: { name: "javascript", auto: false }, + delimiter: { from, to }, + content: { from, to }, + range: { from, to } +} +``` +这些字段供格式化、HTTP 运行、块操作等扩展示例使用。 + +## 快捷命令 +| 命令 | 默认快捷键 | 说明 | +| --- | --- | --- | +| blockAddAfterCurrent | `Ctrl+Enter` | 插入新块(下方) | +| blockAddBeforeCurrent | `Ctrl+Shift+Enter` | 插入新块(上方) | +| blockGotoPrevious/Next | `Alt+↑ / Alt+↓` | 在块之间跳转 | +| blockSelectAll | `Ctrl+Shift+A` | 选中当前块(含分隔符) | +| blockDelete | `Alt+Delete` | 删除整个块 | +| blockMoveUp/Down | `Ctrl+Shift+↑ / Ctrl+Shift+↓` | 重排块顺序 | +| blockFormat | `Ctrl+Shift+F` | 针对当前块执行 Prettier | + +## 语言与能力矩阵 +| 语言 | 适配特性 | +| --- | --- | +| `text`/`note` | 基础文本,没有特殊扩展 | +| `md` | Markdown 预览、checkbox、高亮 | +| `javascript`/`typescript`/`json` | Prettier 格式化、彩虹括号、折叠、颜色选择 | +| `go`/`rust`/`python`/`java` | 高亮、折叠、自动缩进、语法跳转 | +| `http` | HTTP DSL、变量、响应插入(详见 [HTTP 客户端](/zh/guide/http-client))| +| `math` | `mathBlock` 运行器,支持 `prev` 引用上一次结果 | +| `sql`/`yaml`/`toml` | 语法高亮、格式化(由 Prettier/插件支持) | + +> 若需要不在列表中的语言,可先使用 `text` 块输入,再在工具栏搜索语言名;也可以在 `lang-parser/languages.ts` 中添加条目。 + +## 自动检测策略 +- 当分隔符以 `∞∞∞text-a` 写成时,`AUTO_DETECT_SUFFIX` 生效,`lang-detect` 会基于内容统计 + Levenshtein 距离预测语言。 +- 自动结果会写入块状态,但不会覆盖分隔符原文,因此可通过工具栏明确指定。 + +## 特殊块 +### HTTP 块 +- 语法位于 `extensions/httpclient/language`,支持 `@var/@json/@form/@multipart` 等指令。 +- 运行器会在块尾生成 `### Response`,包含状态码、耗时、headers、body。 + +### 数学块 +- 语言设为 `math`,逐行计算。 +- `prev` 变量表示上一行结果,可完成链式运算。 +- 结果挂件可点击复制,或显示格式化/定点值。 + +### Markdown 块 +- 工具栏中的 Preview 按钮会调用 `toggleMarkdownPreview`,右侧打开面板。 +- 预览状态按文档隔离,不会影响其他文档。 + +## 分隔符校验 +- `parser.ts` 暴露 `isValidDelimiter` 方法,格式错误时分隔符会以红色底纹标记。 +- 复制/剪切操作会自动扩选到整个块,确保分隔符完整。 + +## 维护建议 +- 保持每个逻辑主题占用一个块,并用 `md` 块写标题。 +- 大量多语言内容时,可用 `text` + 自动检测,待语言确定后再改分隔符。 +- 若文档出现“无法解析块”提示,可运行 `格式化文档` 或在命令面板触发“重建语法树”。 diff --git a/frontend/docs/src/zh/guide/extensions.md b/frontend/docs/src/zh/guide/extensions.md new file mode 100644 index 0000000..3f91f78 --- /dev/null +++ b/frontend/docs/src/zh/guide/extensions.md @@ -0,0 +1,42 @@ +# 扩展与插件 + +![扩展占位](/img/placeholder-extensions.png) +> 替换为展示扩展设置面板或功能合集(小地图、搜索、翻译)的截图。 + +voidraft 的扩展系统由 `internal/models/extensions.go` + 前端 `ExtensionManager` 驱动。扩展配置存储在 `%USERPROFILE%/.voidraft/data/extensions.json`,可在设置页面勾选启用或调整参数。 + +## 核心扩展 +| 扩展 ID | 功能 | 关键文件 | +| --- | --- | --- | +| `editor` | 基础 CodeMirror 行为、光标保护、滚轮缩放 | `frontend/src/views/editor/basic/*` | +| `codeblock` | 块解析、拖拽、复制、格式化、数学、HTTP DSL | `extensions/codeblock` | +| `vscodeSearch` | VSCode 风格搜索替换面板 | `extensions/vscodeSearch` | +| `markdownPreview` | Markdown 实时预览 | `extensions/markdownPreview` | + +## 编辑增强 +- **Rainbow Brackets (`rainbowBrackets`)**:彩虹色括号匹配。 +- **Fold (`fold`)**:代码折叠/展开,支持 `Ctrl+Alt+[`/`]`。 +- **Hyperlink (`hyperlink`)**:识别 URL/邮箱,`Ctrl+Click` 打开。 +- **Color Selector (`colorSelector`)**:悬浮配色器,支持 HEX/RGB/HSL。 +- **Checkbox (`checkbox`)**:Markdown 任务列表交互式勾选。 +- **Text Highlight (`textHighlight`)**:`Mod+Shift+H` 快速标记重点,可自定义颜色/透明度。 + +## 工具扩展 +- **Translator (`translator`)**:选区翻译;配置项包括默认翻译器、最短/最长字符数。后端集成 Bing/Google/Youdao/DeepL/TartuNLP。 +- **Minimap (`minimap`)**:右侧迷你地图,支持悬浮/常驻、显示字符/块,突出当前选区。 +- **Search (`search`)**:补充 VSCode 风格搜索,暴露命令给快捷键系统。 +- **HTTP Client (`httpclient`)**:DSL + 运行器,详见 [HTTP 客户端](/zh/guide/http-client)。 + +## 未来扩展(欢迎参与) +- Vim / Emacs 键位层(正在计划)。 +- 自定义命令面板(Command Palette)。 +- 代码片段/模板库扩展。 +- AI 助手(文生代码/注释)。 + +## 开发者指南概述 +1. **注册扩展**:在 `extensionManager.registerFactory` 中添加自定义扩展工厂。 +2. **配置项**:在 `extensions.json` 中声明默认配置,并在设置面板暴露 UI(Vue 组件)。 +3. **热更新**:调用 `manager.updateExtensionImmediate(id, enabled, config)` 实时切换,无需刷新窗口。 +4. **后端交互**:通过 `ExtensionService.UpdateExtensionState` 将配置写入 SQLite。 + +> 如果需要编写自用扩展,可 fork 项目在 `frontend/src/views/editor/extensions` 中添加文件,再通过 PR 贡献给社区。 diff --git a/frontend/docs/src/zh/guide/features.md b/frontend/docs/src/zh/guide/features.md index 8825f14..ab377c5 100644 --- a/frontend/docs/src/zh/guide/features.md +++ b/frontend/docs/src/zh/guide/features.md @@ -1,163 +1,86 @@ # 功能特性 -探索 voidraft 的强大功能,让它成为开发者的优秀工具。 +![扩展能力占位](/img/placeholder-extensions.png) +> 替换为展示彩虹括号、小地图、搜索工具条等扩展组合的截图。 -## 块状编辑 +## 1. 编辑体验 +### 块状编辑全流程 +- `∞∞∞language[-a]` 语法由 `codeblock/lang-parser` 解析,支持自动检测、分隔符校验、块范围缓存。 +- `blockState` 暴露 API(`getActiveBlock/getFirstBlock/getLastBlock`),供格式化、重排、复制、HTTP 执行等插件共享。 +- `mathBlock` 可在块尾展示计算结果,点击可复制;`CURRENCIES_LOADED` 注解在汇率更新时刷新缓存。 -voidraft 的核心功能是其块状编辑系统: +### 语言支持 +- 内建 30+ 语言模版(`lang-parser/languages.ts`),覆盖 JS/TS/HTML/CSS/Go/Rust/Python/SQL/YAML/HTTP/Markdown/Plain/Text/Math。 +- 语言切换下拉实时更新分隔符;支持自定义别名(例如 `∞∞∞shell`)。 -- 每个块可以有不同的编程语言 -- 块之间由分隔符分隔(`∞∞∞语言`) -- 快速在块之间导航 -- 独立格式化每个块 +### 语法高亮与主题 +- `rainbowBracket`、`fold`、`hyperlink`、`colorSelector` 等扩展组合提供接近 VSCode 的体验。 +- `ThemeService` 预置 12+ 暗/亮主题,可在设置中克隆、修改 JSON 色板,并立即生效。 -## 语法高亮 +### 文本统计与滚轮缩放 +- `statsExtension` 实时统计行数、字符数和选区,展示在状态栏。 +- `wheelZoomExtension` 让 `Ctrl + 鼠标滚轮` 调整字体大小,同时同步 `configStore`。 -支持 30+ 种语言的专业语法高亮: +## 2. 高效工具箱 +### VSCode 式搜索替换 +- `extensions/vscodeSearch` 提供悬浮面板,支持大小写/整词/正则、向上/向下跳转、批量替换。 +- 对应快捷键:`Ctrl+F`、`Ctrl+H`、`Alt+Enter`(替换全部)。 -- 自动语言检测 -- 可自定义配色方案 -- 支持嵌套语言 -- 代码折叠支持 +### Markdown 预览 +- `panelStore` 为每个文档维护预览状态,保证不同文档互不影响。 +- 选中 Markdown 块后点击工具栏预览按钮即可在右侧展开实时渲染面板。 -## HTTP 客户端 +### HTTP 客户端 +- Request DSL + 运行器在 [专章](/zh/guide/http-client) 详细说明。 +- 支持变量、响应插入、多种请求体、定制 header、复制 cURL。 -用于 API 测试的内置 HTTP 客户端: +### 翻译助手 +- `translator` 扩展监听选区,符合长度阈值后显示按钮;由 `TranslationService` 调用 Bing/Google/Youdao/DeepL/TartuNLP。 +- 支持语种缓存、复制译文、切换译文方向。 -### 请求类型 -- GET、POST、PUT、DELETE、PATCH -- 自定义请求头 -- 多种请求体格式:JSON、FormData、URL 编码、XML、文本 +### 颜色与高亮 +- `colorSelector` 识别 `#fff/rgba/hsl`、打开取色器;`textHighlight` 用 `Mod+Shift+H` 标记重要行。 -### 请求变量 -定义和重用变量: +## 3. 复杂布局能力 +### 多窗口 +- `WindowService` 允许为任意文档创建独立 WebView,URL 自动携带 `?documentId=`。 +- `WindowSnapService` 根据主窗口位置吸附子窗口(上下左右+四角),并缓存尺寸、位置。 +- 支持全局热键(默认 `Alt+X`)一键显示或隐藏所有窗口。 -```http -@var { - baseUrl: "https://api.example.com", - token: "your-api-token" -} +### 标签页 +- `tabStore` 通过 `enableTabs` 控制;支持拖拽排序、关闭其他/左侧/右侧标签。 +- 与多窗口互斥:当文档被新窗口接管后会从标签栏移除,避免重复。 -GET "{{baseUrl}}/users" { - authorization: "Bearer {{token}}" -} -``` +### 系统托盘与置顶 +- `TrayService` 控制关闭时隐藏到托盘或直接退出。 +- 工具栏提供图钉按钮,可即时切换 `AlwaysOnTop`(支持临时置顶和永久置顶)。 -### 响应处理 -- 查看格式化的 JSON 响应 -- 查看响应时间和大小 -- 检查响应头 -- 保存响应以供日后使用 +## 4. 数据守护 +### SQLite + 自动迁移 +- `DatabaseService` 启动时执行 PRAGMA + 表结构校验,缺失字段自动 `ALTER TABLE`。 +- 默认生成 `documents/extensions/key_bindings/themes` 等表,支持软删除与锁定。 -## 代码格式化 +### Git 备份 +- `BackupService` 将 `dataPath` 初始化为 Git 仓库,支持 Token/SSHKey/用户名密码三种方式。 +- 自动任务按分钟运行(`BackupInterval`),包括 add/commit/push;也可从 UI 触发一次性 push。 -集成 Prettier 支持: +### 配置快照 +- 所有设置存于 `config.json`,包含 `metadata.version/lastUpdated`,方便手工回滚。 +- `ConfigService.Watch` 为窗口吸附、托盘、热键等服务提供实时响应。 -- 保存时格式化(可选) -- 格式化选区或整个块 -- 支持 JavaScript、TypeScript、CSS、HTML、JSON 等 -- 可自定义格式化规则 +### 自动更新 +- `SelfUpdateService` 先检查主源(Gitea),失败再回退到 GitHub;下载完成后可一键「重启并更新」。 +- 更新前可选自动触发 Git 备份(`backupBeforeUpdate`)。 -## 编辑器扩展 +## 5. 自动化与集成 +- **启动时动作**:可开启开机自启(`StartupService`)、默认最小化至托盘。 +- **HTTP 运行挂钩**:`response-inserter` 可在响应块尾部插入 `// @timestamp` 等自定义标记。 +- **Math/汇率**:`mathBlock` 可引用上一次结果 (`prev`),配合 `CURRENCIES_LOADED` 注解支撑货币换算。 +- **系统信息**:`SystemService` 暴露内存、GC、Goroutine 数量,可在调试面板查看。 -### VSCode 风格搜索 -- 查找和替换,支持正则表达式 -- 区分大小写和全字匹配选项 -- 跨所有块搜索 - -### 小地图 -- 文档的鸟瞰图 -- 快速导航 -- 可自定义大小和位置 - -### 彩虹括号 -- 彩色括号配对 -- 更容易匹配括号 -- 可自定义颜色 - -### 颜色选择器 -- 可视化颜色选择 -- 支持 hex、RGB、HSL -- 实时预览 - -### 翻译工具 -- 翻译选定的文本 -- 支持多种语言 -- 快速键盘访问 - -### 文本高亮 -- 高亮重要文本 -- 多种高亮颜色 -- 持久化高亮 - -## 多窗口支持 - -高效使用多个窗口: - -- 每个窗口都是独立的 -- 独立的文档 -- 同步的设置 -- 窗口状态持久化 - -## 主题自定义 - -完全控制编辑器外观: - -### 内置主题 -- 深色模式 -- 浅色模式 -- 根据系统自动切换 - -### 自定义主题 -- 创建你自己的主题 -- 自定义每种颜色 -- 保存和分享主题 -- 导入社区主题 - -## 自动更新系统 - -通过自动更新保持最新: - -- 后台更新检查 -- 新版本通知 -- 一键更新 -- 更新历史 -- 支持多个更新源(GitHub、Gitea) - -## 数据备份 - -使用基于 Git 的备份保护你的数据: - -- 自动备份 -- 手动触发备份 -- 支持 GitHub 和 Gitea -- 多种认证方式(SSH、Token、密码) -- 可配置备份间隔 - -## 键盘快捷键 - -广泛的键盘支持: - -- 可自定义快捷键 -- Vim/Emacs 按键绑定(计划中) -- 快速命令面板 -- 上下文感知快捷键 - -## 性能 - -专为速度而构建: - -- 快速启动时间 -- 流畅滚动 -- 高效内存使用 -- 支持大文件 - -## 隐私与安全 - -你的数据是安全的: - -- 本地优先存储 -- 可选云备份 -- 无遥测或跟踪 -- 开源代码库 +## 6. 可配置的快捷键 +- 详见 [键盘快捷键](/zh/guide/keyboard-shortcuts)。默认绑定定义在 `internal/models/key_bindings.go`,前端设置页可逐项修改、禁用。 +## 7. 文档 & 帮助 +- 文档站以 VitePress 构建(`frontend/docs`),内置中英双语导航,可一键部署到 GitHub Pages。 +- `README` 与本文档同步介绍核心功能;建议将常用工作流截图补充到每个「图片占位」中。 diff --git a/frontend/docs/src/zh/guide/getting-started.md b/frontend/docs/src/zh/guide/getting-started.md index e50a945..646965c 100644 --- a/frontend/docs/src/zh/guide/getting-started.md +++ b/frontend/docs/src/zh/guide/getting-started.md @@ -1,107 +1,82 @@ # 快速开始 -学习使用 voidraft 的基础知识并创建你的第一个文档。 +![块结构流程占位](/img/placeholder-block-flow.png) +> 替换为展示块分隔符、语言标签、内容的截图,帮助读者直观理解 `∞∞∞language` 结构。 -## 编辑器界面 +## 5 分钟上手流程 +1. **启动应用**:等待加载动画结束,默认会打开 `default` 文档。 +2. **新建文档**:点击工具栏的文档列表按钮,输入标题后创建;也可在设置里开启标签页,以便同时挂载多个文档。 +3. **创建首个块**: + - 在空白处输入 `∞∞∞javascript` 并回车。 + - 输入代码或文本,`CodeBlockExtension` 会自动匹配语法高亮。 +4. **格式化与预览**: + - 选中块后点击工具栏的「Format」或使用 `Ctrl+Shift+F`。 + - 如果块语言是 `md`,可点击「Preview」按钮开启 Markdown 侧栏。 +5. **运行 HTTP 请求**:创建 `∞∞∞http` 块,填写请求,再点击行号旁的 Run 按钮即可获取响应。 +6. **打开第二窗口**:在文档列表中右键文档 -> “在新窗口中打开”。`WindowService` 会创建无边框窗口并自动贴靠主窗口。 -当你打开 voidraft 时,你将看到: +## 界面导览 +- **主编辑区**:CodeMirror 视图,支持鼠标滚轮 + `Ctrl` 缩放(`wheelZoomExtension`)。 +- **右侧小地图**:`extensions/minimap` 提供鸟瞰和选区同步。 +- **底部状态**:`editorStore.documentStats` 实时展示行数/字符/选区。 +- **工具栏**(`Toolbar.vue`):包含文档切换、块语言下拉、窗口置顶、格式化、Markdown 预览、更新提示、进入设置等。 -- **主编辑器**:编写和编辑的中心区域 -- **工具栏**:快速访问常用操作 -- **状态栏**:显示当前块的语言和其他信息 +## 块的基本操作 +| 操作 | 快捷键 | 说明 | +| --- | --- | --- | +| 新建块(下方) | `Ctrl+Enter` | 在当前块后插入 `∞∞∞text-a` 分隔符 | +| 新建块(上方) | `Ctrl+Shift+Enter` | 在当前块前插入 | +| 跳到上/下一个块 | `Alt+Up / Alt+Down` | 通过 `blockGotoPrevious/Next` 命令 | +| 删除块 | `Alt+Delete` | 仅删除块内容,不影响其他块 | +| 块排序 | `Ctrl+Shift+↑/↓` | `moveLines` 结合块范围移动 | +| 复制块 | `Ctrl+C`(光标在块上即可) | `copyPaste.ts` 自动扩展选区至整个块 | -## 创建代码块 +## 自动语言与格式化 +- 当分隔符写成 `∞∞∞text-a` 时,会触发语言自动检测(`lang-detect/autodetect.ts`),常用于粘贴未知代码。 +- `formatCode.ts` 调用 Prettier,自动选择 parser;若语言不支持,会提示不可格式化。 +- 块语言可在工具栏下拉中修改,列表由 `lang-parser/languages.ts` 提供。 -voidraft 使用基于块的编辑系统。每个块可以有不同的语言: +## Markdown / 待办 +1. 使用 `∞∞∞md` 分隔符。 +2. 在块内写 Markdown,点击工具栏预览按钮。 +3. 勾选/取消 Checkbox(`extensions/checkbox`)即可同步更新文本。 -1. 按 `Ctrl+Enter` 创建新块 -2. 输入 `∞∞∞` 后跟语言名称(例如 `∞∞∞javascript`) -3. 在该块中开始编码 - -### 支持的语言 - -voidraft 支持 30+ 种编程语言,包括: -- JavaScript、TypeScript -- Python、Go、Rust -- HTML、CSS、Sass -- SQL、YAML、JSON -- 以及更多... - -## 基本操作 - -### 导航 - -- `Ctrl+Up/Down`:在块之间移动 -- `Ctrl+Home/End`:跳转到第一个/最后一个块 -- `Ctrl+F`:在文档中搜索 - -### 编辑 - -- `Ctrl+D`:复制当前行 -- `Ctrl+/`:切换注释 -- `Alt+Up/Down`:向上/向下移动行 -- `Ctrl+Shift+F`:格式化代码(如果语言支持 Prettier) - -### 块管理 - -- `Ctrl+Enter`:创建新块 -- `Ctrl+Shift+Enter`:在上方创建块 -- `Alt+Delete`:删除当前块 - -## 使用 HTTP 客户端 - -voidraft 包含用于测试 API 的内置 HTTP 客户端: - -1. 创建一个 HTTP 语言的块 -2. 编写你的 HTTP 请求: +## 翻译与文本标注 +- 选中文本后会浮现翻译入口(`translator` 扩展),点击即可在块内查看结果、复制、切换目标语言。 +- `textHighlight` 扩展提供 `Mod+Shift+H` 高亮当前选区,颜色可在扩展设置中调整。 +## HTTP 客户端概览 ```http -POST "https://api.example.com/users" { +∞∞∞http +@var { + baseUrl: "https://api.example.com", + token: "{{secrets.token}}" +} + +POST "{{baseUrl}}/users" { + authorization: "Bearer {{token}}" content-type: "application/json" - + @json { - name: "张三", - email: "zhangsan@example.com" + name: "voidraft", + role: "developer" } } ``` +- `parser/request-parser.ts` 会将变量与请求体解析为结构化对象。 +- 点击 gutter Run 获取响应,`response-inserter.ts` 会将结果写入 `### Response` 区块。 -3. 点击运行按钮执行请求 -4. 内联查看响应 +## 自动保存与版本安全 +- `editorStore` 为每个文档维护 `autoSaveTimer`,默认 2000 ms,可在设置 > 编辑 调整。 +- `documentStates` 记录每个文档的光标位置,切换文档或重启应用都会恢复。 +- 若开启 Git 备份,可在工具栏或设置中查看最近一次 `push` 是否成功。 -## 多窗口支持 - -同时处理多个文档: - -1. 转到 `文件 > 新建窗口`(或 `Ctrl+Shift+N`) -2. 每个窗口都是独立的 -3. 更改会自动保存 - -## 自定义主题 - -个性化你的编辑器: - -1. 打开设置(`Ctrl+,`) -2. 转到外观 -3. 选择主题或创建自己的主题 -4. 根据你的偏好自定义颜色 - -## 键盘快捷键 - -学习基本快捷键: - -| 操作 | 快捷键 | -|-----|--------| -| 新建窗口 | `Ctrl+Shift+N` | -| 搜索 | `Ctrl+F` | -| 替换 | `Ctrl+H` | -| 格式化代码 | `Ctrl+Shift+F` | -| 切换主题 | `Ctrl+Shift+T` | -| 命令面板 | `Ctrl+Shift+P` | - -## 下一步 - -现在你已经了解了基础知识: - -- 详细探索[功能特性](/zh/guide/features) +## 最佳实践 +- 使用 Markdown 块为每组代码加标题/注释,便于导航。 +- 重要文档启用“锁定”以避免被删除(文档右键菜单)。 +- 多窗口 + 吸附用于常驻参考资料,标签页用于在一个窗口内快速切换。 +- 善用「窗口置顶」图钉,让 voidraft 叠放在 VSCode/浏览器之上。 +接下来: +- [界面总览](/zh/guide/ui-overview) +- [块语法与结构](/zh/guide/block-syntax) diff --git a/frontend/docs/src/zh/guide/http-client.md b/frontend/docs/src/zh/guide/http-client.md new file mode 100644 index 0000000..e8ec139 --- /dev/null +++ b/frontend/docs/src/zh/guide/http-client.md @@ -0,0 +1,72 @@ +# HTTP 客户端 + +![HTTP 客户端占位](/img/placeholder-http.png) +> 替换为 HTTP 块 + 响应卡片的截图。 + +voidraft 将 HTTP 测试写成块(`∞∞∞http`),语法与 JetBrains Http Client 类似。解析与执行由 `frontend/src/views/editor/extensions/httpclient` 完成。 + +## 基本语法 +```http +∞∞∞http +GET "https://api.example.com/users" { + accept: "application/json" +} +``` +- 方法 + URL 必须用双引号包裹。 +- Header 以 `key: "value"` 格式编写。 +- 请求体使用内联指令(见下文)。 + +## 变量与环境 +```http +@var { + baseUrl: "https://api.example.com", + token: "{{secrets.token}}" +} + +GET "{{baseUrl}}/users" { + authorization: "Bearer {{token}}" +} +``` +- `@var` 块使用 JSON 语法。 +- 变量在任意请求中以 `{{name}}` 引用。 +- `variable-resolver.ts` 支持嵌套、默认值、外部 secrets 映射。 + +## 请求体助手 +| 指令 | 示例 | 说明 | +| --- | --- | --- | +| `@json` | `@json { "name": "voidraft" }` | 自动 `content-type: application/json` 并格式化 | +| `@form` | `@form { username: "demo" }` | 转为 `application/x-www-form-urlencoded` | +| `@multipart` | `@multipart { file: @"C:\tmp\a.txt" }` | 读取文件、多段表单 | +| `@text` | `@text ` | 自由文本 | + +## 运行与响应 +1. 将光标置于 HTTP 块内。 +2. 点击行号左侧的 Run(三角形图标),或按下自定义快捷键。 +3. 运行结果会插入到块尾的 `### Response` 中,包含: + - 状态行 + 响应时间 + 体积。 + - Headers(可折叠)。 + - 响应体(自动格式化 JSON / XML / HTML / Text)。 + - 复制、另存为、再次发送等快捷按钮。 + +## 多请求文档 +- 每个 `∞∞∞http` 块被视为独立请求。 +- `request-parser.ts` 会解析同一块内的多个请求(以 `###` 分隔)。 +- 使用 Markdown 块写注释或分组标题。 + +## 变量注入顺序 +1. 块内 `@var`。 +2. 文档级变量(计划中)。 +3. 环境变量(`EnvironmentService` 预留)。 + +## 调试技巧 +- 运行器会在控制台打印完整请求信息,可通过 `wails3 dev` 查看。 +- 如果响应过大,可右键响应块选择“折叠正文”或“导出到文件”。 +- 网络错误会在响应卡片顶部以红条展示,内容来自 `HttpClientService`。 +- 需要代理时确保系统代理已设置,voidraft 会自动继承。 + +## 与其他功能配合 +- 运行结果可直接与 Markdown/代码块混排,形成 API 使用手册。 +- 配合 Git 备份可版本化 API 调试记录。 +- 可将响应复制到其他块(例如 JSON → Prettier 之后用于 mock)。 + +> 欢迎在 Issue 中提交你希望支持的额外 DSL 指令(例如 GraphQL、WebSocket、gRPC)。 diff --git a/frontend/docs/src/zh/guide/installation.md b/frontend/docs/src/zh/guide/installation.md index 7e59893..999f245 100644 --- a/frontend/docs/src/zh/guide/installation.md +++ b/frontend/docs/src/zh/guide/installation.md @@ -1,63 +1,77 @@ # 安装 -本指南将帮助你在系统上安装 voidraft。 +![安装流程占位](/img/placeholder-settings.png) +> 替换为安装向导或设置页截图,展示关键开关(置顶、数据目录、自动更新等)。 -## 系统要求 +## 系统要求(2025.11) +| 项目 | 最低配置 | 推荐配置 | +| --- | --- | --- | +| 操作系统 | Windows 10 19045 / Windows 11 21H2 | Windows 11 23H2(macOS/Linux 版本开发中) | +| CPU | x86_64 双核 | 4 核以上 | +| 内存 | 4 GB | ≥ 8 GB | +| 磁盘空间 | 200 MB(含 SQLite 数据) | 1 GB 以上以保存附件/备份 | +| 运行环境 | Go 1.21+, Node.js 18+(仅开发者编译时需要) | 同左 + pnpm 8 用于前端 | -- **操作系统**:Windows 10 或更高版本(macOS 和 Linux 支持计划中) -- **内存**:最低 4GB,推荐 8GB -- **磁盘空间**:200MB 可用空间 +## 获取发行版 +1. 打开 [GitHub Releases](https://github.com/landaiqing/voidraft/releases) 或自建 Gitea 镜像。 +2. 下载 `voidraft-windows-amd64-installer.exe`(安装版)或 `voidraft-portable.zip`(绿色版)。 +3. (可选)验证 SHA256: + ```powershell + Get-FileHash .\voidraft-windows-amd64-installer.exe -Algorithm SHA256 + ``` +4. 双击安装包,按向导完成安装;或解压绿色版至任意目录并创建快捷方式。 -## 下载 +## 首次启动流程 +1. 启动后将创建数据目录:`%USERPROFILE%\.voidraft\data`(含 `voidraft.db`、`config.json`、`extensions.json`)。 +2. 默认会生成 `default` 文档和一段示例块 `∞∞∞text-a`。 +3. 若检测到旧版本数据,`ConfigMigrationService` 会自动迁移字段;`DataMigrationService` 确保表结构一致。 +4. 首次运行建议立刻打开「设置 > 备份」配置远程 Git 仓库。 -访问[发布页面](https://github.com/landaiqing/voidraft/releases)并下载适合你平台的最新版本: +## 开发者手动构建 +```bash +# 克隆项目 + git clone https://github.com/landaiqing/voidraft.git + cd voidraft -- **Windows**:`voidraft-windows-amd64-installer.exe` +# 安装前端依赖 + cd frontend + npm install + npm run build + cd .. -## 安装步骤 +# 构建/运行桌面应用 + wails3 dev # 启动调试 + wails3 package # 生成安装包(输出位于 bin/) +``` +> 若遇到 `wails3` 未找到,请先执行 `go install github.com/wailsapp/wails/v3/cmd/wails3@latest`。 -### Windows +## 数据目录与可执行文件 +| 类型 | 默认位置 | 说明 | +| --- | --- | --- | +| 安装目录 | `C:\Program Files\voidraft` | 包含主程序与嵌入式前端资源 | +| 数据目录 | `C:\Users\\.voidraft\data` | 可在设置 > 通用修改 `dataPath`,修改后需重启 | +| 备份仓库 | `dataPath/.git` | `BackupService` 初始化或使用现有仓库 | +| 日志 | `%LOCALAPPDATA%/voidraft/logs/*.log` | 通过 Wails `application.Log` 输出 | -1. 从发布页面下载安装程序 -2. 运行 `voidraft-windows-amd64-installer.exe` 文件 -3. 按照安装向导操作 -4. 从开始菜单或桌面快捷方式启动 voidraft +## 常用 CLI 检查 +```powershell +# 查看版本 +& "C:\Program Files\voidraft\voidraft.exe" --version -## 首次启动 +# 清理缓存(若前端异常) +Remove-Item "$env:APPDATA\voidraft\Cache" -Recurse -Force +``` -首次启动 voidraft 时: +## 防火墙与代理 +- voidraft 仅在使用 HTTP 客户端、更新检测、REST 翻译器时发起网络请求。 +- 若处于企业代理,请在系统代理中放行 `voidraft.exe` 或设置环境变量 `HTTP(S)_PROXY`,HTTP 客户端会继承系统代理。 -1. 应用程序将创建一个数据目录来存储你的文档 -2. 你将看到带有欢迎块的主编辑器界面 -3. 开始输入或创建你的第一个代码块! - -## 配置 - -voidraft 将其配置和数据存储在: - -- **Windows**:`%APPDATA%/voidraft/` - -你可以自定义各种设置,包括: -- 编辑器主题(深色/浅色模式) -- 代码格式化偏好 -- 备份设置 -- 键盘快捷键 - -## 更新 - -voidraft 包含自动更新功能,会在有新版本时通知你。你可以: - -- 从设置中手动检查更新 -- 启用自动更新 -- 选择首选的更新源 - -## 故障排除 - -如果在安装过程中遇到任何问题: - -1. 确保你有管理员权限 -2. 检查杀毒软件是否阻止了安装 -3. 访问我们的 [GitHub issues](https://github.com/landaiqing/voidraft/issues) 页面寻求帮助 - -下一步:[快速开始 →](/zh/guide/getting-started) +## 常见安装问题 +| 症状 | 处理方案 | +| --- | --- | +| 安装向导被安全策略阻止 | 使用签名哈希进行白名单设置或改用便携版 | +| 启动后白屏 | 删除 `%APPDATA%/voidraft/Cache`,确保显卡驱动支持 WebView2 | +| `wails3 dev` 报错缺少 WebView2 | 安装 [WebView2 Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) | +| 便携版无法写入 | 检查解压目录是否具有写权限,或在设置内切换 `dataPath` 至可写分区 | +> 继续阅读:[快速开始](/zh/guide/getting-started) diff --git a/frontend/docs/src/zh/guide/introduction.md b/frontend/docs/src/zh/guide/introduction.md index 79e81c1..4d68876 100644 --- a/frontend/docs/src/zh/guide/introduction.md +++ b/frontend/docs/src/zh/guide/introduction.md @@ -1,50 +1,73 @@ # 简介 -欢迎使用 voidraft —— 一个专为开发者设计的优雅文本片段记录工具。 +> voidraft 是一款面向开发者的「块式工作台」,用 CodeMirror 6 打造 Heynote 风格的体验,并结合 Wails3 + Go 后端提供系统托盘、全局热键、自动备份等桌面级能力。 -## 什么是 voidraft? +![主界面总览占位](/img/placeholder-main-ui.png) +> 将 `/img/placeholder-main-ui.png` 替换为真实的应用主界面截图,演示数据面板、工具栏和右侧小地图。 -voidraft 是一个现代化的桌面应用程序,帮助开发者管理文本片段、代码块、API 响应、会议笔记和日常待办事项。它为开发工作流程提供了流畅而优雅的编辑体验和强大的功能。 +## 产品定位 +- **核心诉求**:在一处快速记录代码/配置/API 响应/待办清单,并能随时重排、格式化、运行或搜索。 +- **目标用户**:需要跨项目管理零碎文本的开发者、DevOps、测试或产品技术写作者。 +- **设计理念**:所有内容都拆成可重排的块(`∞∞∞language`);每个块拥有独立语言、格式化器与扩展;多窗口/多标签保证同一份数据的不同视角。 -## 核心特性 +## 面向场景 +1. **临时代码/脚本草稿**:支持 30+ 语言高亮、Prettier 格式化、彩虹括号、文本高亮。 +2. **API 调试台**:HTTP 块内置运行器、变量解析、响应插入;请求和响应始终和文档共存。 +3. **会议 & 需求记录**:Markdown 块 + Checkbox 扩展 + 颜色标注快速整理想法。 +4. **翻译与研究**:选中文本即可调 Bing/Google/DeepL/TartuNLP/有道翻译,结果内联呈现。 +5. **多窗口资料墙**:重要文档可弹出独立无边框窗口,依附(Snap)在主窗口侧边。 -### 块状编辑模式 +## 核心概念 +### 块式编辑器 +- 解析器位于 `frontend/src/views/editor/extensions/codeblock`,依赖自研 Lezer 语法树确保 `∞∞∞` 分隔符稳定。 +- 块结构(语言、是否自动检测、正文范围)存入 `blockState`,供格式化、移动、复制、HTTP 执行等扩展复用。 +- `math` 块使用 `math.js` 运行器,`http` 块调用 request parser + gutter run widget。 -voidraft 使用受 Heynote 启发的独特块状编辑系统。你可以将内容分割为独立的代码块,每个块具有: -- 不同的编程语言设置 -- 语法高亮 -- 独立格式化 -- 轻松在块之间导航 +### 扩展驱动 +- 后端通过 `internal/models/extensions.go` 定义扩展 ID/配置,`ExtensionService` 负责持久化。 +- 前端 `ExtensionManager` 根据扩展配置动态拼装 CodeMirror Extension pipeline(小地图、VSCode Search、Translator、Color Picker 等)。 +- 所有扩展都可在设置页热切换,立即同步到当前与所有已打开的编辑器实例。 -### 开发者工具 +### 数据与安全 +- SQLite 数据保存在 `%USERPROFILE%/.voidraft/data/voidraft.db`(可在设置中自定义 dataPath)。 +- `DatabaseService` 自动迁移表结构,`DocumentService` 提供软删除/锁定机制避免误删默认草稿。 +- `BackupService` 基于 go-git(SSH/Token/用户名密码)把 dataPath git 化,可按分钟全量提交、推送到 GitHub/Gitea 等。 +- `SelfUpdateService` 同时轮询 GitHub/Gitea Release,支持自动下载 + 一键重启。 -- **HTTP 客户端**:直接在编辑器中测试 API -- **代码格式化**:内置 Prettier 支持多种语言 -- **语法高亮**:支持 30+ 种编程语言 -- **自动语言检测**:自动识别代码块语言类型 +## 系统架构概览 +| 层级 | 说明 | 关键路径 | +| --- | --- | --- | +| 桌面容器 | Wails3 + Go 1.21,负责窗口、托盘、热键、服务注入 | `main.go`, `internal/services` | +| 后端服务 | Config/Document/Extension/Theme/Backup/Window/Hotkey/Translation 等 | `internal/services/*.go` | +| 数据模型 | Document、Theme、KeyBinding、GitBackup、Config | `internal/models` | +| 前端应用 | Vue 3 + Vite + Pinia + vue-router | `frontend/src` | +| 编辑器内核 | CodeMirror 6 扩展及自研块解析、HTTP DSL、Markdown 预览 | `frontend/src/views/editor` | +| 文档站点 | VitePress,多语言导航 | `frontend/docs` | -### 自定义 +## 模块速览 +- **文档存储**:`DocumentService` 支持创建/重命名/软删除/恢复、多窗口并发打开同一文档。 +- **编辑器实例管理**:`editorStore` 使用 LRU 缓存 + 自动保存计时器,确保在多文档切换时保留光标位置、未保存内容。 +- **HTTP 客户端**:`extensions/httpclient` 包括 Lezer 语法、变量解析、响应插入与运行 gutter;支持 JSON/FormData/GraphQL 等多体格式。 +- **Markdown 预览**:`panelStore` 管理逐文档的预览状态,可随块实时刷新。 +- **多窗口/吸附**:`WindowService` + `WindowSnapService` 根据主窗口位置智能吸附子窗口、自动记忆尺寸。 +- **全局热键**:`HotkeyService` 监听系统级组合键,切换窗口显隐(默认 Alt+X,可配置)。 +- **系统托盘**:`systray.SetupSystemTray` 注入显示/隐藏、退出、开机启动等操作。 +- **翻译生态**:`TranslationService` 聚合 Bing/Google/Youdao/DeepL/TartuNLP,前端 `translator` 扩展提供 Tooltip + 复制。 +- **主题与外观**:`ThemeService` 预置 12+ 主题,可重置/克隆;前端 `createThemeExtension` 即时应用。 -- **自定义主题**:创建并保存你自己的编辑器主题 -- **扩展功能**:丰富的编辑器扩展,包括小地图、彩虹括号、颜色选择器等 -- **多窗口**:同时处理多个文档 +## 数据流(从键盘到持久化) +1. 用户按键 -> CodeMirror extensions 更新文档。 +2. `contentChangeExtension` 记录脏状态并刷新 `documentStats`(行数、字符数、选区字符数)。 +3. 触发自动保存计时器(默认 2s) -> `DocumentService.UpdateDocumentContent` 写入 SQLite。 +4. 若开启 Git 自动备份,每次 Commit 会序列化数据库 + 附带 `voidraft_data.bin`。 +5. 配置变更(Pinia store)通过 `ConfigService.Set` 传回 Go,并触发观察者(如 WindowSnap/Hotkey/Backup)。 -### 数据管理 - -- **Git 备份**:使用 Git 仓库自动备份 -- **云同步**:跨设备同步你的数据 -- **自动更新**:及时获取最新功能 - -## 为什么选择 voidraft? - -- **专注开发者**:考虑开发者需求而构建 -- **现代技术栈**:使用前沿技术(Wails3、Vue 3、CodeMirror 6) -- **跨平台**:支持 Windows(macOS 和 Linux 支持计划中) -- **开源**:MIT 许可证,社区驱动开发 - -## 开始使用 - -准备好开始了吗?从我们的[发布页面](https://github.com/landaiqing/voidraft/releases)下载最新版本,或继续阅读文档了解更多。 - -下一步:[安装 →](/zh/guide/installation) +## 版本节奏与路线图 +- ✅ 当前实现:多窗口、标签页、HTTP 客户端、Markdown Preview、数学块、彩虹括号、翻译、Git 备份、自动更新。 +- 🚧 进行中:自定义扩展导入、键位模版、Linux/macOS 原生打包。 +- 🗺️ 规划中:剪贴板历史、团队同步、云端模板市场。 +## 下一步 +- [安装 voidraft](/zh/guide/installation) +- [界面总览](/zh/guide/ui-overview) +- [快速开始](/zh/guide/getting-started) diff --git a/frontend/docs/src/zh/guide/keyboard-shortcuts.md b/frontend/docs/src/zh/guide/keyboard-shortcuts.md new file mode 100644 index 0000000..e7c76ad --- /dev/null +++ b/frontend/docs/src/zh/guide/keyboard-shortcuts.md @@ -0,0 +1,74 @@ +# 键盘快捷键 + +![快捷键占位](/img/placeholder-shortcuts.png) +> 替换为展示快捷键设置界面或常用快捷键速查表的截图。 + +快捷键定义源自 `internal/models/key_bindings.go`,在设置 > 键位 中可以启用/禁用或改写。下表列出常用组合: + +## 块管理 +| 功能 | 默认快捷键 | 备注 | +| --- | --- | --- | +| 新建块(下方) | `Ctrl+Enter` | `blockAddAfterCurrent` | +| 新建块(上方) | `Ctrl+Shift+Enter` | `blockAddBeforeCurrent` | +| 跳到上/下一个块 | `Alt+↑ / Alt+↓` | `blockGotoPrevious/Next` | +| 选择当前块 | `Ctrl+Shift+A` | `blockSelectAll` | +| 删除块 | `Alt+Delete` | `blockDelete` | +| 块上移/下移 | `Ctrl+Shift+↑ / Ctrl+Shift+↓` | `blockMoveUp/Down` | +| 复制块 | `Ctrl+C`(块获得焦点) | `blockCopy` | +| 剪切块 | `Ctrl+X` | `blockCut` | +| 粘贴块 | `Ctrl+V` | `blockPaste` | + +## 行与文本编辑 +| 功能 | 快捷键 | +| --- | --- | +| 行复制(上/下) | `Shift+Alt+↑ / Shift+Alt+↓` | +| 行移动(上/下) | `Alt+↑ / Alt+↓`(在块内部) | +| 插入空行 | `Ctrl+Enter`(块尾后仍可插入) | +| 选择整行 | `Alt+L` | +| 语法级跳转 | `Ctrl+Alt+Left / Ctrl+Alt+Right` | +| 匹配括号 | `Shift+Ctrl+\` | +| 注释/块注释 | `Ctrl+/` / `Shift+Alt+A` | +| Tab 缩进/反向缩进 | `Ctrl+]` / `Ctrl+[` | +| 删除单词(向前/向后) | `Ctrl+Backspace` / `Ctrl+Delete` | + +## 搜索与替换 +| 功能 | 快捷键 | 描述 | +| --- | --- | --- | +| 打开搜索 | `Ctrl+F` | `showSearch` | +| 打开替换 | `Ctrl+H` | `searchShowReplace` | +| 切换大小写/整词/正则 | `Alt+C / Alt+W / Alt+R` | `searchToggleCase/Word/Regex` | +| 替换全部 | `Alt+Enter` | `searchReplaceAll` | + +## Markdown/预览/格式化 +| 功能 | 快捷键 | +| --- | --- | +| 格式化块 | `Ctrl+Shift+F` | +| 打开 Markdown 预览 | 工具栏按钮(建议映射到 `Ctrl+Shift+M`) | +| 高亮文本 | `Mod+Shift+H` | + +## 窗口与系统 +| 功能 | 快捷键 | +| --- | --- | +| 新建窗口 | `Ctrl+Shift+N`(命令面板) | +| 全局显示/隐藏所有窗口 | 默认 `Alt+X`(可在设置 > 通用 > 全局热键中修改) | +| 打开设置 | `Ctrl+,` | +| 切换主题 | `Ctrl+Shift+T`(可自定义) | + +## HTTP 客户端 +| 功能 | 快捷键 | +| --- | --- | +| 运行请求 | 点击行号旁 Run 或自定义 `Ctrl+Alt+R` | +| 复制响应正文 | `Ctrl+Alt+C`(响应块聚焦时) | + +## 翻译工具 +| 功能 | 快捷键 | +| --- | --- | +| 显示翻译浮层 | 选中 ≥ `minSelectionLength` 的文本后按 `Ctrl+'`(可自定义) | +| 复制译文 | 在浮层中按 `Ctrl+C` | + +## 自定义与导出 +1. 打开设置 > 键位,列表会加载来自 `ExtensionService.GetAllKeyBindings()` 的数据。 +2. 可单独禁用某个绑定或录入新组合;存储在 `%USERPROFILE%/.voidraft/data/key_bindings.json`。 +3. 需要与系统级快捷键冲突时,可勾选“忽略系统修饰键”。 + +> 建议将以上表格打印贴在工作区,或在文档中保留常用组合,方便新同事查阅。 diff --git a/frontend/docs/src/zh/guide/multiwindow-tabs.md b/frontend/docs/src/zh/guide/multiwindow-tabs.md new file mode 100644 index 0000000..a762e26 --- /dev/null +++ b/frontend/docs/src/zh/guide/multiwindow-tabs.md @@ -0,0 +1,67 @@ +# 多窗口与标签页 + +![多窗口占位](/img/placeholder-multiwindow.png) +> 替换为展示主窗口 + 侧边浮窗(子窗口)或标签页齐开的截图。 + +## 多窗口工作流 +- `WindowService.OpenDocumentWindow` 会根据文档 ID 创建新 WebView 窗口,URL 自动附加 `?documentId=`。 +- `windowStore` 通过查询字符串判断当前是否为子窗口(非主窗口)。 +- 子窗口具备: + - 独立的 CodeMirror 实例与扩展栈。 + - 与主窗口共享的 Document/Config Store,因此编辑内容实时同步(SQLite 数据库为唯一来源)。 + - `WindowSnapService` 提供吸附:拖动靠近主窗口边缘时自动贴靠;支持上下左右以及四个角。 + - 关闭时自动注销吸附状态,避免悬挂引用。 + +### 操作步骤 +1. 打开文档列表(工具栏图标或 `Ctrl+Shift+O`)。 +2. 右键目标文档 → 选择 “在新窗口中打开”。 +3. 若文档已在标签页打开,会自动从标签栏移除,防止重复。 +4. 关闭窗口: + - 点击自定义标题栏关闭按钮。 + - 系统托盘菜单选择退出。 + +### 使用建议 +- 将参考资料或检查清单放在子窗口中,配合“窗口置顶”保持常驻。 +- 通过 Windows Snap + voidraft Snap 组合,可快速排版 2-4 个窗口。 +- 若想在多窗口之间同步滚动,可尝试启用“共享视图状态”扩展(计划中)。 + +## 标签页模式 +- 在设置 > 通用中开启“启用标签页”(`config.general.enableTabs`)。 +- `tabStore` 维护 `tabsMap` + `tabOrder`,支持: + - 拖拽排序(拖动标签即可)。 + - 关闭单个/其他/左侧/右侧标签。 + - 检测当前文档是否已存在标签。 +- 标签栏位于主窗口顶部,紧贴工具栏下方。 + +### 常用操作 +| 操作 | 方法 | +| --- | --- | +| 关闭标签 | 点击标签上的叉号或中键 | +| 关闭其他 | 右键标签 → “关闭其他标签” | +| 关闭右侧/左侧 | 右键标签 → 选择对应菜单 | +| 固定标签(计划中) | 将在后续版本中提供 pin 功能 | + +### Tabs vs 窗口 +| 项目 | 标签页 | 新窗口 | +| --- | --- | --- | +| UI 占用 | 集成在一个窗口中 | 独立操作系统窗口 | +| 跨屏 | 不方便 | 可拖到其他显示器 | +| 独立置顶 | 不可单独置顶 | 每个窗口可单独置顶 | +| 推荐场景 | 同一背景的多个文档 | 跨项目/跨显示器对比 | + +## 系统托盘与热键 +- 勾选 “启用系统托盘” 后,关闭窗口默认隐藏至托盘。 +- 全局热键(默认 `Alt+X`)由 `HotkeyService` 控制: + - 若 main window 可见 → 隐藏所有 voidraft 窗口。 + - 若 main window 隐藏 → Show + Restore + Focus。 +- `TrayService` 还提供“最小化到托盘”“显示主窗口”等菜单项。 + +## 常见问题 +| 问题 | 原因 | 解决 | +| --- | --- | --- | +| 新窗口无法打开 | 文档 ID 不存在或被锁定 | 在文档列表确认状态,必要时解锁 | +| 子窗口未吸附 | WindowSnap 未启用 | 设置 > 通用 → 勾选“窗口吸附” | +| 关闭窗口直接退出应用 | 未启用托盘模式 | 设置 > 通用 → 启用系统托盘 | +| 标签页切换慢 | 同时开启标签 + 多窗口导致资源占用 | 关闭暂不需要的窗口或减少标签 | + +> 如果需要更复杂的布局(如平铺窗口、快捷布局),欢迎在 Issue 中提出建议。 diff --git a/frontend/docs/src/zh/guide/settings.md b/frontend/docs/src/zh/guide/settings.md new file mode 100644 index 0000000..80f667a --- /dev/null +++ b/frontend/docs/src/zh/guide/settings.md @@ -0,0 +1,71 @@ +# 设置与配置 + +![设置占位](/img/placeholder-settings.png) +> 替换为设置页截图,突出通用/编辑/外观/更新/备份等分栏。 + +所有设置都映射到 `internal/models/config.go`,持久化文件位于 `%USERPROFILE%/.voidraft/data/config.json`。前端 `configStore` 负责与后端 `ConfigService` 同步。 + +## 通用(General) +| 选项 | 说明 | 后端键 | +| --- | --- | --- | +| 窗口置顶 (`alwaysOnTop`) | 永久置顶主窗口 | `general.alwaysOnTop` | +| 数据目录 (`dataPath`) | SQLite + 备份所在目录,修改后需重启 | `general.dataPath` | +| 系统托盘 (`enableSystemTray`) | 关闭窗口后隐藏到托盘而非退出 | `general.enableSystemTray` | +| 开机自启 (`startAtLogin`) | 调用 `StartupService` 注册 | `general.startAtLogin` | +| 窗口吸附 (`enableWindowSnap`) | `WindowSnapService` 是否启用 | `general.enableWindowSnap` | +| 全局热键 (`enableGlobalHotkey` + `globalHotkey`) | 默认 Alt+X,控制显隐 | `general.globalHotkey` | +| 标签页 (`enableTabs`) | 启用多标签界面 | `general.enableTabs` | +| 加载动画 (`enableLoadingAnimation`) | 切换文档时显示动画 | `general.enableLoadingAnimation` | + +## 编辑(Editing) +| 选项 | 说明 | +| --- | --- | +| Font Size/Family/Weight/Line Height | 立即作用于所有编辑器实例 | +| Tab Size/Tab Type/Enable Tab Indent | 映射 `tabExtension` 行为 | +| Auto Save Delay | ms,影响 `editorStore` 自动保存周期 | + +## 外观(Appearance) +| 选项 | 说明 | +| --- | --- | +| Language | UI 语言(`zh-CN`/`en-US`) | +| System Theme | 深色/浅色/跟随系统 | +| Current Theme | 选择预设或自定义主题(详见 [主题与外观](/zh/guide/themes)) | + +## 更新(Updates) +| 选项 | 说明 | +| --- | --- | +| Auto Update | 启动时自动检查更新 | +| Primary/Backup Source | `github` 或 `gitea`,对应 `UpdatesConfig` | +| Backup Before Update | 下载更新前执行 Git 备份 | +| Update Timeout | HTTP 请求超时 | +| GitHub/Gitea 仓库 | owner/repo/baseURL,可指向自建镜像 | + +## 备份(Backup) +| 选项 | 说明 | +| --- | --- | +| Enabled | 开关 Git 备份 | +| Repo URL | 远程仓库地址(HTTPS 或 SSH) | +| Auth Method | `token` / `ssh_key` / `user_pass` | +| Username/Password/Token/SSH Key Path | 根据认证方式填写 | +| Backup Interval | 自动备份间隔(分钟) | +| Auto Backup | 是否按间隔自动推送 | + +## 键位(Key Bindings) +- 列表由 `ExtensionService.GetAllKeyBindings()` 提供。可搜索命令 ID 或组合。 +- 允许将命令禁用(关闭开关)或录入新组合。 +- 更改立即影响所有编辑器实例。 + +## 扩展(Extensions) +- 显示 `ExtensionSettings` 中的所有扩展。 +- 每项可开关并展示 JSON 配置(背景色、最小选区、最小化提示等)。 +- 修改后调用 `ExtensionService.UpdateExtensionState` 并通知 `ExtensionManager` 热更新。 + +## 配置文件备份 +- 每次修改配置都会更新 `metadata.lastUpdated`,可用 Git 备份追踪历史。 +- 若出现配置损坏,可删除 `config.json`,应用会写入 `NewDefaultAppConfig`。 + +## 导入/导出(建议) +- 目前可手动复制 `config.json`/`extensions.json`/`key_bindings.json`。 +- 计划提供 UI 层面的导入导出按钮,便于跨设备同步。 + +> 修改高级选项(如 dataPath)后建议重启,以确保后台服务(数据库、备份、窗口吸附等)读取到最新配置。 diff --git a/frontend/docs/src/zh/guide/themes.md b/frontend/docs/src/zh/guide/themes.md new file mode 100644 index 0000000..3e56c17 --- /dev/null +++ b/frontend/docs/src/zh/guide/themes.md @@ -0,0 +1,44 @@ +# 主题与外观 + +![主题占位](/img/placeholder-themes.png) +> 替换为主题切换界面或自定义主题编辑器的截图。 + +voidraft 的主题由后端 `ThemeService` 管理,存储在 `themes` 表。前端通过 `themeStore` + `createThemeExtension` 应用色板。 + +## 预设主题 +| 名称 | 类型 | 说明 | +| --- | --- | --- | +| default-dark | Dark | 默认暗色,适合低光环境 | +| default-light | Light | 默认亮色 | +| dracula | Dark | 高对比度紫色系 | +| aura | Dark | 柔和霓虹风 | +| github-dark / github-light | Dark/Light | 与 GitHub 主题接近 | +| material-dark / light | Dark/Light | Material Design 色板 | +| one-dark | Dark | VSCode 经典主题 | +| solarized-dark / light | Dark/Light | Solarized 配色 | +| tokyo-night / storm / day | Dark/Light | Tokyo Night 三件套 | + +## 自定义主题 +1. 打开设置 > 外观,选择「创建主题」。 +2. 颜色字段对应 `ThemeColorConfig`,包含 `editor.background`, `editor.foreground`, `gutter`, `selection`, `bracket`, `keyword`, `string`, `comment`, `accent` 等。 +3. 保存后立即写入数据库,可通过 `Reset` 按钮恢复为预设值。 +4. 前端 `themeExtension` 会向 CodeMirror 注入新的 `EditorView.theme`。 + +## 动态切换 +- 切换主题会立即影响所有已打开的编辑器实例;`updateEditorTheme` 逐个更新 `EditorView`。 +- `SystemTheme` 设为 `auto` 时,voidraft 会监听操作系统深浅模式并自动切换到 `default-dark` 或 `default-light`。 + +## 字体与行高 +- 字体配置来自设置 > 编辑,`createFontExtensionFromBackend` 会同步 `fontFamily/fontSize/fontWeight/lineHeight`。 +- 可在通用设置中的“滚轮缩放”手势下临时调整字号。 + +## 小地图/装饰色 +- `minimap` 扩展读取主题中的 `accent` 颜色,用于高亮当前视区。 +- `textHighlight` 扩展的默认背景色可在扩展设置中配置。 + +## 截图建议 +- 展示暗/亮主题对比。 +- 展示主题编辑对话框,标出关键字段。 +- 展示自定义主题应用后的编辑器界面。 + +> 如果希望导入 VSCode `.json` 主题,可将颜色映射到 `ThemeColorConfig` 后写入数据库,或等待官方导入工具上线。 diff --git a/frontend/docs/src/zh/guide/troubleshooting.md b/frontend/docs/src/zh/guide/troubleshooting.md new file mode 100644 index 0000000..5c9a1de --- /dev/null +++ b/frontend/docs/src/zh/guide/troubleshooting.md @@ -0,0 +1,53 @@ +# 常见问题与故障排查 + +![故障排查占位](/img/placeholder-troubleshooting.png) +> 替换为错误提示或日志查看界面的截图。 + +## 安装与启动 +| 问题 | 可能原因 | 解决步骤 | +| --- | --- | --- | +| 启动白屏 | WebView2 缺失或缓存损坏 | 安装 WebView2 Runtime;删除 `%APPDATA%/voidraft/Cache` 后重启 | +| 双击无反应 | 被安全策略拦截 | 以管理员运行或使用便携版;验证 SHA256 后加入白名单 | +| `wails3 dev` 报错 | Go/Node 版本不符或缺少 WebView2 | 确保 Go 1.21+、Node 18+,安装 WebView2 | + +## 编辑器 +| 问题 | 原因 | 解决 | +| --- | --- | --- | +| 格式化按钮灰色 | 当前块语言无对应 Prettier parser | 更换语言或安装支持的语言扩展(未来版本) | +| 块解析错误 | 分隔符格式不正确 | 确认 `∞∞∞language` 后跟换行;可用自动重建语法树命令 | +| 翻译浮层不出现 | 选区过短或超过最大长度 | 在设置 > 扩展 > translator 中调整阈值 | +| 小地图不同步 | 编辑器实例未刷新 | 切换文档或重开应用,检查扩展是否被禁用 | + +## 窗口与多实例 +| 问题 | 原因 | 解决 | +| --- | --- | --- | +| 子窗口未吸附 | WindowSnap 未启用 | 设置 > 通用 → 勾选“窗口吸附” | +| 全局热键无效 | 与系统/其他软件冲突 | 在设置 > 通用改用非系统占用组合,比如 `Ctrl+Alt+Space` | +| 关闭窗口直接退出 | 未启用托盘模式 | 设置 > 通用 → 启用系统托盘 | + +## HTTP 客户端 +| 问题 | 可能原因 | 解决 | +| --- | --- | --- | +| 发送失败,提示 `proxy` | 系统代理配置异常 | 在系统代理或环境变量中设置 HTTP(S)_PROXY,或关闭代理再试 | +| 响应乱码 | 服务器未声明编码 | 手动在请求头中加 `accept-charset: utf-8`,或在响应视图切换编码(计划) | +| 变量未替换 | 变量名拼写或作用域错误 | 确认 `@var` 定义位置,使用 `{{name}}` 语法 | + +## 数据与备份 +| 问题 | 可能原因 | 解决 | +| --- | --- | --- | +| 自动备份停在 “未初始化” | Repo URL/认证缺失 | 补全备份配置或关闭自动备份 | +| Push 失败 | Token 权限不足或网络问题 | 为 Token 开启 `repo` scope;检查代理;稍后再试 | +| 数据目录迁移后文件缺失 | 未重启或权限不足 | 修改 `dataPath` 后重启应用;确保目标目录可写 | + +## 更新 +| 问题 | 原因 | 解决 | +| --- | --- | --- | +| 检查更新超时 | 主源不可达 | 切换到备用源或关闭代理重试 | +| 下载完成但未重启 | 权限或文件被占用 | 以管理员运行,关闭杀毒软件后重试 | + +## 收集日志 +- Wails 日志:`%LOCALAPPDATA%/voidraft/logs/*.log`。 +- 终端调试:运行 `wails3 dev` 并观察控制台输出。 +- 若提交 Issue,请附上:系统版本、voidraft 版本、日志片段、复现步骤。 + +> 仍未解决?请到 GitHub Issues 提交反馈,并尽可能附上截图和日志。 diff --git a/frontend/docs/src/zh/guide/ui-overview.md b/frontend/docs/src/zh/guide/ui-overview.md new file mode 100644 index 0000000..15101a7 --- /dev/null +++ b/frontend/docs/src/zh/guide/ui-overview.md @@ -0,0 +1,46 @@ +# 界面总览 + +![界面截图占位](/img/placeholder-main-ui.png) +> 替换为包含顶部工具栏、块区域、右侧小地图、底部状态栏的完整截图。 + +voidraft 的主窗口由四个区域组成: + +| 区域 | 位置 | 作用 | 相关代码 | +| --- | --- | --- | --- | +| 工具栏 | 顶部浮层 | 文档切换、块语言选择、格式化、Markdown 预览、窗口置顶、更新提示、进入设置 | `frontend/src/components/toolbar/Toolbar.vue` | +| 编辑器主体 | 中央 | CodeMirror 6 视图,承载块编辑、HTTP 运行器、翻译按钮等 | `frontend/src/views/editor/Editor.vue` + `extensions` | +| 导航辅助 | 右侧 | 小地图、滚动条、块徽标、HTTP 运行按钮 | `extensions/minimap`, `codeblock/decorations.ts` | +| 底部状态 | 左下角 | 行数、字符数、选区统计、文档脏状态 | `editorStore.documentStats` | + +## 工具栏详解 +| 项 | 说明 | 快捷入口 | +| --- | --- | --- | +| 文档切换器 | 展开后列出全部文档,支持搜索、创建、在新窗口打开 | 同步 `DocumentService.ListAllDocumentsMeta` | +| 块语言下拉 | 当前块语言,列表取自 `lang-parser/languages.ts`,支持搜索 | 鼠标选择或输入语言 token | +| Pin(窗口置顶) | 临时 / 永久置顶切换,调用 `SystemService.SetWindowOnTop` 与 `config.general.alwaysOnTop` | Alt+Space(自定义) | +| Format / Preview | 对当前块执行 Prettier 或打开 Markdown 预览 | `Ctrl+Shift+F` / 工具栏按钮 | +| 更新提示 | 轮询 `SelfUpdateService`,有更新时显示小点,可直接“检查/下载/重启” | 设置 > 更新 | +| 设置入口 | 跳转到 Vue Router 的 `/settings` 页面 | `Ctrl+,` | + +## 多文档视图 +- **标签页(可选)**:在设置 > 通用中启用“标签页模式”,`tabStore` 将当前文档加入 tab bar,支持拖拽、批量关闭。 +- **多窗口**:以文档列表右键「在新窗口中打开」或命令面板为入口。`WindowService` 会根据文档 ID 命名窗口,`WindowSnapService` 自动吸附。 +- **系统托盘**:关闭窗口时默认最小化到托盘,可在托盘图标中重新唤醒或彻底退出。 + +## 面板与浮层 +- **Markdown 预览**:针对选中的 Markdown 块,面板会贴在右侧,支持实时滚动同步、关闭动画。 +- **HTTP 响应**:运行后在块底部自动插入 `### Response`,可展开查看头部/体/耗时。 +- **翻译浮层**:选中文本后自动出现按钮,点击后显示结果卡片,附带复制、语种切换。 + +## 快捷状态 +- **底部统计**: + - `Ln`:当前块内行号。 + - `Ch`:字符数。 + - `Sel`:选区字符数。 +- **右上角加载动画**:当编辑器实例加载或切换文档时显示,遵循 `enableLoadingAnimation` 设置。 + +## 建议截图 +1. 默认深色主题 + 多块示例。 +2. 打开 Markdown 预览 + 小地图。 +3. 展示 HTTP 块运行按钮与响应卡片。 +4. 展示标签页或多窗口。