Repository navigation
fix(macos): 日志窗口自适应布局、恢复编辑器“LSP 日志”标签页与齿轮菜单图标 - #1700
Conversation
- 日志表格按视口分配多余宽度,只在表头拖动结束后保存手动列宽 - 实时批次只增量替换末尾行,跟随滚动平滑衔接并遵守减少动态效果 - ⌘F 由所属窗口处理,工作台快捷键分发前先交给日志窗口 - 通道列表改用原生表格,支持 ⌘ 点击增减和 Shift 连选 - 新增时间范围弹层(系统日历与时分秒),事件分布显示秒级刻度 - 筛选、通道、跟随、调用链、时间范围补充 ⓘ 说明 - 语言服务器“查看日志”打开独立窗口,不再改写应用日志窗口的筛选 - 齿轮菜单的插件与日志项增加图标
Lithe Review结论: 未发现需要阻塞合并的问题。 Findings
Scope Check
Suggestions
Summary整体复用边界清晰,测试覆盖了主要接线和基础交互;手动列宽提交及长日志刷新仍有上述非阻塞问题。 Verification
|
Lithe 运行验收版本: 对照:共同祖先
未覆盖:
工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。 |
- 状态栏语言服务器菜单的“查看日志”改为打开编辑器标签页“LSP 日志”, 删除上一版的独立语言服务器日志窗口;每个工作区只有一个该标签, 再次打开其他服务器时复用并切换服务器。 - 标签页参与混合标签顺序、拖动排序和分组,⌘W 与关闭按钮走统一关闭路径, 切换文档时让出选中,重置工作区内容时移除并停止查询。 - 顶部工具栏:服务器选择、“服务器日志”说明 ⓘ、最低级别(信息/警告/错误)、 “清空视图”。清空只隐藏当前服务器已显示的记录,切换服务器后各自保留清空点, 不删除已采集的诊断日志。 - 数据来自结构化日志的 lsp/<id> 通道,按 Core 解析出的通道查询; 不提供“全部服务器”视图,也不提供 Server Trace 和 RPC 捕获。 - 新增 i18n 词条并重新生成 Localizable.strings;更新三份 Agent Note 与 lsp-status-logs 功能矩阵条目。 - 测试:LogWindowTests 改为验证入口打开编辑器标签且不影响应用日志窗口; LogWindowReviewTests 新增按服务器显示与清空的用例。
Lithe 运行验收版本: 对照:共同祖先
未覆盖:
工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。 |
…esponsive-layout # Conflicts: # shared/platform-feature-matrix/features/diagnostics-export.json # shared/platform-feature-matrix/features/lsp-status-logs.json
概要
这个 PR 修复日志窗口放大或缩小后布局不跟随的问题,把语言服务器的“查看日志”恢复为编辑器区的“LSP 日志”标签页(数据改读 v2 日志),并给齿轮菜单的插件、日志项加上图标。只改 macOS,Windows 仍是 v1 日志,没有变化。
改动点
日志窗口自适应布局(
LogWindowTable.swift、LogWindowView.swift)LogScrollView.tile()在视口变化时重新分配列宽。commitColumnWidths(previous:))。窗口缩放、隐藏列,以及延迟到达的原生列宽通知都不会改写已保存的配置。替换了原来的tableViewColumnDidResize写回逻辑。max(196, 窗口高度 × 0.28)。beginUpdates加 remove/insert)。选择、暂停或状态变化时不再整表重建,已选中的单元格保持不变。筛选、通道与时间范围
LitheSearchField,旁边的 ⓘ 说明表达式语法:AND 组合、-排除、level>=和level:、字段匹配、前缀匹配、/regex/,以及与通道、级别、时间条件取交集的规则。MacWindowFindTarget.swift):日志窗口里按 ⌘F 会聚焦筛选框,不再被编辑器抢走。MacShortcutDetector先把事件交给所在窗口的 Find 目标,再分发工作台快捷键。有 sheet 弹出或输入法正在组字时,不接管按键;窗口关闭时移除事件监听。LogChannelList.swift,删除LogChannelRow):通过共享列表的原生渲染入口承载NSTableView。⌘ 点击增减通道,Shift 点击连续选择,“全部通道”清除限制;分组标题不可选中。这样避免在 SwiftUI Button 的回调里读取可能已经变化的currentEvent。LogTimeRangePicker.swift):用共享下拉弹层承载系统日历和时分秒编辑器,点击“应用”后才发给 Core 的时间查询。界面使用本地时区,结束时间包含该秒内的全部记录;结束早于开始时禁止应用;“清除时间范围”恢复不限时间。+N ms和条形表示相对首条记录的偏移,不是执行耗时)、时间范围。语言服务器日志恢复为编辑器标签页“LSP 日志”
#1683 删除了编辑器里的 LSP 日志标签,“查看日志”改为打开应用日志窗口并改写它的通道筛选。本 PR 把这个入口恢复成编辑器标签页,数据改读 v2 日志:
EditorTabItem.languageLogs):每个工作区窗口最多一个,再次打开只切换服务器。它复用混合标签顺序、拖动重排、分组、选择和关闭(含 ⌘W),接线在EditorAreaView、EditorTabOrderFeatureModel、AppModel+FeatureState、AppModel+Media、AppModel+WorkbenchClose。选中它会清除活动文件、媒体和终端投影;文件通过功能模型直接打开时,日志标签让出选择(EditorSessionCoordinator);工作区重置时移除标签并停止查询。LanguageServerLogsView.swift):服务器选择、“服务器日志”和 ⓘ 说明(数据来自已脱敏的诊断日志,不提供 Server Trace 和 RPC 消息捕获,应用日志在“日志与诊断”中查看)、最低级别(信息 / 警告 / 错误,默认信息)、“清空视图”。窗口变窄时工具栏换成两行。输出复用OutputTextView,每行是[级别] 时间 消息加字段,查询失败时显示“重试”。LanguageServerLogsModel.swift):LogWindowModel,数据来源仍是MacLogStore中已脱敏的 v2 磁盘记录和实时广播,和应用日志窗口、诊断导出是同一份证据,没有新增内存缓冲或日志文件。windowEngineChannel解析该服务器的通道,拿到通道后才开始查询,所以不会显示未过滤的整个lsp前缀,也没有“全部语言服务器”选项。Swift 不自己拼通道名。AppLoggingDiagnosticsFailed。LogWindowModel新增displayWatermarks)。清空 Java 后切到 Go,Go 的记录照常显示;切回 Java 仍是清空状态,只显示清空后的新记录。LanguageServerLogsCoordinator、language-server-logs窗口场景)已全部删除,LitheApp、RootView、AppServices相对preview没有改动。齿轮菜单图标
WorkbenchSettingsMenu.swift,集中声明齿轮菜单项。WorkbenchView改为使用它。expui/nodes/plugin.svg图标,“日志与诊断…”使用fileTypes/text.svg图标。其余菜单项和顺序不变。文案、笔记与功能矩阵
shared/i18n/里补齐中英词条,并重新生成Localizable.strings。词条包括logs.window.*Help、时间范围,以及logs.language.*:标签标题“LSP 日志”、最低级别、ⓘ 说明、“清空视图”提示、“服务器日志”和空状态。服务器选择、级别名称、“清空视图”和“重试”复用已有词条。2026-11-03-structured-logging-log-window.md新增“窗口尺寸、筛选与实时呈现”和“语言服务器日志在编辑器标签页里看”两节;结论、备选方案和后果改为“应用日志一个入口,LSP 日志在编辑器标签页里看,数据同源”。备选方案记录了被否的三种做法:借用应用日志窗口、单独开窗口、提供“全部语言服务器”。2026-09-13-language-tooling-and-lsp-runtime-ownership.md)和编辑器分组 Note(2026-10-12-editor-tab-split-docking.md)改写 LSP 日志一段:编辑器标签页、单服务器、按服务器清空,以及标签参与重排和分组。diagnostics-export补充本次新文件作为证据,并追加自适应布局回归说明。lsp-status-logs补充 LSP 日志标签页的证据(模型、视图、EditorAreaView、评审测试)和验证说明。测试
LogWindowTests:findBelongsOnlyToTheWindowThatInstalledItsTarget:⌘F 只由安装了目标的窗口处理。tableColumnsUseTheViewportWithoutSavingAutomaticWidths:自动分配列宽,但不写偏好。languageServerEntryOpensEditorTabWithoutChangingApplicationLogs:打开后只有一个“LSP 日志”标签且被聚焦、选中对应服务器、应用日志窗口没有收到请求;再次打开另一个服务器复用同一标签;关闭后标签移除。DiagnosticsWorkflowTests:测试窗口改为带标题栏、可缩放。新增verifyLogWindowInteractions和verifyTimeRangePicker,覆盖单元格保持、⌘F 聚焦、⌘ 点击通道、时间范围弹层(4 个NSDatePicker)和视口宽度。LogWindowReviewTests:serverTabShowsOneServerAndClearsOnlyThatServer:用真实MacLogStore验证级别只有信息 / 警告 / 错误且默认信息;选中 java 时查询只有lsp/java通道;清空 java 后切到 go 仍显示lsp/go记录;切回 java 时之前的记录仍隐藏,只显示清空后新写入的记录。LITHE_REVIEW_LOG_SESSION和LITHE_LOGGING_SCREENSHOTS时才运行,默认跳过。变基说明
变基到最新
preview时与 #1695 在MacShortcutDetector冲突:#1695 把终端快捷键延后判断移到了快捷键匹配之后。本 PR 只在原位置保留MacWindowFindTarget.handle(event),终端判断沿用 #1695 的新位置。本地验证
node scripts/i18n/verify-app-language-localization.mjsnode scripts/i18n/generate-i18n.mjs --checknode --test --test-timeout=60000 scripts/i18n/test-i18n.mjsnode scripts/logging/generate-log-events.mjs --checknode scripts/logging/verify-log-usage.mjs./.agents/skills/write-stable-tests/scripts/verify-test-stability.sh./scripts/architecture/verify-service-boundaries.sh(包含运行时 bundle 只读检查)./scripts/agent-notes/verify-agent-notes.sh./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD./scripts/macos/test/test-macos.sh --filter 'LitheTests\.(LogWindowTests|LogWindowReviewTests|DiagnosticsWorkflowTests|EditorTabOrderFeatureModelTests|EditorTabLayoutTests|LanguageServerStatusTests)'(“LSP 日志”标签页这一版):6 个套件、90 个测试,85 个通过、5 个失败。floatingPreviewCancelsWithoutTakingFocus、nativeMultilineRowReleaseReordersWithoutSplitting、fileAndDiffTabsCanReorder、nativeTabDragSplitsOnReleaseAndEscCancels、repositoryDiffSharesOrderAndSurvivesDocumentSelection。它们都靠合成 NSEvent 拖动标签或 Esc 关闭拖动预览子窗口;单独运行这个套件结果相同。1d3672986(还没有 LSP 日志标签页)上单独运行这个套件,这 5 个用例同样失败,另外explicitNewDiffTabKeepsAnIndependentSessionWhileOrdinaryOpenReusesItsPreview也失败。所以这些失败和本次改动无关,是本机测试环境里事件和子窗口的问题。floatingPreviewCancelsWithoutTakingFocus只用到EditorTabDragPreviewAnchor,完全不经过本次改动的代码。最终以 CI 结果为准。1d3672986上跑过--filter 'LitheTests\.(LogWindowTests|LogWindowReviewTests|DiagnosticsWorkflowTests|TerminalShortcutInputPolicyTests|MacKeyboardShortcut.*Tests|HTMLPreviewFindShortcutTests)':6 个套件、34 个测试全部通过。终端快捷键测试也包含在内,因为它和本 PR 改动的MacShortcutDetector键盘监听是同一处;这次的提交没有改动MacShortcutDetector。./scripts/macos/test/test-macos.sh在本机没有跑通,需要看 CI 结果:MacProcessRunnerTests、MacLoginShellEnvironmentTests、MacBuildProviderSessionsTests、LitheGitModuleTests、VcsProviderHostTests、MybatisFeatureModelTests、MarkdownPreviewHTMLTests。随后 LitheTests 进程中止(signal 6),原因是AgentManagementFeatureModelTests里的 actor executor 断言(Incorrect actor executor assumption)。preview上做对比,无法排除本地命令沙盒的影响。LogWindowReviewTests一处编译错误:原来调用了不存在的AppServices.makeDiagnosticsExportService(),已改为使用已有的diagnosticsExportService属性。未验证:在真实应用里手动缩放窗口、打开 Java 项目查看 jdtls 日志的整机验收,功能矩阵中保持 pending。