“defaults” command tricks
If you use the defaults command to set preferences, it’s easy to forget that you ever did. Some implications of this:
- You could be filling up your drive with logs or slowing your system down
- You could run into other bugs later that are caused by the default itself
- An update to an app might not benefit you because the default you set is overriding behavior
Finding defaults
The defaults command has a find subcommand, but I’ve found that people generally aren’t aware of it. Let’s say you set some defaults relating to your trackpad, but don’t know what domain they are in:
defaults find trackpad
Found 3 keys in domain 'Apple Global Domain': {
"com.apple.trackpad.forceClick" = 0;
"com.apple.trackpad.scaling" = 3;
"com.apple.trackpad.scrolling" = "0.75";
}
Found 3 keys in domain 'com.apple.AppleMultitouchTrackpad': {
Clicking = 0;
DragLock = 0;
Dragging = 0;
FirstClickThreshold = 2;
ForceSuppressed = 1;
}
Found 1 keys in domain 'com.apple.preference.trackpad': {
ForceClickSavedState = 0;
}
Found 1 keys in domain 'com.apple.systempreferences': {
"trackpad.lastselectedtab" = 0;
}
Now you can use “defaults delete” to delete the offending keys or “defaults write” to change them. For the global domain, use “-g” as the domain.
Disabling but not deleting a default
Sometimes you have a default that you want to remember, but you want to disable it for now. One nice way to do this is to use therename command.
defaults rename com.apple.screencapture location _disabled_location
Then, you can just rename it back later rather than deleting it and having to find the default you need to set again. Then, you can usedefaults find _disabled_ and you can find anything you’ve disabled, provide you use a unique prefix.
If it’s a boolean default, you can just set it to -bool false or whatever the opposite setting is.
Keeping track of all defaults
This might be kind of a dumb idea, but add some functions to my .bashrc to track my history of adding defaults.
function defaults-write { defaults write com.my-defaults all -array-add "defaults write $*"; }
export -f defaults-write
function defaults-read { defaults read com.my-defaults all; }
export -f defaults-read
function defaults-delete { defaults delete com.my-defaults; }
export -f defaults-delete
Then I use defaults-write instead of “defaults write” when I want to set a default. This sets the default and writes the command to a domain called com.my-defaults — this can be read easily with defaults-read and the whole domain can be deleted with defaults-delete
Here’s how it works:
defaults-write defaults write com.apple.screencapture foo bar
then:
defaults-read
This outputs:
(
"defaults write com.apple.screencapture foo bar"
)
This is very primitive but you could imagine making it more powerful. Perhaps it could work like darwinup and keep a track of all defaults commands and then they could all be reversible, since it could keep track of the setting before the defaults command was run.