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 输出应该仍然包含相关信息。
有没有办法以编程方式获取 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 输出应该仍然包含相关信息。