有没有办法在 OSX 中编写设置空间(任务控制)的脚本?

Dre*_*rew 8 productivity osx-spaces mission-control osx-mountain-lion macos

Spaces 的设计似乎考虑了将应用程序分配到空间(请参阅此知识库文章)。甚至像 TotalSpaces 这样的应用程序也是用这个模型构建的。这对我来说似乎是多余的,因为已经有一个应用程序切换器 (Cmd-Tab) 可以让您在应用程序之间切换。

我想使用 Spaces 作为在项目之间切换的一种方式。例如,我有一个用于 ProjectA 的空间,其中每个都有一个用于 XCode、Safari、Sublime Text 和 Terminal 的窗口。然后我有一个不同的 ProjectB 空间,它也有一个窗口,每个窗口用于 XCode、Safari、Sublime Text 和终端。只是窗口打开了不同的文档。

但是维护设置很不方便,因为我必须一遍又一遍地设置它们,而且在计算机之间来回穿梭时尤其可怕,而且必须自己打开五个窗口并将它们放入正确的空间。有什么方法可以生成一个一步脚本,自动按照我喜欢的方式设置空间?共享软件、Applescript 等?或者我只是想将我的工作风格硬塞进一个专为其他人构建的功能中?

Mar*_*nks 1

你当然可以。我不久前编写了一个 AppleScript 来执行在每个空间中打开终端窗口的繁琐任务。

互联网上的大多数示例最终都使用 AppleScript 来生成击键。例如,如果您将其设置为“control-2”将您带到空格 2(这可以在“键盘”首选项窗格中设置),则可以使用以下 AppleScript:

tell application "System Events"
        tell process "Finder"
                keystroke "2" using control down --switches to space 2
        end tell
end tell
Run Code Online (Sandbox Code Playgroud)

更改为空间 2。因此,我的脚本在每个空间中打开一个终端窗口,其工作方式如下:

tell application "System Events"
    tell process "Finder"
            keystroke "1" using control down --switches to space 1
    end tell
    tell process "Terminal"
            activate
            keystroke "t" using command down --new terminal tab
    end tell
    tell process "Finder"
            keystroke "2" using control down --switches to space 2
    end tell
    ...etc...
end tell
Run Code Online (Sandbox Code Playgroud)

显然,您可以指示终端以外的应用程序在给定空间中打开窗口。

您可以使用 启动非运行的应用程序do shell script "open -a application_name"

这种方法的问题在于,它完全依赖于发送击键,击键可能发送得太快,最终排队,并最终以错误的顺序执行。为了防止这种情况,有必要在每次脚本击键后添加延迟(例如delay 0.1),从而使整个脚本需要一些时间来执行。

或者,例如,如果您启动一个应用程序,它可能需要一些时间来初始化,并且一旦它达到了那么远,它将在任何活动空间中打开其窗口(而不是您第一次启动应用程序时任何活动空间) )。因此,每次的延迟必须设置得适当,有时可能是几秒钟。更糟糕的是,由于系统负载差异,执行之间的时间甚至可能不一致,迫使您使用足够长的延迟来应对最坏的情况。(例如,如果您启动的应用程序从执行之日起可能需要长达 5 秒的时间才能显示第一个窗口,则您需要延迟 5 秒才能切换到下一个空间并继续。)

不幸的是,我还没有看到另一种切换空间的方法。希望有人能够提供一种比发送击键更好的切换方法,或者一种让脚本等待而不产生任意延迟的方法。

不过,如果您不介意给脚本几秒钟的时间来启动并运行您的环境,那么您应该能够使用我提供的内容轻松地排序一系列应用程序启动或窗口打开和空间选择。