長いこと使っていた MacBook Air が遂に壊れたので MacBook Pro に新調したのだが、シェル周りの環境構築がめんどくさい!!ということで dotfiles を GitHub に上げて育てていくことにした。
他人の dotfiles リポジトリを眺めていると無限の学びがあり、時間も無限に消費されて切りがなかったので、自分にとって必須じゃないものは排除しなるべくミニマルな構成からスタートすることにした。
リポジトリ
oh-my-zsh から zplug への移行
今までは oh-my-zsh を使っていたが、起動が非常にもたつくのと、デフォルトで便利な環境のため使ってない便利機能が多くある気がしたので、これを機に zplug に移行することにした。
結果として移行して正解だった。
起動時間に関してはめちゃくちゃ早くなったわけではないのだが、今までよりもましになった。
プラグインの管理面がとても優秀で .zshrc
に欲しいプラグインを記述するだけでプラグインのダウンロードから読み込みまでしてくれる。
プラグインのバージョンロックに対応しているため dotfiles リポジトリに .zshrc
をアップしておけば同じプラグイン環境を再現することが容易になる。
また有り難いことに oh-my-zsh のプラグインの読み込みにも対応しているので、ヘビーに使っていた git のエイリアスを一式定義してくれるプラグイン plugins/git
を読み込んで使用させてもらっている。例えば gl
で git pull
, gs
で git status
, gc
で git commit
など。バッティングで苦しい感じのエイリアスも有るのだがもうこれに慣れてしまったのでw
以下は .zshrc
から zplug 読み込みに関する部分を抜粋したもの。
zplug コマンドで必要なプラグインを記述する。
source ~/.zplug/init.zsh zplug 'zplug/zplug', hook-build:'zplug --self-manage' # theme zplug "yous/lime" # highliting zplug "zsh-users/zsh-syntax-highlighting", defer:2 # completions zplug "zsh-users/zsh-completions" zplug "zsh-users/zsh-history-substring-search" bindkey '^[[A' history-substring-search-up bindkey '^[[B' history-substring-search-down # git helper zplug "plugins/git", from:oh-my-zsh # install plugins if ! zplug check --verbose; then printf "Install? [y/N]: " if read -q; then echo; zplug install fi fi # source plugins and add commands to $PATH zplug load
dotfiles のインストールスクリプト構成
新しい環境に dotfiles を適用する簡単なスクリプトを書いた。他の人のリポジトリを参考に初回のみ実行する setup.sh
と更新の際に都度実行する deploy.sh
の二つに分けた。
setup.sh
の主な内容
- brew のインストール
- zsh のインストール
- 各種 brew パッケージのインストール
- zplug のインストール
- peco のインストール
#!/bin/bash set -euo pipefail source lib/echos.sh function command_exists() { type "$1" &> /dev/null ; } : "install brew" && { if ! command_exists brew; then info "installing brew..." /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" else warn "brew is already installed" fi } : "install zsh by brew" && { BREW_ZSH_PATH="/usr/local/bin/zsh" if ! brew list | grep zsh &> /dev/null; then info "installing zsh..." brew install zsh zsh-completions sudo sh -c 'echo $(brew --prefix)/bin/zsh >> /etc/shells' chsh -s $(brew --prefix)/bin/zsh else warn "zsh is already installed" fi } : "install other packages by brew" && { packages=( peco ghq jq tree wget autojump rbenv direnv ) for package in ${packages[@]}; do if ! brew list | grep $package &> /dev/null; then info "installing ${package}..." brew install ${package} else warn "${package} is already installed" fi done } : "install zplug" && { ZPLUG_DIR=$HOME/.zplug if [ ! -e $ZPLUG_DIR ]; then info "installing zplug..." curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh else warn "zplug is already installed" fi } ok "Complete!"
完全ではないがなるべく冪等性を持つようにした。
ok, info, warn, error などのコマンドは単に色付きの echo。
以下のような記法は 名前付きブロック記法 と呼ばれる見やすくするためのもの。
: "hoge" && { # do something }
deploy.sh
の主な内容
ホームディレクトリ以下に各 dotenv ファイルへのシンボリックリンクを作成するだけ。
同名のファイルがあれば作成をスキップする。
#!/bin/bash set -euo pipefail source lib/echos.sh readonly DOT_FILES=( .vimrc .bashrc .zshrc .zshenv ) for file in ${DOT_FILES[@]}; do dest=${HOME}/${file} if [ -e ${dest} ]; then warn "[warn] ${dest}: skipped (already exists)" else ln -s $HOME/dotfiles/$file $dest ok "[ ok ] ${dest}: created" fi done ok "Complete!"