mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-07 21:46:12 +08:00
151 lines
4.4 KiB
JavaScript
151 lines
4.4 KiB
JavaScript
const fs = require("fs");
|
||
const path = require("path");
|
||
|
||
// 终端配置
|
||
const DEFAULT_TERMINALS = {
|
||
windows: ["wt", "cmd"],
|
||
macos: ["warp", "iterm", "terminal"],
|
||
};
|
||
|
||
// Windows 终端命令生成器
|
||
const getWindowsTerminalCommand = (cmdline, options = {}) => {
|
||
const { dir, terminal = "wt" } = options;
|
||
const appPath = path.join(
|
||
window.utools.getPath("home"),
|
||
"/AppData/Local/Microsoft/WindowsApps/"
|
||
);
|
||
|
||
const terminalCommands = {
|
||
wt: () => {
|
||
if (
|
||
fs.existsSync(appPath) &&
|
||
fs.readdirSync(appPath).includes("wt.exe")
|
||
) {
|
||
const escapedCmd = cmdline.replace(/"/g, `\\"`);
|
||
const cd = dir ? `-d "${dir.replace(/\\/g, "/")}"` : "";
|
||
return `${appPath}wt.exe ${cd} cmd /k "${escapedCmd}"`;
|
||
}
|
||
return null;
|
||
},
|
||
cmd: () => {
|
||
const escapedCmd = cmdline.replace(/"/g, `^"`);
|
||
const cd = dir ? `cd /d "${dir.replace(/\\/g, "/")}" &&` : "";
|
||
return `${cd} start "" cmd /k "${escapedCmd}"`;
|
||
},
|
||
};
|
||
|
||
// 按优先级尝试不同终端
|
||
const terminalPriority =
|
||
terminal === "default"
|
||
? DEFAULT_TERMINALS.windows
|
||
: [terminal, ...DEFAULT_TERMINALS.windows];
|
||
|
||
for (const term of terminalPriority) {
|
||
const command = terminalCommands[term]?.();
|
||
if (command) return command;
|
||
}
|
||
|
||
// 如果都失败了,返回默认的 cmd 命令
|
||
return terminalCommands.cmd();
|
||
};
|
||
|
||
// macOS 终端命令生成器
|
||
const getMacTerminalCommand = (cmdline, options = {}) => {
|
||
const { dir, terminal = "warp" } = options;
|
||
|
||
const terminalCommands = {
|
||
warp: () => {
|
||
if (fs.existsSync("/Applications/Warp.app")) {
|
||
const workingDir = dir || process.cwd();
|
||
// 创建临时的 launch configuration
|
||
const configName = `temp_${Date.now()}`;
|
||
const configPath = path.join(
|
||
window.utools.getPath("home"),
|
||
".warp/launch_configurations",
|
||
`${configName}.yml`
|
||
);
|
||
|
||
// 确保目录存在
|
||
const configDir = path.dirname(configPath);
|
||
if (!fs.existsSync(configDir)) {
|
||
fs.mkdirSync(configDir, { recursive: true });
|
||
}
|
||
|
||
// 创建配置文件,对于 Warp,命令不需要转义,因为是通过 YAML 配置传递
|
||
const config = `---
|
||
name: ${configName}
|
||
windows:
|
||
- tabs:
|
||
- layout:
|
||
cwd: "${workingDir}"
|
||
commands:
|
||
- exec: ${cmdline}`;
|
||
|
||
fs.writeFileSync(configPath, config);
|
||
|
||
// 使用配置文件启动 Warp
|
||
return `open "warp://launch/${configName}" && sleep 0.5 && rm "${configPath}"`;
|
||
}
|
||
return null;
|
||
},
|
||
iterm: () => {
|
||
const escapedCmd = cmdline.replace(/"/g, `\\"`);
|
||
const cd = dir ? `cd ${dir.replace(/ /g, "\\\\ ")} &&` : "";
|
||
if (fs.existsSync("/Applications/iTerm.app")) {
|
||
return `osascript -e 'tell application "iTerm"
|
||
if application "iTerm" is running then
|
||
create window with default profile
|
||
end if
|
||
tell current session of first window to write text "clear && ${cd} ${escapedCmd}"
|
||
activate
|
||
end tell'`;
|
||
}
|
||
return null;
|
||
},
|
||
terminal: () => {
|
||
const escapedCmd = cmdline.replace(/"/g, `\\"`);
|
||
const cd = dir ? `cd ${dir.replace(/ /g, "\\\\ ")} &&` : "";
|
||
return `osascript -e 'tell application "Terminal"
|
||
if application "Terminal" is running then
|
||
do script "clear && ${cd} ${escapedCmd}"
|
||
else
|
||
do script "clear && ${cd} ${escapedCmd}" in window 1
|
||
end if
|
||
activate
|
||
end tell'`;
|
||
},
|
||
};
|
||
|
||
// 按优先级尝试不同终端
|
||
const terminalPriority =
|
||
terminal === "default"
|
||
? DEFAULT_TERMINALS.macos
|
||
: [terminal, ...DEFAULT_TERMINALS.macos];
|
||
|
||
for (const term of terminalPriority) {
|
||
const command = terminalCommands[term]?.();
|
||
if (command) return command;
|
||
}
|
||
|
||
// 如果都失败了,返回默认终端命令
|
||
return terminalCommands.terminal();
|
||
};
|
||
|
||
// 主函数
|
||
const createTerminalCommand = (cmdline, options = {}) => {
|
||
const { windows = "default", macos = "default" } = options;
|
||
|
||
if (window.utools.isWindows()) {
|
||
return getWindowsTerminalCommand(cmdline, {
|
||
...options,
|
||
terminal: windows,
|
||
});
|
||
} else if (window.utools.isMacOs()) {
|
||
return getMacTerminalCommand(cmdline, { ...options, terminal: macos });
|
||
}
|
||
|
||
throw new Error("Unsupported operating system");
|
||
};
|
||
|
||
module.exports = createTerminalCommand;
|