懒程序员和他的 dotfiles

如果你不知道什么是 dotfiles,那你就不会知道什么是 dotfiles。如果你知道什么是 dotfiles,那你就知道什么是 dotfiles。

以一段废话开场,引出今天的主题:dotfiles。软件匠艺社区(codingstyle.cn)周三晚上有一期分享介绍 Vim 时提到了 dotfiles,这篇文章我们就来好好说一说 dotfiles。

什么是 dotfiles?

dot 即「点」的意思,意思是以点开头的文件。如果你不是程序员,你大概会说,我咋从来没见过这种文件啊?因为这些文件通常都是隐藏文件,平常一般看不到,比如 .git 目录。但这里说的 dotfiles 主要是指用户 home 目录下的点文件,这类文件一般是一些配置文件,比如 vim 的配置文件 .vimrc,zsh 的配置文件 .zshrc 等。通过设置这些配置文件,可以实现出很强大的功能,比如有不少人通过配置 .vimrc,把 vim 活生生变成了一个功能强大的 IDE。还有一些偷懒的程序员在 .profile 之类的文件里设置了大量命令的 alias。以至于你还没看清楚他敲的第一个命令,他已经敲了三四个命令了。

通过配置各种 dotfiles,程序员可以把系统定制得既顺手又高效。但是问题来了,自己千辛万苦调的设置,如果换一台机器,又得重新设置一遍。这对于追求效率的程序员来说是不可接受的。

dotfiles 管理

于是会玩又懒的程序员想出了一个办法,把所有的 dotfiles 放在一个单独的目录进行统一管理,放到 GitHub 或者通过网盘同步。

为了让 dotfiles 生效,主要有两种方式:

  1. 通过一个脚本,把所有 dotfile 文件 rsync 到 HOME 目录。
  2. 使用软链,让 HOME 目录的 dotfile 文件指向你目录的 dotfile 文件。

第一种方式适合机器初装,但是假如你有两台机器,希望配置能方便的进行同步,第二种方式是更好的选择。

$ ln -s ~/dotfiles/.vimrc ~/.vimrc

但是,假如你的 dotfile 文件很多,手工去维护那些软链也是一件麻烦的事情。而程序员又是最不能忍受麻烦的,于是造了各种轮子去维护和管理这些 dotfiles 。

有些人把软链的管理写成一个 Shell 脚本,也有人做成特定的工具。比如:rcmYARDdotfilesmackup ……

mackup

在对比了各种 dotfiles 工具后,我最终选择了 mackup。理由主要如下:

  1. 使用方便,配置起来非常简单。
  2. 社区贡献了大量现成的软件的 dotfiles 配置,可以直接使用。

在 OS X 下,可以直接使用 brew 安装 mackup。其他系统下,可以直接使用 pip 安装。安装好后,备份和还原都只需要一个命令:

# 备份
$ mackup backup

在新机器上:

# 还原
$ mackup restore

如果你不想要那些软链了,只需要执行:

$ mackup uninstall

mackup 可以通过配置文件,指定你希望备份哪些 dotfiles,以及备份到哪里(支持备份到 Dropbox、Google Drive、Copy、iCloud、Box 以及指定的目录。

比如在我的 mac 上,我的 .mackup.cfg 这样设置的:

[storage]
engine = file_system
path = dotfiles
directory = home 

[applications_to_sync]
atom
pycharmce
myvim
ideaic15
zsh
mackup
dash
karabiner

storage 里指定了备份到文件系统的 ~/dotfiles/home 路径。applications_to_sync 指定了备份哪些应用的 dotfiles。mackup 预先定义好了大量 application 的 dotfiles,比如:

Atom
Bash
Dash
Emacs
Flux
Git
Gradle
MacOSX
MacVim
npm
Oh My Zsh
Vim
WebStorm
...

如果你需要定制某个 application 的 dotfiles 也很简单,比如我发现 mackup 自带的配置里没有 IntelliJ Community 版本的配置,我只需要在新建一个文件: ~/.mackup/ideaic15.cfg :

[application]
name = My IntelliJ IDEA 15

[configuration_files]
Library/Preferences/IdeaIC15/keymaps/Mac OS X copy.xml
Library/Preferences/IdeaIC15/options/keymap.xml

configuration_files 里指定我需要备份的文件即可。非常的简单易用。

自动安装软件

在一台新机器上,把之前机器装的软件一个一个手动安装也是非常耗时和麻烦的事情。如果你使用的是 Mac OS X,将会变得非常简单,因为绝大部分的软件开发包及软件都可以通过 Homebrewbrew cask 来安装。

我的 Mac 上 99.9% 的软件,可以通过我写的 brew.sh 脚本来安装:

# Install Homebrew

# Ask for the administrator password upfront.
sudo -v

# Keep-alive: update existing `sudo` time stamp until the script has finished.
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &

# Check for Homebrew,
# Install if we don't have it
if test ! $(which brew); then
  echo "Installing homebrew..."
  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

brew tap homebrew/versions
brew update
brew upgrade --all

# Install packages
apps=(
    caskroom/cask/brew-cask
    cmake
    coreutils
    findutils
    git
    gnu-sed --with-default-names
    go
    hugo
    mercurial
    mackup
    macvim
    mysql
    android-platform-tools
    python
    ruby
    svn
    vim
    wget
    zsh
)

caskapps=(
    android-studio
    alfred
    atom
    cheatsheet
    dash
    genymotion
    google-chrome
    intellij-idea-ce
    iterm2
    java
    karabiner
    keepassx
    kindle
    macdown
    pomotodo
    pycharm-ce
    qq
    qqmusic
    qqmacmgr
    sogouinput
    thunder
    vagrant
    virtualbox
    vlc
    wiznote
    youdao
)

brew install "${apps[@]}"
brew tap caskroom/versions
brew cask update
brew cask install --appdir="/Applications" "${caskapps[@]}"
brew cleanup
brew cask cleanup

pip、npm、gem

使用 pip、npm、gem 安装的包也使用脚本进行一键安装:

pip install --upgrade pip
pip install powerline-status
pip install MySQL-python
pip install tornado
pip install torndb
pip install pycrypto
pip install mock
# npm、gem ...

OS X 的系统设置

当你拿到一台新的 Mac 然后开机时,不知道有没有被 Duang~ 的一声吓到的经历。当时吓得的宝宝我赶紧找了如何关闭开机声音的方法(设置静音、插上耳机都不管用!),只要执行一条命令即可:

sudo nvram SystemAudioVolume=" "

很多的系统设置都可以通过命令来完成,比如:

# 电池显示是百分百
defaults write com.apple.menuextra.battery -bool true

# 设置键盘按键重复的延迟
defaults write NSGlobalDomain KeyRepeat -int 3

# 禁止自动拼写纠正
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false

# Finder 显示状态栏
defaults write com.apple.finder ShowStatusBar -bool true

# Finder 显示地址栏
defaults write com.apple.finder ShowPathbar -bool true

# 禁止在网络驱动器上生成 .DS_Store 文件 
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true

字体

程序员喜欢折腾的几样东西:键盘、编辑器、字体。程序员钟爱的几种字体,包括 Source Code Pro、Hack、Menlo 等等,其中对 powerline 字体更是最爱。把所有心爱的字体放在 dotfiles/fonts 目录里,通过自动安装脚本里直接拷贝到 ~/Library/Fonts/ 目录下即可。

cp -r ~/dotfiles/fonts/* ~/Library/Fonts/

使用 powerline 字体需要安装 powerline-status,这个在前面讲的 pip 脚本里已经安装了。

pip install powerline-status

zsh 中使用 powerline 字体,只需要在 .zshrc 中加一句:

source /usr/local/lib/python2.7/site-packages/powerline/bindings/zsh/powerline.zsh

效果如下:

zsh-powerline

在 vim 里使用 powerline 字体,只需要在 .vimrc 里加:

set rtp+=/usr/local/lib/python2.7/site-packages/powerline/bindings/vim
set laststatus=2

效果如下:

vim-powerline

总结

懒程序员如果拿到了一个新的 Mac 机器,他只需要做如下几步,就可以把这台新的机器变成熟悉的一台机器:

  1. 安装 XCode(最好在 Mac Store 里下载安装完整版的 XCode,因为有些软件安装依赖完整版 XCode):

    $ sudo softwareupdate -i -a
    $ xcode-select --install
    
  2. 自动安装软件及系统设置。

    $ cd ~
    $ git clone https://github.com/coderzh/dotfiles.git
    $ source dotfiles/install.sh
    
  3. 使用 mackup 恢复 dotfiles。

    $ cp ~/dotfiles/.mackup.cfg ~/
    $ cp -r ~/dotfiles/.mackup ~/
    $ mackup restore
    

如果一切顺利,程序员,你没有浪费上班时间装电脑,你可以开始搬砖了。:-)

(对了,iTerm2 的 Color 设置好像必须手工操作,配色列表可以在 https://github.com/mbadolato/iTerm2-Color-Schemes 找,作为 JetBrains 粉,最后我选择了 JetBrains Darcula.itermcolors 这一款。)

在 GitHub 里搜 dotfiles 可以看到大量的 dotfiles,当然,别忘了 Star 我的 dotfiles:https://github.com/coderzh/dotfiles

最后,温馨提示下,千万不要把 ssh、mysql 密码相关的内容提交上去呦~

参考资料:

  1. https://github.com/mathiasbynens/dotfiles
  2. https://github.com/skwp/dotfiles
  3. https://github.com/donnemartin/dev-setup
  4. https://github.com/webpro/awesome-dotfiles
  5. https://github.com/jbernard/dotfiles
  6. https://github.com/lra/mackup
  7. https://github.com/webpro/dotfiles
微信扫一扫交流

作者:CoderZh
微信关注:hacker-thinking (代码随想)
本文出处:https://blog.coderzh.com/2016/03/19/dotfiles/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。