源码
packages/desktop/src/main/editor-definitions.ts
// Adapted from ZCode main/editors.ts; see licenses/third-party-notices.txt.
import { existsSync } from "node:fs";
export interface EditorDef {
id: string;
name: string;
/** macOS .app bundle 路径 */
appPath: string;
/** CLI 命令名(如果有)。用于 open folder;null 则 fallback 到 `open -a` */
command: string | null;
}
const MAC_EDITOR_DEFS: EditorDef[] = [
// 代码编辑器
{
id: "vscode",
name: "VS Code",
appPath: "/Applications/Visual Studio Code.app",
command: "code",
},
// 这里之前只登记了稳定版 VS Code,`getInstalledEditors()` 又完全依赖这份静态白名单做 existsSync 过滤。
// 用户安装的是 `Visual Studio Code - Insiders.app` 时,主进程根本不会把它纳入候选列表,UI 自然也就显示不出来。
// 补上独立定义后,既能识别 Insiders,也能复用现有的 `code-insiders` CLI / `open -a` 降级打开链路。
{
id: "vscode-insiders",
name: "VS Code Insiders",
appPath: "/Applications/Visual Studio Code - Insiders.app",
command: "code-insiders",
},
{ id: "cursor", name: "Cursor", appPath: "/Applications/Cursor.app", command: "cursor" },
{ id: "trae", name: "Trae", appPath: "/Applications/Trae.app", command: null },
{ id: "zed", name: "Zed", appPath: "/Applications/Zed.app", command: "zed" },
{
id: "sublime",
name: "Sublime Text",
appPath: "/Applications/Sublime Text.app",
command: "subl",
},
{ id: "codebuddy", name: "CodeBuddy", appPath: "/Applications/CodeBuddy.app", command: null },
{ id: "qoder", name: "Qoder", appPath: "/Applications/Qoder.app", command: null },
// JetBrains 系列
{
id: "idea",
name: "IntelliJ IDEA",
appPath: "/Applications/IntelliJ IDEA.app",
command: "idea",
},
{
id: "idea-ce",
name: "IntelliJ IDEA CE",
appPath: "/Applications/IntelliJ IDEA CE.app",
command: "idea",
},
{ id: "webstorm", name: "WebStorm", appPath: "/Applications/WebStorm.app", command: "webstorm" },
{ id: "pycharm", name: "PyCharm", appPath: "/Applications/PyCharm.app", command: "pycharm" },
{ id: "goland", name: "GoLand", appPath: "/Applications/GoLand.app", command: "goland" },
{ id: "phpstorm", name: "PhpStorm", appPath: "/Applications/PhpStorm.app", command: "phpstorm" },
{ id: "rider", name: "Rider", appPath: "/Applications/Rider.app", command: "rider" },
{ id: "clion", name: "CLion", appPath: "/Applications/CLion.app", command: "clion" },
{ id: "rubymine", name: "RubyMine", appPath: "/Applications/RubyMine.app", command: "rubymine" },
{ id: "datagrip", name: "DataGrip", appPath: "/Applications/DataGrip.app", command: "datagrip" },
// 终端(macOS 新版系统 Terminal 在 /System/Applications 下)
{
id: "terminal",
name: "Terminal",
appPath: "/System/Applications/Utilities/Terminal.app",
command: null,
},
{ id: "iterm2", name: "iTerm", appPath: "/Applications/iTerm.app", command: null },
{ id: "ghostty", name: "Ghostty", appPath: "/Applications/Ghostty.app", command: null },
{ id: "warp", name: "Warp", appPath: "/Applications/Warp.app", command: null },
// 文件管理器
{
id: "finder",
name: "Finder",
appPath: "/System/Library/CoreServices/Finder.app",
command: null,
},
// 功能扩展:QSpace / QSpace Pro 是 macOS 第三方文件管理器,默认没有 CLI,复用 open -a app bundle 打开路径。
{
id: "qspace",
name: "QSpace",
appPath: "/Applications/QSpace.app",
command: null,
},
{
id: "qspace-pro",
name: "QSpace Pro",
appPath: "/Applications/QSpace Pro.app",
command: null,
},
];
export function getEditorDefsForCurrentPlatform(): EditorDef[] {
return process.platform === "darwin" ? MAC_EDITOR_DEFS : [];
}
/** Recheck availability on every resolution, including each open request. */
export async function resolveEditorDefAppPath(def: EditorDef): Promise<string | null> {
return existsSync(def.appPath) ? def.appPath : null;
}