【问题标题】:JXA iTerm Automation - Wait for command to finishJXA iTerm 自动化 - 等待命令完成
【发布时间】:2020-10-27 19:33:40
【问题描述】:

我正在尝试使用 JXA 来自动化 iTerm。

我想在第一个选项卡的“监视模式”下编译一些 UI 代码。 第一次编译库后(并创建 dist/ 文件夹),我想要第二个选项卡打开并运行一些其他代码,这些代码取决于第一个选项卡的输出。换句话说,我需要第二个选项卡等待第一个选项卡完成。

就 iTerm 的 JXA 自动化而言,我找不到任何方法让一个选项卡等待另一个选项卡。

我发现的每个示例都涉及打开多个选项卡并在这些选项卡中启动并行进程。

Here's an example

我能想到的最好的方法是使用某种形式的 setInterval 并检查 iTerm 的 session.isProcessing(我通过 Script Editor > Window > Library 在文档中找到),但即使这样也只会给出一些奇怪的错误,好像 isProcessing 不是应该阅读:

Error: Can't convert types

    function timer(repeats, func, delay) {
        const args = Array.prototype.slice.call(arguments, 2, -1);
        args.unshift(this);

        const boundFunc = func.bind.apply(func, args);
        const operation = $.NSBlockOperation.blockOperationWithBlock(boundFunc);
        const timer = $.NSTimer.timerWithTimeIntervalTargetSelectorUserInfoRepeats(
            delay / 1000, operation, 'main', null, repeats
        );
        $.NSRunLoop.currentRunLoop.addTimerForMode(timer, "timer");
        return timer;
    }

    function invalidate(timeoutID) {
        timeoutID.invalidate
    }

    const setTimeout = timer.bind(undefined, false)
    const setInterval = timer.bind(undefined, true)
    const clearTimeout = invalidate
    const clearInterval = invalidate

    const terminal = Application('iTerm')
    terminal.includeStandardAdditions = true

    const window = terminal.currentWindow()
    let tab = window.currentTab()
    let session = tab.currentSession();

    setInterval(function() {
        console.log('isProcessing', session.isProcessing);
    }, 500);

    session.write({ text: 'ng build my-angular-lib --watch' });

    //WAIT HERE

    let tab2 = window.createTabWithDefaultProfile();
    let session2 = tab2.currentSession();
    session2.write({ text: 'npm link my-angular-lib && ng serve' });

【问题讨论】:

  • 我可能错了,但是您是否考虑过引入资源锁的概念来帮助您解决这种情况?
  • 我是 JXA 的新手,我不知道这样的事情。
  • 我也不知道。也许你可以探索Mutex-Promise,直到你得到更有意义的东西。

标签: javascript-automation


【解决方案1】:

我要做的是调试sessiontab 的完整结构。 也许信息在不同的字段下。

我会尝试将整个对象序列化/字符串化为 JSON 并在控制台上打印。

类似:

console.log(JSON.stringify(session) )

【讨论】:

    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 2013-04-03
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2016-01-29
    • 2012-10-16
    相关资源
    最近更新 更多