jorfus
jorfus

Reputation: 3088

Applescript to remove items from dock

I'm trying to remove (all) items from the dock. I can remove them by name like so:

tell application "System Events"
    tell UI element "Launchpad" of list 1 of process "Dock"
        perform action "AXShowMenu"
        click menu item "Remove from Dock" of menu 1
    end tell
end tell

But I'd like to pull the list of current items and iterate over them. This stack overflow question seems to cover how to get the list. What I'd like to do is tweak the above code to operate inside of a loop. I would guess that referencing the current item of the list inside the loop would be done with "thisRecord". I think I'm misunderstanding how to convert "thisRecord" into something I can reference within system events.

set plistpath to (path to preferences folder as text) & "com.apple.dock.plist"

tell application "System Events"
    set plistContents to contents of property list file plistpath
    set pListItems to value of plistContents
end tell
set persistentAppsList to |persistent-apps| of pListItems

set dockAppsList to {}
repeat with thisRecord in persistentAppsList
    set end of dockAppsList to |file-label| of |tile-data| of thisRecord
    tell application "System Events"
        tell UI element application thisRecord
            perform action "AXShowMenu"
            click menu item "Remove from Dock" of menu 1
        end tell
    end tell
end repeat  

Upvotes: 5

Views: 7322

Answers (2)

user3439894
user3439894

Reputation: 7555

As an alternative... Here is a much more straight forwards approach to removing the persistent apps on the Dock found in the persistent-apps key of the com.apple.dock.plist file:

In Terminal, do the following to first backup the target file:

  1. cd ~/Library/Preferences
  2. cp -a com.apple.dock.plist com.apple.dock.plist.bak

Now to remove the persistent apps, use the following compound command:

defaults delete com.apple.dock persistent-apps; killall Dock

If later you want to restore the backup, use the following compound command:

 cd ~/Library/Preferences; rm com.apple.dock.plist; cp -a com.apple.dock.plist.bak com.apple.dock.plist; killall Dock

If for some reason you need to do this with AppleScript, you can use the do shell script command to run these shell commands.


Note: In your OP you stated "I'm trying to remove (all) items from the dock." and the code you've presented only focuses on the apps stored under the persistent-apps key. There are also additional items that can show on the Dock, the first being the default persistent-others, which has the Downloads stack and other items you've added to that section. Then with macOS Mojave there is recent-apps which shows between the two aforementioned sections (by key name) on the Dock. The same premise can be use on these keys as well, substituting persistent-others or recent-apps for persistent-apps in the defaults delete ... compound command.

Upvotes: 14

wch1zpink
wch1zpink

Reputation: 3142

It would probably be wise to backup your "com.apple.dock.plist" file first. These following two lines of AppleScript code will copy your current com.apple.dock.plist file to your Desktop. This will come in handy if you want to revert your Dock icons back to the way they were before you ran the second script of this post.

set plistpath to (path to preferences folder as text) & "com.apple.dock.plist"
tell application "Finder" to duplicate alias plistpath to desktop

This AppleScript code works for me using the latest version of macOS Mojave.

set plistpath to (path to preferences folder as text) & "com.apple.dock.plist"

tell application "System Events"
    set plistContents to contents of property list file plistpath
    set pListItems to value of plistContents
end tell
set persistentAppsList to |persistent-apps| of pListItems

set dockAppsList to {}
-- Gets app names and adds them to dockAppsList
repeat with i from 1 to count of persistentAppsList
    set thisItem to item i of persistentAppsList
    set appName to |file-label| of |tile-data| of thisItem
    set end of dockAppsList to appName
end repeat

-- Loops through each app in dockAppsList and removes each app from Dock
repeat with thisRecord in dockAppsList
    tell application "System Events"
        tell UI element thisRecord of list 1 of process "Dock"
            try
                perform action "AXShowMenu"
                click menu item "Options" of menu 1
                click menu item "Remove from Dock" of menu 1 of menu item "Options" of menu 1
            on error
                try
                    perform action "AXShowMenu"
                    click menu item "Remove from Dock" of menu 1
                end try
            end try
        end tell
    end tell
end repeat

I realize I could have included everything in one large repeat loop. I thought it would be better ,for purposes of this script, to separate the two looping events in the event that somewhere else in your script you may want to refer back to items of dockAppsList so instead of "removing all from the dock" you may only want to remove items 1 through 5 of dockAppsList from the dock.

Upvotes: 2

Related Questions