Repository navigation
fix(desktop): LSP 日志级别前缀着色、自动换行与横向滚动,状态栏打开语言服务菜单 - #1876
Merged
Merged
Conversation
- 日志行的 [INFO]/[ERROR] 等级别前缀单独着色:信息用强调色,错误红、警告黄、调试与跟踪灰; 错误、警告、调试行的正文继续按级别着色。 - 日志页签工具栏新增“自动换行”开关。关闭时长行保持单行,整个列表按最宽的行横向滚动 (触控板或 Shift+滚轮);开启时按页签宽度换行。 - 多行日志事件拆成多行,制表符展开为 4 个空格;单行超过 4096 字节按字符边界截断并加“…”。 - 点击状态栏的 LSP 状态不再直接打开日志,而是在上方弹出“语言服务”菜单:每个服务器一行, 图标形状表示状态,附状态与版本,子菜单可查看日志、重启、停止;其后是查看日志、重启所有服务器、 停止所有服务器和“管理语言服务器插件…”;没有服务器时显示“未注册语言服务器”。 - 状态栏圆点按服务器状态着色。 Closes #1875
xiaoyumuxi
marked this pull request as ready for review
November 13, 2026 18:40
This was referenced Nov 13, 2026
2 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
关联 Issue / Linked issue
PR 类型 / Type
改动说明 / What changes
背景 / Why
#1873 合入后,Viva 桌面端(
desktop/)的 LSP 日志已经是普通页签,但用户实际使用时还有三个问题:[INFO]、[ERROR]等级别前缀和正文颜色相同,看不出级别。改动 / Changes
级别前缀单独着色(
lsp_status.go)lspLogLine新增tag字段,记录[LEVEL]前缀的字节长度,parts()拆成前缀和正文两段,页签里画成两个标签。lspLevelColor:ERROR用主题危险色,WARN/WARNING用警告色,DEBUG/TRACE用弱化色,其余级别(INFO、NOTICE等)用强调色。lspLogColor:错误、警告、调试行的正文继续按级别着色,信息行正文是普通文字色。长行:横向滚动与自动换行(
lsp_status.go)lspLogLine.width里(measureLogLines),之后不再重复测量。RowWidth取最宽的行加左右内边距,长行保持单行,整个列表可以横向滚动(触控板或 Shift+滚轮)。行用Text加Shrink(0),不会被压缩截断。native.softWraps,按钮名lspWrap)。开启后RowWidth为 0,行用ui.Wrap按页签宽度换行;切换时横向滚动回到最左边(ScrollToX(0))。List目前不绘制横向滚动条,只能用触控板或 Shift+滚轮横向滚动。这是 Viva 的能力缺口,按仓库规则不在应用层绕过。日志事件的行处理(
recordServerEvent、appendLog、cutLogLine)\n、\r\n)拆成多行,只有第一行带[LEVEL]前缀,后续行保留相同级别,正文颜色一致。lspLogTab),避免宽度测量和绘制不一致。lspLogLineBytes)从 600 字节放宽到 4096 字节,原来 600 字节会切掉常见的堆栈行和 JSON 消息。超出时仍按字符边界截断,不会切坏多字节字符;现在会加上“…”标记(lspLogCut),原来是无标记地静默截断。logsAdded同样按行计数,所以自动跟随到底部的判断不变。状态栏“语言服务”菜单(
lsp_status.go、app.go、chrome_view.go)a.editor.lsp.menu,在状态项上方弹出菜单(lspStatusMenu,ui.Menu加Above())。菜单内容与旧 macOS 客户端的“语言服务”菜单一致:native.languageServices)。lspPhaseIcon),附“状态 · 版本”。子菜单包括:native.restartAllServers)native.stopAllServers)desktop.lsp.managePlugins),打开设置窗口的插件页。native.noRegisteredLanguageServers)。lspStatusColor):就绪绿、出错红、已停止灰、启动中黄。原来固定是弱化色。lspPhase枚举和phase(),状态文字、图标和颜色都由它决定。原来写在lspStatusText里的状态文字抽成lspPhaseText(server),菜单中的每个服务器也用它,词条键不变。showLSPLog(打开或聚焦页签并切到指定服务器)和restartLSPServer,供菜单和页签工具栏共用。i18n(
shared/i18n/、desktop/internal/i18n/shared.generated.go)desktop.lsp.managePlugins,中文“管理语言服务器插件…”,英文“Manage Language Server Plugins…”。desktop,文案不变,并重新生成:native.inline.viewLogsnative.noRegisteredLanguageServersnative.restartAllServersnative.stopAllServersnative.softWraps功能矩阵(
shared/platform-feature-matrix/features/lsp-status-logs.json)chrome_view.go。状态字段不变。测试(
lsp_status_test.go、close_tab_shortcut_test.go)TestLSPLogSplitsLinesAndCutsHugeOnes:多行拆分、前缀只在第一行、制表符展开、中文长行按字符边界截断。TestLSPStatusMenuListsTheServersAndStopsThem:TestLSPLogScrollsSidewaysOrWrapsLongLines:TestLSPLogLineColorFollowsTheEventLevel:增加lspLevelColor的检查,并检查页签实际绘制的颜色:[INFO]是强调色,正文是普通文字色,[ERROR]和它的正文都是危险色。TestLSPLogIsBounded:增加对截断标记的检查。openLSPLogFromStatus:按用户的操作路径,先点状态项打开菜单,再点“查看日志”。TestCloseTabShortcutClosesTheSelectedEditorTab也改用它打开日志页签。不在本 PR 范围内 / Out of scope
List的横向滚动条:属于 Viva 能力缺口,应在 Lithe-IDEA/viva fork 中补,不在应用层绕过。类型专属:fix
复现与根因
[INFO]和正文颜色相同;长行被截断,不能横向滚动,没有自动换行开关;多行事件挤在一行。期望结果:前缀单独着色;长行可以横向滚动,或者切换成自动换行;多行事件分行显示。git log -S itemLSP)。日志行一直是没有RowWidth的单个Text,所以不能横向滚动;每个事件只追加一行。lspLogColor给整行统一着色,没有把级别前缀拆出来(git log -S lspLogColor)。检查项
desktop/internal/workbench/lsp_status_test.go。新测试用到 preview 上没有的字段和函数,没法直接在 preview 上编译,所以把实现文件换回 preview(6bc91bc57)的版本,用只依赖 preview 已有接口的等价临时测试运行。失败输出如下:lspLogLine只在lsp_status.go和它的测试中使用。filterLogLines、lspLogColor、openLSPLog的调用方都在lsp_status.go、app.go和测试中。itemLSP只在app.go的activate中处理。chromeStatusItem的弹出层只在chrome_view.go中。showLSPLog和restartLSPServer是为了让菜单和工具栏复用同一流程而抽出的;lspPhase是为了让状态文字、图标、颜色共用一个判断。发现的既有问题(Viva 不画横向滚动条)属于 Viva,见“不在本 PR 范围内”。.agents/notes/implemented/bug-fix/记录:没有新增需要长期记住的取舍。行为已由回归测试和功能矩阵的 notes 固定。范围检查 / Scope checks
功能矩阵 / Feature matrix
shared/platform-feature-matrix/features/lsp-status-logs.json的 notes 和两端的证据路径。实现状态和验证状态未改:Windows 没有实机验证,保持原状态。./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh(validated 223 platform capabilities)和./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD(matrix change gate passed)。.artifacts/下生成的矩阵视图。统一日志系统 / Structured logging
app.action.performed事件,没有新增事件 ID,也没有直接输出:lsp.log.open、lsp.server.restart、lsp.server.stop、lsp.servers.restartAll、lsp.servers.stopAll,surface 为menu。lsp.log.wrap,surface 为button。openPluginSettings记settings.open,surface 为menu。node scripts/logging/generate-log-events.mjs --check和node scripts/logging/verify-log-usage.mjs:未完成。scripts/logging/下的门禁脚本已被移除,无法运行;恢复工作由 [Feature] 恢复 Viva 日志事件类型生成和目录使用门禁 #1802 跟踪。界面文案 / i18n
desktop.lsp.managePlugins,中英文都已补齐;复用的五个已有词条只在平台范围加上desktop。已用node scripts/i18n/generate-i18n.mjs重新生成,没有手改生成文件。node scripts/i18n/verify-app-language-localization.mjs和node scripts/i18n/generate-i18n.mjs --check,都通过;没有放宽脚本或扩大豁免名单。逻辑归属 / Logic placement
filterLogLines的匹配规则没有变。日志页签改读 Core 统一日志并交给 Core 筛选的工作,已由refactorIssue [Feature] Viva LSP 日志页签自存 500 行并在 Go 里筛选:改为通过 Core 查询统一 v2 日志,删除平台层缓冲与 filterLogLines #1869 跟踪。性能与内存 / Performance and memory
desktop/internal/editor/**、editorview/**),也没有新增依赖。设置 / Settings
N/A:没有新增或修改设置项。“管理语言服务器插件…”只是打开已有的插件设置页。
插件契约 / Plugin contract
N/A:不涉及插件契约、能力版本、插件函数协议或宿主方法。
发行包与资源 / Bundle and resources
./scripts/desktop/verify/verify-runtime-bundle-immutability.sh,通过。无用代码与重构 / Dead code and refactoring
lspStatusText里被lspPhaseText取代的状态判断。refactor标签的 Issue,没有在本 PR 顺手处理:[Feature] Viva LSP 日志页签自存 500 行并在 Go 里筛选:改为通过 Core 查询统一 v2 日志,删除平台层缓冲与 filterLogLines #1869。验证 / Verification
gofmt -l(改动的 Go 文件)scripts/desktop/desktop-go.sh vet ./...scripts/desktop/desktop-go.sh test ./internal/workbench/ ./internal/settingswindow/(基于最新 preview 6bc91bc)scripts/desktop/desktop-go.sh test ./internal/workbench/ -run 'TestLSP|TestCloseTab' -count=1 -v.agents/skills/write-stable-tests/scripts/test-stability-macos.sh --package ./internal/workbench --filter '<本 PR 新增和改写的测试>'(静态检查加计时运行)./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEADnode scripts/i18n/verify-app-language-localization.mjsnode scripts/i18n/generate-i18n.mjs --check./scripts/desktop/verify/verify-runtime-bundle-immutability.sh未能执行的检查和原因:
scripts/logging/*):脚本已被移除,见 [Feature] 恢复 Viva 日志事件类型生成和目录使用门禁 #1802。提交前确认 / Final checks
preview(6bc91bc57)创建;目标分支为preview。.build/、target/、dist/、.artifacts/等产物,没有凭据、个人路径和未脱敏的日志或截图。