新增quickcommand.runCode,quickcommand.runInTerminal支持warp

This commit is contained in:
fofolee
2025-01-13 01:15:42 +08:00
parent 4053f7a9c2
commit 0a8c24374a
9 changed files with 366 additions and 105 deletions

View File

@@ -0,0 +1,150 @@
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;