シェルをzshにした

今までxonshというシェルを使っていたのだけれど、中身がPythonで書かれているせいか、新しい言語などに挑戦するときに環境構築でxonshが原因でコケることがちょこちょこあった。

今まではその度にxonshの場合になんとかできるように解決策を見出しいたのだけれど、流石に耐えきれなくて今回シェルをzshにすることにした。

もともと自分がxonshを使っていたモチベとして、シェル上でPythonがかけるということには対して魅力は感じてなくて、そうではなく大した設定をせずともデフォルトでリッチな補完機能や履歴検索、ハイライトなどを行ってくれていたからで、要するにシェルの設定を書くのがめんどくさかったため。

ここで今回ようやく重い腰を上げて環境構築するぞ、ということでxonshを卒業してzshにすることに。

結果として

結論としてこんな感じになった。

f:id:komi1230:20191030232012p:plain
zshの環境構築終了後

機能として

  • 有効なコマンドは緑色
  • 無効なコマンドは白色
  • コマンドの予測はグレーで表示
  • gitのブランチ管理とstatusの表示
  • コマンド予測
  • 補完のsuggestion

あたり。

他にもmangrepなどのコマンドでの色付けなども。

ちなみにプロンプトは自分で作った。オシャレ。

以下では環境構築の際にやったことについてまとめていく。

環境構築はやっぱりめんどくさい

まあ基本的にやりたくないのが環境構築。

あらかじめ環境構築を良しなにやってくれる物があれば人生ハッピー。

ということでPreztoを利用する。

リポジトリの指示の通りインストール。

github.com

まずzshを入れる。

自分が使っている端末はMacbookなので

$ brew install zsh

そしてzshを立ち上げる。

$ zsh

このときもしかしたら勝手に~/.zshrcが作られるかもしれないが、あとでPreztoが自動で作ってくれるので一旦ここでは削除しておく。

さて、リポジトリをcloneしてくる。

$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

そして以下のコマンドを打ち込む。

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

前準備はこれでオッケーだと思われ。

デフォルトのシェルをzsh

としてzshを入れ、/etc/shells/usr/local/bin/zshを追加。

$ sudo vi /etc/shells  # => 最後に/usr/local/bin/zshを追加する

そしてデフォルトシェルを入れ替える

$ chsh -s /usr/local/bin/zsh

これにてデフォルトのシェルはzshになった。

zshの中身の具体的な設定

Preztoが色々やってくれたので、あとは自分のお好みの設定をやっていく。

まず、有効なコマンドの色付けとコマンドのsuggestionが欲しい。

ということで.zpreztorcにて以下を追記。

zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'prompt' \
  'syntax-highlighting' \  <- こいつ追記
  'autosuggestions'  <- こいつも

これでオッケー。

さてさて、あとはプロンプトを整える。

自分の.zshrcはこうなっている。

# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# Customize to your needs...
fpath=(/usr/local/share/zsh-completions $fpath)

# Environment variables
export LANG=ja_JP.UTF-8

# Be able to use colors
autoload -Uz colors
colors

# history
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# Prompt
autoload -Uz vcs_info
zstyle ':vcs_info:git:*' check-for-changes true #formats 設定項目で %c,%u が使用可
zstyle ':vcs_info:git:*' stagedstr "%F{green}!" #commit されていないファイルがある
zstyle ':vcs_info:git:*' unstagedstr "%F{magenta}+" #add されていないファイルがある
zstyle ':vcs_info:*' formats "%F{cyan}%c%u(%b)%f" #通常
zstyle ':vcs_info:*' actionformats '[%b|%a]' #rebase 途中,merge コンフリクト等 formats 外の表示
precmd () { vcs_info }
PROMPT=' %{$fg[red]%}[%{$fg[blue]%}%n%{$fg[red]%}]-[%{$fg[green]%}%~%{$fg[red]%}]%{$reset_color%}'
PROMPT=$PROMPT' ${vcs_info_msg_0_} %{${reset_color}%}
'
PROMPT=$PROMPT'%{$fg[yellow]%} >>> '

多分これで大丈夫なはず。

最後にターミナルのカラーテーマ

普段から自分が使っているカラーテーマはIcebergなのだけれども、Icebergのままだと色が薄すぎて見にくい。

cocopon.github.io

確かに目に優しそうだけど....

てことでカラーテーマをIcebergからwombatに変える。

github.com

ここからダウンロードしてきて、Macbookでターミナルの環境設定のところからテーマを読み込ませる。

f:id:komi1230:20191030233732p:plain
ここの下部のimportとあるところ。日本語だと「読み込む」

これでオッケー。xonsh卒業。

まとめ

Zshに移行するためにPreztoを入れて、それに加えていくつか設定を書き加えた。

もうこれで環境構築で変なところで悲しむことはなさそう。

今回zshにしようと思った要因として、Common LispでのSLIME的なやつでClojureのCIDERを使おうと思ったのだけれど、それがREPLを動かしている側のサーバーとの通信でxonshが原因で通信が繋がらなかったことにある。

んー、xonshイケてるシェルなんだけどなぁ....

まあこれからはzsh使いのおじさんとして生きていく。