feat(terminal): 文件面板支持切换远端目标主机(含跨主机守卫、选择弹窗统一) - #230
Merged
Merged
Conversation
- OSC 7 保留 host 段:新增 ReportedWorkingDir { host, path } 替代裸 String,
贯通 osc → pty_backend / ssh_backend → Terminal → TerminalModelEvent →
sidebar → FileManagerPanel;空主机归一化为 None,比对大小写不敏感
- 文件面板新增纯状态 ReportedHostTracker + classify_reported_host:学习本会话
首次上报的 host 作为基线,之后遇其他 host 即拒收路径(不再拿去本机 SFTP
会话上 read_dir),重连时丢弃终端上报的脏初始目录
- host 只在本会话历次上报之间比较,不与连接配置的 host 比较——用 IP 连接的
机器远端自报的是 hostname,硬比会把正常的同机跟随全部误判为跨主机
- 面板顶部渲染 foreign_host_notice 提示条,明确标注"终端已进入 X,面板仍
连接 Y",取代此前默默列旧目录的行为
- locales: 新增 foreign_host_notice / foreign_host_hint(en / zh-CN / zh-HK)
背景:堡垒机里嵌套 ssh 到内层主机时,内层 shell 不加载 navop 的 shell
integration,本就不发 OSC 7;若该远端历史上写入过集成脚本仍会上报他机路径,
旧实现会把它当作本机路径使用——读目录失败后回退,表现成"刷新也过不来";
更糟的是在该路径上做删除/上传,操作的是堡垒机而非用户以为的那台主机。
本改动不做跨主机自动跟随(SFTP 通道绑在配置的那条连接上,物理上不可达),
只保证不再误导。
验证(在本提交所覆盖的工作区执行,HEAD d57473d):
- cargo check -p terminal -p terminal_view EXIT=0(无警告)
- cargo test -p terminal --lib 496 passed / 0 failed
- cargo test -p terminal_view --lib 551 passed / 0 failed
- sftp_transfer 新增 ssh_config 模块,抽出 StoredConnection 到 SshConnectConfig 的解析,供 sftp_view 与 terminal_view 共用 - sftp_view 改为薄包装并删除本地 ssh_auth / sftp_initial_directory*,调用点与既有测试零改动 - 文件面板顶栏新增远端目标选择器,只列 SSH/SFTP/FTP 连接,当前目标与终端主机分别标记 - 切换目标时新建独立 SshSessionManager,用 Arc::ptr_eq 区分自有会话,避免断开终端共享会话 - 切换后清空 current_path 与 history,避免沿用旧主机目录作为新目标起点 - 跨主机时暂停 OSC 7 跟随,避免终端路径劫持外部目标的面板路径 - 新增 5 个测试:目标类型过滤、FTP 端点标签、标签按字符边界截断、切换后暂停跟随、切换后重置路径
- one_ui 新增 picker_dialog:候选、搜索、上下键选择、滚动都交给 gpui-component 的 List,行样式对齐「快捷打开」(标签页切换):单行、图标 + 名称 + 行尾 user@host:port,选中行 list_active,未选中 muted + hover - sftp_view 端点切换瘦成映射层,删除本地 delegate/item/过滤函数与其测试 (过滤测试搬到 one_ui 的 filter_picker_entries) - terminal_view 远端目标由 Popover 下拉换成同一弹窗,顺带修掉两个问题:气泡底色 读全局应用主题(浅色)而不是终端配色、列表高度不限导致没有滚动条;触发器保留 终端配色的 custom button variant - 列表项展示内容统一:标题只放连接名(不再拼 host),副标题统一为 user@host:port,sftp_transfer 抽出 connection_endpoint_label 供两处共用 - locales: 新增 FileManager.target_picker_title / target_search、 Endpoint.no_results 验证: - cargo check -p one-ui -p sftp_transfer -p sftp_view -p terminal_view EXIT=0(无警告) - cargo test -p one-ui --lib 53 passed / 0 failed - cargo test -p sftp_transfer --lib 49 passed / 0 failed - cargo test -p sftp_view --lib 102 passed / 0 failed - cargo test -p terminal_view --lib --no-run 编译通过 未验证:应用内手工点击验收(本次未启动 GUI)。
…ager-remote-target
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.
背景
终端文件面板原先只能跟着终端会话走。本分支给面板加了「远端目标」切换:面板可以连一台和终端不同的主机,同时保证终端会话本身不被牵连;顺带把主机选择这件事收敛到一套共享弹窗里。
包含的改动
1. 跨主机守卫(
fix(terminal))终端 shell integration 上报的 OSC 7 现在保留 host 段(
ReportedWorkingDir { host, path }),文件面板学习本会话首次上报的 host 作为基线,之后遇其他 host 即拒收路径,不再把它当本机路径去read_dir/ 删除 / 上传。面板顶部会显示「终端已进入 X,面板仍连接 Y」提示条。不做跨主机自动跟随(SFTP 通道绑在配置的连接上,物理不可达)。2. 远端目标切换(
feat(terminal))顶栏新增目标选择器,只列 SSH/SFTP/FTP 连接,当前目标与终端主机分别标记。切换目标时新建独立
SshSessionManager,用Arc::ptr_eq区分自有会话,避免断开终端共享会话;切换后清空current_path与history,并暂停 OSC 7 跟随。3. 选择弹窗统一(
refactor(ui),本 PR 收尾)原来的目标下拉是
Popover+ 全局应用主题,出现两个问题:气泡底色跟随浅色应用主题而不是终端配色、气泡高度不定导致列表没有滚动条。现在改成与 SFTP 端点切换共用的弹窗:one_ui新增picker_dialog:搜索、上下键选择、滚动都交给gpui-component的List;行样式对齐「快捷打开」(标签页切换)——单行、图标 + 名称 + 行尾user@host:port,选中行list_active,未选中muted_foreground+ hoversftp_view端点切换瘦成映射层,删除本地 delegate / item / 过滤函数(过滤测试搬到one_ui)user@host:port;sftp_transfer抽出connection_endpoint_label供两处共用terminal_view触发器仍是终端配色的 custom button variant验证
合并
origin/dev(23 个提交)后在本 worktree 执行:cargo check -p one-ui -p sftp_transfer -p sftp_view -p terminal_view— EXIT=0,无警告cargo test -p one-ui --lib— 53 passed / 0 failedcargo test -p sftp_transfer --lib— 49 passed / 0 failedcargo test -p sftp_view --lib— 104 passed / 0 failedcargo test -p terminal_view --lib— 558 passed / 0 failed未做:应用内手工点击验收(本次未启动 GUI)。