Skip to content

Add configurable file open targets#119

Open
MoozLee wants to merge 4 commits intoxintaofei:mainfrom
MoozLee:pr/open-file-in-editor-upstream
Open

Add configurable file open targets#119
MoozLee wants to merge 4 commits intoxintaofei:mainfrom
MoozLee:pr/open-file-in-editor-upstream

Conversation

@MoozLee
Copy link
Copy Markdown
Contributor

@MoozLee MoozLee commented Apr 26, 2026

Summary

  • Add a General settings page with configurable default file open targets.
  • Wire file preview and file-tree open actions through VS Code, file manager, terminal, and browser handling for HTML files.
  • Keep native editor launching desktop-only and validate workspace-relative paths before opening in VS Code.

Test plan

  • cargo check --manifest-path src-tauri/Cargo.toml --bin codeg-server --no-default-features
  • eslint on PR-changed frontend files

MoozLee added 2 commits April 26, 2026 20:59
…-in-editor]

Add General settings for default open targets and route file preview/tree actions through the selected target.
@xintaofei
Copy link
Copy Markdown
Owner

读完整个 diff。功能本身合理("在哪里打开文件" 是用户合理诉求,而且按现有 settings 的模式实现),实现的安全性也基本到位。但有几个可清理的问题,目前不算 ready-to-merge。

总体评估
功能合理 / 落地大致可接受,但存在重复代码和小遗留。建议要求清理后再合并。

优点
后端路径校验做得不错:resolve_workspace_relative_path 拒绝绝对路径、.. 组件、Prefix/RootDir,并通过双 canonicalize + starts_with 防 symlink 越界(src-tauri/src/commands/system_settings.rs:48-95)。
VS Code 启动有合理的 fallback 链:code CLI → 平台特定路径(macOS: /Applications/... 或 open -n -a;Windows: %LOCALAPPDATA%/%ProgramFiles%),分别拿到 code_err 和 fallback_err 拼成详细错误。
双模式遵循项目约定:open_path_with_target 在 web handler 里返回 configuration_invalid("desktop only"),桌面命令通过 #[cfg(feature = "tauri-runtime")] 隔离。
i18n 10 种语言全覆盖,没有遗漏。
OPEN_TARGET_REGISTRY 注册表的设计合理,前端通过 supportsFiles / supportsDirectories / desktopOnly 元数据驱动菜单。
需要修改的问题
i18n 重复键 — 10 个 locale × 6-8 个未使用的键。所有 locale 在 SystemSettings 命名空间里也加了 openTargetTitle、defaultOpenTarget、defaultOpenTargetDescription、openTargetDesktopOnly、openTargetSaveFailed、openTargets.vscode(见 en.json:133-141 等),但这套设置已经搬到 GeneralSettings 页面,SystemSettings 不再渲染它们。这是死代码且分布在 10 个文件,迟早烂。应当删除。
导航顺序与默认落地页不一致。第二个 commit 把 General nav 移到 Appearance 之下(settings-shell.tsx),但默认路由仍改成了 /settings/general(src/app/settings/page.tsx、src-tauri/src/commands/windows.rs:308、web/handlers/folders.rs:226)。导航顺序首项是 Appearance,进入设置却跳到第二项 General — 用户体验不自洽。建议要么 nav 顺序保持 General 在第一,要么默认路由保留 appearance。
normalize_open_target_settings 是空实现 (system_settings.rs:38-40):直接返回入参。它在 3 处被调用。如果暂无规范化需求,删掉;如果计划做规范化,至少加 TODO 说明,否则纯属占位代码。
open_path_with_target_core 参数不必要复杂(system_settings.rs:254-282):只用到 target 字段,但走 SystemOpenTargetSettings { target, ..default() } 这种构造路径;逻辑里把 web_file_open_method 默认成 Browser 后又用不上。建议直接 let target = target.unwrap_or(load_system_open_target_settings(conn).await?.target);,把 normalize 那层去掉。
较小的观察(不阻塞)
spawn_code_cli 用 spawn().map(|_| ()) 不等 status;macOS 的 open -n -a 分支用 status()。两条路径的错误检测不一致。code CLI 一般 fork 后立即退出,可接受,但值得注意。
OPEN_TARGET_REGISTRY 设计像支持多 editor,但实际只有 VS Code。要么在文档/UI 上明示这是"VS Code 专用",要么后续真正补 JetBrains/Sublime 等。
前端 isWebFileLanguage(activeTab.language === "html") 与 isWebFilePath 用扩展名检测不一致(一处看 language tag,一处看路径扩展),目前不会出问题但概念上分裂。
验证状态
PR 自述只跑了 cargo check --bin codeg-server --no-default-features + ESLint。没有跑 desktop 模式 cargo check / cargo clippy / pnpm build。按 CLAUDE.md 要求至少应再补这些。

建议
请作者:(1) 删掉 SystemSettings 命名空间里 10 个 locale 的重复 open-target 键;(2) 决定 nav 顺序 vs 默认路由的一致性;(3) 删掉或填充 normalize_open_target_settings;(4) 跑一遍桌面模式 cargo check + cargo clippy + pnpm build。改完即可合并。_

Align the settings landing flow with the General page, remove dead open-target i18n keys, and simplify open-target persistence logic without changing the existing path safety checks.
@MoozLee
Copy link
Copy Markdown
Contributor Author

MoozLee commented May 1, 2026

已根据这轮 review feedback 补上一轮清理,PR head 现在已经包含最新提交:b35aff3 (fix(settings): clean up open target review feedback)。

这次主要处理了 reviewer 提到的 4 个点:

  1. 删除 SystemSettings 下的重复 open-target i18n 键

    • 已把那批已经不再使用的 SystemSettings 命名空间键从 10 个 locale 中删掉。
    • open-target 相关文案现在只保留在实际使用的 GeneralSettings 下。
  2. 统一 settings 导航顺序与默认落地页

    • 现在 settings 导航恢复为 General 在第一项
    • /settings 默认仍然进入 /settings/general
    • open_settings_window 在桌面/web fallback 路径上也继续对齐到 General。
  3. 删除空的 normalize_open_target_settings

    • 这个函数原本只是原样返回入参,没有实际规范化逻辑。
    • 现在已经删掉,并同步简化调用点。
  4. 简化 open_path_with_target_core

    • 不再构造临时的 SystemOpenTargetSettings { target, ..default() } 只为了读 target
    • 现在直接按 reviewer 建议解析:显式 target 优先,否则回退到持久化设置里的 target

安全边界保持不变:

  • 仍然保留 workspace-relative path 校验
  • 仍然保留 canonicalize + starts_with 的越界保护
  • 仍然保留 desktop-only VS Code 打开逻辑
  • backend 仍然只允许 VS Code 这条原生命令路径

本轮验证:

  • cargo check --manifest-path src-tauri/Cargo.toml
  • cargo check --manifest-path src-tauri/Cargo.toml --bin codeg-server --no-default-features
  • cargo clippy --manifest-path src-tauri/Cargo.toml
  • pnpm build
  • 相关前端 lint(settings / open-target 相关文件)

备注:cargo clippy 仍有一些与本 PR 无关的既有 warning,但这轮修改范围内没有新的 clippy 问题。

Move file-opening preferences into System settings, remove the top-level General entry, and retarget settings fallbacks to System so the remaining navigation and routes stay consistent.
@MoozLee
Copy link
Copy Markdown
Contributor Author

MoozLee commented May 2, 2026

继续按这条 PR 的方向又做了一轮整理,PR head 现在已经包含最新提交:f523c31 (refactor(settings): move open target controls into system)。

这次主要调整的是设置页结构:

  1. 把文件打开配置从 General 挪到 System

    • open-target / web-file-open-method 这组设置现在放在 SystemSettings 页面里。
    • 位置上放在软件更新 section 之后,作为系统页中的同级配置区块。
  2. 删除顶层 General 设置入口

    • 删掉了 SettingsShell 里的 general 一级导航。
    • 删除了:
      • src/components/settings/general-settings.tsx
      • src/app/settings/general/page.tsx
    • 不再保留只为 open-target 存在的独立 General 页面。
  3. 默认 settings 落点改到 System

    • /settings 默认跳转改为 /settings/system
    • 桌面 settings window fallback 和 web 侧对应 fallback 也同步对齐到 System
  4. 清掉对应死代码和死文案

    • GeneralSettings i18n namespace 已删除
    • SettingsShell.nav.general 已删除
    • 活跃的 open-target 文案已迁到 SystemSettings

没有改变的部分:

  • open-target 的功能逻辑没变
  • file tree / file tab 里的打开分发逻辑没变
  • backend 的路径校验、workspace 边界保护、desktop-only VS Code 打开限制都保持不变

这轮按较轻的平衡验证做了确认,重点是:

  • pnpm build
  • 相关 frontend targeted lint
  • cargo check --manifest-path src-tauri/Cargo.toml
  • cargo check --manifest-path src-tauri/Cargo.toml --bin codeg-server --no-default-features
  • cargo build --manifest-path src-tauri/Cargo.toml

如果还希望继续收口,我可以下一步再把这条分支同步合并到本地 release

@MoozLee MoozLee closed this May 2, 2026
@MoozLee MoozLee deleted the pr/open-file-in-editor-upstream branch May 2, 2026 06:21
@MoozLee MoozLee restored the pr/open-file-in-editor-upstream branch May 2, 2026 06:27
@MoozLee MoozLee reopened this May 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants