Mac で zsh と oh-my-zsh を使う

2019年8月17日土曜日 / , ,
簡体中文日本語
要約:
Mac のデフォルト bash をやめ、zsh と oh-my-zsh でターミナル体験を最適化する。

Mac のターミナルはデフォルトで bash が使われていますが、bash の体験はかなり簡素で、補完できるのはファイル名だけで、コマンドを打ち間違えても Enter を押すまで気づけません。快適なターミナル体験を得るには、やはり zsh に切り替えるべきです。zsh 自体が bash よりずっと強力で、さらに oh-my-zsh という設定フレームワークを組み合わせれば、補完、サジェスト、ハイライトといった機能をそのまま使えます。

デフォルトを確認

まず現在のシェルと、システムで利用できるシェルを確認します。

Shell
echo $SHELL
# /bin/bash

cat /etc/shells

/etc/shells に一覧されているのが、システムがログインシェルとして許可しているプログラムです。中にはすでに /bin/zsh がありますが、これはシステム標準のものでバージョンが古いため、通常は Homebrew で新しい zsh を別途インストールするのがおすすめです。

zsh のインストール

Homebrew をまだインストールしていない場合は、先にインストールします。

Shell
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

次に zsh をインストールします。

Shell
brew install zsh
zsh --version

Homebrew でインストールした zsh は /usr/local/bin/zsh にありますが、それは /etc/shells に含まれていないため、この状態で直接 chsh を実行すると拒否され、有効なシェルではないと表示されます。そのため、先に追加してからデフォルトシェルを切り替える必要があります。

Shell
# 把 Homebrew 的 zsh 加进允许的 shell 列表
echo /usr/local/bin/zsh | sudo tee -a /etc/shells

# 切换默认 shell
chsh -s /usr/local/bin/zsh

切り替えた後はターミナルを完全に終了してから再度開き、そのうえで echo $SHELL を実行して確認し、/usr/local/bin/zsh になっていれば成功です。

初めて zsh に入るときは、まだ ~/.zshrc がないため、設定ウィザードが表示され、どのように設定するか尋ねられます。ここではそのまま q を押して終了して構いません。この後 oh-my-zsh が設定ファイルを生成してくれるからです。

oh-my-zsh のインストール

zsh 自体のデフォルト設定はとても素朴で、ほとんど何もないため、ほとんどの人は設定フレームワークを追加でインストールします。最も一般的なのが oh-my-zsh です。テーマ、プラグイン、補完などがまとめてパッケージされているので、インストール後はほぼそのまま使えます。

公式のワンライナーインストールコマンドが提供されています。

Shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

スクリプトは oh-my-zsh を ~/.oh-my-zsh にクローンし、すでに ~/.zshrc が存在する場合は、まず ~/.zshrc.pre-oh-my-zsh にバックアップしてから、独自のテンプレートに置き換えます。

インストールが終わるとターミナルの見た目はすぐに変わり、プロンプトは矢印と現在のディレクトリ名の表示に変わります。git リポジトリ内では現在のブランチも表示され、未コミットの変更があれば後ろに小さな × が付きます。

テーマ

テーマは ~/.zshrc の中の ZSH_THEME で決まり、デフォルトは robbyrussell。

Shell
ZSH_THEME="robbyrussell"

oh-my-zsh には多くのテーマが同梱されており、すべて ~/.oh-my-zsh/themes にあります。また Oh My Zsh Themes でサードパーティ製テーマを確認できます。

プラグイン

oh-my-zsh の最大の魅力はやはりプラグインです。プラグインも ~/.zshrc で設定し、plugins という配列に書くだけで済みます。

Shell
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)

このうち git と z は同梱されていますが、残りの2つはサードパーティ製プラグインなので、先に oh-my-zsh の custom ディレクトリにクローンする必要があります。

Shell
git clone https://github.com/zsh-users/zsh-autosuggestions \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-syntax-highlighting \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

その後 source ~/.zshrc を実行するか、ターミナルを開き直せば反映されます。

git

git プラグインは大量の省略形を提供しており、よく使ういくつかを覚えておけば git コマンドの入力がかなり楽になります。

Shell
gst     # git status
gaa     # git add --all
gcmsg   # git commit -m
gco     # git checkout
gl      # git pull
gp      # git push
glog    # git log --oneline --decorate --graph

すべて見たい場合は、直接 alias | grep git。

z

z は訪問したディレクトリを記憶し、アクセス頻度と時間に基づいて並べ替えます。そのため一度でも行ったことがあれば、その後はディレクトリ名の一部を入力するだけで直接ジャンプできます。

Shell
z blog     # 跳到最常去的、路径里带 blog 的目录

数日使った後、私はほとんど長いパスを手入力しなくなりました。

zsh-autosuggestions

このプラグインは履歴に基づいて、入力中に考えられるコマンドを灰色の文字で後ろに補完してくれます。右方向キーを押せばそのまま受け入れられます。多くの長いコマンドは最初の数文字を打つだけで、続きが自動的に出てきます。

zsh-syntax-highlighting

入力中のコマンドに色を付け、コマンドが存在すれば緑、打ち間違いや存在しない場合は赤になります。そのため Enter を押す前にスペルミスに気づけます。

また、これは plugins の中で最後に置く必要があります。これは他のプラグインが定義する widget を包み込む必要があるためで、前に置くと後から読み込まれるプラグインがハイライトされない可能性があります。

bash の設定を移行する

もともと ~/.bash_profile に書いていたもの、たとえば一部の PATH やエイリアスは zsh が読み込まないため、手動で ~/.zshrc に移す必要があります。私は source $ZSH/oh-my-zsh.sh の行より後ろに置くことをおすすめします。そうすれば自分で定義したエイリアスが、プラグイン内の同名エイリアスを上書きできるからです。

Shell
source $ZSH/oh-my-zsh.sh

# User configuration
export PATH="$HOME/bin:$PATH"
export EDITOR="vim"

alias ll="ls -lah"

また、bash と zsh の構文は大部分が互換性があるため、普段使っているコマンドはほとんど変更する必要がありません。少数だけ異なる点があり、たとえば zsh ではマッチしないワイルドカードがあるとそのまま渡されず直接エラーになります。そのため no matches found に遭遇したときは、引数に引用符を付ければ大丈夫です。

更新

oh-my-zsh はデフォルトで定期的に更新を確認し、タイミングが来るとターミナルを開いたときに更新するか尋ねてくるので、Enter を押せば済みます。手動で更新したい場合は、次のコマンドを直接実行できます。

Shell
upgrade_oh_my_zsh

zsh 自体は Homebrew と一緒に更新されるため、brew upgrade のときに最新版へアップグレードされます。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...