uTools-quickcommand/plugin/lib/createTerminalCommand.js

151 lines
4.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;