ミシシッピ川以東のルイジアナ

わたしのブログへようこそ!出てけ

bashからzshに乗り換え

はじめに

環境構築シリーズです。前回↓

jj1lis.hatenablog.com

Neovim がいい感じになったので、次は bash から zsh に乗り換えます。

きっかけ

今のところ自宅環境は万物が bash 前提で構築されているのだが、バイト先では色々あり zsh を使っている。bash とは10年弱を共に過ごした仲(?)なので思い入れがないわけではないが、設定が共通でないと何かと不便であるからこの際 zsh に移行する。

環境

$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=20
DISTRIB_CODENAME=ulyana
DISTRIB_DESCRIPTION="Linux Mint 20 Ulyana"
$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

こうしてみると bash 古いな(ここのところ毎回のように言ってる気がする)。

zsh

そもそも zsh (Z SHell) とは Brian Fox が1990年に開発したコマンドシェルの一つで、1989年に公開された bash と地味にタメを張る大御所シェルである。

www.zsh.org

有名どころのシェルの機能を全て備えた上でいろいろと追加されており、bash に比べると多機能なシェルということになっている。

インストール

とりあえず、兎にも角にも本体がないと話にならない。

$ sudo apt install zsh

ここでいきなりログインシェルを zsh にしてもいいのだが、流石に使いづらいので先に.zshrcの方をある程度整えておきたい。

.zshrc

bash でいうところの .bashrc のように、zsh も対話シェル起動時には .zshrc を読む。

結論から言うとこんな感じになった。

github.com

これを期に整えたりしたが、基本的には bash の内容そのままで問題ない。ただ、プロンプトだけは zsh の記法が使えるので使っていきたい。

プロンプト

bash環境変数 $PS1 でプロンプト(シェルで入力するときに出てる user@hostname: ~ $ みたいなアレ)の見た目を変更できたが、zsh では$PROMPTで設定できる。上のリンク先ではここにあたる。

PROMPT="%B%F{red}%n%f%F{green}@%M%f: %F{blue}%~ \$%f%b "

$PROMPT に指定した文字列がプロンプトになるのだが、一部の情報はパラメータを使って動的に表示できる。上に書いたものでいうと

パラメータ 内容
%n ユーザ名
%M ホスト名
`%~ カレントディレクト

など。またHTMLのタグのように %X...%x と書いて囲った内部の文字列の体裁を変えるものもある。

パラメータ 内容
%B...%b 太字
%F{color}...%f color色に着色

他にもいろいろあるので、詳しくは勝手に調べてほしい。

ちなみに bash のときは同じ内容を設定しようと思うと PS1="\[\e[1;31m\]\u\[\e[1;32m\]@\H\[\e[1;37m\]:\[\e[1;34m\]\w $\[\e[m\]" のように最悪の可読性だったのだが、 zsh は随分と読みやすくて感動した。

sheldon

sheldonBash/Zsh 対応のプラグインマネージャである。

github.com

インストール

Homebrew があれば brew install sheldon でいけるのだが、ないので Cargo を使う。

$ rustup update stable
$ cargo install sheldon

セットアップ

sheldon の設定は ${XDG_CONFIG_HOME}/sheldon/plugins.toml で行う。以下のように、sheldon init で使いたいシェルに応じて(といっても変数の値がちょっと違うだけだけど)plugins.tomlを生成してくれる。

$ sheldon init --shell zsh
Initialize new config file `~/.config/sheldon/plugins.toml`? [y/N] y
Initialized ~/.config/sheldon/plugins.toml
# `sheldon` configuration file
# ----------------------------
#
# You can modify this file directly or you can use one of the following
# `sheldon` commands which are provided to assist in editing the config file:
#
# - `sheldon add` to add a new plugin to the config file
# - `sheldon edit` to open up the config file in the default editor
# - `sheldon remove` to remove a plugin from the config file
#
# See the documentation for more https://github.com/rossmacarthur/sheldon#readme

shell = "zsh"

[plugins]

# For example:
#
# [plugins.base16]
# github = "chriskempson/base16-shell"

一番下にbase16を入れる用例が載っているが、このように

[plugins.<plugin>]
github = "<repo>"

の要領で追記しておくことで自動的にプラグインをインストールしてくれる。

とりあえず鉄板の zsh-autocomplete を入れておく。

[plugins.zsh-autocomplete]
github = "marlonrichert/zsh-autocomplete"

sheldon はこれらのプラグインを適用するスクリプトsheldon sourceで吐き出す。

$ sheldon source
source "/home/jj1lis/.local/share/sheldon/repos/github.com/marlonrichert/zsh-autocomplete/zsh-autocomplete.plugin.zsh"

よって、 .zshrc にでもeval "$(sheldon sourece)" と書いておけば、起動時にプラグインを有効化できる。

$ zsh
Loaded ~/.config/sheldon/plugins.toml
    Cloned https://github.com/marlonrichert/zsh-autocomplete
Locked ~/.local/share/sheldon/plugins.lock

入れたプラグイン

とりあえず列挙するので、詳細はリンク先を見ていただきたい。

zsh-autocomplete

github.com

プロンプトに文字列を入力するとファイルやコマンド、オプションなどを表示してくれたり、コマンド履歴から候補を持ってきて補完したりしてくれる。便利。

zsh-syntax-highlighting

github.com

コマンドは緑、ファイルは下線、文字列は黄色など、入力した文字列に色をつけてくれる。存在しないコマンド名は赤色になるので typo に気づきやすい。便利。

zsh-z

github.com

行ったことのあるディレクトリを記憶しておいて、ちゃんと指定しなくても高速で移動してくれる。

例えば最近行った ~/hoge/fuga/foo/bar/xxx/yyy/zzz/somedir というディレクトリに戻りたいとき、 z somedir と打つと一発で飛ぶことができる。何なら z some のような入力でも気を利かせて移動してくれる。便利。

該当するディレクトリが複数あるときは頻度や一致度から適当に選ばれるっぽい。一応候補は下に出るので自分で選ぶこともできる。

セットアップスクリプト

前回の Neovim と併せて、自動でセットアップを行うシェルスクリプトを書いた。

github.com

環境構築が楽ちんでとてもよい。

おわりに

僕の土日はdotfiles盆栽で消えました゜