如何優雅地在 Mac 上使用 dotfiles?

註:這篇文章的原始碼放在 GitHub,會以上面的更新為主。
如果不清楚什麼是 dotfiles 的話,可以參閱善用 dotfiles 個人化自己的工作環境:
dotfiles,顧名思義,就是檔案名稱以 . (dot) 為 prefix 的檔案通稱,若是您的作業系統是 Mac OS X 或是 Linux 這類 *nix-based 的作業系統,一般來說在視窗環境中是看不到這些檔案的,因為對系統來說,他們是所謂的隱藏檔,這些檔案有一些共通點,那就是他們通常用來儲存一些個人化的設定或是自定的拓展功能,以符合使用者本身的使用需求與習慣,有了這些設定好的檔案之後,使用者可以讓整個系統用起來更為順手,並且大幅提昇他們自身的工作效率!因此對某些使用者來說,這些 dotfiles 設定檔對他們來說,反而可能是他們機器上最重要的檔案呢!
這份 dotfiles 是 fork 自 Holman's dotfiles,並根據個人的需求修改過,如果有興趣,閱讀完這份文件之後,歡迎 fork 一份回去配置成適合自己的 dotfiles。
更多的 dotfiles 請參考 GitHub does dotfiles

Quick Start

Erase and reinstall OS X

如果你打算從乾淨的 Mac 環境開始,請參閱 OS X:如何清除並安裝

Install Xcode

  1. 更新 App Store。
  2. 安裝 Xcode
  3. 開啟 Terminal,安裝 Xcode Command Line Tools:
xcode-select --install

Install dotfiles

下載或使用 git clone 一份到 $HOME 目錄底下的 .dotfiles 資料夾裡面:
git clone https://github.com/amowu/dotfiles.git ~/.dotfiles
進入 .dotfiles 資料夾:
cd ~/.dotfiles
安裝 dotfiles:
script/bootstrap
bootstrap.sh 這個程式會自動完成以下工作:
  1. 檢查並安裝 Homebrew
  2. 檢查並安裝 Oh My Zsh
  3. 檢查並連結 dotfiles(.zshrc.vimrc.gitconfig,.gitignore, ...)。
  4. 更新並安裝 brew packages(binaries, fonts, apps)。
  5. 設置 Mac OS X 的 defaults settings。
完成之後,手動安裝一些 App Store 上才有的軟體(Dash, Moom, ...)。

Restore backup

使用 Mackup 進行備份回復:
mackup restore
什麼是 Mackup? 底下會介紹。

How To Use

dotfiles

執行 ~/.dotfiles/script/bootstrap 的時候,腳本會將目錄底下所有的 *.symlink 檔案透過 ln 命令建立連結至$HOME 目錄底下:
topic*.symlink.dotfiles
gitgitconfig.symlink~/.gitconfig
gitignore.symlink~/.gitignore
mackupmackup.cfg.symlink~/.mackup.cfg
vimvimrc.symlink~/.vimrc
zshzshrc.symlink~/.zshrc

Topical

每一個環境的配置是以資料夾的形式被獨立區分。例如,如果想要新增 "Java" 的配置到 dotfiles,你可以簡單的新增一個命名為 java 的資料夾,然後將檔案建至目錄底下。 任何副檔名是 .zsh 的檔案將在 shell 執行時被自動載入至環境中。 任何副檔名是 .symlink的檔案將在你執行 script/bootstrap 安裝時被連結至 $HOME 目錄底下。.

Components

一些目錄中比較特別的檔案:
  • bin/: 任何在 bin/ 目錄底下的檔案可以在 shell 執行時直接使用。
  • topic/*.zsh: 任何 .zsh 結尾的檔案都會在 shell 執行時被載入至環境。
  • topic/path.zsh: 任何命名為 path.zsh 的檔案會在 shell 執行時優先被載入至 $PATH
  • topic/*.symlink: 任何 *.symlink 結尾的檔案都會在 $HOME 目錄底下建立連結。這可以讓你在配置環境的時候也保持版本控制的優點。新增 symlink 的時候需要執行 script/bootstrap 安裝。
不同於 Holman's dotfiles,我修改了一些部分:

OS X

bin/dot 是一支簡單的腳本,會在 script/bootstrap 配置完 dotfiles 之後執行,安裝自定的 OS X 程式並設定系統參數配置。
執行 dot 之後,它會跑以下兩支腳本檔:
  1. $HOME/.dotfiles/homebrew/install.sh - Homebrew packages
  2. $HOME/.dotfiles/osx/set-defaults.sh - OS X defaults setting

Homebrew packages

執行 homebrew/install.sh 的時候,腳本會使用 Homebrew 和 Homebrew Cask 來安裝 binaryfont 還有 app,可以根據個人需求修改這個檔案,增加或減少自己需要的 packages:
binaries=(
  git
  tree
  ...
)
字型都是以 font-XXX 的形式命名,可以用 brew cask search /font-XXX/ 搜尋是否存在。
fonts=(
  font-roboto
  ...
)
應用程式可以用 brew cask search XXX 或是 Cask Search 網站搜尋是否存在。
apps=(
  dropbox
  google-chrome
  ...
)
以下是目前安裝的 packages:
Binary
grclog 上色
mackup同步應用程式的配置
tree樹狀目錄顯示
Font
font-robotoRoboto
App
alfred三大神器之一
dropbox雲端硬碟
google-chromeGoogle 瀏覽器
iterm2加強版終端機
mouMarkdown 編輯器
qlcolorcode讓 Quick Look 支援 syntax highlighting
qlmarkdown讓 Quick Look 支援 Markdown
qlstephen讓 Quick Look 支援無副檔名的純文字檔
sourcetreeGit GUI
sublime-text3程式碼編輯器

OS X defaults setting

執行 osx/set-defaults.sh 之後,程式會將 Mac OS X 的一些系統設置改變,可以根據個人需求修改這個檔案,或是參考 Mathias’s dotfiles 整理好的配置。
以下是目前設定的配置:
setting
加快視窗 resize 的速度(Cocoa applications)defaults write NSGlobalDomain NSWindowResizeTime -float 0.001
預設展開儲存視窗defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
關閉“你確定要開啟這個應用程式?”詢問視窗defaults write com.apple.LaunchServices LSQuarantine -bool false
開啟觸控板輕觸點擊功能defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
開啟觸控板兩指輕觸彈出右鍵選單功能defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadRightClick -bool true
開啟觸控板三指拖曳功能defaults -currentHost write NSGlobalDomain com.apple.trackpad.threeFingerDragGesture -bool true
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDrag -bool true
開啟觸控板四指向下滑出現 app expose 功能defaults write com.apple.AppleMultitouchTrackpad TrackpadThreeFingerVertSwipeGesture -int 0
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerVertSwipeGesture -int 0
defaults write com.apple.dock showAppExposeGestureEnabled -int 1
加快觸控板/滑鼠的速度defaults write NSGlobalDomain com.apple.trackpad.scaling -int 3
defaults write NSGlobalDomain com.apple.mouse.scaling -int 3
開啟所有視窗組件支援鍵盤控制defaults write NSGlobalDomain AppleKeyboardUIMode -int 3
關閉鍵盤按住的輸入限制defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
加快鍵盤輸入defaults write NSGlobalDomain KeyRepeat -int 0
預設 Finder 起始位置為桌面defaults write com.apple.finder NewWindowTarget -string "PfDe"
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/Desktop/"
顯示副檔名defaults write NSGlobalDomain AppleShowAllExtensions -bool true
顯示 Finder 狀態列defaults write com.apple.finder ShowStatusBar -bool true
顯示 Finder 路徑列defaults write com.apple.finder ShowPathbar -bool true
允許框選 Finde Quick Look 的文字defaults write com.apple.finder QLEnableTextSelection -bool true
Finder 標題列顯示完整路徑defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
預設搜尋列的結果為當前目錄下defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
關閉改變副檔名的警告提示defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false
開啟資料夾的 spring loading 功能defaults write NSGlobalDomain com.apple.springing.enabled -bool true
開啟 Dock 的 spring loading 功能defaults write com.apple.dock enable-spring-load-actions-on-all-items -bool true
移除 spring loading 的延遲defaults write NSGlobalDomain com.apple.springing.delay -float 0
避免在 network volumes 底下建立 .DS_Store 檔案defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
使用 column view 作為 Finder 預設顯示選項defaults write com.apple.finder FXPreferredViewStyle -string "clmv"
關閉清空垃圾桶的警告提示defaults write com.apple.finder WarnOnEmptyTrash -bool false
使用黑色的選單列和 Dockdefaults write NSGlobalDomain AppleInterfaceStyle Dark
使用縮放的效果作為視窗放大縮小效果defaults write com.apple.dock mineffect -string "scale"
應用程式縮小至自己的圖示defaults write com.apple.dock minimize-to-application -bool true
顯示 Dock 應用程式開啟中的小亮燈提示defaults write com.apple.dock show-process-indicators -bool true
關閉 Dock 開啟應用程式的彈跳動畫defaults write com.apple.dock launchanim -bool false
加快 Mission Control 的動畫速度defaults write com.apple.dock expose-animation-duration -float 0.1
關閉 Mission Control 的應用程式群組化顯示defaults write com.apple.dock expose-group-by-app -bool false
關閉 Dashboarddefaults write com.apple.dashboard mcx-disabled -bool true
將 Dashboard 從多重桌面之中移除defaults write com.apple.dock dashboard-in-overlay -bool true
自動隱藏 Dockdefaults write com.apple.dock autohide -bool true
移除隱藏 Dock 的延遲defaults write com.apple.dock autohide-delay -float 0
移除 Dock 的顯示/隱藏動畫defaults write com.apple.dock autohide-time-modifier -float 0
將隱藏的應用程式 Dock 圖示半透明顯示defaults write com.apple.dock showhidden -bool true
以上,若修改過 homebrew/install.sh 或 osx/set-defaults.sh 之後,直接執行指令:
dot
就會再次更新 packages 還有 defaults setting。

Mackup

當初始環境都安裝好之後,剩下的就是恢復備份。除了 .zsrc.vimrc 這類 dotfile 比較適合放在版本控制之外,其他像是 Sublime 的 plugin、iTerm2 的 setting、Oh My Zsh 的 plugin、等等很多還有一般應用程式的配置檔需要備份,甚至是 SSH 的 key,這些我認為都不適合丟進 dotfiles 放上 GitHub。所以這裡介紹 Mackup 這個簡單的工具作為解決方案,使用方式很簡單,brew install mackup 安裝完之後只要執行:
mackup backup
就可以將檔案備份到 Dropbox 或 Google Drive。當需要恢復的時候則是執行:
mackup restore
就會將雲端硬碟上的備份以 ln 連結的方式在新電腦上同步。
配置方式也很容易,建立一份 ~/.mackup.cfg,或是直接使用 .dofiles/mackup/mackup.cfg.symlink 來修改:
[storage]
engine = dropbox # 同步的雲端硬碟,有 dropbox 與 google_drive 可以選擇
directory = Mackup # 同步的資料夾,這裡會將所有備份同步至 ~/Dropbox/Mackup 底下

# 指定要同步的應用程式
[applications_to_sync]
iterm2
oh-my-zsh
sublime-text-3
ssh

[applications_to_ignore]
# 指定不想同步的應用程式
以下是目前備份的應用程式:
app
iterm2加強版終端機
moom視窗布局
oh-my-zsh加強版 ZSH
sourcetreeGit GUI
sublime-text-3程式碼編輯器
sshSSH Key
更多詳細的配置與支援的軟體請參閱 mackup 的文件

參考文章

這個網誌中的熱門文章

DevOps:持續整合&持續交付(Docker、CircleCI、AWS)

Factory pattern 工廠模式

如何使用 Docker 切換不同的 MongoDB