使用 Bash 脚本自定义 macOS 的 Dock

问题描述

我想使用 Bash 脚本(不带 AppleScript)自定义 macOS 的 Dock。

目前我有代码(从 this answer 获取修改):

#!/bin/bash

defaults delete com.apple.dock persistent-apps

dock_item() {
    printf '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>%s</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>',"$1"
}

defaults write com.apple.dock persistent-apps -array \
    "$(dock_item /Applications/iTerm.app)" \
    "$(dock_item /Applications/Visual\ Studio\ Code.app)" \
    "$(dock_item /Applications/Slack.app)" \
    "$(dock_item /Applications/Google\ Chrome.app)" \
    "$(dock_item /System/Applications/Utilities/Screenshot.app)"

killall Dock

更改认 Dock:

default Dock

致:

resulted Dock

但我也希望它删除垃圾箱旁边的下载文件夹以及出现在 Dock 中保存/保存的正在运行的应用程序的垂直线(在这种情况下只有 iTerm)之间的重复图标(到垂直线的左侧)。像这样:

expected Dock


此外,在进行更改后,代码更新 Dock 的方式是杀死 Dock 进程,然后自动重新启动。我觉得应该有一种更快的方法来做到这一点,它不会动画 Dock 下降,然后桌面变黑片刻,打开任何最小化的应用程序,然后动画 Dock 上升(recording)。

解决方法

在比较从 Dock 手动删除图标之前和之后 defaults read com.apple.dock 打印的内容后,我注意到我只需要删除 recent-apps(对于重复的图标)和 persistent-others(对于文件夹)键:

defaults delete com.apple.dock recent-apps
defaults delete com.apple.dock persistent-others