From zero to fully installed and configured, in an hour.
case "${SHELL}" in
(*zsh) ;;
(*) chsh -s "$(which zsh)"; exit 1 ;;
esac
curl --location --silent \
"https://github.com/ptb/mac-setup/raw/develop/mac-setup.command" | \
source /dev/stdin 0
init && install && config
custom && personalize_all
Enter administrator account password only once
Select the cache folder for repeat installations
Turn off sleep and set computer name/hostname
Set write permission on destination folders
Cache software updates and App Store software
Install developer tools and macOS updates
Homebrew : The missing package mananger for macOS
Homebrew-Cask : “To install, drag this icon…” no more!
mas-cli/mas : Mac App Store command line interface
homebrew-bundle : List all Homebrew packages in Brewfile
Node.js : Cross-platform JavaScript run-time environment
Perl 5 : Highly capable, feature-rich programming language
Python : Programming language that lets you work quickly
Ruby : Language with a focus on simplicity and productivity
Configure software requiring an administrator account
Optionally configure local Dovecot secure IMAP server
Create your primary non-administrator account
Remove password-less administrator account permission
Recommended that you log out of administrator account
Log in with your new non-administrator account
Create or clone a git repository into your home folder
Install Atom packages and customize preferences
Set the desktop picture to a solid black color
Customize the dock with new default applications
Customize Emacs with Spacemacs : Emacs plus Vim!
Set all preferences automatically and consistently
macOS High Sierra: Tested with macOS High Sierra 10.13 (17A365).
Completely Automated: Homebrew, Cask, and mas-cli install everything.
Latest Versions: Includes Node, Perl, Python, and Ruby separate from macOS.
Customized Terminal: Colors and fonts decyphered into editable preferences.
Idempotent: This script is intended to be safe to run more than once.
Clone Internal Hard Disk to External Disk
Select the External Disk as Startup Disk
Download macOS Install from the App Store
macappstores://itunes.apple.com/app/id1209167288
Open /Applications/Utilities/Terminal.app
diskx="$(diskutil list internal physical | sed '/^\//!d;s/^\(.*\)\ (.*):/\1/')"
diskutil zeroDisk $diskx
diskutil partitionDisk $diskx 2 GPT \
jhfs+ "Install" 6G \
apfs $(ruby -e "print '$(hostname -s)'.capitalize") R
sudo "/Applications/Install macOS High Sierra.app/Contents/Resources/createinstallmedia" \
--applicationpath "/Applications/Install macOS High Sierra.app" --nointeraction \
--volume "/Volumes/Install"
Select the Install Disk as Startup Disk
Copyright 2017 Peter T Bosse II
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
if test -z "${1}"; then
osascript - "${0}" << EOF > /dev/null 2>&1
<<new_term.applescript>>
EOF
fi
on run { _this }
tell app "Terminal" to do script "source " & quoted form of _this & " 0"
end run
ask () {
osascript - "${1}" "${2}" "${3}" << EOF 2> /dev/null
<<ask.applescript>>
EOF
}
on run { _title, _action, _default }
tell app "System Events" to return text returned of (display dialog _title with title _title buttons { "Cancel", _action } default answer _default)
end run
ask2 () {
osascript - "$1" "$2" "$3" "$4" "$5" "$6" << EOF 2> /dev/null
<<ask2.applescript>>
EOF
}
on run { _text, _title, _cancel, _action, _default, _hidden }
tell app "Terminal" to return text returned of (display dialog _text with title _title buttons { _cancel, _action } cancel button _cancel default button _action default answer _default hidden answer _hidden)
end run
p () {
printf "\n\033[1m\033[34m%s\033[0m\n\n" "${1}"
}
run () {
osascript - "${1}" "${2}" "${3}" << EOF 2> /dev/null
<<run.applescript>>
EOF
}
on run { _title, _cancel, _action }
tell app "Terminal" to return button returned of (display dialog _title with title _title buttons { _cancel, _action } cancel button 1 default button 2 giving up after 5)
end run
init () {
init_sudo
init_cache
init_no_sleep
init_hostname
init_perms
init_maskeep
init_updates
config_new_account
config_rm_sudoers
}
if test "${1}" = 0; then
printf "\n$(which init)\n"
fi
Define Function init_paths
init_paths () {
test -x "/usr/libexec/path_helper" && \
eval $(/usr/libexec/path_helper -s)
}
Eliminate Prompts for Password
init_sudo () {
printf "%s\n" "%wheel ALL=(ALL) NOPASSWD: ALL" | \
sudo tee "/etc/sudoers.d/wheel" > /dev/null && \
sudo dscl /Local/Default append /Groups/wheel GroupMembership "$(whoami)"
}
Select Installation Cache Location
init_cache () {
grep -q "CACHES" "/etc/zshenv" 2> /dev/null || \
a=$(osascript << EOF 2> /dev/null
<<init_cache.applescript>>
EOF
) && \
test -d "${a}" || \
a="${HOME}/Library/Caches/"
grep -q "CACHES" "/etc/zshenv" 2> /dev/null || \
printf "%s\n" \
"export CACHES=\"${a}\"" \
"export HOMEBREW_CACHE=\"${a}/brew\"" \
"export BREWFILE=\"${a}/brew/Brewfile\"" | \
sudo tee -a "/etc/zshenv" > /dev/null
. "/etc/zshenv"
if test -d "${CACHES}/upd"; then
sudo chown -R "$(whoami)" "/Library/Updates"
rsync -a --delay-updates \
"${CACHES}/upd/" "/Library/Updates/"
fi
}
on run
return text 1 through -2 of POSIX path of (choose folder with prompt "Select Installation Cache Location")
end run
init_no_sleep () {
sudo pmset -a sleep 0
sudo pmset -a disksleep 0
}
init_hostname () {
a=$(ask2 "Set Computer Name and Hostname" "Set Hostname" "Cancel" "Set Hostname" $(ruby -e "print '$(hostname -s)'.capitalize") "false")
if test -n $a; then
sudo scutil --set ComputerName $(ruby -e "print '$a'.capitalize")
sudo scutil --set HostName $(ruby -e "print '$a'.downcase")
fi
}
Set Permissions on Install Destinations
init_perms () {
printf "%s\n" "${_dest}" | \
while IFS="$(printf '\t')" read d; do
test -d "${d}" || sudo mkdir -p "${d}"
sudo chgrp -R admin "${d}"
sudo chmod -R g+w "${d}"
done
}
Location Install Path
/usr/local/bin
/Library/Desktop Pictures
colorpickerdir /Library/ColorPickers
fontdir /Library/Fonts
input_methoddir /Library/Input Methods
prefpanedir /Library/PreferencePanes
qlplugindir /Library/QuickLook
screen_saverdir /Library/Screen Savers
/Library/User Pictures
init_devtools () {
p="${HOMEBREW_CACHE}/Cask/Command Line Tools (macOS High Sierra version 10.13).pkg"
i="com.apple.pkg.CLTools_SDK_macOS1013"
if test -f "${p}"; then
if ! pkgutil --pkg-info "${i}" > /dev/null 2>&1; then
sudo installer -pkg "${p}" -target /
fi
else
xcode-select --install
fi
}
init_xcode () {
if test -f ${HOMEBREW_CACHE}/Cask/xcode*.xip; then
p "Installing Xcode"
dest="${HOMEBREW_CACHE}/Cask/xcode"
if ! test -d "$dest"; then
pkgutil --expand ${HOMEBREW_CACHE}/Cask/xcode*.xip "$dest"
curl --location --silent \
"https://gist.githubusercontent.com/pudquick/ff412bcb29c9c1fa4b8d/raw/24b25538ea8df8d0634a2a6189aa581ccc6a5b4b/parse_pbzx2.py" | \
python - "${dest}/Content"
find "${dest}" -empty -name "*.xz" -type f -print0 | \
xargs -0 -l 1 rm
find "${dest}" -name "*.xz" -print0 | \
xargs -0 -L 1 gunzip
cat ${dest}/Content.part* > \
${dest}/Content.cpio
fi
cd /Applications && \
sudo cpio -dimu --file=${dest}/Content.cpio
for pkg in /Applications/Xcode*.app/Contents/Resources/Packages/*.pkg; do
sudo installer -pkg "$pkg" -target /
done
x="$(find '/Applications' -maxdepth 1 -regex '.*/Xcode[^ ]*.app' -print -quit)"
if test -n "${x}"; then
sudo xcode-select -s "${x}"
sudo xcodebuild -license accept
fi
fi
}
init_updates () {
sudo softwareupdate --install --all
}
Save Mac App Store Packages
sudo lsof -c softwareupdated -F -r 2 | sed '/^n\//!d;/com.apple.SoftwareUpdate/!d;s/^n//'
sudo lsof -c storedownloadd -F -r 2 | sed '/^n\//!d;/com.apple.appstore/!d;s/^n//'
init_maskeep () {
sudo softwareupdate --reset-ignored > /dev/null
cat << EOF > "/usr/local/bin/maskeep"
<<maskeep.sh>>
EOF
chmod a+x "/usr/local/bin/maskeep"
rehash
config_launchd "/Library/LaunchDaemons/com.github.ptb.maskeep.plist" "$_maskeep_launchd" "sudo" ""
}
Command Entry Type Value
add :KeepAlive bool false
add :Label string com.github.ptb.maskeep
add :ProcessType string Background
add :Program string /usr/local/bin/maskeep
add :RunAtLoad bool true
add :StandardErrorPath string /dev/stderr
add :StandardOutPath string /dev/stdout
add :UserName string root
add :WatchPaths array
add :WatchPaths:0 string $(sudo find ‘/private/var/folders’ -name ‘com.apple.SoftwareUpdate’ -type d -user _softwareupdate -print -quit 2> /dev/null)
add :WatchPaths:1 string $(sudo -u \#501 – sh -c ‘getconf DARWIN_USER_CACHE_DIR’ 2> /dev/null)com.apple.appstore
add :WatchPaths:2 string $(sudo -u \#502 – sh -c ‘getconf DARWIN_USER_CACHE_DIR’ 2> /dev/null)com.apple.appstore
add :WatchPaths:3 string $(sudo -u \#503 – sh -c ‘getconf DARWIN_USER_CACHE_DIR’ 2> /dev/null)com.apple.appstore
add :WatchPaths:4 string /Library/Updates
#!/bin/sh
asdir="/Library/Caches/storedownloadd"
as1="\$(sudo -u \\#501 -- sh -c 'getconf DARWIN_USER_CACHE_DIR' 2> /dev/null)com.apple.appstore"
as2="\$(sudo -u \\#502 -- sh -c 'getconf DARWIN_USER_CACHE_DIR' 2> /dev/null)com.apple.appstore"
as3="\$(sudo -u \\#503 -- sh -c 'getconf DARWIN_USER_CACHE_DIR' 2> /dev/null)com.apple.appstore"
upd="/Library/Updates"
sudir="/Library/Caches/softwareupdated"
su="\$(sudo find '/private/var/folders' -name 'com.apple.SoftwareUpdate' -type d -user _softwareupdate 2> /dev/null)"
for i in 1 2 3 4 5; do
mkdir -m a=rwxt -p "\$asdir"
for as in "\$as1" "\$as2" "\$as3" "\$upd"; do
test -d "\$as" && \
find "\${as}" -type d -print | \\
while read a; do
b="\${asdir}/\$(basename \$a)"
mkdir -p "\${b}"
find "\${a}" -type f -print | \\
while read c; do
d="\$(basename \$c)"
test -e "\${b}/\${d}" || \\
ln "\${c}" "\${b}/\${d}" && \\
chmod 666 "\${b}/\${d}"
done
done
done
mkdir -m a=rwxt -p "\${sudir}"
find "\${su}" -name "*.tmp" -type f -print | \\
while read a; do
d="\$(basename \$a)"
test -e "\${sudir}/\${d}.xar" ||
ln "\${a}" "\${sudir}/\${d}.xar" && \\
chmod 666 "\${sudir}/\${d}.xar"
done
sleep 1
done
exit 0
install () {
install_macos_sw
install_node_sw
install_perl_sw
install_python_sw
install_ruby_sw
which config
}
Install macOS Software with brew
install_macos_sw () {
p "Installing macOS Software"
install_paths
install_brew
install_brewfile_taps
install_brewfile_brew_pkgs
install_brewfile_cask_args
install_brewfile_cask_pkgs
install_brewfile_mas_apps
x=$(find '/Applications' -maxdepth 1 -regex '.*/Xcode[^ ]*.app' -print -quit)
if test -n "$x"; then
sudo xcode-select -s "$x"
sudo xcodebuild -license accept
fi
brew bundle --file="${BREWFILE}"
x=$(find '/Applications' -maxdepth 1 -regex '.*/Xcode[^ ]*.app' -print -quit)
if test -n "$x"; then
sudo xcode-select -s "$x"
sudo xcodebuild -license accept
fi
install_links
sudo xattr -rd "com.apple.quarantine" "/Applications" > /dev/null 2>&1
sudo chmod -R go=u-w "/Applications" > /dev/null 2>&1
}
Add /usr/local/bin/sbin to Default Path
install_paths () {
if ! grep -Fq "/usr/local/sbin" /etc/paths; then
sudo sed -i "" -e "/\/usr\/sbin/{x;s/$/\/usr\/local\/sbin/;G;}" /etc/paths
fi
}
Install Homebrew Package Manager
install_brew () {
if ! which brew > /dev/null; then
ruby -e \
"$(curl -Ls 'https://github.com/Homebrew/install/raw/master/install')" \
< /dev/null > /dev/null 2>&1
fi
printf "" > "${BREWFILE}"
brew analytics off
brew update
brew doctor
brew tap "homebrew/bundle"
}
Add Homebrew Taps to Brewfile
install_brewfile_taps () {
printf "%s\n" "${_taps}" | \
while IFS="$(printf '\t')" read tap; do
printf 'tap "%s"\n' "${tap}" >> "${BREWFILE}"
done
printf "\n" >> "${BREWFILE}"
}
Add Homebrew Packages to Brewfile
install_brewfile_brew_pkgs () {
printf "%s\n" "${_pkgs}" | \
while IFS="$(printf '\t')" read pkg; do
# printf 'brew "%s", args: [ "force-bottle" ]\n' "${pkg}" >> "${BREWFILE}"
printf 'brew "%s"\n' "${pkg}" >> "${BREWFILE}"
done
printf "\n" >> "${BREWFILE}"
}
Add Caskroom Options to Brewfile
install_brewfile_cask_args () {
printf 'cask_args \' >> "${BREWFILE}"
printf "%s\n" "${_args}" | \
while IFS="$(printf '\t')" read arg dir; do
printf '\n %s: "%s",' "${arg}" "${dir}" >> "${BREWFILE}"
done
sed -i "" -e '$ s/,/\
/' "${BREWFILE}"
}
Add Homebrew Casks to Brewfile
install_brewfile_cask_pkgs () {
printf "%s\n" "${_casks}" | \
while IFS="$(printf '\t')" read cask; do
printf 'cask "%s"\n' "${cask}" >> "${BREWFILE}"
done
printf "\n" >> "${BREWFILE}"
}
Add App Store Packages to Brewfile
install_brewfile_mas_apps () {
open "/Applications/App Store.app"
run "Sign in to the App Store with your Apple ID" "Cancel" "OK"
MASDIR="$(getconf DARWIN_USER_CACHE_DIR)com.apple.appstore"
sudo chown -R "$(whoami)" "${MASDIR}"
rsync -a --delay-updates \
"${CACHES}/mas/" "${MASDIR}/"
printf "%s\n" "${_mas}" | \
while IFS="$(printf '\t')" read app id; do
printf 'mas "%s", id: %s\n' "${app}" "${id}" >> "${BREWFILE}"
done
}
Link System Utilities to Applications
install_links () {
printf "%s\n" "${_links}" | \
while IFS="$(printf '\t')" read link; do
find "${link}" -maxdepth 1 -name "*.app" -type d -print0 2> /dev/null | \
xargs -0 -I {} -L 1 ln -s "{}" "/Applications" 2> /dev/null
done
}
Application Locations
/System/Library/CoreServices/Applications
/Applications/Xcode.app/Contents/Applications
/Applications/Xcode.app/Contents/Developer/Applications
/Applications/Xcode-beta.app/Contents/Applications
/Applications/Xcode-beta.app/Contents/Developer/Applications
Install Node.js with nodenv
install_node_sw () {
if which nodenv > /dev/null; then
NODENV_ROOT="/usr/local/node" && export NODENV_ROOT
sudo mkdir -p "$NODENV_ROOT"
sudo chown -R "$(whoami):admin" "$NODENV_ROOT"
p "Installing Node.js with nodenv"
nodenv install --skip-existing 8.5.0
nodenv global 8.5.0
grep -q "${NODENV_ROOT}" "/etc/paths" || \
sudo sed -i "" -e "1i\\
${NODENV_ROOT}/shims
" "/etc/paths"
init_paths
rehash
fi
T=$(printf '\t')
printf "%s\n" "$_npm" | \
while IFS="$T" read pkg; do
yarn global add "$pkg"
done
rehash
}
Install Perl 5 with plenv
install_perl_sw () {
if which plenv > /dev/null; then
PLENV_ROOT="/usr/local/perl" && export PLENV_ROOT
sudo mkdir -p "$PLENV_ROOT"
sudo chown -R "$(whoami):admin" "$PLENV_ROOT"
p "Installing Perl 5 with plenv"
plenv install 5.26.0 > /dev/null 2>&1
plenv global 5.26.0
grep -q "${PLENV_ROOT}" "/etc/paths" || \
sudo sed -i "" -e "1i\\
${PLENV_ROOT}/shims
" "/etc/paths"
init_paths
rehash
fi
}
Install Python with pyenv
install_python_sw () {
if which pyenv > /dev/null; then
CFLAGS="-I$(brew --prefix openssl)/include" && export CFLAGS
LDFLAGS="-L$(brew --prefix openssl)/lib" && export LDFLAGS
PYENV_ROOT="/usr/local/python" && export PYENV_ROOT
sudo mkdir -p "$PYENV_ROOT"
sudo chown -R "$(whoami):admin" "$PYENV_ROOT"
p "Installing Python 2 with pyenv"
pyenv install --skip-existing 2.7.13
p "Installing Python 3 with pyenv"
pyenv install --skip-existing 3.6.2
pyenv global 2.7.13
grep -q "${PYENV_ROOT}" "/etc/paths" || \
sudo sed -i "" -e "1i\\
${PYENV_ROOT}/shims
" "/etc/paths"
init_paths
rehash
pip install --upgrade "pip" "setuptools"
# Reference: https://github.com/mdhiggins/sickbeard_mp4_automator
pip install --upgrade "babelfish" "guessit<2" "qtfaststart" "requests" "stevedore==1.19.1" "subliminal<2"
pip install --upgrade "requests-cache" "requests[security]"
# Reference: https://github.com/pixelb/crudini
pip install --upgrade "crudini"
fi
}
install_ruby_sw () {
if which rbenv > /dev/null; then
RBENV_ROOT="/usr/local/ruby" && export RBENV_ROOT
sudo mkdir -p "$RBENV_ROOT"
sudo chown -R "$(whoami):admin" "$RBENV_ROOT"
p "Installing Ruby with rbenv"
rbenv install --skip-existing 2.4.2
rbenv global 2.4.2
grep -q "${RBENV_ROOT}" "/etc/paths" || \
sudo sed -i "" -e "1i\\
${RBENV_ROOT}/shims
" "/etc/paths"
init_paths
rehash
printf "%s\n" \
"gem: --no-document" | \
tee "${HOME}/.gemrc" > /dev/null
gem update --system > /dev/null
trash "$(which rdoc)"
trash "$(which ri)"
gem update
gem install bundler
fi
}
config () {
config_admin_req
config_bbedit
config_certbot
config_desktop
config_dovecot
config_emacs
config_environment
config_ipmenulet
config_istatmenus
config_nginx
config_openssl
config_sysprefs
config_zsh
config_guest
which custom
}
Define Function config_defaults
config_defaults () {
printf "%s\n" "${1}" | \
while IFS="$(printf '\t')" read domain key type value host; do
${2} defaults ${host} write ${domain} "${key}" ${type} "${value}"
done
}
Define Function config_plist
T="$(printf '\t')"
config_plist () {
printf "%s\n" "$1" | \
while IFS="$T" read command entry type value; do
case "$value" in
(\$*)
$4 /usr/libexec/PlistBuddy "$2" \
-c "$command '${3}${entry}' $type '$(eval echo \"$value\")'" 2> /dev/null ;;
(*)
$4 /usr/libexec/PlistBuddy "$2" \
-c "$command '${3}${entry}' $type '$value'" 2> /dev/null ;;
esac
done
}
Define Function config_launchd
config_launchd () {
test -d "$(dirname $1)" || \
$3 mkdir -p "$(dirname $1)"
test -f "$1" && \
$3 launchctl unload "$1" && \
$3 rm -f "$1"
config_plist "$2" "$1" "$4" "$3" && \
$3 plutil -convert xml1 "$1" && \
$3 launchctl load "$1"
}
Mark Applications Requiring Administrator Account
config_admin_req () {
printf "%s\n" "${_admin_req}" | \
while IFS="$(printf '\t')" read app; do
sudo tag -a "Red, admin" "/Applications/${app}"
done
}
Admin Apps
Carbon Copy Cloner.app
Charles.app
Composer.app
Dropbox.app
iStat Menus.app
Moom.app
VMware Fusion.app
Wireshark.app
config_bbedit () {
if test -d "/Applications/BBEdit.app"; then
test -f "/usr/local/bin/bbdiff" || \
ln /Applications/BBEdit.app/Contents/Helpers/bbdiff /usr/local/bin/bbdiff && \
ln /Applications/BBEdit.app/Contents/Helpers/bbedit_tool /usr/local/bin/bbedit && \
ln /Applications/BBEdit.app/Contents/Helpers/bbfind /usr/local/bin/bbfind && \
ln /Applications/BBEdit.app/Contents/Helpers/bbresults /usr/local/bin/bbresults
fi
}
config_certbot () {
test -d "/etc/letsencrypt" || \
sudo mkdir -p /etc/letsencrypt
sudo tee "/etc/letsencrypt/cli.ini" << EOF > /dev/null
agree-tos = True
authenticator = standalone
eff-email = True
manual-public-ip-logging-ok = True
nginx-ctl = $(which nginx)
nginx-server-root = /usr/local/etc/nginx
preferred-challenges = tls-sni-01
keep-until-expiring = True
rsa-key-size = 4096
text = True
EOF
if ! test -e "/etc/letsencrypt/.git"; then
a=$(ask "Existing Let’s Encrypt Git Repository Path or URL?" "Clone Repository" "")
test -n "$a" && \
case "$a" in
(/*)
sudo tee "/etc/letsencrypt/.git" << EOF > /dev/null ;;
gitdir: $a
EOF
(*)
sudo git -C "/etc/letsencrypt" remote add origin "$a"
sudo git -C "/etc/letsencrypt" fetch origin master ;;
esac
sudo git -C "/etc/letsencrypt" reset --hard
sudo git checkout -f -b master HEAD
fi
sudo launchctl unload /Library/LaunchDaemons/org.nginx.nginx.plist 2> /dev/null
sudo certbot renew
while true; do
test -n "$1" && server_name="$1" || \
server_name="$(ask 'New SSL Server: Server Name?' 'Create Server' 'example.com')"
test -n "$server_name" || break
test -n "$2" && proxy_address="$2" || \
proxy_address="$(ask "Proxy Address for $server_name?" 'Set Address' 'http://127.0.0.1:80')"
sudo certbot certonly --domain $server_name
key1="$(openssl x509 -pubkey < /etc/letsencrypt/live/$server_name/fullchain.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)"
key2="$(curl -s https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)"
key3="$(curl -s https://letsencrypt.org/certs/isrgrootx1.pem | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)"
pkp="$(printf "add_header Public-Key-Pins 'pin-sha256=\"%s\"; pin-sha256=\"%s\"; pin-sha256=\"%s\"; max-age=2592000;';\n" $key1 $key2 $key3)"
cat << EOF > "/usr/local/etc/nginx/servers/$server_name.conf"
<<server_name.conf>>
EOF
unset argv
done
sudo launchctl load /Library/LaunchDaemons/org.nginx.nginx.plist
}
/usr/local/etc/nginx/servers/server_name/server_name.conf
server {
server_name $server_name;
location / {
proxy_pass $proxy_address;
}
ssl_certificate /etc/letsencrypt/live/$server_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$server_name/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/$server_name/chain.pem;
$pkp
add_header Content-Security-Policy "upgrade-insecure-requests;";
add_header Referrer-Policy "strict-origin";
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-Robots-Tag none;
add_header X-XSS-Protection "1; mode=block";
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_stapling on;
ssl_stapling_verify on;
# https://securityheaders.io/?q=https%3A%2F%2F$server_name&hide=on&followRedirects=on
# https://www.ssllabs.com/ssltest/analyze.html?d=$server_name&hideResults=on&latest
}
config_default_apps () {
true
}
Configure Desktop Picture
config_desktop () {
sudo rm -f "/Library/Caches/com.apple.desktop.admin.png"
base64 -D << EOF > "/Library/Desktop Pictures/Solid Colors/Solid Black.png"
<<black.png.b64>>
EOF
}
iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAQAAAADrRVxmAAAAGElEQVR4AWOgMxgFo2AUjIJRMApGwSgAAAiAAAH3bJXBAAAAAElFTkSuQmCC
config_dovecot () {
if which /usr/local/sbin/dovecot > /dev/null; then
if ! run "Configure Dovecot Email Server?" "Configure Server" "Cancel"; then
sudo tee "/usr/local/etc/dovecot/dovecot.conf" << EOF > /dev/null
<<dovecot.conf>>
EOF
MAILADM="$(ask 'Email: Postmaster Email?' 'Set Email' "$(whoami)@$(hostname -f | cut -d. -f2-)")"
MAILSVR="$(ask 'Email: Server Hostname for DNS?' 'Set Hostname' "$(hostname -f)")"
sudo certbot certonly --domain $MAILSVR
printf "%s\n" \
"postmaster_address = '${MAILADM}'" \
"ssl_cert = </etc/letsencrypt/live/$MAILSVR/fullchain.pem" \
"ssl_key = </etc/letsencrypt/live/$MAILSVR/privkey.pem" | \
sudo tee -a "/usr/local/etc/dovecot/dovecot.conf" > /dev/null
if test ! -f "/usr/local/etc/dovecot/cram-md5.pwd"; then
while true; do
MAILUSR="$(ask 'New Email Account: User Name?' 'Create Account' "$(whoami)")"
test -n "${MAILUSR}" || break
doveadm pw | \
sed -e "s/^/${MAILUSR}:/" | \
sudo tee -a "/usr/local/etc/dovecot/cram-md5.pwd"
done
sudo chown _dovecot "/usr/local/etc/dovecot/cram-md5.pwd"
sudo chmod go= "/usr/local/etc/dovecot/cram-md5.pwd"
fi
sudo tee "/etc/pam.d/dovecot" << EOF > /dev/null
<<dovecot.pam>>
EOF
sudo brew services start dovecot
cat << EOF > "/usr/local/bin/imaptimefix.py"
<<imaptimefix.py>>
EOF
chmod +x /usr/local/bin/imaptimefix.py
fi
fi
}
/usr/local/etc/dovecot/dovecot.conf
auth_mechanisms = cram-md5
default_internal_user = _dovecot
default_login_user = _dovenull
log_path = /dev/stderr
mail_location = maildir:~/.mail:INBOX=~/.mail/Inbox:LAYOUT=fs
mail_plugins = zlib
maildir_copy_with_hardlinks = no
namespace {
inbox = yes
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
separator = .
type = private
}
passdb {
args = scheme=cram-md5 /usr/local/etc/dovecot/cram-md5.pwd
driver = passwd-file
# driver = pam
# args = nopassword=y
# driver = static
}
plugin {
sieve = file:/Users/%u/.sieve
sieve_plugins = sieve_extprograms
zlib_save = bz2
zlib_save_level = 9
}
protocols = imap
service imap-login {
inet_listener imap {
port = 0
}
}
ssl = required
ssl_cipher_list = ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AES128
ssl_dh_parameters_length = 4096
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3
userdb {
driver = passwd
}
protocol lda {
mail_plugins = sieve zlib
}
# auth_debug = yes
# auth_debug_passwords = yes
# auth_verbose = yes
# auth_verbose_passwords = plain
# mail_debug = yes
# verbose_ssl = yes
auth required pam_opendirectory.so try_first_pass
account required pam_nologin.so
account required pam_opendirectory.so
password required pam_opendirectory.so
/usr/local/bin/imaptimefix.py
#!/usr/bin/env python
# Author: Zachary Cutlip <@zcutlip>
# http://shadow-file.blogspot.com/2012/06/parsing-email-and-fixing-timestamps-in.html
# Updated: Peter T Bosse II <@ptb>
# Purpose: A program to fix sorting of mail messages that have been POPed or
# IMAPed in the wrong order. Compares time stamp sent and timestamp
# received on an RFC822-formatted email message, and renames the
# message file using the most recent timestamp that is no more than
# 24 hours after the date sent. Updates the file's atime/mtime with
# the timestamp, as well. Does not modify the headers or contents of
# the message.
from bz2 import BZ2File
from email import message_from_string
from email.utils import mktime_tz, parsedate_tz
from os import rename, utime, walk
from os.path import abspath, isdir, isfile, join
from re import compile, match
from sys import argv
if isdir(argv[1]):
e = compile("([0-9]+)(\..*$)")
for a, b, c in walk(argv[1]):
for d in c:
if e.match(d):
f = message_from_string(BZ2File(join(a, d)).read())
g = mktime_tz(parsedate_tz(f.get("Date")))
h = 0
for i in f.get_all("Received", []):
j = i.split(";")[-1]
if parsedate_tz(j):
k = mktime_tz(parsedate_tz(j))
if (k - g) > (60*60*24):
continue
h = k
break
if (h < 1):
h = g
l = e.match(d)
if len(l.groups()) == 2:
m = str(int(h)) + l.groups()[1]
if not isfile(join(a, m)):
rename(join(a, d), join(a, m))
utime(join(a, m), (h, h))
config_emacs () {
test -f "/usr/local/bin/vi" || \
cat << EOF > "/usr/local/bin/vi"
<<vi.sh>>
EOF
chmod a+x /usr/local/bin/vi
rehash
}
#!/bin/sh
if [ -e "/Applications/Emacs.app" ]; then
t=()
if [ \${#@} -ne 0 ]; then
while IFS= read -r file; do
[ ! -f "\$file" ] && t+=("\$file") && /usr/bin/touch "\$file"
file=\$(echo \$(cd \$(dirname "\$file") && pwd -P)/\$(basename "\$file"))
\$(/usr/bin/osascript <<-END
if application "Emacs.app" is running then
tell application id (id of application "Emacs.app") to open POSIX file "\$file"
else
tell application ((path to applications folder as text) & "Emacs.app")
activate
open POSIX file "\$file"
end tell
end if
END
) & # Note: END on the previous line may be indented with tabs but not spaces
done <<<"\$(printf '%s\n' "\$@")"
fi
if [ ! -z "\$t" ]; then
\$(/bin/sleep 10; for file in "\${t[@]}"; do
[ ! -s "\$file" ] && /bin/rm "\$file";
done) &
fi
else
vim -No "\$@"
fi
Configure Environment Variables
config_environment () {
sudo tee "/etc/environment.sh" << 'EOF' > /dev/null
<<environment.sh>>
EOF
sudo chmod a+x "/etc/environment.sh"
rehash
la="/Library/LaunchAgents/environment.user"
ld="/Library/LaunchDaemons/environment"
sudo mkdir -p "$(dirname $la)" "$(dirname $ld)"
sudo launchctl unload "${la}.plist" "${ld}.plist" 2> /dev/null
sudo rm -f "${la}.plist" "${ld}.plist"
config_defaults "$_environment_defaults" "sudo"
sudo plutil -convert xml1 "${la}.plist" "${ld}.plist"
sudo launchctl load "${la}.plist" "${ld}.plist" 2> /dev/null
}
#!/bin/sh
set -e
if test -x /usr/libexec/path_helper; then
export PATH=""
eval `/usr/libexec/path_helper -s`
launchctl setenv PATH $PATH
fi
osascript -e 'tell app "Dock" to quit'
Domain Key Type Value Host
/Library/LaunchAgents/environment.user KeepAlive -bool false
/Library/LaunchAgents/environment.user Label -string environment.user
/Library/LaunchAgents/environment.user ProcessType -string Background
/Library/LaunchAgents/environment.user Program -string /etc/environment.sh
/Library/LaunchAgents/environment.user RunAtLoad -bool true
/Library/LaunchAgents/environment.user WatchPaths -array-add /etc/environment.sh
/Library/LaunchAgents/environment.user WatchPaths -array-add /etc/paths
/Library/LaunchAgents/environment.user WatchPaths -array-add /etc/paths.d
/Library/LaunchDaemons/environment KeepAlive -bool false
/Library/LaunchDaemons/environment Label -string environment
/Library/LaunchDaemons/environment ProcessType -string Background
/Library/LaunchDaemons/environment Program -string /etc/environment.sh
/Library/LaunchDaemons/environment RunAtLoad -bool true
/Library/LaunchDaemons/environment WatchPaths -array-add /etc/environment.sh
/Library/LaunchDaemons/environment WatchPaths -array-add /etc/paths
/Library/LaunchDaemons/environment WatchPaths -array-add /etc/paths.d
Configure IPMenulet
config_ipmenulet () {
_ipm="/Applications/IPMenulet.app/Contents/Resources"
if test -d "$_ipm"; then
rm "${_ipm}/icon-19x19-black.png"
ln "${_ipm}/icon-19x19-white.png" "${_ipm}/icon-19x19-black.png"
fi
}
Configure iStat Menus
config_istatmenus () {
test -d "/Applications/iStat Menus.app" && \
open "/Applications/iStat Menus.app"
}
client_max_body_size 0;
location / {
if ($http_x_plex_device_name = "") {
rewrite ^/$ https://$host/web/index.html permanent;
}
}
config_nginx () {
cat << 'EOF' > /usr/local/etc/nginx/nginx.conf
<<nginx.conf>>
EOF
ld="/Library/LaunchDaemons/org.nginx.nginx"
sudo mkdir -p "$(dirname $ld)"
sudo launchctl unload "${ld}.plist" 2> /dev/null
sudo rm -f "${ld}.plist"
config_defaults "$_nginx_defaults" "sudo"
sudo plutil -convert xml1 "${ld}.plist"
sudo launchctl load "${ld}.plist" 2> /dev/null
}
/usr/local/etc/nginx/nginx.conf
daemon off;
events {
accept_mutex off;
worker_connections 8000;
}
http {
charset utf-8;
charset_types
application/javascript
application/json
application/rss+xml
application/xhtml+xml
application/xml
text/css
text/plain
text/vnd.wap.wml;
default_type application/octet-stream;
error_log /dev/stderr;
gzip on;
gzip_comp_level 9;
gzip_min_length 256;
gzip_proxied any;
gzip_static on;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
index index.html index.xhtml;
log_format default '$host $status $body_bytes_sent "$request" "$http_referer"\n'
' $remote_addr "$http_user_agent"';
map $http_upgrade $connection_upgrade {
default upgrade;
"" close;
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_redirect off;
sendfile on;
sendfile_max_chunk 512k;
server_tokens off;
resolver 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=300s;
resolver_timeout 5s;
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AES128;
# openssl dhparam -out /etc/letsencrypt/ssl-dhparam.pem 4096
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2;
ssl_session_cache shared:TLS:10m;
types {
application/atom+xml atom;
application/font-woff woff;
application/font-woff2 woff2;
application/java-archive ear jar war;
application/javascript js;
application/json json map topojson;
application/ld+json jsonld;
application/mac-binhex40 hqx;
application/manifest+json webmanifest;
application/msword doc;
application/octet-stream bin deb dll dmg exe img iso msi msm msp safariextz;
application/pdf pdf;
application/postscript ai eps ps;
application/rss+xml rss;
application/rtf rtf;
application/vnd.geo+json geojson;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-bb-appworld bbaw;
application/x-bittorrent torrent;
application/x-chrome-extension crx;
application/x-cocoa cco;
application/x-font-ttf ttc ttf;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-opera-extension oex;
application/x-perl pl pm;
application/x-pilot pdb prc;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-web-app-manifest+json webapp;
application/x-x509-ca-cert crt der pem;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xml rdf xml;
application/xslt+xml xsl;
application/zip zip;
audio/midi mid midi kar;
audio/mp4 aac f4a f4b m4a;
audio/mpeg mp3;
audio/ogg oga ogg opus;
audio/x-realaudio ra;
audio/x-wav wav;
font/opentype otf;
image/bmp bmp;
image/gif gif;
image/jpeg jpeg jpg;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon cur ico;
image/x-jng jng;
text/cache-manifest appcache;
text/css css;
text/html htm html shtml;
text/mathml mml;
text/plain txt;
text/vcard vcard vcf;
text/vnd.rim.location.xloc xloc;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/vtt vtt;
text/x-component htc;
video/3gpp 3gp 3gpp;
video/mp4 f4p f4v m4v mp4;
video/mpeg mpeg mpg;
video/ogg ogv;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-mng mng;
video/x-ms-asf asf asx;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
include servers/*.conf;
}
worker_processes auto;
Domain Key Type Value Host
/Library/LaunchDaemons/org.nginx.nginx KeepAlive -bool true
/Library/LaunchDaemons/org.nginx.nginx Label -string org.nginx.nginx
/Library/LaunchDaemons/org.nginx.nginx ProcessType -string Background
/Library/LaunchDaemons/org.nginx.nginx Program -string /usr/local/bin/nginx
/Library/LaunchDaemons/org.nginx.nginx RunAtLoad -bool true
/Library/LaunchDaemons/org.nginx.nginx StandardErrorPath -string /usr/local/var/log/nginx/error.log
/Library/LaunchDaemons/org.nginx.nginx StandardOutPath -string /usr/local/var/log/nginx/access.log
/Library/LaunchDaemons/org.nginx.nginx UserName -string root
/Library/LaunchDaemons/org.nginx.nginx WatchPaths -array-add /usr/local/etc/nginx
Create an intentionally invalid certificate for use with a DNS-based ad blocker, e.g. https://pi-hole.net
config_openssl () {
_default="/etc/letsencrypt/live/default"
test -d "$_default" || mkdir -p "$_default"
cat << EOF > "${_default}/default.cnf"
<<openssl.cnf>>
EOF
openssl req -days 1 -new -newkey rsa -x509 \
-config "${_default}/default.cnf" \
-out "${_default}/default.crt"
cat << EOF > "/usr/local/etc/nginx/servers/default.conf"
<<default.conf>>
EOF
}
/etc/letsencrypt/live/default/default.cnf
[ req ]
default_bits = 4096
default_keyfile = ${_default}/default.key
default_md = sha256
distinguished_name = dn
encrypt_key = no
prompt = no
utf8 = yes
x509_extensions = v3_ca
[ dn ]
CN = *
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:true
/usr/local/etc/nginx/servers/default.conf
server {
server_name .$(hostname -f | cut -d. -f2-);
listen 80;
listen [::]:80;
return 301 https://\$host\$request_uri;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 default_server ssl http2;
listen [::]:443 default_server ssl http2;
ssl_certificate ${_default}/default.crt;
ssl_certificate_key ${_default}/default.key;
ssl_ciphers NULL;
return 204;
}
Configure System Preferences
config_sysprefs () {
config_energy
config_loginwindow
config_mas
}
config_energy () {
printf "%s\n" "${_energy}" | \
while IFS="$(printf '\t')" read flag setting value; do
sudo pmset $flag ${setting} ${value}
done
}
Preference Flag Setting Value
Power: Turn display off after: 20 min-c displaysleep 20
Power: on Prevent computer from sleeping automatically when the display is off -c sleep 0
Power: 60 min Put hard disks to sleep when possible -c disksleep 60
Power: on Wake for network access -c womp 1
Power: on Start up automatically after a power failure -c autorestart 1
Power: on Enable Power Nap -c powernap 1
UPS: Turn display off after: 2 min-u displaysleep 2
UPS: on Slightly dim the display when using this power source -u lessbright 1
UPS: on Shut down the computer after using the UPS battery for: 5 min-u haltafter 5
UPS: off Shut down the computer when the time remaining on the UPS battery is: -u haltremain -1
UPS: off Shut down the computer when the UPS battery level is below: -u haltlevel -1
config_loginwindow () {
config_defaults "${_loginwindow}" "sudo"
}
Preference Domain Key Type Value Host
Display login window as: Name and password/Library/Preferences/com.apple.loginwindow SHOWFULLNAME -bool true
config_mas () {
config_defaults "${_swupdate}" "sudo"
}
Preference Domain Key Type Value Host
on Install app updates /Library/Preferences/com.apple.commerce AutoUpdate -bool true
on Install macOS updates /Library/Preferences/com.apple.commerce AutoUpdateRestartRequired -bool true
config_zsh () {
grep -q "$(which zsh)" /etc/shells ||
print "$(which zsh)\n" | \
sudo tee -a /etc/shells > /dev/null
case "$SHELL" in
($(which zsh)) ;;
(*)
chsh -s "$(which zsh)"
sudo chsh -s $(which zsh) ;;
esac
sudo tee -a /etc/zshenv << 'EOF' > /dev/null
<<etc-zshenv>>
EOF
sudo chmod +x "/etc/zshenv"
. "/etc/zshenv"
sudo tee /etc/zshrc << 'EOF' > /dev/null
<<etc-zshrc>>
EOF
sudo chmod +x "/etc/zshrc"
. "/etc/zshrc"
}
#-- Exports ----------------------------------------------------
export \
ZDOTDIR="${HOME}/.zsh" \
MASDIR="$(getconf DARWIN_USER_CACHE_DIR)com.apple.appstore" \
NODENV_ROOT="/usr/local/node" \
PLENV_ROOT="/usr/local/perl" \
PYENV_ROOT="/usr/local/python" \
RBENV_ROOT="/usr/local/ruby" \
EDITOR="vi" \
VISUAL="vi" \
PAGER="less" \
LANG="en_US.UTF-8" \
LESS="-egiMQRS -x2 -z-2" \
LESSHISTFILE="/dev/null" \
HISTSIZE=50000 \
SAVEHIST=50000 \
KEYTIMEOUT=1
test -d "$ZDOTDIR" || \
mkdir -p "$ZDOTDIR"
test -f "${ZDOTDIR}/.zshrc" || \
touch "${ZDOTDIR}/.zshrc"
# Ensure path arrays do not contain duplicates.
typeset -gU cdpath fpath mailpath path
#-- Exports ----------------------------------------------------
export \
HISTFILE="${ZDOTDIR:-$HOME}/.zhistory"
#-- Changing Directories ---------------------------------------
setopt \
autocd \
autopushd \
cdablevars \
chasedots \
chaselinks \
NO_posixcd \
pushdignoredups \
no_pushdminus \
pushdsilent \
pushdtohome
#-- Completion -------------------------------------------------
setopt \
ALWAYSLASTPROMPT \
no_alwaystoend \
AUTOLIST \
AUTOMENU \
autonamedirs \
AUTOPARAMKEYS \
AUTOPARAMSLASH \
AUTOREMOVESLASH \
no_bashautolist \
no_completealiases \
completeinword \
no_globcomplete \
HASHLISTALL \
LISTAMBIGUOUS \
no_LISTBEEP \
no_listpacked \
no_listrowsfirst \
LISTTYPES \
menucomplete \
no_recexact
#-- Expansion and Globbing -------------------------------------
setopt \
BADPATTERN \
BAREGLOBQUAL \
braceccl \
CASEGLOB \
CASEMATCH \
NO_cshnullglob \
EQUALS \
extendedglob \
no_forcefloat \
GLOB \
NO_globassign \
no_globdots \
no_globstarshort \
NO_globsubst \
no_histsubstpattern \
NO_ignorebraces \
no_ignoreclosebraces \
NO_kshglob \
no_magicequalsubst \
no_markdirs \
MULTIBYTE \
NOMATCH \
no_nullglob \
no_numericglobsort \
no_rcexpandparam \
no_rematchpcre \
NO_shglob \
UNSET \
no_warncreateglobal \
no_warnnestedvar
#-- History ----------------------------------------------------
setopt \
APPENDHISTORY \
BANGHIST \
extendedhistory \
no_histallowclobber \
no_HISTBEEP \
histexpiredupsfirst \
no_histfcntllock \
histfindnodups \
histignorealldups \
histignoredups \
histignorespace \
histlexwords \
no_histnofunctions \
no_histnostore \
histreduceblanks \
HISTSAVEBYCOPY \
histsavenodups \
histverify \
incappendhistory \
incappendhistorytime \
sharehistory
#-- Initialisation ---------------------------------------------
setopt \
no_allexport \
GLOBALEXPORT \
GLOBALRCS \
RCS
#-- Input/Output -----------------------------------------------
setopt \
ALIASES \
no_CLOBBER \
no_correct \
no_correctall \
dvorak \
no_FLOWCONTROL \
no_ignoreeof \
NO_interactivecomments \
HASHCMDS \
HASHDIRS \
no_hashexecutablesonly \
no_mailwarning \
pathdirs \
NO_pathscript \
no_printeightbit \
no_printexitvalue \
rcquotes \
NO_rmstarsilent \
no_rmstarwait \
SHORTLOOPS \
no_sunkeyboardhack
#-- Job Control ------------------------------------------------
setopt \
no_autocontinue \
autoresume \
no_BGNICE \
CHECKJOBS \
no_HUP \
longlistjobs \
MONITOR \
NOTIFY \
NO_posixjobs
#-- Prompting --------------------------------------------------
setopt \
NO_promptbang \
PROMPTCR \
PROMPTSP \
PROMPTPERCENT \
promptsubst \
transientrprompt
#-- Scripts and Functions --------------------------------------
setopt \
NO_aliasfuncdef \
no_cbases \
no_cprecedences \
DEBUGBEFORECMD \
no_errexit \
no_errreturn \
EVALLINENO \
EXEC \
FUNCTIONARGZERO \
no_localloops \
NO_localoptions \
no_localpatterns \
NO_localtraps \
MULTIFUNCDEF \
MULTIOS \
NO_octalzeroes \
no_pipefail \
no_sourcetrace \
no_typesetsilent \
no_verbose \
no_xtrace
#-- Shell Emulation --------------------------------------------
setopt \
NO_appendcreate \
no_bashrematch \
NO_bsdecho \
no_continueonerror \
NO_cshjunkiehistory \
NO_cshjunkieloops \
NO_cshjunkiequotes \
NO_cshnullcmd \
NO_ksharrays \
NO_kshautoload \
NO_kshoptionprint \
no_kshtypeset \
no_kshzerosubscript \
NO_posixaliases \
no_posixargzero \
NO_posixbuiltins \
NO_posixidentifiers \
NO_posixstrings \
NO_posixtraps \
NO_shfileexpansion \
NO_shnullcmd \
NO_shoptionletters \
NO_shwordsplit \
no_trapsasync
#-- Zle --------------------------------------------------------
setopt \
no_BEEP \
combiningchars \
no_overstrike \
NO_singlelinezle
#-- Aliases ----------------------------------------------------
alias \
ll="/bin/ls -aFGHhlOw"
#-- Functions --------------------------------------------------
autoload -Uz \
add-zsh-hook \
compaudit \
compinit
compaudit 2> /dev/null | \
xargs -L 1 chmod go-w 2> /dev/null
compinit -u
which nodenv > /dev/null && \
eval "$(nodenv init - zsh)"
which plenv > /dev/null && \
eval "$(plenv init - zsh)"
which pyenv > /dev/null && \
eval "$(pyenv init - zsh)"
which rbenv > /dev/null && \
eval "$(rbenv init - zsh)"
sf () {
SetFile -P -d "$1 12:00:00" -m "$1 12:00:00" $argv[2,$]
}
ssh-add -A 2> /dev/null
#-- zsh-syntax-highlighting ------------------------------------
. "$(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
#-- zsh-history-substring-search -------------------------------
. "$(brew --prefix)/share/zsh-history-substring-search/zsh-history-substring-search.zsh"
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND="fg=default,underline" && \
export HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND="fg=red,underline" && \
export HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND
#-- Zle --------------------------------------------------------
zmodload zsh/zle
bindkey -d
bindkey -v
for k in "vicmd" "viins"; do
bindkey -M $k '\C-A' beginning-of-line
bindkey -M $k '\C-E' end-of-line
bindkey -M $k '\C-U' kill-whole-line
bindkey -M $k '\e[3~' delete-char
bindkey -M $k '\e[A' history-substring-search-up
bindkey -M $k '\e[B' history-substring-search-down
bindkey -M $k '\x7f' backward-delete-char
done
for f in \
"zle-keymap-select" \
"zle-line-finish" \
"zle-line-init"
do
eval "$f () {
case \$TERM_PROGRAM in
('Apple_Terminal')
test \$KEYMAP = 'vicmd' && \
printf '%b' '\e[4 q' || \
printf '%b' '\e[6 q' ;;
('iTerm.app')
test \$KEYMAP = 'vicmd' && \
printf '%b' '\e]Plf27f7f\e\x5c\e[4 q' || \
printf '%b' '\e]Pl99cc99\e\x5c\e[6 q' ;;
esac
}"
zle -N $f
done
#-- prompt_ptb_setup -------------------------------------------
prompt_ptb_setup () {
I="$(printf '%b' '%{\e[3m%}')"
i="$(printf '%b' '%{\e[0m%}')"
PROMPT="%F{004}$I%d$i %(!.%F{001}.%F{002})%n %B❯%b%f " && \
export PROMPT
}
prompt_ptb_setup
prompt_ptb_precmd () {
if test "$(uname -s)" = "Darwin"; then
print -Pn "\e]7;file://%M\${PWD// /%%20}\a"
print -Pn "\e]2;%n@%m\a"
print -Pn "\e]1;%~\a"
fi
test -n "$(git rev-parse --git-dir 2> /dev/null)" && \
RPROMPT="%F{000}$(git rev-parse --abbrev-ref HEAD 2> /dev/null)%f" && \
export RPROMPT
}
add-zsh-hook precmd \
prompt_ptb_precmd
config_new_account () {
e="$(ask 'New macOS Account: Email Address?' 'OK' '')"
curl --output "/Library/User Pictures/${e}.jpg" --silent \
"https://www.gravatar.com/avatar/$(md5 -qs ${e}).jpg?s=512"
g="$(curl --location --silent \
"https://api.github.com/search/users?q=${e}" | \
sed -n 's/^.*"url": "\(.*\)".*/\1/p')"
g="$(curl --location --silent ${g})"
n="$(printf ${g} | sed -n 's/^.*"name": "\(.*\)".*/\1/p')"
n="$(ask 'New macOS Account: Real Name?' 'OK' ${n})"
u="$(printf ${g} | sed -n 's/^.*"login": "\(.*\)".*/\1/p')"
u="$(ask 'New macOS Account: User Name?' 'OK' ${u})"
sudo defaults write \
"/System/Library/User Template/Non_localized/Library/Preferences/.GlobalPreferences.plist" \
"com.apple.swipescrolldirection" -bool false
sudo sysadminctl -admin -addUser "${u}" -fullName "${n}" -password - \
-shell "$(which zsh)" -picture "/Library/User Pictures/${e}.jpg"
}
config_guest () {
sudo sysadminctl -guestAccount off
}
config_rm_sudoers () {
sudo -- sh -c \
"rm -f /etc/sudoers.d/wheel; dscl /Local/Default -delete /Groups/wheel GroupMembership $(whoami)"
/usr/bin/read -n 1 -p "Press any key to continue.
" -s
if run "Log Out Then Log Back In?" "Cancel" "Log Out"; then
osascript -e 'tell app "loginwindow" to «event aevtrlgo»'
fi
}
custom () {
custom_githome
custom_atom
custom_autoping
custom_dropbox
custom_duti
custom_emacs
custom_finder
custom_getmail
custom_git
custom_gnupg
custom_istatmenus
custom_meteorologist
custom_moom
custom_mp4_automator
custom_nvalt
custom_nzbget
custom_safari
custom_sieve
custom_sonarr
custom_ssh
custom_sysprefs
custom_terminal
custom_vim
custom_vlc
which personalize_all
}
custom_githome () {
git -C "${HOME}" init
test -f "${CACHES}/dbx/.zshenv" && \
mkdir -p "${ZDOTDIR:-$HOME}" && \
cp "${CACHES}/dbx/.zshenv" "${ZDOTDIR:-$HOME}" && \
. "${ZDOTDIR:-$HOME}/.zshenv"
a=$(ask "Existing Git Home Repository Path or URL" "Add Remote" "")
if test -n "${a}"; then
git -C "${HOME}" remote add origin "${a}"
git -C "${HOME}" fetch origin master
fi
if run "Encrypt and commit changes to Git and push to GitHub, automatically?" "No" "Add AutoKeep"; then
curl --location --silent \
"https://github.com/ptb/autokeep/raw/master/autokeep.command" | \
. /dev/stdin 0
autokeep_remote
autokeep_push
autokeep_gitignore
autokeep_post_commit
autokeep_launchagent
autokeep_crypt
git reset --hard
git checkout -f -b master FETCH_HEAD
fi
chmod -R go= "${HOME}" > /dev/null 2>&1
}
custom_atom () {
if which apm > /dev/null; then
mkdir -p "${HOME}/.atom/.apm"
cat << EOF > "${HOME}/.atom/.apmrc"
cache = ${CACHES}/apm
EOF
cat << EOF > "${HOME}/.atom/.apm/.apmrc"
cache = ${CACHES}/apm
EOF
printf "%s\n" "${_atom}" | \
while IFS="$(printf '\t')" read pkg; do
test -d "${HOME}/.atom/packages/${pkg}" ||
apm install "${pkg}"
done
cat << EOF > "${HOME}/.atom/config.cson"
<<config.cson>>
EOF
cat << EOF > "${HOME}/.atom/packages/tomorrow-night-eighties-syntax/styles/colors.less"
<<colors.less>>
EOF
fi
}
${HOME}/.atom/config.cson
"*":
"autocomplete-python":
useKite: false
core:
telemetryConsent: "limited"
themes: [
"one-dark-ui"
"tomorrow-night-eighties-syntax"
]
editor:
fontFamily: "Inconsolata LGC"
fontSize: 13
welcome:
showOnStartup: false
${HOME}/.atom/packages/tomorrow-night-eighties-syntax/styles/colors.less
@background: #222222;
@current-line: #333333;
@selection: #4c4c4c;
@foreground: #cccccc;
@comment: #999999;
@red: #f27f7f;
@orange: #ff994c;
@yellow: #ffcc66;
@green: #99cc99;
@aqua: #66cccc;
@blue: #6699cc;
@purple: #cc99cc;
custom_autoping () {
config_defaults "${_autoping}"
}
Preference Domain Key Type Value Host
Host to Ping com.memset.autoping Hostname -string google.com
Slow Ping Threshold (ms) 100com.memset.autoping SlowPingLowThreshold -int 100
Launch at Login oncom.memset.autoping LaunchAtLogin -bool true
Display Icon and Textcom.memset.autoping ShowIcon -bool true
com.memset.autoping ShowText -bool true
Packet Loss Text oncom.memset.autoping ShowPacketLossText -bool true
Connection Up/Down Alerts oncom.memset.autoping ShowNotifications -bool true
custom_dropbox () {
test -d "/Applications/Dropbox.app" && \
open "/Applications/Dropbox.app"
}
custom_duti () {
if test -x "/usr/local/bin/duti"; then
test -f "${HOME}/Library/Preferences/org.duti.plist" && \
rm "${HOME}/Library/Preferences/org.duti.plist"
printf "%s\n" "${_duti}" | \
while IFS="$(printf '\t')" read id uti role; do
defaults write org.duti DUTISettings -array-add \
"{
DUTIBundleIdentifier = '$a';
DUTIUniformTypeIdentifier = '$b';
DUTIRole = '$c';
}"
done
duti "${HOME}/Library/Preferences/org.duti.plist" 2> /dev/null
fi
}
Bundle ID UTI Role
com.apple.DiskImageMounter com.apple.disk-image all
com.apple.DiskImageMounter public.disk-image all
com.apple.DiskImageMounter public.iso-image all
com.apple.QuickTimePlayerX com.apple.coreaudio-format all
com.apple.QuickTimePlayerX com.apple.quicktime-movie all
com.apple.QuickTimePlayerX com.microsoft.waveform-audio all
com.apple.QuickTimePlayerX public.aifc-audio all
com.apple.QuickTimePlayerX public.aiff-audio all
com.apple.QuickTimePlayerX public.audio all
com.apple.QuickTimePlayerX public.mp3 all
com.apple.Safari com.compuserve.gif all
com.apple.Terminal com.apple.terminal.shell-script all
com.apple.iTunes com.apple.iTunes.audible all
com.apple.iTunes com.apple.iTunes.ipg all
com.apple.iTunes com.apple.iTunes.ipsw all
com.apple.iTunes com.apple.iTunes.ite all
com.apple.iTunes com.apple.iTunes.itlp all
com.apple.iTunes com.apple.iTunes.itms all
com.apple.iTunes com.apple.iTunes.podcast all
com.apple.iTunes com.apple.m4a-audio all
com.apple.iTunes com.apple.mpeg-4-ringtone all
com.apple.iTunes com.apple.protected-mpeg-4-audio all
com.apple.iTunes com.apple.protected-mpeg-4-video all
com.apple.iTunes com.audible.aa-audio all
com.apple.iTunes public.mpeg-4-audio all
com.apple.installer com.apple.installer-package-archive all
com.github.atom com.apple.binary-property-list editor
com.github.atom com.apple.crashreport editor
com.github.atom com.apple.dt.document.ascii-property-list editor
com.github.atom com.apple.dt.document.script-suite-property-list editor
com.github.atom com.apple.dt.document.script-terminology-property-list editor
com.github.atom com.apple.log editor
com.github.atom com.apple.property-list editor
com.github.atom com.apple.rez-source editor
com.github.atom com.apple.symbol-export editor
com.github.atom com.apple.xcode.ada-source editor
com.github.atom com.apple.xcode.bash-script editor
com.github.atom com.apple.xcode.configsettings editor
com.github.atom com.apple.xcode.csh-script editor
com.github.atom com.apple.xcode.fortran-source editor
com.github.atom com.apple.xcode.ksh-script editor
com.github.atom com.apple.xcode.lex-source editor
com.github.atom com.apple.xcode.make-script editor
com.github.atom com.apple.xcode.mig-source editor
com.github.atom com.apple.xcode.pascal-source editor
com.github.atom com.apple.xcode.strings-text editor
com.github.atom com.apple.xcode.tcsh-script editor
com.github.atom com.apple.xcode.yacc-source editor
com.github.atom com.apple.xcode.zsh-script editor
com.github.atom com.apple.xml-property-list editor
com.github.atom com.barebones.bbedit.actionscript-source editor
com.github.atom com.barebones.bbedit.erb-source editor
com.github.atom com.barebones.bbedit.ini-configuration editor
com.github.atom com.barebones.bbedit.javascript-source editor
com.github.atom com.barebones.bbedit.json-source editor
com.github.atom com.barebones.bbedit.jsp-source editor
com.github.atom com.barebones.bbedit.lasso-source editor
com.github.atom com.barebones.bbedit.lua-source editor
com.github.atom com.barebones.bbedit.setext-source editor
com.github.atom com.barebones.bbedit.sql-source editor
com.github.atom com.barebones.bbedit.tcl-source editor
com.github.atom com.barebones.bbedit.tex-source editor
com.github.atom com.barebones.bbedit.textile-source editor
com.github.atom com.barebones.bbedit.vbscript-source editor
com.github.atom com.barebones.bbedit.vectorscript-source editor
com.github.atom com.barebones.bbedit.verilog-hdl-source editor
com.github.atom com.barebones.bbedit.vhdl-source editor
com.github.atom com.barebones.bbedit.yaml-source editor
com.github.atom com.netscape.javascript-source editor
com.github.atom com.sun.java-source editor
com.github.atom dyn.ah62d4rv4ge80255drq all
com.github.atom dyn.ah62d4rv4ge80g55gq3w0n all
com.github.atom dyn.ah62d4rv4ge80g55sq2 all
com.github.atom dyn.ah62d4rv4ge80y2xzrf0gk3pw all
com.github.atom dyn.ah62d4rv4ge81e3dtqq all
com.github.atom dyn.ah62d4rv4ge81e7k all
com.github.atom dyn.ah62d4rv4ge81g25xsq all
com.github.atom dyn.ah62d4rv4ge81g2pxsq all
com.github.atom net.daringfireball.markdown editor
com.github.atom public.assembly-source editor
com.github.atom public.c-header editor
com.github.atom public.c-plus-plus-source editor
com.github.atom public.c-source editor
com.github.atom public.csh-script editor
com.github.atom public.json editor
com.github.atom public.lex-source editor
com.github.atom public.log editor
com.github.atom public.mig-source editor
com.github.atom public.nasm-assembly-source editor
com.github.atom public.objective-c-plus-plus-source editor
com.github.atom public.objective-c-source editor
com.github.atom public.patch-file editor
com.github.atom public.perl-script editor
com.github.atom public.php-script editor
com.github.atom public.plain-text editor
com.github.atom public.precompiled-c-header editor
com.github.atom public.precompiled-c-plus-plus-header editor
com.github.atom public.python-script editor
com.github.atom public.ruby-script editor
com.github.atom public.script editor
com.github.atom public.shell-script editor
com.github.atom public.source-code editor
com.github.atom public.text editor
com.github.atom public.utf16-external-plain-text editor
com.github.atom public.utf16-plain-text editor
com.github.atom public.utf8-plain-text editor
com.github.atom public.xml editor
com.kodlian.Icon-Slate com.apple.icns all
com.kodlian.Icon-Slate com.microsoft.ico all
com.microsoft.Word public.rtf all
com.panayotis.jubler dyn.ah62d4rv4ge81g6xy all
com.sketchup.SketchUp.2017 com.sketchup.skp all
com.VortexApps.NZBVortex3 dyn.ah62d4rv4ge8068xc all
com.vmware.fusion com.microsoft.windows-executable all
cx.c3.theunarchiver com.alcohol-soft.mdf-image all
cx.c3.theunarchiver com.allume.stuffit-archive all
cx.c3.theunarchiver com.altools.alz-archive all
cx.c3.theunarchiver com.amiga.adf-archive all
cx.c3.theunarchiver com.amiga.adz-archive all
cx.c3.theunarchiver com.apple.applesingle-archive all
cx.c3.theunarchiver com.apple.binhex-archive all
cx.c3.theunarchiver com.apple.bom-compressed-cpio all
cx.c3.theunarchiver com.apple.itunes.ipa all
cx.c3.theunarchiver com.apple.macbinary-archive all
cx.c3.theunarchiver com.apple.self-extracting-archive all
cx.c3.theunarchiver com.apple.xar-archive all
cx.c3.theunarchiver com.apple.xip-archive all
cx.c3.theunarchiver com.cyclos.cpt-archive all
cx.c3.theunarchiver com.microsoft.cab-archive all
cx.c3.theunarchiver com.microsoft.msi-installer all
cx.c3.theunarchiver com.nero.nrg-image all
cx.c3.theunarchiver com.network172.pit-archive all
cx.c3.theunarchiver com.nowsoftware.now-archive all
cx.c3.theunarchiver com.nscripter.nsa-archive all
cx.c3.theunarchiver com.padus.cdi-image all
cx.c3.theunarchiver com.pkware.zip-archive all
cx.c3.theunarchiver com.rarlab.rar-archive all
cx.c3.theunarchiver com.redhat.rpm-archive all
cx.c3.theunarchiver com.stuffit.archive.sit all
cx.c3.theunarchiver com.stuffit.archive.sitx all
cx.c3.theunarchiver com.sun.java-archive all
cx.c3.theunarchiver com.symantec.dd-archive all
cx.c3.theunarchiver com.winace.ace-archive all
cx.c3.theunarchiver com.winzip.zipx-archive all
cx.c3.theunarchiver cx.c3.arc-archive all
cx.c3.theunarchiver cx.c3.arj-archive all
cx.c3.theunarchiver cx.c3.dcs-archive all
cx.c3.theunarchiver cx.c3.dms-archive all
cx.c3.theunarchiver cx.c3.ha-archive all
cx.c3.theunarchiver cx.c3.lbr-archive all
cx.c3.theunarchiver cx.c3.lha-archive all
cx.c3.theunarchiver cx.c3.lhf-archive all
cx.c3.theunarchiver cx.c3.lzx-archive all
cx.c3.theunarchiver cx.c3.packdev-archive all
cx.c3.theunarchiver cx.c3.pax-archive all
cx.c3.theunarchiver cx.c3.pma-archive all
cx.c3.theunarchiver cx.c3.pp-archive all
cx.c3.theunarchiver cx.c3.xmash-archive all
cx.c3.theunarchiver cx.c3.zoo-archive all
cx.c3.theunarchiver cx.c3.zoom-archive all
cx.c3.theunarchiver org.7-zip.7-zip-archive all
cx.c3.theunarchiver org.archive.warc-archive all
cx.c3.theunarchiver org.debian.deb-archive all
cx.c3.theunarchiver org.gnu.gnu-tar-archive all
cx.c3.theunarchiver org.gnu.gnu-zip-archive all
cx.c3.theunarchiver org.gnu.gnu-zip-tar-archive all
cx.c3.theunarchiver org.tukaani.lzma-archive all
cx.c3.theunarchiver org.tukaani.xz-archive all
cx.c3.theunarchiver public.bzip2-archive all
cx.c3.theunarchiver public.cpio-archive all
cx.c3.theunarchiver public.tar-archive all
cx.c3.theunarchiver public.tar-bzip2-archive all
cx.c3.theunarchiver public.z-archive all
cx.c3.theunarchiver public.zip-archive all
cx.c3.theunarchiver public.zip-archive.first-part all
org.gnu.Emacs dyn.ah62d4rv4ge8086xh all
org.inkscape.Inkscape public.svg-image editor
org.videolan.vlc com.apple.m4v-video all
org.videolan.vlc com.microsoft.windows-media-wmv all
org.videolan.vlc org.videolan.3gp all
org.videolan.vlc org.videolan.aac all
org.videolan.vlc org.videolan.ac3 all
org.videolan.vlc org.videolan.aiff all
org.videolan.vlc org.videolan.amr all
org.videolan.vlc org.videolan.aob all
org.videolan.vlc org.videolan.ape all
org.videolan.vlc org.videolan.asf all
org.videolan.vlc org.videolan.avi all
org.videolan.vlc org.videolan.axa all
org.videolan.vlc org.videolan.axv all
org.videolan.vlc org.videolan.divx all
org.videolan.vlc org.videolan.dts all
org.videolan.vlc org.videolan.dv all
org.videolan.vlc org.videolan.flac all
org.videolan.vlc org.videolan.flash all
org.videolan.vlc org.videolan.gxf all
org.videolan.vlc org.videolan.it all
org.videolan.vlc org.videolan.mid all
org.videolan.vlc org.videolan.mka all
org.videolan.vlc org.videolan.mkv all
org.videolan.vlc org.videolan.mlp all
org.videolan.vlc org.videolan.mod all
org.videolan.vlc org.videolan.mpc all
org.videolan.vlc org.videolan.mpeg-audio all
org.videolan.vlc org.videolan.mpeg-stream all
org.videolan.vlc org.videolan.mpeg-video all
org.videolan.vlc org.videolan.mxf all
org.videolan.vlc org.videolan.nsv all
org.videolan.vlc org.videolan.nuv all
org.videolan.vlc org.videolan.ogg-audio all
org.videolan.vlc org.videolan.ogg-video all
org.videolan.vlc org.videolan.oma all
org.videolan.vlc org.videolan.opus all
org.videolan.vlc org.videolan.quicktime all
org.videolan.vlc org.videolan.realmedia all
org.videolan.vlc org.videolan.rec all
org.videolan.vlc org.videolan.rmi all
org.videolan.vlc org.videolan.s3m all
org.videolan.vlc org.videolan.spx all
org.videolan.vlc org.videolan.tod all
org.videolan.vlc org.videolan.tta all
org.videolan.vlc org.videolan.vob all
org.videolan.vlc org.videolan.voc all
org.videolan.vlc org.videolan.vqf all
org.videolan.vlc org.videolan.vro all
org.videolan.vlc org.videolan.wav all
org.videolan.vlc org.videolan.webm all
org.videolan.vlc org.videolan.wma all
org.videolan.vlc org.videolan.wmv all
org.videolan.vlc org.videolan.wtv all
org.videolan.vlc org.videolan.wv all
org.videolan.vlc org.videolan.xa all
org.videolan.vlc org.videolan.xesc all
org.videolan.vlc org.videolan.xm all
org.videolan.vlc public.ac3-audio all
org.videolan.vlc public.audiovisual-content all
org.videolan.vlc public.avi all
org.videolan.vlc public.movie all
org.videolan.vlc public.mpeg all
org.videolan.vlc public.mpeg-2-video all
org.videolan.vlc public.mpeg-4 all
custom_emacs () {
mkdir -p "${HOME}/.emacs.d" && \
curl --compressed --location --silent \
"https://github.com/syl20bnr/spacemacs/archive/master.tar.gz" | \
tar -C "${HOME}/.emacs.d" --strip-components 1 -xf -
mkdir -p "${HOME}/.emacs.d/private/ptb"
chmod -R go= "${HOME}/.emacs.d"
cat << EOF > "${HOME}/.spacemacs"
<<.spacemacs>>
EOF
cat << EOF > "${HOME}/.emacs.d/private/ptb/config.el"
<<config.el>>
EOF
cat << EOF > "${HOME}/.emacs.d/private/ptb/funcs.el"
<<funcs.el>>
EOF
cat << EOF > "${HOME}/.emacs.d/private/ptb/keybindings.el"
<<keybindings.el>>
EOF
cat << EOF > "${HOME}/.emacs.d/private/ptb/packages.el"
<<packages.el>>
EOF
}
(defun dotspacemacs/layers ()
(setq-default
dotspacemacs-configuration-layers '(
auto-completion
(colors :variables
colors-colorize-identifiers 'variables)
dash
deft
docker
emacs-lisp
evil-cleverparens
git
github
helm
html
ibuffer
imenu-list
javascript
markdown
nginx
(org :variables
org-enable-github-support t)
(osx :variables
osx-use-option-as-meta nil)
ptb
react
ruby
ruby-on-rails
search-engine
semantic
shell-scripts
(spell-checking :variables
spell-checking-enable-by-default nil)
syntax-checking
(version-control :variables
version-control-diff-side 'left)
vim-empty-lines
)
dotspacemacs-excluded-packages '(org-bullets)
)
)
(defun dotspacemacs/init ()
(setq-default
dotspacemacs-startup-banner nil
dotspacemacs-startup-lists nil
dotspacemacs-scratch-mode 'org-mode
dotspacemacs-themes '(sanityinc-tomorrow-eighties)
dotspacemacs-default-font '(
"Inconsolata LGC"
:size 13
:weight normal
:width normal
:powerline-scale 1.1)
dotspacemacs-loading-progress-bar nil
dotspacemacs-active-transparency 100
dotspacemacs-inactive-transparency 100
dotspacemacs-line-numbers t
dotspacemacs-whitespace-cleanup 'all
)
)
(defun dotspacemacs/user-init ())
(defun dotspacemacs/user-config ())
~/.emacs.d/private/ptb/config.el
(setq
default-frame-alist '(
(top . 22)
(left . 1201)
(height . 50)
(width . 120)
(vertical-scroll-bars . right))
initial-frame-alist (copy-alist default-frame-alist)
deft-directory "~/Dropbox/Notes"
focus-follows-mouse t
mouse-wheel-follow-mouse t
mouse-wheel-scroll-amount '(1 ((shift) . 1))
org-src-preserve-indentation t
purpose-display-at-right 20
recentf-max-saved-items 5
scroll-step 1
system-uses-terminfo nil
ibuffer-formats '(
(mark modified read-only " "
(name 18 18 :left :elide)))
ibuffer-shrink-to-minimum-size t
ibuffer-always-show-last-buffer nil
ibuffer-sorting-mode 'recency
ibuffer-use-header-line nil
x-select-enable-clipboard nil)
(global-linum-mode t)
(recentf-mode t)
(x-focus-frame nil)
(with-eval-after-load 'org
(org-babel-do-load-languages
'org-babel-load-languages '(
(ruby . t)
(shell . t)
)
)
)
~/.emacs.d/private/ptb/funcs.el
(defun is-useless-buffer (buffer)
(let ((name (buffer-name buffer)))
(and (= ?* (aref name 0))
(string-match "^\\**" name))))
(defun kill-useless-buffers ()
(interactive)
(loop for buffer being the buffers
do (and (is-useless-buffer buffer) (kill-buffer buffer))))
(defun org-babel-tangle-hook ()
(add-hook 'after-save-hook 'org-babel-tangle))
(add-hook 'org-mode-hook #'org-babel-tangle-hook)
(defun ptb/new-untitled-buffer ()
"Create a new untitled buffer in the current frame."
(interactive)
(let
((buffer "Untitled-") (count 1))
(while
(get-buffer (concat buffer (number-to-string count)))
(setq count (1+ count)))
(switch-to-buffer
(concat buffer (number-to-string count))))
(org-mode))
(defun ptb/previous-buffer ()
(interactive)
(kill-useless-buffers)
(previous-buffer))
(defun ptb/next-buffer ()
(interactive)
(kill-useless-buffers)
(next-buffer))
(defun ptb/kill-current-buffer ()
(interactive)
(kill-buffer (current-buffer))
(kill-useless-buffers))
~/.emacs.d/private/ptb/keybindings.el
(define-key evil-insert-state-map (kbd "<return>") 'newline)
(define-key evil-normal-state-map (kbd "s-c") 'clipboard-kill-ring-save)
(define-key evil-insert-state-map (kbd "s-c") 'clipboard-kill-ring-save)
(define-key evil-visual-state-map (kbd "s-c") 'clipboard-kill-ring-save)
(define-key evil-ex-completion-map (kbd "s-v") 'clipboard-yank)
(define-key evil-ex-search-keymap (kbd "s-v") 'clipboard-yank)
(define-key evil-insert-state-map (kbd "s-v") 'clipboard-yank)
(define-key evil-normal-state-map (kbd "s-x") 'clipboard-kill-region)
(define-key evil-insert-state-map (kbd "s-x") 'clipboard-kill-region)
(define-key evil-visual-state-map (kbd "s-x") 'clipboard-kill-region)
(define-key evil-normal-state-map (kbd "<S-up>") 'evil-previous-visual-line)
(define-key evil-insert-state-map (kbd "<S-up>") 'evil-previous-visual-line)
(define-key evil-visual-state-map (kbd "<S-up>") 'evil-previous-visual-line)
(define-key evil-normal-state-map (kbd "<S-down>") 'evil-next-visual-line)
(define-key evil-insert-state-map (kbd "<S-down>") 'evil-next-visual-line)
(define-key evil-visual-state-map (kbd "<S-down>") 'evil-next-visual-line)
(global-set-key (kbd "C-l") 'evil-search-highlight-persist-remove-all)
(global-set-key (kbd "s-t") 'make-frame)
(global-set-key (kbd "s-n") 'ptb/new-untitled-buffer)
(global-set-key (kbd "s-w") 'ptb/kill-current-buffer)
(global-set-key (kbd "s-{") 'ptb/previous-buffer)
(global-set-key (kbd "s-}") 'ptb/next-buffer)
~/.emacs.d/private/ptb/packages.el
(setq ptb-packages '(adaptive-wrap auto-indent-mode))
(defun ptb/init-adaptive-wrap ()
"Load the adaptive wrap package"
(use-package adaptive-wrap
:init
(setq adaptive-wrap-extra-indent 2)
:config
(progn
;; http://stackoverflow.com/questions/13559061
(when (fboundp 'adaptive-wrap-prefix-mode)
(defun ptb/activate-adaptive-wrap-prefix-mode ()
"Toggle 'visual-line-mode' and 'adaptive-wrap-prefix-mode' simultaneously."
(adaptive-wrap-prefix-mode (if visual-line-mode 1 -1)))
(add-hook 'visual-line-mode-hook 'ptb/activate-adaptive-wrap-prefix-mode)))))
(defun ptb/init-auto-indent-mode ()
(use-package auto-indent-mode
:init
(setq
auto-indent-delete-backward-char t
auto-indent-fix-org-auto-fill t
auto-indent-fix-org-move-beginning-of-line t
auto-indent-fix-org-return t
auto-indent-fix-org-yank t
auto-indent-start-org-indent t
)
)
)
custom_finder () {
config_defaults "${_finder}"
defaults write "com.apple.finder" "NSToolbar Configuration Browser" \
'{
"TB Display Mode" = 2;
"TB Item Identifiers" = (
"com.apple.finder.BACK",
"com.apple.finder.PATH",
"com.apple.finder.SWCH",
"com.apple.finder.ARNG",
"NSToolbarFlexibleSpaceItem",
"com.apple.finder.SRCH",
"com.apple.finder.ACTN"
);
}'
}
Preference Domain Key Type Value Host
Show these items on the desktop: off Hard disks com.apple.finder ShowHardDrivesOnDesktop -bool false
Show these items on the desktop: off External disks com.apple.finder ShowExternalHardDrivesOnDesktop -bool false
Show these items on the desktop: on CDs, DVDs, and iPods com.apple.finder ShowRemovableMediaOnDesktop -bool true
Show these items on the desktop: on Connected servers: com.apple.finder ShowMountedServersOnDesktop -bool true
New Finder windows show: ${HOME}com.apple.finder NewWindowTarget -string PfLo
com.apple.finder NewWindowTargetPath -string file://${HOME}/Dropbox/
on Show all filename extensions -globalDomain AppleShowAllExtensions -bool true
off Show warning before changing an extension com.apple.finder FXEnableExtensionChangeWarning -bool false
on Show warning before removing from iCloud Drive com.apple.finder FXEnableRemoveFromICloudDriveWarning -bool true
off Show warning before emptying the Trash com.apple.finder WarnOnEmptyTrash -bool false
View ▶ Show Path Bar com.apple.finder ShowPathbar -bool true
View ▶ Show Status Bar com.apple.finder ShowStatusBar -bool true
custom_getmail () {
test -d "${HOME}/.getmail" || \
mkdir -m go= "${HOME}/.getmail"
while true; do
e=$(ask2 "To configure getmail, enter your email address." "Configure Getmail" "No More Addresses" "Create Configuration" "$(whoami)@$(hostname -f | cut -d. -f2-)" "false")
test -n "$e" || break
security find-internet-password -a "$e" -D "getmail password" > /dev/null || \
p=$(ask2 "Enter your password for $e." "Configure Getmail" "Cancel" "Set Password" "" "true") && \
security add-internet-password -a "$e" -s "imap.gmail.com" -r "imap" \
-l "$e" -D "getmail password" -P 993 -w "$p"
if which crudini > /dev/null; then
gm="${HOME}/.getmail/${e}"
printf "%s\n" "${_getmail_ini}" | \
while IFS="$(printf '\t')" read section key value; do
crudini --set "$gm" "$section" "$key" "$value"
done
crudini --set "$gm" "destination" "arguments" "('-c','/usr/local/etc/dovecot/dovecot.conf','-d','$(whoami)')"
crudini --set "$gm" "destination" "path" "$(find '/usr/local/Cellar/dovecot' -name 'dovecot-lda' -print -quit)"
crudini --set "$gm" "retriever" "username" "$e"
fi
la="${HOME}/Library/LaunchAgents/ca.pyropus.getmail.${e}"
test -d "$(dirname $la)" || \
mkdir -p "$(dirname $la)"
launchctl unload "${la}.plist" 2> /dev/null
rm -f "${la}.plist"
config_plist "$_getmail_plist" "${la}.plist"
config_defaults "$(printf "${la}\tLabel\t-string\tca.pyropus.getmail.${e}\t")"
config_defaults "$(printf "${la}\tProgramArguments\t-array-add\t${e}\t")"
config_defaults "$(printf "${la}\tWorkingDirectory\t-string\t${HOME}/.getmail\t")"
plutil -convert xml1 "${la}.plist"
launchctl load "${la}.plist" 2> /dev/null
done
}
Section Key Value
destination ignore_stderr true
destination type MDA_external
options delete true
options delivered_to false
options read_all false
options received false
options verbose 0
retriever mailboxes (“[Gmail]/All Mail”,)
retriever move_on_delete “[Gmail]/Trash”
retriever port 993
retriever server imap.gmail.com
retriever type SimpleIMAPSSLRetriever
Command Entry Type Value
add :KeepAlive bool true
add :ProcessType string Background
add :ProgramArguments array
add :ProgramArguments:0 string /usr/local/bin/getmail
add :ProgramArguments:1 string –idle
add :ProgramArguments:2 string [Gmail]/All Mail
add :ProgramArguments:3 string –rcfile
add :RunAtLoad bool true
add :StandardOutPath string getmail.log
add :StandardErrorPath string getmail.err
custom_git () {
if ! test -e "${HOME}/.gitconfig"; then
true
fi
}
custom_gnupg () {
if ! test -d "${HOME}/.gnupg"; then
true
fi
}
Customize iStat Menus
custom_istatmenus () {
defaults delete com.bjango.istatmenus5.extras Time_MenubarFormat > /dev/null 2>&1
defaults delete com.bjango.istatmenus5.extras Time_DropdownFormat > /dev/null 2>&1
defaults delete com.bjango.istatmenus5.extras Time_Cities > /dev/null 2>&1
config_defaults "${_istatmenus}"
}
_istatmenus
Preference Domain Key Type Value Host
com.bjango.istatmenus5.extras MenubarSkinColor -int 8
com.bjango.istatmenus5.extras MenubarTheme -int 0
com.bjango.istatmenus5.extras DropdownTheme -int 1
com.bjango.istatmenus5.extras CPU_MenubarMode -string 100,2,0
com.bjango.istatmenus5.extras CPU_MenubarTextSize -int 14
com.bjango.istatmenus5.extras CPU_MenubarGraphShowBackground -int 0
com.bjango.istatmenus5.extras CPU_MenubarGraphWidth -int 32
com.bjango.istatmenus5.extras CPU_MenubarGraphBreakdowns -int 0
com.bjango.istatmenus5.extras CPU_MenubarGraphCustomColors -int 0
com.bjango.istatmenus5.extras CPU_MenubarGraphOverall -string 0.40 0.60 0.40 1.00
com.bjango.istatmenus5.extras CPU_MenubarCombineCores -int 1
com.bjango.istatmenus5.extras CPU_MenubarGroupItems -int 0
com.bjango.istatmenus5.extras CPU_MenubarSingleHistoryGraph -int 0
com.bjango.istatmenus5.extras CPU_CombineLogicalCores -int 1
com.bjango.istatmenus5.extras CPU_AppFormat -int 0
com.bjango.istatmenus5.extras Memory_MenubarMode -string 100,2,6
com.bjango.istatmenus5.extras Memory_MenubarPercentageSize -int 14
com.bjango.istatmenus5.extras Memory_MenubarGraphBreakdowns -int 1
com.bjango.istatmenus5.extras Memory_MenubarGraphCustomColors -int 0
com.bjango.istatmenus5.extras Memory_MenubarGraphOverall -string 0.40 0.60 0.40 1.00
com.bjango.istatmenus5.extras Memory_MenubarGraphWired -string 0.40 0.60 0.40 1.00
com.bjango.istatmenus5.extras Memory_MenubarGraphActive -string 0.47 0.67 0.47 1.00
com.bjango.istatmenus5.extras Memory_MenubarGraphCompressed -string 0.53 0.73 0.53 1.00
com.bjango.istatmenus5.extras Memory_MenubarGraphInactive -string 0.60 0.80 0.60 1.00
com.bjango.istatmenus5.extras Memory_IgnoreInactive -int 0
com.bjango.istatmenus5.extras Memory_AppFormat -int 0
com.bjango.istatmenus5.extras Memory_DisplayFormat -int 1
com.bjango.istatmenus5.extras Disks_MenubarMode -string 100,9,8
com.bjango.istatmenus5.extras Disks_MenubarGroupItems -int 1
com.bjango.istatmenus5.extras Disks_MenubarRWShowLabel -int 1
com.bjango.istatmenus5.extras Disks_MenubarRWBold -int 0
com.bjango.istatmenus5.extras Disks_MenubarGraphActivityWidth -int 32
com.bjango.istatmenus5.extras Disks_MenubarGraphActivityShowBackground -int 0
com.bjango.istatmenus5.extras Disks_MenubarGraphActivityCustomColors -int 0
com.bjango.istatmenus5.extras Disks_MenubarGraphActivityRead -string 0.60 0.80 0.60 1.00
com.bjango.istatmenus5.extras Disks_MenubarGraphActivityWrite -string 0.40 0.60 0.40 1.00
com.bjango.istatmenus5.extras Disks_SeperateFusion -int 1
com.bjango.istatmenus5.extras Network_MenubarMode -string 4,0,1
com.bjango.istatmenus5.extras Network_TextUploadColor-Dark -string 1.00 1.00 1.00 1.00
com.bjango.istatmenus5.extras Network_TextDownloadColor-Dark -string 1.00 1.00 1.00 1.00
com.bjango.istatmenus5.extras Network_GraphWidth -int 32
com.bjango.istatmenus5.extras Network_GraphShowBackground -int 0
com.bjango.istatmenus5.extras Network_GraphCustomColors -int 0
com.bjango.istatmenus5.extras Network_GraphUpload -string 0.60 0.80 0.60 1.00
com.bjango.istatmenus5.extras Network_GraphDownload -string 0.40 0.60 0.40 1.00
com.bjango.istatmenus5.extras Network_GraphMode -int 1
com.bjango.istatmenus5.extras Battery_MenubarMode -string 5,0
com.bjango.istatmenus5.extras Battery_ColorGraphCustomColors -int 1
com.bjango.istatmenus5.extras Battery_ColorGraphCharged -string 0.40 0.60 0.40 1.00
com.bjango.istatmenus5.extras Battery_ColorGraphCharging -string 0.60 0.80 0.60 1.00
com.bjango.istatmenus5.extras Battery_ColorGraphDraining -string 1.00 0.60 0.60 1.00
com.bjango.istatmenus5.extras Battery_ColorGraphLow -string 1.00 0.20 0.20 1.00
com.bjango.istatmenus5.extras Battery_PercentageSize -int 14
com.bjango.istatmenus5.extras Battery_MenubarCustomizeStates -int 0
com.bjango.istatmenus5.extras Battery_MenubarHideBluetooth -int 1
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add EE
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add \040
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add MMM
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add \040
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add d
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add \040
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add h
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add :
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add mm
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add :
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add ss
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add \040
com.bjango.istatmenus5.extras Time_MenubarFormat -array-add a
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add EE
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add \040
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add h
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add :
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add mm
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add \040
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add a
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add \040\050
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add zzz
com.bjango.istatmenus5.extras Time_DropdownFormat -array-add \051
com.bjango.istatmenus5.extras Time_Cities -array-add 4930956
com.bjango.istatmenus5.extras Time_Cities -array-add 4887398
com.bjango.istatmenus5.extras Time_Cities -array-add 5419384
com.bjango.istatmenus5.extras Time_Cities -array-add 5392171
com.bjango.istatmenus5.extras Time_Cities -array-add 5879400
com.bjango.istatmenus5.extras Time_Cities -array-add 5856195
com.bjango.istatmenus5.extras Time_TextSize -int 14
custom_meteorologist () {
config_defaults "${_meteorologist}"
}
Preference Domain Key Type Value Host
com.heat.meteorologist controlsInSubmenu -string 0
com.heat.meteorologist currentWeatherInSubmenu -string 0
com.heat.meteorologist displayCityName -string 0
com.heat.meteorologist displayHumidity -string 0
com.heat.meteorologist displayWeatherIcon -string 1
com.heat.meteorologist extendedForecastIcons -string 1
com.heat.meteorologist extendedForecastInSubmenu -string 0
com.heat.meteorologist extendedForecastSingleLine -string 1
com.heat.meteorologist forecastDays -int 8
com.heat.meteorologist viewExtendedForecast -string 1
com.heat.meteorologist weatherSource_1 -int 3
custom_moom () {
killall Moom > /dev/null 2>&1
defaults delete com.manytricks.Moom "Custom Controls" > /dev/null 2>&1
config_defaults "${_moom}"
test -d "/Applications/Moom.app" && \
open "/Applications/Moom.app"
}
Preference Domain Key Type Value Host
on Treat drawers as part of their parent windows com.manytricks.Moom Allow For Drawers -bool true
on Separate windows by 2 pt com.manytricks.Moom Grid Spacing -bool true
com.manytricks.Moom Grid Spacing: Gap -int 2
off Apply to screen edges com.manytricks.Moom Grid Spacing: Apply To Edges -bool false
Grid/keyboard control highlight: 25%com.manytricks.Moom Target Window Highlight -float 0.25
off Show preferences on launch com.manytricks.Moom Stealth Mode -bool true
Run as faceless application com.manytricks.Moom Application Mode -int 2
on Pop up controls when hovering over a Zoom button com.manytricks.Moom Mouse Controls -bool true
Delay: 0.1 second com.manytricks.Moom Mouse Controls Delay -float 0.1
on Enable hexagon grid with 16 × 9 cells com.manytricks.Moom Mouse Controls Grid -bool true
com.manytricks.Moom Mouse Controls Grid: Mode -int 3
com.manytricks.Moom Mouse Controls Grid: Columns -int 16
com.manytricks.Moom Mouse Controls Grid: Rows -int 9
on Enable access to custom controls com.manytricks.Moom Mouse Controls Include Custom Controls -bool true
off Show on hover com.manytricks.Moom Mouse Controls Include Custom Controls: Show On Hover -bool false
on Bring moomed windows to the front automatically com.manytricks.Moom Mouse Controls Auto-Activate Window -bool true
off Move & Zoom when dragging a window to a display edge or corner com.manytricks.Moom Snap -bool false
Move & Zoomcom.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0, 0.33333}, {0.375, 0.66666}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0, 0.33333}, {0.375, 0.33333}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0, 0}, {0.25, 0.33333}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0.125, 0}, {0.25, 0.33333}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0.375, 0.44444}, {0.3125, 0.55555}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0.375, 0}, {0.3125, 0.44444}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0.6875, 0.55555}, {0.3125, 0.44444}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0.6875, 0.44444}, {0.3125, 0.55555}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 19; “Relative Frame” = “{{0.6875, 0}, {0.3125, 0.44444}}”; }
com.manytricks.Moom Custom Controls -array-add { Action = 1001; “Apply to Overlapping Windows” = 1; Snapshot = ( { “Application Name” = Safari; “Bundle Identifier” = “com.apple.safari”; “Window Frame” = “{{0, 594}, {1199, 1184}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = Finder; “Bundle Identifier” = “com.apple.finder”; “Window Frame” = “{{0, 0}, {799, 592}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = Messages; “Bundle Identifier” = “com.apple.ichat”; “Window Frame” = “{{401, 0}, {798, 592}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = Emacs; “Bundle Identifier” = “org.gnu.emacs”; “Window Frame” = “{{1201, 806}, {991, 972}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = Terminal; “Bundle Identifier” = “com.apple.terminal”; “Window Frame” = “{{1201, 17}, {993, 772}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = iTerm2; “Bundle Identifier” = “com.googlecode.iterm2”; “Window Frame” = “{{1201, 17}, {993, 772}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = nvALT; “Bundle Identifier” = “net.elasticthreads.nv”; “Window Frame” = “{{2201, 989}, {999, 789}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = “Metanota Pro”; “Bundle Identifier” = “bogdanf.osx.metanota.pro”; “Window Frame” = “{{2201, 989}, {999, 789}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = BBEdit; “Bundle Identifier” = “com.barebones.bbedit”; “Window Frame” = “{{2201, 622}, {999, 1156}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = Atom; “Bundle Identifier” = “com.github.atom”; “Window Frame” = “{{2201, 622}, {999, 1156}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = Mail; “Bundle Identifier” = “com.apple.mail”; “Window Frame” = “{{2201, 622}, {999, 1156}}”; “Window Subrole” = AXStandardWindow; }, { “Application Name” = VLC; “Bundle Identifier” = “org.videolan.vlc”; “Window Frame” = “{{2201, 0}, {999, 789}}”; “Window Subrole” = AXStandardWindow; } ); “Snapshot Screens” = ( “{{0, 0}, {3200, 1800}}” ); }
Define window sizes using 16 × 9 cells com.manytricks.Moom Configuration Grid: Columns -int 16
com.manytricks.Moom Configuration Grid: Rows -int 9
on Check for updates automatically com.manytricks.Moom SUEnableAutomaticChecks -bool true
custom_mp4_automator () {
mkdir -p "${HOME}/.config/mp4_automator" && \
curl --compressed --location --silent \
"https://github.com/mdhiggins/sickbeard_mp4_automator/archive/master.tar.gz" | \
tar -C "${HOME}/.config/mp4_automator" --strip-components 1 -xf -
printf "%s\n" "2.7.13" > "${HOME}/.config/mp4_automator/.python-version"
if which crudini > /dev/null; then
printf "%s\n" "${_mp4_automator}" | \
while IFS="$(printf '\t')" read section key value; do
crudini --set "${HOME}/.config/mp4_automator/autoProcess.ini" "${section}" "${key}" "${value}"
done
open "http://localhost:7878/settings/general"
RADARRAPI="$(ask 'Radarr API Key?' 'Set API Key' '')"
crudini --set "${HOME}/.config/mp4_automator/autoProcess.ini" "Radarr" "apikey" "$RADARRAPI"
open "http://localhost:8989/settings/general"
SONARRAPI="$(ask 'Sonarr API Key?' 'Set API Key' '')"
crudini --set "${HOME}/.config/mp4_automator/autoProcess.ini" "Sonarr" "apikey" "$SONARRAPI"
fi
find "${HOME}/.config/mp4_automator" -name "*.py" -print0 | \
xargs -0 -L 1 sed -i "" -e "s:/usr/bin/env python:/usr/local/python/versions/2.7.13/bin/python:"
}
Preference Section Key Value
MP4 aac_adtstoasc True
MP4 audio-channel-bitrate 256
MP4 audio-codec ac3,aac
MP4 audio-default-language eng
MP4 audio-filter
MP4 audio-language eng
MP4 convert-mp4 True
MP4 copy_to
MP4 delete_original False
MP4 download-artwork Poster
MP4 download-subs True
MP4 embed-subs True
MP4 ffmpeg /usr/local/bin/ffmpeg
MP4 ffprobe /usr/local/bin/ffprobe
MP4 fullpathguess True
MP4 h264-max-level 4.1
MP4 ios-audio True
MP4 ios-audio-filter
MP4 ios-first-track-only True
MP4 max-audio-channels
MP4 move_to
MP4 output_directory
MP4 output_extension m4v
MP4 output_format mp4
MP4 permissions 0644
MP4 pix-fmt
MP4 post-process False
MP4 postopts
MP4 preopts
MP4 relocate_moov True
MP4 sub-providers addic7ed,podnapisi,thesubdb,opensubtitles
MP4 subtitle-codec mov_text
MP4 subtitle-default-language eng
MP4 subtitle-encoding
MP4 subtitle-language eng
MP4 tag-language eng
MP4 tagfile True
MP4 threads auto
MP4 use-qsv-decoder-with-encoder True
MP4 video-bitrate
MP4 video-codec h264,x264
MP4 video-crf
MP4 video-max-width 1920
Plex host localhost
Plex port 32400
Plex refresh False
Plex token
Radarr host localhost
Radarr port 7878
Radarr ssl False
Radarr web_root
Sonarr host localhost
Sonarr port 8989
Sonarr ssl False
Sonarr web_root
custom_nvalt () {
config_defaults "$_nvalt"
config_launchd "${HOME}/Library/LaunchAgents/net.elasticthreads.nv.plist" "$_nvalt_launchd"
}
Preference Domain Key Type Value Host
List Text Size: Smallnet.elasticthreads.nv TableFontPointSize -int 11
Bring-to-Front Hotkey: (None)net.elasticthreads.nv AppActivationKeyCode -int -1
net.elasticthreads.nv AppActivationModifiers -int -1
on Auto-select notes by title when searching net.elasticthreads.nv AutoCompleteSearches -bool true
on Confirm note deletion net.elasticthreads.nv ConfirmNoteDeletion -bool true
off Quit when closing window net.elasticthreads.nv QuitWhenClosingMainWindow -bool false
on Show menu bar icon net.elasticthreads.nv StatusBarItem -bool true
Hide Dock Icon net.elasticthreads.nv ShowDockIcon -bool false
Styled Text: off Copy basic styles from other apps net.elasticthreads.nv PastePreservesStyle -bool false
Spelling: off Check as you type net.elasticthreads.nv CheckSpellingInNoteBody -bool false
Tab Key: Indent linesnet.elasticthreads.nv TabKeyIndents -bool true
on Soft tabs (spaces) net.elasticthreads.nv UseSoftTabs -bool true
Links: on Make URLs clickable links net.elasticthreads.nv MakeURLsClickable -bool true
Links: off Suggest titles for note-links net.elasticthreads.nv AutoSuggestLinks -bool false
URL Import: off Convert imported URLs to Markdown net.elasticthreads.nv UseMarkdownImport -bool false
URL Import: off Process with Readability net.elasticthreads.nv UseReadability -bool false
Direction: off Right-To-Left (RTL) net.elasticthreads.nv rtl -bool false
Auto-pair: onnet.elasticthreads.nv UseAutoPairing -bool true
External Text Editor: Emacs.appnet.elasticthreads.nv DefaultEEIdentifier -string org.gnu.Emacs
net.elasticthreads.nv UserEEIdentifiers -array-add com.apple.TextEdit
net.elasticthreads.nv UserEEIdentifiers -array-add org.gnu.Emacs
Body Font: InconsolataLGC 13net.elasticthreads.nv NoteBodyFont -data 040b73747265616d747970656481e803840140848484064e53466f6e741e8484084e534f626a65637400858401692884055b3430635d060000001e000000fffe49006e0063006f006e0073006f006c006100740061004c004700430000008401660d8401630098019800980086
on Search Highlight: #CCFFCCnet.elasticthreads.nv HighlightSearchTerms -bool true
net.elasticthreads.nv SearchTermHighlightColor -data 040b73747265616d747970656481e803840140848484074e53436f6c6f72008484084e534f626a65637400858401630184046666666683cdcc4c3f0183cdcc4c3f0186
Foreground Text: #CCCCCCnet.elasticthreads.nv ForegroundTextColor -data 040b73747265616d747970656481e803840140848484074e53436f6c6f72008484084e534f626a65637400858401630184046666666683cdcc4c3f83cdcc4c3f83cdcc4c3f0186
Background: #1A1A1Anet.elasticthreads.nv BackgroundTextColor -data 040b73747265616d747970656481e803840140848484074e53436f6c6f72008484084e534f626a65637400858401630184046666666683d1d0d03d83d1d0d03d83d1d0d03d0186
Always Show Grid Lines in Notes List: onnet.elasticthreads.nv ShowGrid -bool true
Alternating Row Colors: onnet.elasticthreads.nv AlternatingRows -bool true
Use nvALT Scrollbars: offnet.elasticthreads.nv UseETScrollbarsOnLion -bool false
Keep Note Body Width Readable: onnet.elasticthreads.nv KeepsMaxTextWidth -bool true
Max. Note Body Width: 650 pixels net.elasticthreads.nv NoteBodyMaxWidth -int 650
View ▶ Switch to Horizontal Layout net.elasticthreads.nv HorizontalLayout -bool true
View ▶ Columns ▶ ✓ Title ✓ Tagsnet.elasticthreads.nv NoteAttributesVisible -array-add Title
net.elasticthreads.nv NoteAttributesVisible -array-add Tags
View ▶ Sort By ▶︎ ▼ Date Modifiednet.elasticthreads.nv TableIsReverseSorted -bool true
net.elasticthreads.nv TableSortColumn -string Date Modified
View ▶ Show Note Previews in Title net.elasticthreads.nv TableColumnsHaveBodyPreview -bool true
Command Entry Type Value
add :KeepAlive bool true
add :Label string net.elasticthreads.nv
add :ProcessType string Interactive
add :Program string /Applications/nvALT.app/Contents/MacOS/nvALT
add :RunAtLoad bool true
custom_nzbget () {
f="${HOME}/Library/Application Support/NZBGet/nzbget.conf"
mkdir -p "$(dirname $f)"
if which crudini > /dev/null; then
printf "%s\n" "${_nzbget}" | \
while IFS="$(printf '\t')" read key value; do
crudini --set "$f" "" "${key}" "${value}"
done
fi
sed -i "" -e "s/ = /=/g" "$f"
}
Preference Key Value
Security ControlIP 127.0.0.1
ControlPort 6789
AuthorizedIP 127.0.0.1
News-Servers Server1.Level 0
Server1 Server1.Host ssl.astraweb.com
Server1.Port 443
Server1.Encryption yes
Server1.Connections 6
Server1.Retention 3000
News-Servers Server2.Level 0
Server2 Server2.Host ssl-us.astraweb.com
Server2.Port 443
Server2.Encryption yes
Server2.Connections 6
Server2.Retention 3000
News-Servers Server3.Level 0
Server3 Server3.Host ssl-eu.astraweb.com
Server3.Port 443
Server3.Encryption yes
Server3.Connections 6
Server3.Retention 3000
News-Servers Server4.Level 1
Server4 Server4.Host news.tweaknews.eu
Server4.Port 443
Server4.Encryption yes
Server4.Connections 40
Server4.Retention 2500
News-Servers Server5.Level 2
Server5 Server5.Host news.newsdemon.com
Server5.Port 563
Server5.Encryption yes
Server5.Connections 12
Server5.Retention 3303
News-Servers Server6.Level 2
Server6 Server6.Host us.newsdemon.com
Server6.Port 563
Server6.Encryption yes
Server6.Connections 12
Server6.Retention 3303
News-Servers Server7.Level 2
Server7 Server7.Host eu.newsdemon.com
Server7.Port 563
Server7.Encryption yes
Server7.Connections 12
Server7.Retention 3303
News-Servers Server8.Level 2
Server8 Server8.Host nl.newsdemon.com
Server8.Port 563
Server8.Encryption yes
Server8.Connections 12
Server8.Retention 3303
News-Servers Server9.Level 2
Server9 Server9.Host usnews.blocknews.net
Server9.Port 443
Server9.Encryption yes
Server9.Connections 16
Server9.Retention 3240
News-Servers Server10.Level 2
Server10 Server10.Host eunews.blocknews.net
Server10.Port 443
Server10.Encryption yes
Server10.Connections 16
Server10.Retention 3240
News-Servers Server11.Level 2
Server11 Server11.Host eunews2.blocknews.net
Server11.Port 443
Server11.Encryption yes
Server11.Connections 16
Server11.Retention 3240
custom_safari () {
config_defaults "${_safari}"
}
Preference Domain Key Type Value Host
Safari opens with: A new windowcom.apple.Safari AlwaysRestoreSessionAtLaunch -bool false
com.apple.Safari OpenPrivateWindowWhenNotRestoringSessionAtLaunch -bool false
New windows open with: Empty Pagecom.apple.Safari NewWindowBehavior -int 1
New tabs open with: Empty Pagecom.apple.Safari NewTabBehavior -int 1
off Open “safe” files after downloading com.apple.Safari AutoOpenSafeDownloads -bool false
Open pages in tabs instead of windows: Alwayscom.apple.Safari TabCreationPolicy -int 2
AutoFill web forms: off Using info from my contacts com.apple.Safari AutoFillFromAddressBook -bool false
AutoFill web forms: on User names and passwords com.apple.Safari AutoFillPasswords -bool true
AutoFill web forms: off Credit cards com.apple.Safari AutoFillCreditCardData -bool false
AutoFill web forms: off Other forms com.apple.Safari AutoFillMiscellaneousForms -bool false
on Include search engine suggestions com.apple.Safari SuppressSearchSuggestions -bool false
Smart Search Field: off Include Safari Suggestions com.apple.Safari UniversalSearchEnabled -bool false
Smart Search Field: on Enable Quick Website Search com.apple.Safari WebsiteSpecificSearchEnabled -bool true
Smart Search Field: on Preload Top Hit in the background com.apple.Safari PreloadTopHit -bool true
Smart Search Field: off Show Favorites com.apple.Safari ShowFavoritesUnderSmartSearchField -bool false
Website use of location services: Deny without promptingcom.apple.Safari SafariGeolocationPermissionPolicy -int 0
Website tracking: ~on~ *Prevent cross-site tracking com.apple.Safari BlockStoragePolicy -int 2
com.apple.Safari WebKitStorageBlockingPolicy -int 1
com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2StorageBlockingPolicy -int 1
Website tracking: on Ask websites not to track me com.apple.Safari SendDoNotTrackHTTPHeader -bool true
Cookies and website data: off Block all cookies com.apple.WebFoundation NSHTTPAcceptCookies -string always
Apple Pay: on Allow websites to check if Apple Pay is set up com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2ApplePayCapabilityDisclosureAllowed -bool true
off Allow websites to ask for permission to send push notifications com.apple.Safari CanPromptForPushNotifications -bool false
Smart Search Field: on Show full website address com.apple.Safari ShowFullURLInSmartSearchField -bool true
Default encoding: Unicode (UTF-8)com.apple.Safari WebKitDefaultTextEncodingName -string utf-8
com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DefaultTextEncodingName -string utf-8
on Show Develop menu in menu bar com.apple.Safari IncludeDevelopMenu -bool true
com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled -bool true
View ▶ Show Favorites Bar com.apple.Safari ShowFavoritesBar-v2 -bool true
View ▶ Show Tab Bar com.apple.Safari AlwaysShowTabBar -bool true
View ▶ Show Status Bar com.apple.Safari ShowStatusBar -bool true
com.apple.Safari ShowStatusBarInFullScreen -bool true
custom_sieve () {
cat > "${HOME}/.sieve" << EOF
require ["date", "fileinto", "imap4flags", "mailbox", "relational", "variables"];
setflag "\\\\Seen";
if date :is "date" "year" "1995" { fileinto :create "Archives.1995"; }
if date :is "date" "year" "1996" { fileinto :create "Archives.1996"; }
if date :is "date" "year" "1997" { fileinto :create "Archives.1997"; }
if date :is "date" "year" "1998" { fileinto :create "Archives.1998"; }
if date :is "date" "year" "1999" { fileinto :create "Archives.1999"; }
if date :is "date" "year" "2000" { fileinto :create "Archives.2000"; }
if date :is "date" "year" "2001" { fileinto :create "Archives.2001"; }
if date :is "date" "year" "2002" { fileinto :create "Archives.2002"; }
if date :is "date" "year" "2003" { fileinto :create "Archives.2003"; }
if date :is "date" "year" "2004" { fileinto :create "Archives.2004"; }
if date :is "date" "year" "2005" { fileinto :create "Archives.2005"; }
if date :is "date" "year" "2006" { fileinto :create "Archives.2006"; }
if date :is "date" "year" "2007" { fileinto :create "Archives.2007"; }
if date :is "date" "year" "2008" { fileinto :create "Archives.2008"; }
if date :is "date" "year" "2009" { fileinto :create "Archives.2009"; }
if date :is "date" "year" "2010" { fileinto :create "Archives.2010"; }
if date :is "date" "year" "2011" { fileinto :create "Archives.2011"; }
if date :is "date" "year" "2012" { fileinto :create "Archives.2012"; }
if date :is "date" "year" "2013" { fileinto :create "Archives.2013"; }
if date :is "date" "year" "2014" { fileinto :create "Archives.2014"; }
if date :is "date" "year" "2015" { fileinto :create "Archives.2015"; }
if date :is "date" "year" "2016" { fileinto :create "Archives.2016"; }
if date :is "date" "year" "2017" { fileinto :create "Archives.2017"; }
if date :is "date" "year" "2018" { fileinto :create "Archives.2018"; }
if date :is "date" "year" "2019" { fileinto :create "Archives.2019"; }
if date :is "date" "year" "2020" { fileinto :create "Archives.2020"; }
EOF
}
custom_sonarr () {
open "http://localhost:7878/settings/mediamanagement"
open "http://localhost:8989/settings/mediamanagement"
printf "%s" "$_sonarr" | \
while IFS="$(printf '\t')" read pref value; do
printf "\033[1m\033[34m%s:\033[0m %s\n" "$pref" "$value"
done
}
Preference Value
Advanced Settings Shown
Rename Episodes Yes
Standard Episode Format {Series Title} - s{season:00}e{episode:00} - {Episode Title}
Daily Episode Format {Series Title} - {Air-Date} - {Episode Title}
Anime Episode Format {Series Title} - s{season:00}e{episode:00} - {Episode Title}
Multi-Episode Style Scene
Create empty series folders Yes
Ignore Deleted Episodes Yes
Change File Date UTC Air Date
Set Permissions Yes
Download Clients NZBGet
NZBGet: Name NZBGet
NZBGet: Category Sonarr
Failed: Remove No
Drone Factory Interval 0
Connect: Custom Script
postSonarr: Name postSonarr
postSonarr: On Grab No
postSonarr: On Download Yes
postSonarr: On Upgrade Yes
postSonarr: On Rename No
postSonarr: Path ${HOME}/.config/mp4_automator/postSonarr.py
Start-Up: Open browser on start No
Security: Authentication Basic (Browser popup)
custom_ssh () {
if ! test -d "${HOME}/.ssh"; then
mkdir -m go= "${HOME}/.ssh"
e="$(ask 'New SSH Key: Email Address?' 'OK' '')"
ssh-keygen -t ed25519 -a 100 -C "$e"
cat << EOF > "${HOME}/.ssh/config"
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
EOF
pbcopy < "${HOME}/.ssh/id_ed25519.pub"
open "https://github.com/settings/keys"
fi
}
Customize System Preferences
custom_sysprefs () {
custom_general
custom_desktop "/Library/Desktop Pictures/Solid Colors/Solid Black.png"
custom_screensaver
custom_dock
custom_dockapps
# custom_security
custom_text
custom_dictation
custom_mouse
custom_trackpad
custom_sound
custom_loginitems
custom_siri
custom_clock
custom_a11y
custom_other
}
custom_general () {
osascript -e 'tell application "System Events" to tell appearance preferences to set dark mode to true'
config_defaults "${_general}"
osascript << EOF
<<recent-items.applescript>>
EOF
}
tell application "System Events"
tell appearance preferences
set recent documents limit to 0
set recent applications limit to 0
set recent servers limit to 0
end tell
end tell
Preference Domain Key Type Value Host
Appearance: Graphite For Buttons, Menus, and Windows -globalDomain AppleAquaColorVariant -int 6
Appearance: on Use dark menu bar and Dock -globalDomain AppleInterfaceStyle -string Dark
Appearance: off Automatically hide and show the menu bar -globalDomain _HIHideMenuBar -bool false
Highlight color: #99CC99 Other…-globalDomain AppleHighlightColor -string 0.600000 0.800000 0.600000
Sidebar icon size: Small-globalDomain NSTableViewDefaultSizeMode -int 1
Show scroll bars: Always-globalDomain AppleShowScrollBars -string Always
Click in the scroll bar to: Jump to the next page-globalDomain AppleScrollerPagingBehavior -bool false
on Ask to keep changes when closing documents -globalDomain NSCloseAlwaysConfirmsChanges -bool true
on Close windows when quitting an app -globalDomain NSQuitAlwaysKeepsWindows -bool false
on Allow Handoff between this Mac and your iCloud devices com.apple.coreservices.useractivityd ActivityAdvertisingAllowed -bool true -currentHost
com.apple.coreservices.useractivityd ActivityReceivingAllowed -bool true -currentHost
on Use LCD font smoothing when available -globalDomain AppleFontSmoothing -int 1 -currentHost
Customize Desktop Picture
custom_desktop () {
osascript - "${1}" << EOF 2> /dev/null
<<custom_desktop.applescript>>
EOF
}
custom_desktop.applescript
on run { _this }
tell app "System Events" to set picture of every desktop to POSIX file _this
end run
custom_screensaver () {
if test -e "/Library/Screen Savers/BlankScreen.saver"; then
defaults -currentHost write com.apple.screensaver moduleDict \
'{
moduleName = "BlankScreen";
path = "/Library/Screen Savers/BlankScreen.saver";
type = 0;
}'
fi
config_defaults "${_screensaver}"
}
Preference Domain Key Type Value Host
Start after: Nevercom.apple.screensaver idleTime -int 0 -currentHost
Hot Corners…: Top Left: ⌘ Mission Controlcom.apple.dock wvous-tl-corner -int 2
com.apple.dock wvous-tl-modifier -int 1048576
Hot Corners…: Bottom Left: Put Display to Sleepcom.apple.dock wvous-bl-corner -int 10
com.apple.dock wvous-bl-modifier -int 0
custom_dock () {
config_defaults "${_dock}"
}
Preference Domain Key Type Value Host
Size: 32 pxcom.apple.dock tilesize -int 32
off Magnification: 64 pxcom.apple.dock magnification -bool false
com.apple.dock largesize -int 64
Position on screen: Rightcom.apple.dock orientation -string right
Minimize windows using: Scale effectcom.apple.dock mineffect -string scale
Prefer tabs when opening documents: Always-globalDomain AppleWindowTabbingMode -string always
off Double-click a window’s title bar to None-globalDomain AppleActionOnDoubleClick -string None
on Minimize windows into application icon com.apple.dock minimize-to-application -bool true
off Animate opening applications com.apple.dock launchanim -bool false
on Automatically hide and show the Dock com.apple.dock autohide -bool true
on Show indicators for open applications com.apple.dock show-process-indicators -bool true
custom_dockapps () {
defaults write com.apple.dock "autohide-delay" -float 0
defaults write com.apple.dock "autohide-time-modifier" -float 0.5
defaults delete com.apple.dock "persistent-apps"
printf "%s\n" "${_dockapps}" | \
while IFS="$(printf '\t')" read app; do
if test -e "/Applications/${app}.app"; then
defaults write com.apple.dock "persistent-apps" -array-add \
"<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/Applications/${app}.app/</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>"
fi
done
defaults delete com.apple.dock "persistent-others"
osascript -e 'tell app "Dock" to quit'
}
Dock Items
Metanota Pro
Mail
Safari
Messages
Emacs
BBEdit
Atom
Utilities/Terminal
iTerm
System Preferences
PCalc
Hermes
iTunes
VLC
custom_security () {
config_defaults "${_security}"
}
Preference Domain Key Type Value Host
on Require password 5 seconds after sleep or screen saver begins com.apple.screensaver askForPassword -int 1
com.apple.screensaver askForPasswordDelay -int 5
custom_text () {
config_defaults "${_text}"
}
Preference Domain Key Type Value Host
off Capitalize words automatically -globalDomain NSAutomaticCapitalizationEnabled -bool false
off Add period with double-space -globalDomain NSAutomaticPeriodSubstitutionEnabled -bool false
off Use smart quotes and dashes -globalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
custom_dictation () {
config_defaults "${_dictation}"
}
Preference Domain Key Type Value Host
Dictation: Oncom.apple.speech.recognition.AppleSpeechRecognition.prefs DictationIMMasterDictationEnabled -bool true
custom_mouse () {
config_defaults "${_mouse}"
}
Preference Domain Key Type Value Host
off Scroll direction: Natural -globalDomain com.apple.swipescrolldirection -bool false
custom_trackpad () {
config_defaults "${_trackpad}"
}
Preference Domain Key Type Value Host
on Tap to click com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
-globalDomain com.apple.mouse.tapBehavior -int 1 -currentHost
custom_sound () {
config_defaults "${_sound}"
}
Preference Domain Key Type Value Host
Select an alert sound: Sosumi-globalDomain com.apple.sound.beep.sound -string /System/Library/Sounds/Sosumi.aiff
off Play user interface sound effects -globalDomain com.apple.sound.uiaudio.enabled -int 0
off Play feedback when volume is changed -globalDomain com.apple.sound.beep.feedback -int 0
custom_loginitems () {
printf "%s\n" "${_loginitems}" | \
while IFS="$(printf '\t')" read app; do
if test -e "$app"; then
osascript - "$app" << EOF > /dev/null
on run { _app }
tell app "System Events"
make new login item with properties { hidden: true, path: _app }
end tell
end run
EOF
fi
done
}
Login Items
/Applications/Alfred 3.app
/Applications/autoping.app
/Applications/Caffeine.app
/Applications/Coffitivity.app
/Applications/Dropbox.app
/Applications/HardwareGrowler.app
/Applications/I Love Stars.app
/Applications/IPMenulet.app
/Applications/iTunes.app/Contents/MacOS/iTunesHelper.app
/Applications/Menubar Countdown.app
/Applications/Meteorologist.app
/Applications/Moom.app
/Applications/NZBGet.app
/Applications/Plex Media Server.app
/Applications/Radarr.app
/Applications/Sonarr-Menu.app
/Library/PreferencePanes/SteerMouse.prefPane/Contents/MacOS/SteerMouse Manager.app
custom_siri () {
defaults write com.apple.assistant.backedup "Output Voice" \
'{
Custom = 1;
Footprint = 0;
Gender = 1;
Language = "en-US";
}'
defaults write com.apple.Siri StatusMenuVisible -bool false
}
custom_clock () {
defaults -currentHost write com.apple.systemuiserver dontAutoLoad \
-array-add "/System/Library/CoreServices/Menu Extras/Clock.menu"
defaults write com.apple.menuextra.clock DateFormat \
-string "EEE MMM d h:mm:ss a"
}
custom_a11y () {
config_defaults "${_a11y}"
if test -d "/System/Library/Speech/Voices/Allison.SpeechVoice"; then
config_defaults "${_speech}"
defaults write com.apple.speech.voice.prefs VisibleIdentifiers \
'{
"com.apple.speech.synthesis.voice.allison.premium" = 1;
}'
fi
}
Preference Domain Key Type Value Host
Display: on Reduce transparency com.apple.universalaccess reduceTransparency -bool true
Speech: System Voice: Allison com.apple.speech.voice.prefs SelectedVoiceName -string Allison
com.apple.speech.voice.prefs SelectedVoiceCreator -int 1886745202
com.apple.speech.voice.prefs SelectedVoiceID -int 184555197
custom_other () {
T=$(printf '\t')
printf "%s\n" "$_other_prefs" | \
while IFS="$T" read pane anchor paneid anchorid icon; do
osascript - "$pane" "$anchor" "$paneid" "$anchorid" "$icon" << EOF 2> /dev/null
<<open-syspref.applescript>>
EOF
done
}
on run { _pane, _anchor, _paneid, _anchorid, _icon }
tell app "System Events"
display dialog "Open the " & _anchor & " pane of " & _pane & " preferences." buttons { "Open " & _pane } default button 1 with icon POSIX file _icon
end tell
tell app "System Preferences"
if not running then run
reveal anchor _anchorid of pane id _paneid
activate
end tell
end run
Pane Anchor Pane ID Anchor ID Icon
Security & Privacy General com.apple.preference.security General /System/Library/PreferencePanes/Security.prefPane/Contents/Resources/FileVault.icns
Security & Privacy FileVault com.apple.preference.security FDE /System/Library/PreferencePanes/Security.prefPane/Contents/Resources/FileVault.icns
Security & Privacy Accessibility com.apple.preference.security Privacy_Accessibility /System/Library/PreferencePanes/Security.prefPane/Contents/Resources/FileVault.icns
Displays Display com.apple.preference.displays displaysDisplayTab /System/Library/PreferencePanes/Displays.prefPane/Contents/Resources/Displays.icns
Keyboard Modifer Keys com.apple.preference.keyboard keyboardTab_ModifierKeys /System/Library/PreferencePanes/Keyboard.prefPane/Contents/Resources/Keyboard.icns
Keyboard Text com.apple.preference.keyboard Text /System/Library/PreferencePanes/Keyboard.prefPane/Contents/Resources/Keyboard.icns
Keyboard Shortcuts com.apple.preference.keyboard shortcutsTab /System/Library/PreferencePanes/Keyboard.prefPane/Contents/Resources/Keyboard.icns
Keyboard Dictation com.apple.preference.keyboard Dictation /System/Library/PreferencePanes/Keyboard.prefPane/Contents/Resources/Keyboard.icns
Printers & Scanners Main com.apple.preference.printfax print /System/Library/PreferencePanes/PrintAndScan.prefPane/Contents/Resources/PrintScanPref.icns
Internet Accounts Main com.apple.preferences.internetaccounts InternetAccounts /System/Library/PreferencePanes/iCloudPref.prefPane/Contents/Resources/iCloud.icns
Network Wi-Fi com.apple.preference.network Wi-Fi /System/Library/PreferencePanes/Network.prefPane/Contents/Resources/Network.icns
Users & Groups Login Options com.apple.preferences.users loginOptionsPref /System/Library/PreferencePanes/Accounts.prefPane/Contents/Resources/AccountsPref.icns
Time Machine Main com.apple.prefs.backup main /System/Library/PreferencePanes/TimeMachine.prefPane/Contents/Resources/TimeMachine.icns
custom_terminal () {
config_plist "${_term_plist}" \
"${HOME}/Library/Preferences/com.apple.Terminal.plist" \
":Window Settings:ptb"
config_defaults "${_term_defaults}"
}
Preference Command Entry Type Value
delete
add : dict
add :name string ptb
add :type string Window Settings
add :ProfileCurrentVersion real 2.05
add :BackgroundColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC4xIDAuMSAwLjE=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :BackgroundBlur real 0
add :BackgroundSettingsForInactiveWindows bool false
add :BackgroundAlphaInactive real 1
add :BackgroundBlurInactive real 0
add :Font data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>3</integer></dict><key>NSName</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSSize</key><real>13</real><key>NSfFlags</key><integer>16</integer></dict><string>InconsolataLGC</string><dict><key>$classes</key><array><string>NSFont</string><string>NSObject</string></array><key>$classname</key><string>NSFont</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :FontWidthSpacing real 1
add :FontHeightSpacing real 1
add :FontAntialias bool true
add :UseBoldFonts bool true
add :BlinkText bool false
add :DisableANSIColor bool false
add :UseBrightBold bool false
add :TextColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC44IDAuOCAwLjg=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :TextBoldColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC44IDAuOCAwLjg=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :SelectionColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC4zIDAuMyAwLjM=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBlackColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC4zIDAuMyAwLjM=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIRedColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC45NSAwLjUgMC41</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIGreenColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC42IDAuOCAwLjY=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIYellowColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MSAwLjggMC40</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBlueColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC40IDAuNiAwLjg=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIMagentaColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC44IDAuNiAwLjg=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSICyanColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC40IDAuOCAwLjg=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIWhiteColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC44IDAuOCAwLjg=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightBlackColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC41IDAuNSAwLjU=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightRedColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MSAwLjcgMC43</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightGreenColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC44IDEgMC44</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightYellowColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MSAxIDAuNg==</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightBlueColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC42IDAuOCAx</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightMagentaColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MSAwLjggMQ==</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightCyanColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC42IDEgMQ==</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ANSIBrightWhiteColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC45IDAuOSAwLjk=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :CursorType integer 0
add :CursorBlink bool false
add :CursorColor data <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0”><dict><key>$archiver</key><string>NSKeyedArchiver</string><key>$objects</key><array><string>$null</string><dict><key>$class</key><dict><key>CF$UID</key><integer>2</integer></dict><key>NSColorSpace</key><integer>1</integer><key>NSRGB</key><data>MC43IDAuNyAwLjc=</data></dict><dict><key>$classes</key><array><string>NSColor</string><string>NSObject</string></array><key>$classname</key><string>NSColor</string></dict></array><key>$top</key><dict><key>root</key><dict><key>CF$UID</key><integer>1</integer></dict></dict><key>$version</key><integer>100000</integer></dict></plist>
add :ShowRepresentedURLInTitle bool true
add :ShowRepresentedURLPathInTitle bool true
add :ShowActiveProcessInTitle bool true
add :ShowActiveProcessArgumentsInTitle bool false
add :ShowShellCommandInTitle bool false
add :ShowWindowSettingsNameInTitle bool false
add :ShowTTYNameInTitle bool false
add :ShowDimensionsInTitle bool false
add :ShowCommandKeyInTitle bool false
add :columnCount integer 121
add :rowCount integer 35
add :ShouldLimitScrollback integer 0
add :ScrollbackLines integer 0
add :ShouldRestoreContent bool false
add :ShowRepresentedURLInTabTitle bool false
add :ShowRepresentedURLPathInTabTitle bool false
add :ShowActiveProcessInTabTitle bool true
add :ShowActiveProcessArgumentsInTabTitle bool false
add :ShowTTYNameInTabTitle bool false
add :ShowComponentsWhenTabHasCustomTitle bool true
add :ShowActivityIndicatorInTab bool true
add :shellExitAction integer 1
add :warnOnShellCloseAction integer 1
add :useOptionAsMetaKey bool false
add :ScrollAlternateScreen bool true
add :TerminalType string xterm-256color
add :deleteSendsBackspace bool false
add :EscapeNonASCIICharacters bool true
add :ConvertNewlinesOnPaste bool true
add :StrictVTKeypad bool true
add :scrollOnInput bool true
add :Bell bool false
add :VisualBell bool false
add :VisualBellOnlyWhenMuted bool false
add :BellBadge bool false
add :BellBounce bool false
add :BellBounceCritical bool false
add :CharacterEncoding integer 4
add :SetLanguageEnvironmentVariables bool true
add :EastAsianAmbiguousWide bool false
Preference Domain Key Type Value Host
com.apple.Terminal Startup Window Settings -string ptb
com.apple.Terminal Default Window Settings -string ptb
custom_vim () {
true
}
custom_vlc () {
config_defaults "${_vlc_defaults}"
if which crudini > /dev/null; then
test -d "${HOME}/Library/Preferences/org.videolan.vlc" || \
mkdir -p "${HOME}/Library/Preferences/org.videolan.vlc"
printf "%s\n" "${_vlcrc}" | \
while IFS="$(printf '\t')" read section key value; do
crudini --set "${HOME}/Library/Preferences/org.videolan.vlc/vlcrc" "${section}" "${key}" "${value}"
done
fi
}
Preference Domain Key Type Value Host
on Automatically check for updatesorg.videolan.vlc SUEnableAutomaticChecks -bool true
org.videolan.vlc SUHasLaunchedBefore -bool true
org.videolan.vlc SUSendProfileInfo -bool true
Preference Section Key Value
Interface: on Use the native fullscreen mode macosx macosx-nativefullscreenmode 1
Interface: off Resize interface to the native video size macosx macosx-video-autoresize 0
Interface: off Control playback with the Apple Remote macosx macosx-appleremote 0
Interface: on Pause the video playback when minimized macosx macosx-pause-minimized 1
Interface: Continue playback Alwaysmacosx macosx-continue-playback 1
Interface: on Allow metadata network access core metadata-network-access 1
Audio: Always reset audio start level to: 100%core volume-save 0
Audio: on Use S/PDIF when available core spdif 1
Subtitles / OSD: Preferred subtitle language Englishcore sub-language English
Interface: Hotkeys settings: Medium jump length* 30core medium-jump-size 30
Subtitles / OSD: Default Encoding Universal (UTF-8)subsdec subsdec-encoding UTF-8
Input / Codecs: Hardware Acceleration Video Decode Accelerationavcodec avcodec-hw vda
Define Function personalize
personalize () {
printf "%b" "$(echo "${1}" | openssl enc -aes-256-ecb -a -d -pass "pass:${CRYPTPASS}")" | sh
}
Define Function personalize_all
personalize_all () {
personalize_ccc4
personalize_sketchuppro8
personalize_istatmenus5
personalize_littlesnitch4
personalize_meteorologist3
personalize_moom
personalize_nzbget
personalize_nzbvortex
personalize_pacifist
personalize_pcalc3
personalize_scrivener
personalize_sizeup
personalize_steermouse5
personalize_tower2
personalize_transmit4
personalize_tune4mac
personalize_vmwarefusion8pro
personalize_logout
}
Personalize Carbon Copy Cloner 4
personalize_ccc4 () {
personalize "${_ccc4_crypt}"
}
U2FsdGVkX1/MLZ+EavKN4ODNZY1H0LENk6AnfNBq/JmkRR4f3uSZHoo0c7mZbLdU
0V5ygQMCllFVHW0WgAQYyMMeihp6PQ+qjTNZvs05bBCm3ovV2ZJOaR5viJOMQj/v
aiYazKPPLhR8kNSxWloOS/3xqvENuwCPSjVj9mZxp4U6pSA0swevHhhopr01sube
7ay3OykHFZGXAdkkPd64DthTSLTPnF5Yf0GIvLWlJwVJTZxDkb+4tiMRouE1gRPA
51Qah/fTE4sFHuvmoCrrAnRBfEuYH5DaWc2FWLWM2srqjd0+TA6N3xIipm0D7jjw
urcxNanFv0oSBSJpwhYM4YAFGHvSHcbPk/orvtB1URN5+KmYPPjk8Ad2fF10PGBm
+TlnRloE3sITbYmIzi3MKSdqerw5wf2x69ioNgF/c4xUHZtrVioSIcR2oIwVua8N
05OzDNG0XjI9bDo+bsevflV7cSg2YMhJElTlqQa7fUfQLUnP7+QJEeX1Azq2LdF6
HpEgFgV9Ruv9XHwHJ2lrJG+/qpYhbv+X2wTmmgnqtQY=
Personalize Sketchup Pro 8
personalize_sketchuppro8 () {
personalize "${_sketchuppro8_crypt}"
}
U2FsdGVkX1/CiRi4IbSmF9DMnkgd74TA3yNaILrAIAJ6EkdS9a8eLeWLEGVItc9j
NWk8T5bIUkT3XCUFeBAFU4hX10smsLoT17MZD/vDevm+Nu1Efo4stPLOzg90pNEb
B0dn2LLBJV8dhDpBHvoBJYl6hXbu7khPZpfVwOTWUGPrdYULEbutjkbYF9R7j+KO
cTkFyHqpPMxDGGOEhoFUptifSo++KbX0oZWWK5S+XK4=
Personalize iStat Menus 5
personalize_istatmenus5 () {
personalize "${_istatmenus5_crypt}"
}
U2FsdGVkX1+tdI0uAzK7kUWZN9APcwvzte3Q4E1Gr+lOlBTkn55cbHepHjYo0f+W
FC+v9NBp13EI+owprzVN8qU+Xs9pX69WKgLQuKa45d8ASrX6Pwz9HrYLVfauuh4r
d8Zd5K8KEsDDZJSmbPq9Xg==
Personalize Little Snitch 4
personalize_littlesnitch4 () {
personalize "${_littlesnitch4_crypt}"
}
U2FsdGVkX18thR0gOmvkpKnSlLhcoHYWP4KcJZodKQIv+Epgi/zbNfW25qNYaxGq
o0/1HUxF+mTw7bsuAJxKM+u1iwLti/BRcicReoLvqSziH/LMvIt3pAEs5UfnHGpy
Bd/lcdnAVm7Sq+r1T5CsNzPR5z0Wuziju0ie14PmT/V/PpJ47B/k8ScT/b7mfwzv
82RqOFdZJjdJ5sK50aiNt9K5h7up6uVwK7cdut44Xf4TDx/UTR46xsUew8jG4I5F
EAWUUBvoI2N9lSywCXdmes5qm2LQ3gxZlCrJgY3/oXe6fUi5BLdVK8iGL6NVq+PY
lDx4SOVP+hZ5kjOpVLe91zhw6nVy1yon6P447IJT0VxP9RaJW2F3VkckRU4xFfao
ShL49pYYhS4yCzxO/sSSHFR+hzaxCMyYGaddDFwN7u5sp4TOiTj+S6HiF6H9c+Uo
b4p9g/CwMsplzedpm9X/Y/hIQ0Uda42r91T75H0f4kWjGd2/LEBUjSVXzPBzYZ9a
o9SduxX3XE+506zBBpE5CGb20ndVEFXgJfq8CVnl7uEF87b+L9AxusLeZHycp83M
G9QbnGiv12M1P8dm6Az0YpOBiF7Xpn0AlQpg+3k9pNQZy7WRlb4symFW2ugUNgLV
BNkWD7W8D1PiLYoo0ZyDDI/FPNGb1uRwCZ4BfvtbjiMH28XAvxxZwMAySApfP4QV
y5UyS6L3olWNpUOFZE/Bgdd3tduCR5xllGAZcugUaN10aXh0EUiubn06i7uf9uQ1
Personalize Meteorologist 3
personalize_meteorologist3 () {
personalize "${_meteorologist3_crypt}"
}
U2FsdGVkX19gjPI4DdUhV25638tJvTh2zGck1vrs/MrQJI1ghBVzZu4YK5I3U4fR
96YI2iy5YqVws5f9fPWKYPsEy7Y58Ppl10sHLo/QLmYbWWCPR7HU5sHITnAbtnid
wjgJtltscMlbSyn1ekyUz2yFM18I2bdKHklHo68UZet/1f8LnyJSBUhaL9l7sYVK
lw1J7xu9A2djc0s7tQYcondLL/sa1OWKXk4kI9IlzD09vTjmmx9U7g+arUV4Z9cB
uDkvQFd2W92+G5Da7NdgJJTrgV9hYH+uWznGG/rnTeIpPjyBMEZbIDtOtiq5j1m4
+K2JieiExcX8CUSKPxBQbH/clmRT8dgr+C9BSDi7iJ2yTIvOU6wRGHvNUN9WrlD4
L/0eW8p6B2E74SkvHjmmD7o0UcrWgS1DO0C4dcM8p3FcvZ7Tj1QPwX6i1roTqAQ5
SbeZNE8UsDnaAfFeVtZNElaH3g5XpdONa7x3Q/L56rpANFW9x96HRCAe6zvl6sAj
personalize_moom () {
personalize "${_moom_crypt}"
}
U2FsdGVkX18lU+JpUd5n3lZTfIBCHIyenbkWqcLZDtlQ0xNnzuOnHWEuVzMZTEMO
n32zp+nIgCBYCQU8cj1CT/jOKfuQ0bYEqMXls05yi5SfsLuHciUfgOZtaZdIo0HI
xi2ozsQaCX9tbxo9l2+l3AS5yE83TYvtWvg2QlTAkkOdPNnnHY7odDNCNICx+aZK
u5N9CGeB/Dg9yDtEUUZInmUG6wJ/lgPizNTRVVEfntKrjNGIy23nOHk5wdvuOYZP
ENnGfaoT3eBC0k1/0Rb4SBATDjP4EJyR1kiBRaV0Km+uNz5tH91e2Ows6gAWJc+e
InOgKTDVAweXmBLxAy5kRTeJAcIkjkAuluu41suzvlAE6e8SSqZXIoptYhNIoLIb
TyXgx5Ad16KSxla9HrdMWwCoxKnOwzuZbfmTasOy6g7tP18FdTiawfbwf20ZLdKc
67ksIOfctKHToHee9g8R+4CtwS0bztEfgszzUhV5Q8BGsP+fYjCI64v3VlLKlPRh
/7DxoZ5T6Vf9vMM9B3TbEcupmH98Cq+PgZa8TLtjScFTw5rlGTyNC8AAFiJzfipA
nDZMcWeyhtep1BhL/LcBcPZja/uwtbNYIMxDwgmQzeyzBqBqzE1AX4St+oM4AQmC
bB7xmEZekWw8LhO4vGGxEkoaT+FXt7GZI6hvKjd2biMCs0LqW8OWWgArWsR7BjrP
/otPGFZi6RK655O069cEaeVaizxZJ/9kw8QvvRYElh1OzfiQQSfozRwnVghHuk9X
u9n8b6MnrRYOojufn9YHltb1UZ6WPEMSk0657TcNZkX5AeWLT6/LF9++/qw37nWr
Z0+xTMP4+BUrXRG2qVOy9gtRkWVr/m9Ap/xvs2IymM+sGPK8msCm+Sx2bL/QpMf9
UunICoL9GHCz5iu47bLTVZPYkG8SAnsDzauHMxWxJcJOVrMNfJwLinc3GmWi7OXo
8r/zcFc0vFA6bSym+3+qCgGrWZ3D84Wf4JO15/qej1o3UqvrHZN1XCgGdNoe7QQu
fuf003HH98R/KYbM7tnWCKTyr/rqbwNG3EzyM9qWABPsUKhhD4xNDSrAETg0gCcU
17ZV74vWmXpBD6GEAvXtW0WxTFm4mX+SwoqA1YEkDDkAxhMIsG00T3X3OcdG8U8/
NgeKG2PJcPK5ZzdCS1jKWQKh4+oS+UOjdJjH9CvpGnM6Ol/7GtnvjReRBn91qjBs
fpVhnmdK3+2+lQsiChCfVH8ZV7scGZqmHrT/Z5B80hxFoHXCBzc4aXqhRP3+8Kwc
8Vdm8BexgPjn/f1h6mZt7V3J5+kaQFItwJgd8f6VYwU40/HVQWgggkBVfb6DFTq2
u+XZ5aZkoM65B4s1HK0bO+Kr8pDxcvcf+O1a53043qPGoAP8l4M2xRHhkKbc2T6Z
r1dm7UQuLktwMAY2m4B1bg==
personalize_nzbget () {
personalize "${_nzbget_crypt}"
}
U2FsdGVkX18JS7hBuu5P5eeTADOpOz+HabaX/DtndESoj1HX1YElFbxrsrovH9IE
+m5jXFF9KgPHIt2ZjUw3H5KmHkix0GeO+ElBFwaGps8pGV6eh3ZqylUGVXc3+7Zt
K0DA2PwxAmyiboiUT2MKwjwYk4lt25+aOUxr6/BV1lo7FwQ9PaPkrVKtZYUClDzH
6xLEp9vgAnQlHyTLtSF5XalbdtutBEInej20mGojHFniB4UW14FnH01KzBpCowGv
zAA0d8nft1Ubx9wI6XrcBpYpUOX8teJj3hmS06ciiWE7RW/UB2YLXcvEx/hzS2Ye
B+tQ5uapM8Ja/ISCcnyAKtNh1WcuKi50PtRo3mXKkxwjJP2pUMWOWe+bhHOX94Z4
yff6KjQTms6BkT0RSpBKzsB98Q/R3G/CNN8Z15u9bP1Owm/9RdkbqoEO2lEang3j
vbJwttB2gmXOB68hh0plxoIEhXb32uJu+ULwFa3ho/5I1X93DgPQC4ab/K19vVhE
28aQCYUkDWkFW1Z0VBIKqRKP6cMDzEPpGnz0sxMhU8Ps6KR4Fmt+CGJEOxTvsRb/
D3Y7UeTTvsFxzmlsiPi/24w8pGAx4oXVPL7Q3DLvomdjBmE9EiJrYzCPOjjO/n4H
9YcqjnObUiN9fphZzjiw4knbpzXXvz41eXTPwSSUoBT3Gv+BjpzA2Lx8Q9l5u0aA
Txm8dbTsddyGaaWPzJ/c6PAsuI9UqV1h01A4nmRVmk1Q0RPcAXON6IvM5gygtKcN
mbfgOf+S1sLNTGXmOxlVV08edHAk1zP3aE/jNTYi2JBeopUC2+9i+3910MEjkbhx
7X0eytMoxHZCaEiLmORTPptouMhflRjbTHoxJJcLEee9p1xOgzxIfI4PzX1d4Jcs
gAVpUhQJhfEvCZReHjMQloVDc9Or2kQ5uRIGg7ZD1MRZWsh6BhB/afSEBRibS/HU
WQrmAWyFeIClaHIAK/Clbfqe40dV/RI592ROJ3Ng3wP7wpXgQAPotCskHFb2dMTm
sNwM1eY1ZgZqtzbCTL4GRUrd2VpoZq417W0HKnr75wctEudn/AOEIp+2l0gOJRKv
HBkzUYrfkbgTVcYDcFh8Yr9CurOA6aWQXVHiNvQmr46jQNqvE/dqQZoAbFrngtJH
4H/SgjvuDiocJitIqVUhNBdX5AtasEhByfzCxalZHGIBxEKdqXMugTaLTcj/nB2C
TfdZnoTMryqJxLlF/pAEZA==
personalize_nzbvortex () {
personalize "${_nzbvortex_crypt}"
}
U2FsdGVkX1+307HjJGIf7rdVkS4iA3amckwax3cNni3YYdUjVoOa8Dzldh2o4zVc
Xv7Wt0rUR434pPu+IeYH+vLqSU4KDibBPT2TZNyv3bcLKNot91E1TWmdEPrxiIPx
ZTw6G9ZJlAUdZPK1PL8SN/32wcuQfRyX6d1NHiQ/rsleIedUvcb1Q2L1MJldD9ZU
vfIE2TZVQA73h2DQsY/HeZXsGudOVhF1A8S5pFP6goocJ8lgmBF0rS0Z2HZ3h8Po
eBMXudhMltv6kApIB2bj39GsECL5fbZUilX83o7tjn89x/eMra4EXwPv7aAlz9dg
qr58SoELeC0BySdYr69KiPD13l3KsHRtQv6FBUKPt7iqlw2Ck9JDtpArSKbPXSfE
efEfu9JIqd3C0A7nNyzapJhjNx5SQLDsu3HbtXvRvztE4BIj2yjLUywWH7BynEEx
74tVEmEKmHcXVpOm11qxtKznkRole4RF97V3FT36juAYQ++2xambRxsd8APDKnQx
x4+uaXLi4A3X2hkxweE4Aw==
personalize_pacifist () {
personalize "${_pacifist_crypt}"
}
U2FsdGVkX1/wjLIEMp8Q0VgD8rDKDOmWVnoNS0wYicHRoTehfFThWcVNiJT8SvwI
0X0pkFgRDq5Le+idSjwfKFIMzmgmKLBZNiMMVbJ6WuWAMaYwl70M5LRfAe4vCvUB
4/vRSrH3+OB9k187XLViAgDadJY95T1bZZ/OGuRTiMR6shAe31XMv0DrI4ksNc/2
clLLzhlnaekyFeCKUYaoywH+BMl0r3nGysFsT9UTxujXmw5RjhsRWJXS7YodvCT6
DVXa9I2B7Q6XV/1KzVZNRg83A6u3oXBqHHKVHi/VWnrRfJf6O095F6EeIr54gzu1
EvJ9+a9qvovJZam37q2QrBvpiugbNZcBb0AAVvdscjIVhrdkIpVbdyHiKCO+rugS
svGkCw28FBdOKIkXgEjudzmj/uXnWQ/9Ru1YFZw0Pv7iFjrubt4Ujgux5CUf5kfr
xdE02nx6TYRBPH6H6fK5IloX1yMDW48CVR/hVLARoSu7rlJTVqd8U27Sx/HhJ625
lcV5Y2kBd7DLKqs3nRIkta90gOxFYCD1G0JYw6dAUSTF7xME9aY5UE8p3ODdmD/8
personalize_pcalc3 () {
personalize "${_pcalc3_crypt}"
}
U2FsdGVkX1+j54XVyGcpSm/+sDyrrLvt1XqzSIlDSwvLwh8geuJzNPVKOfRHWZK1
bRHEQIavsXUXmCR92vV+JtlV5Un2g29R5hvC0GDieCGghzt41Y5BypUEHP8dzWIB
QqNrlqPQ+Wx61AQPVhiIu0y4rocctHx36vArgfuiVlvfYE29APOIJa+0nk3rJ5dB
HsSxwDsaAQAl+psbtzfvixxtCaRa0RrgzGr0Nx1RVZNDgEbTM/mWNQH3TlFE6Vo3
jsZIzuUYJwb526KMk8ADC2aKNqh4fufTuWI7nCG+8RXI+t331Ge4KLXjOKsPNdwi
UQ58r8HS7O2WqOe8Bmqw+/pBlhjLMEsqzsxSmi+KtYzHH5T5s0hOx2DK9fX65pbv
z1t6035CgWuu+U5FezyjaBQX5XZisv51R0pmLh0akNyYKssRn8KQgeaRDmOztHwz
Zqfi5MjUUYNPAyYFfY3EUHjzLfnwXKbQz5LNh3LpGq36nsm/NlkgAS4uOsQQuBA7
vj729zsRh36+psJUhA63+JiQbx5uMVjVq3pXXU0c/I/uWYwDwRNtzPUvfQIUJfZv
Jjy9pxDOY+ybPdkmkcY+cUbPIExYCkRZkWbeqKCGIijXsJKXA6d5E/snYPa5/ckC
zWz2E4RXmOjb3FpL3SL3TTdcpCulVRY47e9kP+P0GHADHOe3YoGEJAdwa0IWzKgC
Zoo2qHh+59O5YjucIb7xFcHZkXvuVzJ5J1iLL/91GsS8oPCp6fci66knv2bpJyAe
aPk31wCBIlOcIC8Y1JSyLUwZWL6CSu2OUOoqjNB2FgK50Xp/4Y0MkypLBCrq3upa
K/jINp0AvPdrQB927lgB6BXkcKfGsRiPySepZ8pYwy1UeN1j58yemjcAtOoKiAYH
tVjRjCyW3FspyFr0RDcxiZD+mJSG/5dxujUqpW7oGsfBtDCF1krfccVYDu3KJ1GF
CVflh0fAO5em/3RnEyaarbscbV29bjl3cbnUejC2Y1Ofh5WrIrk8dlDNllsJNAdN
Zuu6zS4sKFuooMDdzPaVf+YoYgZaOjMhIMTNt5ExsihZOMAr4W4KfGzx02fJHxmC
w462hd1SC+7pjJFTjMjEWnBjUfxi6OiZFPnpgYi9H9iijFKSBu1Z4QNJj3y6V1sK
xyWmE3/p5Aov6qPy+e7SUe84TF4oVyPQVugtdUxmeVI=
personalize_scrivener () {
personalize "${_scrivener_crypt}"
}
U2FsdGVkX1/tPt4XjHPDEtcu53cxgt0Q7GDNbNvu1VhXB+/ly+13tuMU9fA1QGm7
7YBXZ89yhLY15/FzumwHY22T7cU6+y4ULRh5O4weZEX/EyOswJiMYd/MD+mNS+Cf
dk5X6P/Y6OGPbFjL9GjfKcJi96UeZCxjf9Og39k3pqBLjTZ0iSaAUhKsTxVY9QAD
UPrUmHuzPVrrkVQ5gArcWg==
personalize_sizeup () {
personalize "${_sizeup_crypt}"
test -d "/Applications/SizeUp.app" && \
open "/Applications/SizeUp.app"
}
U2FsdGVkX1/5orle7q9WUYhaIgZFfM6G+vKsevlp7WxvCSoL/7VGdaXNfGr8yzjy
tVfmgCAgnLH1kSGY9Xl90/iTaFJOfITzmRpmirqBzUIQVBojWyANkX9JghEnQaZ/
RWP/uZJ/ftxcc+dH1c/crUayobF/vhqHKuEno5IA9WAa9hdjRYvym59+Sbm2dA+3
+Dd8c2SawJ5MwxUWWxUn9lIg4tRtNdoh75ls7JQfvSIalINDidTxd+f43mRmOlzU
6Dzr2tRLuY6jeLE8JJCsqS1tUI1ADuI7kvrTioAg6pdFYaAqLt3SUjDw0VRZlaE4
4GtZ+jPZFxoQe9tKpjwcEKXWxQ1aaIZwYDpsPHhdG6BPWHyyuJiAWYhuVUbQA7Zy
IcRdQklOJ/25rzzYVCze6qZP/3oKg4CRcZ1nTurb0QG3hC5VKuYOB5UEBlejI0lp
iweSpFdwopuXne13bKLfhJGDHz9u1/0f+WW0hVr6SFImbb1jN31GjRpv0yoZH+ia
i5cr32WPHj+qYCkA2lWu0rCNUOb1SoG/CvPtqgM+0EzPIU3kokdZP8hLTVIAfo7i
UCN1fiNMEYE5hVYf4pPe83EK2QDW1BcVApFn0XI2X9YlEecJTnPKLhD6TR+tUWa9
Qjcni9YYoiVniehkRRJcaIy0iii7h295iUcMApduC9PoN4mwtuNOmzT5L32f+ak2
esIgdF8T4KMQcPrbbu2/+8FLWwLlnlVSe7meaBsxEJW5W7xC6A4kEpownQOMRjJm
Zn2y+i49ZwTA2oClXFX3JpIg0P8qvdGM7Fn5OX/0ZqsIe1GsAg2Lbw9/obq2pj0L
peb+6JRTXI7gRgygNCIMbihBvEj+ndp+Nu8XUNQGjgm4lknqkulP/xtoi0k45FT0
1duVXZSOm5heXzTFn0z7FnKNmGCZEXVUDC0gbTPLKeCaKFHsxNTfQ/sY4h/THqRO
h5mziRVzPwrOkzl6lzKESTQbvSDwmc2wl5BgMMlwrQGe5F9xrs2sUkhLdpfGG2QL
uPhw1AQdRrqH4yU7SAXSpvZFCw3yl7LqEPIDwIn8VuIHfStHYo0ZR1nrMAJkD7Ys
+G/E8593amGUWCrAtJWCXlXvlDCcmhMKYPoQHYWQH3JEtkof1J4FFBZ5e85jiLhw
KmZj/JA9hvCghBffMEFZUfg2SdrgkPo4XW51qvDyIvCiOVOBgWQ7yRYCSW2LoRyF
mihR7MTU30P7GOIf0x6kThAN5yXdWQRNrS/JxjUBk4NqWzfi3svXmZOIVZUbjo7O
Sq89IECDpn/5kYeYmMGwEG1j4L5U9PcEHjelZfnQEIIcZZbcONQXXVHk8w1zd/fF
wilkne44R/twnneP4QOmU8MTrX7zo10nZo1Sbxigh0tz4I1HoLAKPYAyIIH+NBqw
6FrT8NAo+FQJf87MIYcnftIuX7s/8+9N7mNrVzMeWfWs66L+uNy5yVmYxr1sA2/B
6T+GRoKusYmjLe7ZeRVY5M1L7W6/HqWOJmW0ojRFz1yDtaymlqExuGirq2F88UM8
6hnJYMJkeYOj0Yn77JT1MIRx2vVuk6JxwmlxGPQwU58os63JNXbRYlc0jJTLu6yo
yUFjmw1tO7/oKMbqHoxKCKz4gcm3fWx9PF9ewNgTorbVoAE1vpz8B2EKcJtAkjwk
n+XJeNEkZsfZi66sDCzAs7TMQsBq67QLhyBqguhK5vQ=
personalize_steermouse5 () {
personalize "${_steermouse5_crypt}"
test -d "/Library/PreferencePanes/SteerMouse.prefPane/Contents/MacOS/SteerMouse Manager.app" && \
osascript -e 'tell app "System Preferences" to reveal pane id "jp.plentycom.prefpane.SteerMouse"' > /dev/null && \
osascript -e 'tell app "System Preferences" to activate'
}
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
personalize_tower2 () {
personalize "${_tower2_crypt}"
}
U2FsdGVkX18oq4VX1emauD73227dbXXMGSeLQUmIsPFyU6+6Q8KFCqbqR7GNsucJ
LXv/OdspHtCJXtDlaWtqZd1NHs+ggn25OjlYUtdMUWKVRPgGlOTyHJdatXs5gB5W
eAhPiTi2426B/2/EG6oP4yCppBzg2Futx67NPJ+IQjV2FXCA6trV/yFUu8OD4L0G
naiVi0l2pCF5Wi1TKNOy/lm9s2+NlCHzRVn7UidI3npHbo2qNPDZaZS/OQ5pW45p
san6ZcVOSQnvpe89Zn7ytuc1ya5ndVppyY8ZNC/CeSrXWvGlXgdv3xOaLAIcl0l7
n5DBDW2eKhwcQAc8V5cK1MUHVJpjjChibB5u/XzewMJ5fqB/Foezbppk0C/qB+NG
Bky5PkBIMGTZxgmSUm015Q0PaaLzypung1wOeUoW3uooW0JXRjHQ+PMz5a7fSwEF
VJnHS5obu6EpOLALMKeHVNr0pebUrZniblnM/ZYpew4CBLS+Ff90ynwAFXqqMQEd
SWavfH0nOn6GJGSPaBC7BtsnPP6f8HGzn/zEg2nV4Tdi+2FyKPJGzVpJX/45BGCH
tqhtNRuuUjBNtgcKq+lKiM0kdKYqIq5178cAQAjSV2CV7MsxpSk3UVgdV0C/lJlc
dp+IGLgewlA26cZ7mAhmF5rGqnEXwK60GJV/wxiixrzMP2yixNNpejgXku0b+rx5
MrIdxFffsNZEEs7Zc9akn1MZpipRSQrwaT89BJ16/plkKiXZPaO4BsLXMqLL3Xui
AgBH9f/Hw3eskinf78r/nkx7l/Gs/zrJS2gb2huAOj37DJBakIyfsmyEfNfyHW5P
2nUMynRGLl4vLl3EBYp9X+nbLDqcLz1qllabMqFYwQ75UWlmiAq3PePKdiY9JnzS
3dfX/PCWw1maMxGFmnxjXqNEMwaP9dHypuQKO45WpvZ1lTs0DWysvuMf7TsHmR7B
N6dmrGKVzxdmVpIndQSsgwcjAoAq1S2shtoKxmd1ew3+yp+SiEui9hvb+VmsAH8w
l4hZRrJOak5+20xeumVQbk7nwz7xdl9K76/jy9RKBXA/3DB2K4iLhkng/vJzAKGz
4w7w9F9bLiZI2j4CSR4Mg9Qs4N2nq3Tr2iON14VXsUtUBmBsDhqCcDneRendQApE
Q835k9ZGbhHn4jjc3YXjRK0ZQlJOzpr1Cin1q+R63DZYtonqVLXa3JiquxjH0z1e
90ZFuIABUyCNkpkb7RSwW0aj3gUvX2uKJ1Jm9PRHFzA0Bb/8bDbqN6U/CabExJXk
fsMvQhP2ZFamNHARTssD1yL+AQoUjIDFp2FAfID2NwKUazQAMIYDS/zRt7lHVWjn
/0N3R2fegJAjaUaFvGBPc++meoCmOOv2A9cOTa1B+omVJiTuLQNFbWzegeZ6of2B
dILRTte1UYE1Z/JIDCH0EnoUyH8YvU9fcC+XpvnCrSwWQTUJNylLUF2gDjXIgIti
11rxpV4Hb98TmiwCHJdJeww6ab0qawmU1ScPGH642X7Pwku805gZPuUeVuCunlj7
ZZXp9pjCcuK9jMxRBlgXVVVjomYzeF6Qu8Ld+GMGZks=
personalize_transmit4 () {
personalize "${_transmit4_crypt}"
}
U2FsdGVkX1/A63DIwdmh9ZT09vTHrkKyLuzKUoAwLXVzz8W9KGmBUqIUCw0qBEU7
ybcj/Pce96IEQX/T+7dcDuMhZ9+XLFmkgjDWbygTSDyqK1JOf5VSfRbHpFv3IIDT
UJzgFiz9bchSACQ39qVigQ==
personalize_tune4mac () {
personalize "${_tune4mac_crypt}"
}
U2FsdGVkX19wxlroNoTkSCFqKoMF+/uM244ExTuMuKN3RtARpy6mL0fDIcsJOA9+
UeireHnKQP//WhCYdvUSEeXI51tiqfO05OiasiD0SkqQEY8okh9s5CJ2a8hErUEJ
rhvPgmlrPMvJkm+w1zabOM/DCUBgpfocCTbaZSmkMAVhWXwGHso1gKuLyxBhswQF
Mpx+flYNykcvPqr/6/eiB12OgwY2K/GKQJqGslRiO64jrD/mgYx/7tDM6mLwKIxm
w4DqWY0f63qEwbxb9Ott5CA3RpR5ocV/WHGvKdji6us=
Personalize VMware Fusion 8 Pro
personalize_vmwarefusion8pro () {
personalize "${_vmwarefusion8pro_crypt}"
}
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
personalize_logout () {
/usr/bin/read -n 1 -p "Press any key to continue.
" -s
if run "Log Out Then Log Back In?" "Cancel" "Log Out"; then
osascript -e 'tell app "loginwindow" to «event aevtrlgo»'
fi
}