fishからzshに移行する過程を、備忘録的に残したいと思います。
はじめに
僕はfishが大好きです。
今までのbashとは違った、使いやすくて離れづらいシェルです。
bashが使いづらいとは言ってません。
しかし、fishはPOSIX非互換なんですよね。すると、いままでbashで構築してきた知識が半分くらい使えないんです。なんか困ったことがあってググっても、基本的にbash前提の記事ばかりなので、微妙に読み替えなきゃいけないところがあるの。
そこで、zshに乗り換えてフレンドリーでインタラクティブにして、fishのような使い勝手に仕立て上げようと思います。(元々インタラクティブではある件は気にせんといて)
(よく考えると、POSIX非互換でそれなりにユーザーがいて有名なシェルって、fishとpwsh(PowerShell)くらいしかないよね。fishすごい。ash含めるかは意見が分かれると思うけど。)
zshをfishに仕立て上げる(?)に当たって、再現するポイントを以下のように挙げました。今回は以下の項目を再現し終えることをゴールとします。
- fisherのようなシンプルで範囲の広いプラグインマネージャー
- bobthefishのようなPowerline風プロンプト
- コマンド入力中に灰色で出てくる入力サジェスト
- コマンドのシンタックスハイライト
- コマンド入力中に展開されるエイリアス、abbr
- jethrokuan/zのように、
z
コマンドでぴょんぴょんディレクトリ移動(語彙死亡)
ではれっつごー
対象者
- シェルに関しての基礎知識がある方
- bashやfishなどからzshに移行する方
※基本的なことについては書いていないので、初めて触るシェルのセットアップをする方向けではありません。
まずはzshのインストール
普段使ってるパッケージマネージャでインストールします。
sudo apt install zsh
ログインシェルにする(任意)
chsh -s /usr/bin/zsh ユーザ名
なんかセットアップ画面が出てきました。
こんな画面(クリックで開く)
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~). This function can help you with a few settings that should
make your use of the shell easier.
You can:
(q) Quit and do nothing. The function will be run again next time.
(0) Exit, creating the file ~/.zshrc containing just a comment.
That will prevent this function being run again.
(1) Continue to the main menu.
(2) Populate your ~/.zshrc with the configuration recommended
by the system administrator and exit (you will need to edit
the file by hand, if so desired).
--- Type one of the keys in parentheses ---
適当なキーを押すと画面が変わります。
初回起動だからホームディレクトリにzsh関連ファイルがなくて出てきたっぽいですね。
めんどくさいので、適当におすすめ設定つけといてもらいましょう。
2
と打ちます。
zshのプロンプトが出てきました。
だっさ。なにこれ。(ホスト名の消し方雑なのは許して)(あと、メイン端末ではないし、ってユーザー名の付け方も雑なの許して)
試しにls
でも打っときましょう。エイリアスも何も設定してないので、真っ白。結構見づらい。
どれがファイルでどれがしれクトリなのかさえわからんね。bashなら多くの場合デフォルトで色がつくのに。
一つだけ便利なところといえば、入力中に[Tab]で補完ができます。
これを使いやすくしていきましょう!
Zplugの導入
僕は現在、zplugからantigenに乗り換えました。主に、zplugの読み込みがめっちゃ遅かったからです。詳しくはこの章の最後に書きます。
プラグインマネージャーであるZplug を導入します。
プラグインマネージャー(の機能を持つものも含む)には、他にも、Oh My ZshやZinit(旧Zplugin)などがあります。
なぜZplugを選んだかというと、シンプルだからです。
Oh My Zshは、フレームワークというだけあって、機能が多すぎて複雑。一方のZinitは、比較的シンプルなのはいいのですが、2021年頃に作者がリモートリポジトリを削除してしまったという事件がありました。直後に有志がローカルのリポジトリから復元したらしいのですが、他のものを使ったほうが良さそうかなと思いました。
日本語版公式ドキュメントがあるので、それに従いましょう。
(なんで日本語版があるのかな、と思ったら、GitHubのOrganizationメンバー3人中2人は日本人ですね。残りの一人は、個人じゃないっぽい?)
- インストールする
インストール画面かっこいいね
curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh
-
~/.zshrc
に追記する(公式ドキュメントの解説部分は削ったもの+αを貼っときます).zshrc#zplugの読み込み source ~/.zplug/init.zsh #zplugをzplug自身で管理 zplug 'zplug/zplug', hook-build:'zplug --self-manage' #ここに他のプラグインについて設定する # 未インストール項目をインストールする if ! zplug check --verbose; then printf "インストールしますか? [y/N]: " if read -q; then echo; zplug install fi fi # コマンドをリンクして、PATH に追加し、プラグインは読み込む zplug load --verbose
これで、source ~/.zshrc
で読み込めます。
なお、ここに管理するプラグインを記述する際は以下のようにします。(READMEより)
tagに関しては、README#3-タグを参照。
Oh-my-zshのプラグインも読み込めるし、gistのプラグインも読み込めるし、すごい便利です。
これも、READMEを参考にしてみてください。
antigenに乗り換えました
zplugの読み込みが遅かったので、antigenに乗り換えました。
zinitは気になっていたのですが、上述の理由からちょいとやめようかと思い、他に気になったのがsheldonとantigenでした。
antigenは以下に書いている入力サジェストとシンタックスハイライトと同じ提供元であるzsh-usersが公開していたので選びました。
-
インストール
curl -sL git.io/antigen ~/antigen.zsh
-
.zshrcに追記
.zshrcsource ~/antigen.zsh #各種プラグインのインストール設定 antigen apply
プラグインのインストール設定は以下のような書式です。
antigen bundle [<url>[@tag|branch] [<loc>]]
例えば以下のようにします。
antigen bundle alpaca-honke/prowpt@main prowpt.plugin.zsh
なお、ブランチ名とファイル名は省略可です。
Powerline-shellのインストール
僕は現在、自作のプロンプトProwptを使っています。詳しくはこの章の下に書いています。
カスタムプロンプトのPowerline-shell をインストールします。
公式ガイドに従いましょう。
今回はpipでのインストールを試します。
まずはPythonをインストールします。
- Pythonが入ってるか確認
python --version
pip -v
- もしも未インストールなら
sudo apt install python
でPython2が入ります。 - 念の為
sudo apt install python3
でPython3も入れときます。 - もしも未インストールなら
sudo apt install pip
でpython3-pipが入りました。
次にPowerline-shellをインストールします。zplugでの管理方法がわからないので、普通にインストールします。
pip install powerline-shell
- 画像のように、PATH通ってないよーって言われたら、PATHを通しておきます。
~/.zshrc
のPATH指定部分を編集します。もしなければ、適当に作っといてください。.zshrcexport PATH="$HOME/.local/bin:$PATH"
-
~/.zshrc
に以下を追記。.zshrcfunction powerline_precmd() { PS1="$(powerline-shell --shell zsh $?)" } function install_powerline_precmd() { for s in ${precmd_functions[@]}; do if [ "$s" = "powerline_precmd" ]; then return fi done precmd_functions+=(powerline_precmd) } if [ "$TERM" != "linux" ]; then install_powerline_precmd fi
- ターミナルを再起動で適用されます。
かっこいい。
もし、文字化けが酷いようであれば、Powerline FontsやNerd Fontsを使いましょう。
個人的には後者の方がグリフが多くてオススメです。
※なぜかsource ~/.zshrc
するごとにプロンプトがダサいやつに戻ってしまうので、ターミナルを再起動してます。原因わかる方いたら教えて下さい。
カスタマイズは、PowerlineのREADME#customization参考。
Prowptに乗り換えました。
これは自作です。自分の好みにピッタリ合うものを作ったんです。
日本語READMEに従います。
とは言っても.zshrcに追記するだけです。
- zplugの場合
zplug "alpaca-honke/prowpt", as:plugin, at:main
- antigenの場合
antigen bundle alpaca-honke/prowpt@main
その他のカスタマイズは日本語READMEに詳しく書いたので、見てみてください。
zsh-autosuggestionの導入
入力サジェストのプラグイン、zsh-autosuggestion を導入します。
-
~/.zshrc
に追記する- zplug
.zshrc
zplug "zsh-users/zsh-autosuggestions", as:plugin
- antigen
.zshrc
antigen bundle zsh-users/zsh-autosuggestions
- zplug
- ターミナルを再起動
これだけ!
こんな感じでサジェストされました!
右矢印キーで候補を入力 できます!
zsh-syntax-highlightingを導入する
シンタックスハイライトプラグイン、zsh-syntax-highlighting を導入します。
上記autosuggestionsと同じ要領です。
-
~/.zshrc
に追記する- zplug
.zshrc
zplug "zsh-users/zsh-syntax-highlighting"
- antigen
.zshrc
antigen bundle zsh-users/zsh-syntax-highlighting
- zplug
- ターミナルを再起動
ちょっと見づらいですがこんな感じでハイライトされました!
間違ってると赤くなります
zsh-abbrを導入
展開されるaliasであるzsh-abbr を導入します。
-
~/.zshrc
に追記する- zplug
.zshrc
zplug "olets/zsh-abbr"
- antigen
.zshrc
antigen bundle olets/zsh-abbr@main
- zplug
- ターミナルを再起動
これで、.zshrc
に alias
の代わりにabbr
を使用することで、コマンド入力中にエイリアスが[Space]or[Enter]で展開される ようになります。このとき、.zshrc
の末尾にabbrを追加しないと、コマンドがねえぞって怒られました。
-S
オプションは、セッション限定のabbrになります。これを使うことで、aliasと同じような感覚で設定できます。
あと、標準出力を捨てないと、起動時にメッセージがエグい ことになります。
例えば、以下は僕の設定です。(git系のabbrが一部、一般的に使われてるaliasとは違うのは僕の好みです)
abbr -S ll='ls -l' >>/dev/null
abbr -S la='ls -A' >>/dev/null
abbr -S lla='ls -l -A' >>/dev/null
abbr -S gst='git status' >>/dev/null
abbr -S gsw='git switch' >>/dev/null
abbr -S gbr='git branch' >>/dev/null
abbr -S gfe='git fetch' >>/dev/null
abbr -S gpl='git pull' >>/dev/null
abbr -S gad='git add' >>/dev/null
abbr -S gcm='git commit' >>/dev/null
abbr -S gmg='git merge' >>/dev/null
abbr -S gpsh='git push' >>/dev/null
プロンプトに入力時に、こんなコマンドねえよって赤くハイライトされることはちょっと不満ですが、まあ大して困らないんで良しとします。
ついでに、普通のエイリアスとして以下も登録しとこう。
ls
打った時に、アイテムの種類(通常ファイルか、実行権限つきか、ディレクトリか、シンボリックリンクか、パイプか、ソケットか)がひと目でわかるようになります。
alias ls='ls -F --color=auto'
zの導入
ディレクトリを簡単に飛び回れるコマンド、rupa/z を導入します。
-
~/.zshrc
に追記する- zplug
.zshrc
zplug "rupa/z", use:"*.sh" #useタグを忘れないように
- antigen
.zshrc
antigen bundle rupa/z z.sh
- zplug
- ターミナル再起動
これで、 一度アクセスしたディレクトリなら、ディレクトリ名の一部を入力するだけで移動 できます!
例えば、こんな感じ
これ、めちゃくちゃ便利で、階層が深くてカレントディレクトリから遠いとこに移動したいときにすっごいありがたいんです。
おわり
zshがかっこよくなって、つかいやすくなった!
あるかっぱのレベルが、1あがった!
(終わり方雑)
なお、僕のdotfiles的なリポジトリに置いてある.zshrcを使うとこの辺の設定が手間いらずで行われます。ミソは、antigenがインストールされてなければ勝手にインストールするコマンドを書くことです。
なおこのリポジトリを使用したことによる損害等に関して一切の責任は負いません。