From 8c6b08cec80cf7140481ee3857e821a7ff68334c Mon Sep 17 00:00:00 2001 From: titor Date: Mon, 6 Apr 2026 05:15:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=A8=A1=E5=9D=975?= =?UTF-8?q?=20-=20TUI=E5=BF=AB=E6=8D=B7=E9=94=AE=E7=B3=BB=E7=BB=9F=20(Ctrl?= =?UTF-8?q?+L=E6=B8=85=E7=A9=BA/Ctrl+T=E5=88=87=E6=8D=A2=E8=AF=AD=E8=A8=80?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 7 ++++--- internal/tui/app.go | 25 +++++++++++++++++++++++-- memory.md | 2 ++ taolun.md | 25 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index c69560d..9819dbe 100644 --- a/changelog.md +++ b/changelog.md @@ -29,6 +29,7 @@ - [x] 模块2: 输入组件 ✅ 已完成 - [x] 模块3: 翻译显示区 ✅ 已完成 - [x] 模块4: 状态栏/主题 ✅ 已完成 +- [x] 模块5: 快捷键系统 ✅ 已完成 ## TUI界面实现计划 (v0.6.0) | 步骤 | 模块 | 内容 | 状态 | @@ -37,7 +38,7 @@ | 2 | 输入组件 | 文本输入框、光标、基础编辑 | ✅ 已完成 | | 3 | 翻译显示区 | 结果展示、格式化、滚动 | ✅ 已完成 | | 4 | 状态栏/主题 | 底部状态栏、语言选择、主题配色 | ✅ 已完成 | -| 5 | 快捷键系统 | 退出、清空、切换语言等 | ⏳ 待实现 | +| 5 | 快捷键系统 | 退出、清空、切换语言等 | ✅ 已完成 | | 6 | 集成翻译 | 对接现有Translator、加载动画 | ⏳ 待实现 | ## 待修复BUG @@ -54,7 +55,7 @@ - ✅ 模块2: 输入组件 - textinput组件、基础输入处理 - ✅ 模块3: 翻译显示区 - 结果显示区域、样式定义 - ✅ 模块4: 状态栏/主题 - 底部状态栏、语言显示、配色完善 -- ⏳ 模块5: 快捷键系统 - 待实现 +- ✅ 模块5: 快捷键系统 - Ctrl+L清空、Ctrl+T切换语言 - ⏳ 模块6: 集成翻译 - 待实现 **技术实现**: @@ -67,7 +68,7 @@ - [TUI界面模块拆分计划](taolun.md#2026-04-06-1000-版本-060---tui界面模块拆分计划) **下一步**: -- 实现模块5: 快捷键系统 +- 实现模块6: 集成翻译 --- diff --git a/internal/tui/app.go b/internal/tui/app.go index ffe8a78..1404d9e 100644 --- a/internal/tui/app.go +++ b/internal/tui/app.go @@ -14,6 +14,7 @@ type model struct { textInput textinput.Model result string targetLang string + langIndex int } var ( @@ -37,8 +38,12 @@ var ( langStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#FBBF24")). Bold(true) + keyStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#60A5FA")) ) +var supportedLangs = []string{"zh-CN", "en-US", "ja", "ko", "zh-TW", "es", "fr", "de"} + func NewApp(cfg *config.Config, t *translator.Translator) *tea.Program { targetLang := "zh-CN" if cfg != nil && cfg.DefaultTargetLang != "" { @@ -71,7 +76,19 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.Type { case tea.KeyEnter: // 回车键处理,后续模块会添加翻译逻辑 - case tea.KeyCtrlC, tea.KeyEsc: + case tea.KeyCtrlC: + return m, tea.Quit + case tea.KeyCtrlL: + // Ctrl+L: 清空输入和结果 + m.textInput.SetValue("") + m.result = "" + return m, nil + case tea.KeyCtrlT: + // Ctrl+T: 切换语言 + m.langIndex = (m.langIndex + 1) % len(supportedLangs) + m.targetLang = supportedLangs[m.langIndex] + return m, nil + case tea.KeyEsc: return m, tea.Quit } } @@ -82,7 +99,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { func (m model) View() string { resultBox := m.renderResult() - helpText := helpStyle.Render("\n Ctrl+C 退出 · Enter 翻译") + helpText := helpStyle.Render("\n " + + keyStyle.Render("Ctrl+L") + " 清空 " + + keyStyle.Render("Ctrl+T") + " 切换语言 " + + keyStyle.Render("Enter") + " 翻译 " + + keyStyle.Render("Ctrl+C") + " 退出") return "\n" + " " + headerStyle.Render("YOYO翻译") + "\n" + diff --git a/memory.md b/memory.md index a45bd23..01fdf20 100644 --- a/memory.md +++ b/memory.md @@ -621,6 +621,8 @@ var ( Background(lipgloss.Color("#0D1B2A")) helpStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#888888")) + keyStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#60A5FA")) ) ``` diff --git a/taolun.md b/taolun.md index 343f5c3..86df6f6 100644 --- a/taolun.md +++ b/taolun.md @@ -518,5 +518,30 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { **下一步**: 实现模块5: 快捷键系统 +**关联文档**: +- [changelog.md#0.6.0](changelog.md#060) + +--- + +### [2026-04-06 12:30] 版本 0.6.0 - 模块5: 快捷键系统 (已完成) +**原因**: 添加键盘快捷键提升用户体验 +**分析**: +- 需要常用操作快捷键 +- 需要清晰显示快捷键提示 + +**解决方案**: +1. 添加Ctrl+L: 清空输入和结果 +2. 添加Ctrl+T: 循环切换语言 +3. 添加keyStyle样式高亮快捷键 +4. 更新帮助提示显示所有快捷键 + +**快捷键列表**: +- `Ctrl+L`: 清空输入框和翻译结果 +- `Ctrl+T`: 循环切换目标语言 (zh-CN→en-US→ja→ko→...) +- `Ctrl+C`/`Esc`: 退出程序 +- `Enter`: 翻译 (后续模块实现) + +**下一步**: 实现模块6: 集成翻译 + **关联文档**: - [changelog.md#0.6.0](changelog.md#060) \ No newline at end of file