長いこと使っていた 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!"