获取当前桌面编号的OSX脚本

有没有一种方法可以通过程序在 OSX 上获取当前的桌面/空间号码?

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

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

点赞
用户5027078
用户5027078

自从最近的操作系统版本,已经不再可能通过脚本访问空间。我所找到的唯一的事情是,通过 Applescript 可以获得当前空间桌面图片的名称/路径:

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

除此之外,自从 Yosemite (至少!)以来,Applescript 字典不再包含空间可脚本化的元素。

2016-01-09 08:32:53
用户1446540
用户1446540

在 Yosemite 中,下面这个 one-liner(构建在 这个答案 上)是有效的:

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 来访问包含空格的键,可以使用例如 Homebrew 来安装。)

在我的第三个桌面上,这个 one-liner 输出:

$ 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

缘由:正如 这个答案 中所述,桌面及其内容存储在 ~/Library/Preferences/com.apple.spaces.plist 中。但是,当更改桌面时,此文件不会自动更新。因此,为了获取当前桌面编号,我们:

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

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

2016-09-27 15:12:18