Skip to content

Instantly share code, notes, and snippets.

@cklanac
Last active September 19, 2022 21:42
Show Gist options
  • Save cklanac/538394d5935dc68354307bf116c9bc32 to your computer and use it in GitHub Desktop.
Save cklanac/538394d5935dc68354307bf116c9bc32 to your computer and use it in GitHub Desktop.
Mac Setup Distilled
#!/usr/bin/env bash
# ~/.macos — https://mths.be/macos
# Close any open System Preferences panes, to prevent them from overriding
# settings we’re about to change
osascript -e 'tell application "System Preferences" to quit'
# Ask for the administrator password upfront
sudo -v
# Keep-alive: update existing `sudo` time stamp until `.macos` has finished
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
###############################################################################
# General UI/UX #
###############################################################################
# Set computer name (as done via System Preferences → Sharing)
sudo scutil --set ComputerName "MBP"
sudo scutil --set LocalHostName "MBP"
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName -string "MBP"
# Disable transparency in the menu bar and elsewhere on Yosemite
defaults writes com.apple.universalaccess reduceTransparency -bool true
# Set highlight color to blue
defaults write NSGlobalDomain AppleHighlightColor -string "0.698039 0.843137 1.000000"
# Always show scrollbars
# Possible values: `WhenScrolling`, `Automatic` and `Always`
defaults write NSGlobalDomain AppleShowScrollBars -string "Always"
# Disable automatic capitalization as it’s annoying when typing code
defaults write NSGlobalDomain NSAutomaticCapitalizationEnabled -bool false
# Disable smart dashes as they’re annoying when typing code
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
# Disable automatic period substitution as it’s annoying when typing code
defaults write NSGlobalDomain NSAutomaticPeriodSubstitutionEnabled -bool false
# Disable smart quotes as they’re annoying when typing code
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
# Disable auto-correct
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
###############################################################################
# Firewall & Security #
###############################################################################
# Enable Firewall. Possible values:
# 0 = off
# 1 = on for specific services
# 2 = on for essential services
sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 1
# Enable Stealth mode
sudo defaults write /Library/Preferences/com.apple.alf stealthenabled -int 1
# Enable Firewall logging
sudo defaults write /Library/Preferences/com.apple.alf loggingenabled -int 1
# Disable IR remote control.
sudo defaults write /Library/Preferences/com.apple.driver.AppleIRController DeviceEnabled -bool false
###############################################################################
# Power Management #
###############################################################################
# Set standby delay to 24 hours (default is 1 hour)
#sudo pmset -a standbydelay 86400
# To stop the display from half dimming before full display 'sleep'
# http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/pmset.1.html
sudo pmset -a halfdim 0
# Sleep options
sudo pmset -a displaysleep 5
sudo pmset -a sleep 0
sudo pmset -a disksleep 0
# Wake for network access
#sudo pmset -a womp 1
# Don't restart after power failure
sudo pmset -a autorestart 0
# Wake computer when laptop is opened
sudo pmset -a lidwake 1
# Don't wake computer when power source changes
sudo pmset -a acwake 0
# Don't dim brightness on any different source
# sudo pmset -a lessbright 0
# Disable sudden motion sensor
sudo pmset -a sms 0
# Disable hibernation (speeds up entering sleep mode)
#sudo pmset -a hibernatemode 0
# Power button behavior
defaults write com.apple.loginwindow PowerButtonSleepsSystem -bool NO
###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input #
###############################################################################
# Trackpad: enable tap to click for this user and for the login screen
#defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
#defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
# Enable full keyboard access for all controls (e.g. enable Tab in modal dialogs)
defaults write NSGlobalDomain AppleKeyboardUIMode -int 3
# Stop iTunes from responding to the keyboard media keys
launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist 2> /dev/null
###############################################################################
# Screen #
###############################################################################
# Disable the screen saver (System Preferences must be closed)
defaults -currentHost write com.apple.screensaver idleTime -int 0
# Require password immediately after sleep or screen saver begins
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
# Save screenshots to the Pictures folder
defaults write com.apple.screencapture location -string "${HOME}/Library/Mobile Documents/com~apple~CloudDocs/ScreenShots"
###############################################################################
# Finder #
###############################################################################
# Set Documents (PfDo) as the default location for new Finder windows
defaults write com.apple.finder NewWindowTarget -string "PfDe"
# Finder: show all filename extensions
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# Finder: show status bar
defaults write com.apple.finder ShowStatusBar -bool true
# Finder: show path bar
defaults write com.apple.finder ShowPathbar -bool true
# When performing a search, search the current folder by default
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
# Enable spring loading for directories
defaults write NSGlobalDomain com.apple.springing.enabled -bool true
# Use list view in all Finder windows by default
# Four-letter codes for the other view modes:
# List: `Nlsv`
# Icon: `icnv`
# Column: `clmv`
# Gallery: `Flwv`
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
###############################################################################
# Menu #
###############################################################################
defaults write com.apple.systemuiserver menuExtras -array \
"/System/Library/CoreServices/Menu Extras/AirPort.menu" \
"/System/Library/CoreServices/Menu Extras/Battery.menu" \
"/System/Library/CoreServices/Menu Extras/Bluetooth.menu" \
"/System/Library/CoreServices/Menu Extras/Clock.menu" \
"/System/Library/CoreServices/Menu Extras/TimeMachine.menu" \
"/System/Library/CoreServices/Menu Extras/Volume.menu"
defaults write com.apple.menuextra.battery ShowPercent -bool true
###############################################################################
# Dock, Dashboard, and hot corners #
###############################################################################
# Enable highlight hover effect for the grid view of a stack (Dock)
#defaults write com.apple.dock mouse-over-hilite-stack -bool true
# Set the icon size of Dock items to tiny
#defaults write com.apple.dock tilesize -int 16
# Disable dock magification
defaults write com.apple.dock magnification -bool false
# Put the dock on left side
defaults write com.apple.dock orientation -string "left"
# Change minimize/maximize window effect
#defaults write com.apple.dock mineffect -string "scale"
# Minimize windows into their application’s icon
defaults write com.apple.dock minimize-to-application -bool true
# Enable spring loading for all Dock items
#defaults write com.apple.dock enable-spring-load-actions-on-all-items -bool true
# Show indicator lights for open applications in the Dock
defaults write com.apple.dock show-process-indicators -bool true
# Wipe all (default) app icons from the Dock
# This is only really useful when setting up a new Mac, or if you don’t use the Dock to launch apps.
defaults write com.apple.dock persistent-apps -array
# Show only open applications in the Dock
defaults write com.apple.dock static-only -bool true
# Don’t animate opening applications from the Dock
#defaults write com.apple.dock launchanim -bool false
# Speed up Mission Control animations
#defaults write com.apple.dock expose-animation-duration -float 0.1
# Don’t group windows by application in Mission Control
# (i.e. use the old Exposé behavior instead)
defaults write com.apple.dock expose-group-by-app -bool false
# Disable Dashboard
defaults write com.apple.dashboard mcx-disabled -bool true
# Don’t show Dashboard as a Space
defaults write com.apple.dock dashboard-in-overlay -bool true
# Don’t automatically rearrange Spaces based on most recent use
defaults write com.apple.dock mru-spaces -bool false
# Set the auto-hiding Dock delay to very very slow
defaults write com.apple.dock autohide-delay -int 5;
# Remove the animation when hiding/showing the Dock
defaults write com.apple.dock autohide-time-modifier -float 0
# Disable Automatic hide and show the Dock
defaults write com.apple.dock autohide -bool false
# Make Dock icons of hidden applications translucent
defaults write com.apple.dock showhidden -bool true
# Don’t show recent applications in Dock
defaults write com.apple.dock show-recents -bool false
# Disable the Launchpad gesture (pinch with thumb and three fingers)
#defaults write com.apple.dock showLaunchpadGestureEnabled -int 0
# Reset Launchpad, but keep the desktop wallpaper intact
#find "${HOME}/Library/Application Support/Dock" -name "*-*.db" -maxdepth 1 -delete
# Add iOS & Watch Simulator to Launchpad
sudo ln -sf "/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app" "/Applications/Simulator.app"
sudo ln -sf "/Applications/Xcode.app/Contents/Developer/Applications/Simulator (Watch).app" "/Applications/Simulator (Watch).app"
# Add a spacer to the left side of the Dock (where the applications are)
#defaults write com.apple.dock persistent-apps -array-add '{tile-data={}; tile-type="spacer-tile";}'
# Add a spacer to the right side of the Dock (where the Trash is)
#defaults write com.apple.dock persistent-others -array-add '{tile-data={}; tile-type="spacer-tile";}'
# Hot corners
# Possible values:
# 0: no-op
# 2: Mission Control
# 3: Show application windows
# 4: Desktop
# 5: Start screen saver
# 6: Disable screen saver
# 7: Dashboard
# 10: Put display to sleep
# 11: Launchpad
# 12: Notification Center
# Top left screen corner → Mission Control
#defaults write com.apple.dock wvous-tl-corner -int 2
#defaults write com.apple.dock wvous-tl-modifier -int 0
# Top right screen corner → Desktop
#defaults write com.apple.dock wvous-tr-corner -int 4
#defaults write com.apple.dock wvous-tr-modifier -int 0
# Bottom left screen corner → Start screen saver
#defaults write com.apple.dock wvous-bl-corner -int 5
#defaults write com.apple.dock wvous-bl-modifier -int 0
###############################################################################
# Safari & WebKit #
###############################################################################
# Privacy: don’t send search queries to Apple
defaults write com.apple.Safari UniversalSearchEnabled -bool false
defaults write com.apple.Safari SuppressSearchSuggestions -bool true
# Press Tab to highlight each item on a web page
#defaults write com.apple.Safari WebKitTabToLinksPreferenceKey -bool true
#defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2TabsToLinks -bool true
# Show the full URL in the address bar (note: this still hides the scheme)
defaults write com.apple.Safari ShowFullURLInSmartSearchField -bool true
# Set Safari’s home page to `about:blank` for faster loading
defaults write com.apple.Safari HomePage -string "about:blank"
# Prevent Safari from opening ‘safe’ files automatically after downloading
defaults write com.apple.Safari AutoOpenSafeDownloads -bool false
# Allow hitting the Backspace key to go to the previous page in history
#defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool true
# Hide Safari’s bookmarks bar by default
#defaults write com.apple.Safari ShowFavoritesBar -bool false
# Hide Safari’s sidebar in Top Sites
defaults write com.apple.Safari ShowSidebarInTopSites -bool false
# Disable Safari’s thumbnail cache for History and Top Sites
#defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2
# Enable Safari’s debug menu
defaults write com.apple.Safari IncludeInternalDebugMenu -bool true
# Make Safari’s search banners default to Contains instead of Starts With
defaults write com.apple.Safari FindOnPageMatchesWordStartsOnly -bool false
# Remove useless icons from Safari’s bookmarks bar
defaults write com.apple.Safari ProxiesInBookmarksBar "()"
# Enable the Develop menu and the Web Inspector in Safari
defaults write com.apple.Safari IncludeDevelopMenu -bool true
defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled -bool true
# Add a context menu item for showing the Web Inspector in web views
defaults write NSGlobalDomain WebKitDeveloperExtras -bool true
# Enable continuous spellchecking
defaults write com.apple.Safari WebContinuousSpellCheckingEnabled -bool true
# Disable auto-correct
defaults write com.apple.Safari WebAutomaticSpellingCorrectionEnabled -bool false
# Disable AutoFill
#defaults write com.apple.Safari AutoFillFromAddressBook -bool false
#defaults write com.apple.Safari AutoFillPasswords -bool false
#defaults write com.apple.Safari AutoFillCreditCardData -bool false
#defaults write com.apple.Safari AutoFillMiscellaneousForms -bool false
# Warn about fraudulent websites
defaults write com.apple.Safari WarnAboutFraudulentWebsites -bool true
# Disable plug-ins
#defaults write com.apple.Safari WebKitPluginsEnabled -bool false
#defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2PluginsEnabled -bool false
# Disable Java
defaults write com.apple.Safari WebKitJavaEnabled -bool false
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2JavaEnabled -bool false
# Block pop-up windows
defaults write com.apple.Safari WebKitJavaScriptCanOpenWindowsAutomatically -bool false
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2JavaScriptCanOpenWindowsAutomatically -bool false
# Disable auto-playing video
defaults write com.apple.Safari WebKitMediaPlaybackAllowsInline -bool false
defaults write com.apple.SafariTechnologyPreview WebKitMediaPlaybackAllowsInline -bool false
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2AllowsInlineMediaPlayback -bool false
defaults write com.apple.SafariTechnologyPreview com.apple.Safari.ContentPageGroupIdentifier.WebKit2AllowsInlineMediaPlayback -bool false
# Enable “Do Not Track”
defaults write com.apple.Safari SendDoNotTrackHTTPHeader -bool true
# Update extensions automatically
defaults write com.apple.Safari InstallExtensionUpdatesAutomatically -bool true
###############################################################################
# Mail #
###############################################################################
# Disable send and reply animations in Mail.app
#defaults write com.apple.mail DisableReplyAnimations -bool true
#defaults write com.apple.mail DisableSendAnimations -bool true
# Copy email addresses as `[email protected]` instead of `Foo Bar <[email protected]>` in Mail.app
#defaults write com.apple.mail AddressesIncludeNameOnPasteboard -bool false
# Add the keyboard shortcut ⌘ + Enter to send an email in Mail.app
#defaults write com.apple.mail NSUserKeyEquivalents -dict-add "Send" "@\U21a9"
# Display emails in threaded mode, sorted by date (oldest at the top)
#defaults write com.apple.mail DraftsViewerAttributes -dict-add "DisplayInThreadedMode" -string "yes"
#defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortedDescending" -string "yes"
#defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortOrder" -string "received-date"
# Disable inline attachments (just show the icons)
#defaults write com.apple.mail DisableInlineAttachmentViewing -bool true
# Disable automatic spell checking
#defaults write com.apple.mail SpellCheckingBehavior -string "NoSpellCheckingEnabled"
###############################################################################
# Spotlight #
###############################################################################
# Hide Spotlight tray-icon (and subsequent helper)
#sudo chmod 600 /System/Library/CoreServices/Search.bundle/Contents/MacOS/Search
# Disable Spotlight indexing for any volume that gets mounted and has not yet been indexed before.
# Use `sudo mdutil -i off "/Volumes/foo"` to stop indexing any volume.
sudo defaults write /.Spotlight-V100/VolumeConfiguration Exclusions -array "/Volumes"
# Change indexing order and disable some search results
# Yosemite-specific search results (remove them if you are using macOS 10.9 or older):
# MENU_DEFINITION
# MENU_CONVERSION
# MENU_EXPRESSION
# MENU_SPOTLIGHT_SUGGESTIONS (send search queries to Apple)
# MENU_WEBSEARCH (send search queries to Apple)
# MENU_OTHER
defaults write com.apple.spotlight orderedItems -array \
'{"enabled" = 1;"name" = "APPLICATIONS";}' \
'{"enabled" = 1;"name" = "SYSTEM_PREFS";}' \
'{"enabled" = 1;"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" = 1;"name" = "MENU_CONVERSION";}' \
'{"enabled" = 1;"name" = "MENU_EXPRESSION";}' \
'{"enabled" = 0;"name" = "MENU_WEBSEARCH";}' \
'{"enabled" = 0;"name" = "MENU_SPOTLIGHT_SUGGESTIONS";}'
# Load new settings before rebuilding the index
killall mds > /dev/null 2>&1
# Make sure indexing is enabled for the main volume
sudo mdutil -i on / > /dev/null
# Rebuild the index from scratch
sudo mdutil -E / > /dev/null
###############################################################################
# Terminal & iTerm 2 #
###############################################################################
# Only use UTF-8 in Terminal.app
defaults write com.apple.terminal StringEncodings -array 4
# Use a modified version of the Solarized Dark theme by default in Terminal.app
#osascript <<EOD
#
#tell application "Terminal"
#
# local allOpenedWindows
# local initialOpenedWindows
# local windowID
# set themeName to "Solarized Dark xterm-256color"
#
# (* Store the IDs of all the open terminal windows. *)
# set initialOpenedWindows to id of every window
#
# (* Open the custom theme so that it gets added to the list
# of available terminal themes (note: this will open two
# additional terminal windows). *)
# do shell script "open '$HOME/init/" & themeName & ".terminal'"
#
# (* Wait a little bit to ensure that the custom theme is added. *)
# delay 1
#
# (* Set the custom theme as the default terminal theme. *)
# set default settings to settings set themeName
#
# (* Get the IDs of all the currently opened terminal windows. *)
# set allOpenedWindows to id of every window
#
# repeat with windowID in allOpenedWindows
#
# (* Close the additional windows that were opened in order
# to add the custom theme to the list of terminal themes. *)
# if initialOpenedWindows does not contain windowID then
# close (every window whose id is windowID)
#
# (* Change the theme for the initial opened terminal windows
# to remove the need to close them in order for the custom
# theme to be applied. *)
# else
# set current settings of tabs of (every window whose id is windowID) to settings set themeName
# end if
#
# end repeat
#
#end tell
#
#EOD
# Enable “focus follows mouse” for Terminal.app and all X11 apps
# i.e. hover over a window and start typing in it without clicking first
defaults write com.apple.terminal FocusFollowsMouse -bool true
defaults write org.x.X11 wm_ffm -bool true
# Enable Secure Keyboard Entry in Terminal.app
# See: https://security.stackexchange.com/a/47786/8918
defaults write com.apple.terminal SecureKeyboardEntry -bool true
# Disable the annoying line marks
defaults write com.apple.Terminal ShowLineMarks -int 0
# Disable leading [ on prompt lines (which is totally broken in anything curses)
# https://twitter.com/UINT_MIN/status/652142001932996609
#defaults write com.apple.Terminal AutoMarkPromptLines -bool false
#defaults write com.apple.Terminal ShowLineMarks -bool false
# Hide scrollbars in terminal
defaults write com.apple.Terminal AppleShowScrollBars -string "Automatic"
# Install the Solarized Dark theme for iTerm
#open "${HOME}/init/Solarized Dark.itermcolors"
# Don’t display the annoying prompt when quitting iTerm
#defaults write com.googlecode.iterm2 PromptOnQuit -bool false
###############################################################################
# Time Machine #
###############################################################################
# Prevent Time Machine from prompting to use new hard drives as backup volume
#defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true
# Disable local Time Machine backups
#hash tmutil &> /dev/null && sudo tmutil disablelocal
###############################################################################
# Activity Monitor #
###############################################################################
# Show the main window when launching Activity Monitor
defaults write com.apple.ActivityMonitor OpenMainWindow -bool true
# Visualize CPU usage in the Activity Monitor Dock icon
defaults write com.apple.ActivityMonitor IconType -int 5
# Show all processes in Activity Monitor
defaults write com.apple.ActivityMonitor ShowCategory -int 0
# Sort Activity Monitor results by CPU usage
defaults write com.apple.ActivityMonitor SortColumn -string "CPUUsage"
defaults write com.apple.ActivityMonitor SortDirection -int 0
###############################################################################
# Address Book, Dashboard, iCal, TextEdit, and Disk Utility #
###############################################################################
# Enable the debug menu in Address Book
#defaults write com.apple.addressbook ABShowDebugMenu -bool true
# Enable Dashboard dev mode (allows keeping widgets on the desktop)
#defaults write com.apple.dashboard devmode -bool true
# Enable the debug menu in iCal (pre-10.8)
#defaults write com.apple.iCal IncludeDebugMenu -bool true
# Use plain text mode for new TextEdit documents
defaults write com.apple.TextEdit RichText -int 0
# Open and save files as UTF-8 in TextEdit
defaults write com.apple.TextEdit PlainTextEncoding -int 4
defaults write com.apple.TextEdit PlainTextEncodingForWrite -int 4
# Enable the debug menu in Disk Utility
#defaults write com.apple.DiskUtility DUDebugMenuEnabled -bool true
#defaults write com.apple.DiskUtility advanced-image-options -bool true
# Disable Auto-play videos when opened with QuickTime Player
defaults write com.apple.QuickTimePlayerX MGPlayMovieOnOpen -bool false
###############################################################################
# Mac App Store #
###############################################################################
# Enable the WebKit Developer Tools in the Mac App Store
#defaults write com.apple.appstore WebKitDeveloperExtras -bool true
# Enable Debug Menu in the Mac App Store
#defaults write com.apple.appstore ShowDebugMenu -bool true
# Enable the automatic update check
defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool true
# Check for software updates daily, not just once per week
defaults write com.apple.SoftwareUpdate ScheduleFrequency -int 1
# Download newly available updates in background
defaults write com.apple.SoftwareUpdate AutomaticDownload -int 1
# Install System data files & security updates
defaults write com.apple.SoftwareUpdate CriticalUpdateInstall -int 1
# Automatically download apps purchased on other Macs
#defaults write com.apple.SoftwareUpdate ConfigDataInstall -int 1
# Turn on app auto-update
defaults write com.apple.commerce AutoUpdate -bool true
# Allow the App Store to reboot machine on macOS updates
defaults write com.apple.commerce AutoUpdateRestartRequired -bool true
###############################################################################
# Photos #
###############################################################################
# Prevent Photos from opening automatically when devices are plugged in
defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool true
###############################################################################
# Messages #
###############################################################################
# Disable automatic emoji substitution (i.e. use plain text smileys)
#defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "automaticEmojiSubstitutionEnablediMessage" -bool false
# Disable smart quotes as it’s annoying for messages that contain code
defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "automaticQuoteSubstitutionEnabled" -bool false
# Disable continuous spell checking
defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "continuousSpellCheckingEnabled" -bool false
###############################################################################
# Kill affected applications #
###############################################################################
for app in "Activity Monitor" \
"Address Book" \
"Calendar" \
"cfprefsd" \
"Contacts" \
"Dock" \
"Finder" \
"Google Chrome Canary" \
"Google Chrome" \
"Mail" \
"Messages" \
"Photos" \
"Safari" \
"SystemUIServer" \
"Terminal" \
"iCal"; do
killall "${app}" &> /dev/null
done
echo "Done. Note that some of these changes require a logout/restart to take effect."

Mac Setup Distilled

Install Chrome, Dev and Canary

Description of Chrome Channels

  • Install Chrome or Chrome Dev
    • Note: Chrome and Chrome Dev use the same profile on a Mac
  • Setup 2 profiles:
    • Browsing: It may contain bookmarks, personal settings and extenstions
    • Development: It should only be minimal, only have React, Redux and dev related extenstions
  • Install Chrome Canary for future feature testing

Install command line apps

Install HomeBrew

From your terminal

  • Install homebrew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Note: brew needs Xcode Command Line Tools to be compiled so you may see the following request:

==> The Xcode Command Line Tools will be installed.

Press RETURN to continue or any other key to abort

Install Node 10 LTS

From your terminal, brew install the following:

Note: As of June 2019, Node Debugger (NDB) does support Node 12.x, yet. So install Node 10 and sym

Install Node:

brew install node@10 - installs node, npm and npx and adds symlinks to /usr/local/bin

Add to PATH:

echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile

Re-source .bask_profile:

source ~/.bash_profile

Install Git

You can install install git using Homebrew or the GUI

Install Git using Brew

brew install git - installs git, git-cvsserver, git-receive-pack, git-shell, git-upload-archive, git-upload-pack, gitk as well as pcre2-config, pcre2grep, pcre2test.

Install Git using GUI

Download and install git GUI from http://sourceforge.net/projects/git-osx-installer/ - This installs git to /usr/local/git, and places symlinks for git, git-credential-osxkeychain, git-cvsserver, git-shell and gitk as well as pcre2-config, pcre2grep, pcre2test into /usr/local/bin.

brew install postgres
brew install mongo 

Config Git

Setup git username and email address

  • In Terminal,
git config --global user.name "John Doe"
git config --global user.email [email protected]

Access GitHub from Terminal

Git osxkeychain helper

The credential helper tells Git to remember your GitHub username and password in the OSX Keychain app. If you installed Git using Brew then the credential helper is already installed installed. Configure it below

  • On the Terminal,
git config --global credential.helper osxkeychain

Now you can use HTTPS git URLs instead of SSH. If you are using 2-Factor Authentication then you must use a Personal Access Token on the Terminal instead of your password. Setup a Personal Access Token below

Git Personal Access Token for 2-Factor Authentication

If you are 2FA you must use a Personal Access Token to login to GitHub from the terminal

On github.com:

  • Go to: Settings > Developer settings > Personal access tokens
  • Create an access token, copy the token
  • On the Terminal, make a commit and then push the change to a remote on GitHub.
  • Enter the Personal Access Token instead of your password

Note: the Personal Access Token will be saved in the OSX Keychain app

Install global NPM packages

Install common global NPM packages

  • brew install the following:
npm install -g eslint http-server nodemon 

Install Node Debugger

Install Chrome Labs Node Debugger

npm install -g ndb

Configure apps

Configure a global ESLint

ESLint supports both global and local configurations so you can have eslintrc files in individual projects as well as at user root. The child configurations in the project folder take precedence over higher configurations. In your user root create the following file.

  • From your terminal:
    • cd to user root cd ~
    • touch eslintrc.json
    • add the following to the file
/** 
* ESLint: http://eslint.org/docs/user-guide/configuring
*/
{
	// https://eslint.org/docs/user-guide/configuring#specifying-parser
    "parserOptions": {
       "ecmaVersion": 7  //same as 2016
    },
    
    // https://eslint.org/docs/user-guide/configuring#specifying-environments
    "env": {
        "browser": true,
        "node": true,
        "es6": true,
        "mocha": true,
        "jest": true,
        "mongo": true,
        "jquery": true
    },

    // our configuration extends the recommended base configuration
    // https://eslint.org/docs/user-guide/configuring#extending-configuration-files
    "extends": "eslint:recommended",

	// https://eslint.org/docs/rules/
    // ESLint rules: Severity Levels: off = 0 | warn = 1 | error = 2
    "rules": {
        "strict": ["error", "safe"],   	//prefer `'use-strict';` pragma
        "eqeqeq": [2, "allow-null"],
        "no-console": "off",          	//ignores `console.log()`
        "no-unused-vars": ["warn", { "vars": "local", "args": "after-used", "ignoreRestSiblings": false }],
        "no-eval": "error",            	//disallows `eval()` usage
        "quotes": [2, "single", "avoid-escape"], //prefer single quotes over double quotes
        "indent": ["error", 2, {		// enforce 2 space indents (not tabs)
        	"SwitchCase": 1				// clauses with 2 spaces with respect to switch statements
        }],
        "semi": ["error", "always"]    //enforce semi-colon usage
    }
}

Configure Postgres PGDATA

Set the default PostgreSQL PGDATA directory

  • Add the following to your ~/.bash_profile file
touch ~/.bash_profile
echo 'export PGDATA=/usr/local/var/postgres' >> ~/.bash_profile

Install Development Apps

App Store Apps:

  • Magnet ($)
  • ScreenBrush
  • Chrom or Chrome Dev
  • Chrome Canary
  • Chrome Extensions for browsing
    • AdBlock
    • Open Frame
    • Thinkful sessions
  • Chrome Extensions for Development
    • JSON Viewer
    • React
  • Postman
  • Slack
  • System Monitor ($)

Other Apps

  • Dropbox
  • Google Drive

Optional Installs and Configs

OPTIONAL: Create a global gitignore

Git uses both local and global gitignore files. You can setup a global gitignore which will prevent common files from accidentally being committed to your repos.

  • From your terminal:
    • cd to user root cd ~
    • touch .gitignore
    • add the following configuration
######################
# REF: https://gist.github.com/octocat/9257657
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
 
# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
 
# Logs and databases #
######################
*.log
# *.sql This should be committed for demos
*.sqlite
 
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

OPTIONAL: Configure command line completion

If you installed the above apps using brew, then you can setup command line completion for git, npm, brew,

#####
# (OPTIONAL) COMMAND LINE COMPLETION
# http://superuser.com/questions/31744/how-to-get-git-completion-bash-to-work-on-mac-os-x
#####
# Load bash completion for brew
if [ -f `brew --prefix`/etc/bash_completion.d/brew ]; then
    source `brew --prefix`/etc/bash_completion.d/brew
fi

# Load bash completion for git
if [ -f `brew --prefix`/etc/bash_completion.d/git-completion.bash ]; then
	source `brew --prefix`/etc/bash_completion.d/git-completion.bash
fi

# Load bash completion for NPM
if [ -f `brew --prefix`/etc/bash_completion.d/npm ]; then
    source `brew --prefix`/etc/bash_completion.d/npm
fi

OPTIONAL: Configure Git Prompt

Optionally, you can setup your prompt to show your git repository status

#####
# (OPTIONAL) GIT PROMPT SUPPORT 
# View the git-prompt.sh file for mor information
#####
# Load git prompt
if [ -f `brew --prefix`/etc/bash_completion.d/git-prompt.sh ]; then
    source `brew --prefix`/etc/bash_completion.d/git-prompt.sh
    PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
fi

Now you command prompt will looks something like this:

[user@MACHINE git-repository-name (master)]$ 

OPTIONAL: Chrome Configs

Disable swipe to go back

defaults write com.google.Chrome.plist AppleEnableSwipeNavigateWithScrolls -bool FALSE

OPTIONAL: Show Hidden Files

defaults write com.apple.finder AppleShowAllFiles YES

To hide them again, run ... AppleShowAllFiles NO

OPTIONAL: Change Dock Slide Out

  • Make dock slide-out very, very slowly so it doesn't get in the way
defaults write com.apple.dock autohide-delay -int 5; killall Dock;
  • Make dock slide-out instantly, if you like that kinda thing?!
defaults write com.apple.dock autohide-delay -int 0;
defaults write com.apple.dock autohide-time-modifier -int 0;
killall Dock;
  • Restore dock defaults
defaults delete com.apple.dock autohide-delay;
defaults delete com.apple.dock autohide-time-modifier;
killall Dock;

Reference:

Add an executable FOO to PATH

echo 'export PATH="/path/to/FOO:$PATH"' >> ~/.bash_profile

If foo is in /usr/local/bin/, then:

echo 'export PATH="/usr/local/bin/FOO:$PATH"' >> ~/.bash_profile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment