You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
461 lines
19 KiB
Bash
461 lines
19 KiB
Bash
#!/usr/bin/env bash
|
|
# vim:ts=4:sts=4:sw=4:et
|
|
#
|
|
# Author: Hari Sekhon
|
|
# Date: 2020-03-01 21:01:50 +0000 (Sun, 01 Mar 2020)
|
|
#
|
|
# https://github.com/harisekhon/bash-tools
|
|
#
|
|
# License: see accompanying Hari Sekhon LICENSE file
|
|
#
|
|
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
|
|
#
|
|
# https://www.linkedin.com/in/harisekhon
|
|
#
|
|
|
|
# ============================================================================ #
|
|
# M a c S e t t i n g s
|
|
# ============================================================================ #
|
|
|
|
set -euo pipefail
|
|
[ -n "${DEBUG:-}" ] && set -x
|
|
srcdir="$(dirname "${BASH_SOURCE[0]}")"
|
|
|
|
# ============================================================================ #
|
|
# B a c k u p B e f o r e A p p l y i n g
|
|
# ============================================================================ #
|
|
|
|
# If you do mess something up, you can also go in to Time Machine and get the ~/Library/Preferences/ plist back,
|
|
# 'defaults import' it and then restart the daemons
|
|
|
|
backup_dir="$srcdir/mac_settings"
|
|
|
|
mkdir -pv "$backup_dir"
|
|
|
|
backup="$backup_dir/settings-backup-$(date '+%F_%H%M%S')-$HOSTNAME.json"
|
|
|
|
echo "backing up mac settings to $backup before applying new settings"
|
|
defaults read > "$backup"
|
|
|
|
# ============================================================================ #
|
|
|
|
# References:
|
|
#
|
|
# https://ss64.com/osx/defaults.html
|
|
#
|
|
# https://github.com/herrbischoff/awesome-macos-command-line
|
|
|
|
# TIP: how to figure out settings keys
|
|
#
|
|
# 1. defaults read > settings.json
|
|
# 2. Make your changes in the UI
|
|
# 3. defaults read > settings2.json
|
|
# 4. diff settings.json settings2.json
|
|
|
|
# This now automated using the adjacent script mac_diff_settings.sh
|
|
# which saves copies of the before and after configs and diffs them,
|
|
# before dropping in to the new config to explore the full settings paths
|
|
|
|
# "Apple Global Domain" === NSGlobalDomain
|
|
defaults write NSGlobalDomain AppleInterfaceStyle -string Dark
|
|
defaults write NSGlobalDomain AppleEnableMenuBarTransparency -bool true
|
|
defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool false
|
|
defaults write NSGlobalDomain NSQuitAlwaysKeepsWindows -bool true
|
|
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
|
|
defaults write NSGlobalDomain AppleMetricUnits -bool true
|
|
defaults write NSGlobalDomain AppleTemperatureUnit -string "Celsius"
|
|
defaults write NSGlobalDomain com.apple.sound.beep.flash -bool false
|
|
|
|
defaults write com.apple.menuextra.battery ShowPercent -string "YES"
|
|
|
|
defaults write com.apple.menuextra.clock DateFormat -string "EEE d MMM HH:mm"
|
|
defaults write com.apple.menuextra.clock FlashDateSeparators -bool false
|
|
defaults write com.apple.menuextra.clock IsAnalog -bool false
|
|
|
|
# Remove Shutdown & Restart buttons at login window
|
|
#defaults write com.apple.loginwindow ShutDownDisabled -bool true
|
|
#defaults write com.apple.loginwindow RestartDisabled -bool true
|
|
#defaults write com.apple.loginwindow LoginwindowText "Your Message"
|
|
|
|
# turn off the annoying "Application Downloaded from Internet" quarantine warning
|
|
#defaults write com.apple.LaunchServices LSQuarantine -bool false
|
|
|
|
# disable annoying crash prompt
|
|
defaults write com.apple.CrashReporter DialogType none # set to 'prompt' to restore
|
|
|
|
# disable dashboard widgets (saves RAM)
|
|
defaults write com.apple.dashboard mcx-disabled -boolean true
|
|
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.TimeMachine" -bool true
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.airport" -bool true
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.appleuser" -bool true
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.battery" -bool true
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.bluetooth" -bool true
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.volume" -bool true
|
|
defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.clock" -bool true
|
|
|
|
|
|
# ============================================================================ #
|
|
# K e y b o a r d
|
|
# ============================================================================ #
|
|
|
|
# fast keyboard repeat and low delay
|
|
defaults write NSGlobalDomain InitialKeyRepeat -int 15
|
|
defaults write NSGlobalDomain KeyRepeat -int 2
|
|
|
|
# make Fn key show hotkeys in touch bar on newer Macs
|
|
defaults write com.apple.touchbar.agent.PresentationModeFnModes.appWithControlStrip -string fullControlStrip
|
|
|
|
# ============================================================================ #
|
|
# T r a c k p a d
|
|
# ============================================================================ #
|
|
|
|
# ============
|
|
# tap to click
|
|
defaults write com.apple.trackpad forceClick -bool false
|
|
defaults write com.apple.AppleMultitouchTrackpad Clicking -bool false
|
|
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool false
|
|
|
|
defaults write com.apple.AppleMultitouchTrackpad TrackpadThreeFingerTapGesture -int 0
|
|
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerTapGesture -int 0
|
|
|
|
# ============================
|
|
# tap to click on login screen
|
|
defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
|
|
defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
|
|
|
|
# OS version on login screen
|
|
defaults write com.apple.loginwindow AdminHostInfo HostName
|
|
|
|
# ==============
|
|
# Trackpad Speed - choose an int/float in the range 0-3:
|
|
# 0 = slowest
|
|
# 3 = fastest
|
|
defaults write com.apple.trackpad.scaling -float 3
|
|
|
|
# ===========
|
|
# right-click
|
|
defaults write com.apple.AppleMultitouchTrackpad TrackpadRightClick -bool true
|
|
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadRightClick -bool true
|
|
# click bottom right corner for right-click - doesn't work
|
|
#defaults write com.apple.AppleMultitouchTrackpad TrackpadCornerSecondaryClick -int 2
|
|
#defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadCornerSecondaryClick -int 2
|
|
|
|
# ===============
|
|
# Haptic feedback
|
|
# 0: Light
|
|
# 1: Medium
|
|
# 2: Firm
|
|
defaults write com.apple.AppleMultitouchTrackpad.FirstClickThreshold -int 0
|
|
defaults write com.apple.AppleMultitouchTrackpad.SecondClickThreshold -int 0
|
|
defaults write com.apple.AppleMultitouchTrackpad.ForceSuppressed -int 0
|
|
defaults write com.apple.AppleMultitouchTrackpad ActuationStrength -int 0
|
|
|
|
# =======================================
|
|
# Enable “natural” (Lion-style) scrolling
|
|
defaults write NSGlobalDomain com.apple.swipescrolldirection -bool true
|
|
|
|
# Maximize window when double clicking the bar
|
|
defaults write NSGlobalDomain AppleActionOnDoubleClick -string Maximize
|
|
|
|
# ============================================================================ #
|
|
# T e r m i n a l
|
|
# ============================================================================ #
|
|
|
|
# use the custom 'Hari' profile
|
|
defaults write com.apple.Terminal "Default Window Settings" -string "Hari"
|
|
defaults write com.apple.Terminal "Startup Window Settings" -string "Hari"
|
|
|
|
# ===============
|
|
# open maximized:
|
|
# - MacBook Pro 15" 2013 has 204 x 59
|
|
# - MacBook Pro 15" 2018 has 239 x 72
|
|
# - if you're running a 13" Macbook Pro this will be different again, let's infer the size using the current terminal
|
|
# - $LINES and $COLUMNS aren't automatically available in a non-interactive script shell, so if not set fall back to 'tput'
|
|
# - tput falls back to 80 cols x 24 lines - too conservative
|
|
# - now instead relying on $COLUMNS and $LINES being exported by shell profile .bash.d/env.sh
|
|
# - this relies on user having already maximized your Terminal window before running this
|
|
COLUMNS="${COLUMNS:-$(tput cols)}"
|
|
LINES="${LINES:-$(tput lines)}"
|
|
# try to squeaze the terminal right to the edges
|
|
((COLUMNS+=1))
|
|
((LINES+=1))
|
|
|
|
# this is a blob and cannot be descended in to using 'defaults' command :'-(
|
|
# so we load from a saved Terminal -> Preferences -> Profiles -> Hari -> Settings -> Export file and override the $LINES and $COLUMNS
|
|
mac_terminal_settings="$(cat "$srcdir/Hari.terminal")"
|
|
mac_terminal_settings="${mac_terminal_settings/<integer>239</<integer>$COLUMNS<}"
|
|
mac_terminal_settings="${mac_terminal_settings/<integer>72</<integer>$LINES<}"
|
|
defaults write com.apple.Terminal "Window Settings" -dict-add Hari "$mac_terminal_settings"
|
|
|
|
# ============================================================================ #
|
|
# S c r e e n s a v e r & H o t C o r n e r s
|
|
# ============================================================================ #
|
|
|
|
# require password after screensaver
|
|
defaults write com.apple.screensaver askForPassword -bool true
|
|
|
|
# gives 5 secs grace before requiring password in case you accidentally hit a hot corner
|
|
defaults write com.apple.screensaver askForPasswordDelay -int 5
|
|
|
|
# bottom left Hot Corner activates Screensaver
|
|
defaults write com.apple.dock wvous-bl-corner -int 5
|
|
defaults write com.apple.dock wvous-bl-modifier -int 0
|
|
|
|
# top right Hot Corner puts display to sleep
|
|
defaults write com.apple.dock wvous-tr-corner -int 10
|
|
defaults write com.apple.dock wvous-tr-modifier -int 0
|
|
|
|
# ============================================================================ #
|
|
# S c r e e n s h o t s
|
|
# ============================================================================ #
|
|
|
|
# save screenshots to Desktop
|
|
defaults write com.apple.screencapture location -string "${HOME}/Desktop"
|
|
|
|
# save in PNG format (default, other options: BMP, GIF, JPG, PDF, TIFF)
|
|
defaults write com.apple.screencapture type -string "png"
|
|
#defaults write com.apple.screencapture type JPG
|
|
|
|
# default screenshot file name
|
|
# defaults write com.apple.screencapture name "myScreenShot"
|
|
|
|
# disable drop shadows in screenshots
|
|
defaults write com.apple.screencapture disable-shadow -bool true
|
|
|
|
# killall SystemUIServer
|
|
|
|
# ============================================================================ #
|
|
# D o c k
|
|
# ============================================================================ #
|
|
|
|
# auto-hide dock
|
|
defaults write com.apple.dock autohide -bool true
|
|
|
|
# hide non-active apps
|
|
# XXX: careful this wipes out your Dock and reversing it to false doesn't restore your Dock items
|
|
# If you mess up your Dock it is difficult to regenerate programmatically, so I suggest you go in to Time Machine and get the ~/Library/Preferences/com.apple.dock.plist back, 'defaults import' and then killall Dock to get back your icons
|
|
#defaults write com.apple.dock static-only -bool true
|
|
|
|
# pop-up instantly
|
|
defaults write com.apple.dock autohide-delay -float 0 # secs
|
|
# disappear instantly
|
|
defaults write com.apple.dock autohide-time-modifier -float 0
|
|
|
|
# speed up Mission Control animations
|
|
defaults write com.apple.dock expose-animation-duration -float 0.12
|
|
|
|
# revert to default dock delays
|
|
#defaults delete com.apple.dock autohide-delay
|
|
#defaults delete com.apple.dock autohide-time-modifier
|
|
|
|
# stop apps saving to iCloud by default
|
|
defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false
|
|
|
|
# enable Dashboard with widgets
|
|
#defaults write com.apple.dashboard mcx-disabled -boolean false
|
|
|
|
# make hidden app icons translucent
|
|
defaults write com.apple.Dock showhidden -bool true
|
|
|
|
# show indicator lights for open applications in the dock
|
|
defaults write com.apple.dock show-process-indicators -bool true
|
|
|
|
# disable bouncing icons
|
|
defaults write com.apple.dock no-bouncing -bool true
|
|
|
|
# don't minimize to applications, it's more obvious when they're on the far right
|
|
defaults write com.apple.dock minimize-to-application -bool false
|
|
|
|
#killall Dock
|
|
|
|
# ============================================================================ #
|
|
# M i s c e l l a n e o u s
|
|
# ============================================================================ #
|
|
|
|
# Use network time
|
|
sudo systemsetup -setusingnetworktime on
|
|
|
|
# auto-restart after a system freeze
|
|
sudo systemsetup -setrestartfreeze on
|
|
|
|
# restore windows after reboot
|
|
defaults write com.apple.systempreferences NSQuitAlwaysKeepsWindows -bool true
|
|
defaults write -g NSQuitAlwaysKeepsWindows -bool true
|
|
|
|
# Check for software updates daily, not just once per week
|
|
defaults write com.apple.SoftwareUpdate ScheduleFrequency -int 1
|
|
|
|
# Disable local Time Machine snapshots
|
|
#sudo tmutil disable local
|
|
|
|
defaults write com.apple.TimeMachine AutoBackup -int 1
|
|
# default 3600 = 1 hour backup interval
|
|
#sudo defaults write /System/Library/Launch Daemons/com.apple.backupd-auto StartInterval -int 1800
|
|
|
|
# Increase sound quality for Bluetooth headphones/headsets
|
|
defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Min (editable)" -int 40
|
|
|
|
# Expanded print options
|
|
defaults write -g PMPrintingExpandedStateForPrint -bool true
|
|
defaults write -g PMPrintingExpandedStateForPrint2 -bool true
|
|
|
|
# Expand file save dialog
|
|
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
|
|
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
|
|
|
|
# ============================================================================ #
|
|
# F i n d e r
|
|
# ============================================================================ #
|
|
|
|
# TODO: set Finder to columns that are auto-wide
|
|
|
|
# hide Desktop icons
|
|
#defaults write com.apple.finder CreateDesktop -bool false
|
|
|
|
# set Desktop as the default location for new Finder windows
|
|
#defaults write com.apple.finder NewWindowTarget -string "PfDe"
|
|
# set Downloads as the default location for new Finder windows
|
|
defaults write com.apple.finder NewWindowTarget -string "PfLo"
|
|
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/Downloads/"
|
|
defaults write com.apple.finder NSNavLastRootDirectory -string "file://${HOME}/Downloads/"
|
|
|
|
# default to Details view
|
|
defaults write com.apple.finder FXPreferredViewStyle -string Nlsv
|
|
defaults write com.apple.finder TrashViewSettings -string Nlsv
|
|
defaults write com.apple.finder SearchRecentsSavedViewStyle -string Nlsv
|
|
|
|
# allow copying from Quick Look preview
|
|
defaults write com.apple.finder QLEnableTextSelection -bool true
|
|
|
|
# show the ~/Library folder
|
|
chflags nohidden ~/Library
|
|
|
|
# show Status Bar
|
|
defaults write com.apple.finder ShowStatusBar -bool true
|
|
|
|
# Empty Trash securely by default
|
|
defaults write com.apple.finder EmptyTrashSecurely -bool true
|
|
|
|
# Automatically remove Trash > 30 days
|
|
defaults write com.apple.finder FXRemoveOldTrashItems -bool true
|
|
|
|
# don't disable the warning before emptying the Trash in case you hit Cmd-Del then Cmd-Shift-Del data could be lost
|
|
defaults write com.apple.finder WarnOnEmptyTrash -bool true
|
|
|
|
# show hidden files by default
|
|
defaults write com.apple.finder AppleShowAllFiles -bool true
|
|
|
|
# show all filename extensions
|
|
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
|
|
|
|
# show the scroll bar all the time
|
|
defaults write NSGlobalDomain AppleShowScrollBars -string WhenScrolling # or Automatic or Always
|
|
|
|
# close always confirms changes
|
|
defaults write NSGlobalDomain NSCloseAlwaysConfirmsChanges -bool true
|
|
|
|
# show path bar
|
|
defaults write com.apple.finder ShowPathbar -bool true
|
|
|
|
# display full POSIX path as Finder window title
|
|
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
|
|
|
|
# When performing a search, search the current folder by default
|
|
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
|
|
|
|
# disable the warning when changing a file extension
|
|
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false
|
|
|
|
# Show icons for hard drives, servers, and removable media on the desktop
|
|
defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
|
|
defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true
|
|
defaults write com.apple.finder ShowMountedServersOnDesktop -bool true
|
|
defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true
|
|
|
|
# Avoid creating .DS_Store files on network volumes
|
|
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
|
|
# Don't create .DS_Store files on USB drives - probably don't want this if you use external hard drives a lot
|
|
#defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
|
|
|
|
|
|
# Automatically open a new Finder window when a volume is mounted
|
|
defaults write com.apple.frameworks.diskimages auto-open-ro-root -bool true
|
|
defaults write com.apple.frameworks.diskimages auto-open-rw-root -bool true
|
|
defaults write com.apple.finder OpenWindowForNewRemovableDisk -bool true
|
|
|
|
# Enable 'Quit' menu item in Finder
|
|
#defaults write com.apple.finder QuitMenuItem -bool true
|
|
defaults write com.apple.finder QuitMenuItem -bool false
|
|
|
|
#killall Finder
|
|
|
|
# ============================================================================ #
|
|
# P r e v i e w
|
|
# ============================================================================ #
|
|
|
|
# set to false to not re-open previous documents from last Preview session
|
|
defaults write com.apple.Preview NSQuitAlwaysKeepsWindows -bool true
|
|
|
|
#killall Preview
|
|
|
|
# ============================================================================ #
|
|
# A u t o m a t i c U p d a t e s
|
|
# ============================================================================ #
|
|
|
|
# Auto check for updates
|
|
defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool true
|
|
|
|
# Auto download updates in background
|
|
defaults write com.apple.SoftwareUpdate AutomaticDownload -bool true
|
|
|
|
# Don't install App updates automatically
|
|
defaults write com.apple.commerce AutoUpdate -bool false
|
|
|
|
# Don't install MacOS updates automatically
|
|
defaults write com.apple.commerce AutoUpdateRestartRequired -bool false
|
|
|
|
# Don't install Security updates automatically
|
|
defaults write com.apple.SoftwareUpdate CriticalUpdateInstall -bool false
|
|
|
|
# ============================================================================ #
|
|
|
|
# Enable AirDrop over Ethernet and on unsupported Macs running Lion
|
|
#defaults write com.apple.NetworkBrowser BrowseAllInterfaces -bool true
|
|
|
|
# Change indexing order and disable some search results
|
|
#defaults write com.apple.spotlight orderedItems -array \
|
|
# '{"enabled" = 1;"name" = "APPLICATIONS";}' \
|
|
# '{"enabled" = 1;"name" = "SYSTEM_PREFS";}' \
|
|
# '{"enabled" = 0;"name" = "DIRECTORIES";}' \
|
|
# '{"enabled" = 0;"name" = "PDF";}' \
|
|
# '{"enabled" = 0;"name" = "FONTS";}' \
|
|
# '{"enabled" = 0;"name" = "DOCUMENTS";}' \
|
|
# '{"enabled" = 0;"name" = "MESSAGES";}' \
|
|
# '{"enabled" = 0;"name" = "CONTACT";}' \
|
|
# '{"enabled" = 0;"name" = "EVENT_TODO";}' \
|
|
# '{"enabled" = 0;"name" = "IMAGES";}' \
|
|
# '{"enabled" = 0;"name" = "BOOKMARKS";}' \
|
|
# '{"enabled" = 0;"name" = "MUSIC";}' \
|
|
# '{"enabled" = 0;"name" = "MOVIES";}' \
|
|
# '{"enabled" = 0;"name" = "PRESENTATIONS";}' \
|
|
# '{"enabled" = 0;"name" = "SPREADSHEETS";}' \
|
|
# '{"enabled" = 0;"name" = "SOURCE";}' \
|
|
# '{"enabled" = 1;"name" = "MENU_DEFINITION";}' \
|
|
# '{"enabled" = 0;"name" = "MENU_OTHER";}' \
|
|
# '{"enabled" = 0;"name" = "MENU_CONVERSION";}' \
|
|
# '{"enabled" = 1;"name" = "MENU_EXPRESSION";}' \
|
|
# '{"enabled" = 0;"name" = "MENU_WEBSEARCH";}' \
|
|
# '{"enabled" = 0;"name" = "MENU_SPOTLIGHT_SUGGESTIONS";}'
|
|
|
|
# ============================================================================ #
|
|
|
|
echo "Some settings won't take effect until you restart the processes. When you've saved your work and are ready, run:
|
|
|
|
sudo killall Finder
|
|
sudo killall Dock
|
|
sudo killall cfprefsd
|
|
sudo killall SystemUIServer
|
|
sudo killall Terminal
|
|
"
|