はじめに
環境構築シリーズです。前回↓
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 と地味にタメを張る大御所シェルである。
有名どころのシェルの機能を全て備えた上でいろいろと追加されており、bash に比べると多機能なシェルということになっている。
インストール
とりあえず、兎にも角にも本体がないと話にならない。
$ sudo apt install zsh
ここでいきなりログインシェルを zsh にしてもいいのだが、流石に使いづらいので先に.zshrc
の方をある程度整えておきたい。
.zshrc
bash でいうところの .bashrc
のように、zsh も対話シェル起動時には .zshrc
を読む。
結論から言うとこんな感じになった。
これを期に整えたりしたが、基本的には 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
sheldon
は Bash/Zsh 対応のプラグインマネージャである。
インストール
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
プロンプトに文字列を入力するとファイルやコマンド、オプションなどを表示してくれたり、コマンド履歴から候補を持ってきて補完したりしてくれる。便利。
zsh-syntax-highlighting
コマンドは緑、ファイルは下線、文字列は黄色など、入力した文字列に色をつけてくれる。存在しないコマンド名は赤色になるので typo に気づきやすい。便利。
zsh-z
行ったことのあるディレクトリを記憶しておいて、ちゃんと指定しなくても高速で移動してくれる。
例えば最近行った ~/hoge/fuga/foo/bar/xxx/yyy/zzz/somedir
というディレクトリに戻りたいとき、 z somedir
と打つと一発で飛ぶことができる。何なら z some
のような入力でも気を利かせて移動してくれる。便利。
該当するディレクトリが複数あるときは頻度や一致度から適当に選ばれるっぽい。一応候補は下に出るので自分で選ぶこともできる。
セットアップスクリプト
前回の Neovim と併せて、自動でセットアップを行うシェルスクリプトを書いた。
環境構築が楽ちんでとてもよい。
おわりに
僕の土日はdotfiles盆栽で消えました゜