osx - 获取当前桌面号的脚本

osx - script to get current desktop number

有没有办法以编程方式获取 osx 上的当前 desktop/space 号码?

我发现了这个问题,但它似乎有点过时了: OSX Lion AppleScript : How to get current space # from mission control?

我还发现了这个: http://www.hammerspoon.org/docs/hs.spaces.watcher.html 但不幸的是它不起作用。

从最近的 OS 版本开始,无法再通过脚本访问 space。我唯一发现的是如何通过 Applescript 获取当前 space 上的桌面图片 name/path :

tell application "Finder" to set A to (desktop picture) as string

除此之外,因为 Yosemite(至少!)Applescript 词典不再包含 space 个可编写脚本的元素。

在 Yosemite 中,以下 oneliner(基于 this answer)有效:

killall Dock \
&& sleep 0.1 \
&& defaults export com.apple.spaces - \
| plutil -convert json - -o - \
| jq '.SpacesDisplayConfiguration."Management Data".Monitors[0] | ."Current Space".uuid as $current_desktop_uuid | [.Spaces[].uuid]|index($current_desktop_uuid)'

(需要 jq 版本 1.5 用于白色 space-包含密钥访问,可安装 Homebrew。)

在我的 Desktop 3 上,这个 oneliner 将输出:

$ killall Dock && sleep 0.1 && defaults export com.apple.spaces - | plutil -convert json - -o - | jq '.SpacesDisplayConfiguration."Management Data".Monitors[0] | ."Current Space".uuid as $current_desktop_uuid | [.Spaces[].uuid]|index($current_desktop_uuid)'
3

基本原理:如 this answer 中所述,桌面及其内容存储在 ~/Library/Preferences/com.apple.spaces.plist 中。但是,更改桌面时不会自动更新此文件。因此,要获取当前桌面编号,我们

  • 使用 killall Dock 强制执行桌面 属性 列表更新。数据存入磁盘需要一点时间所以
  • 等待 0.1 秒(在我的机器上足够了)将文件写入磁盘。
  • 然后导出更新的桌面 property list 使用 defaults 作为 XML,
  • 使用plutil将XML转换为JSON(个人喜好)
  • 并用 jq 提取当前 space uuid 并在 space uuid 列表中获取其索引。由于space uuid 列表包含Mac OS X Dashboard,因此得到的索引正好是当前桌面的编号。

注意:这段代码确实在 Yosemite 上获取了我的主显示器的桌面编号——我的同事在 El Capitan 上用不同的设置测试了这个,但没有成功。但是假设 killall Dock 仍然有效,JSON 输出应该仍然包含相关信息。