OhMyZshからZinitに乗り換えてみた話

この記事は Enigmo Advent Calendar 2021の6日目の記事です。

こんにちは。BUYMAでWebエンジニアをやっております、岡本です。エニグモに入ってから約1年が経過しました。

学生の時にプログラミングを始めてしばらくbashを使っていたのですが、イケイケの先輩にzshを教えてもらい、zshの機能を拡張するためのプラグインマネージャーにはOhMyZshを勧められ、数年利用していました。この時期に使っていたmacOSの標準シェルはbashで、zshはわざわざインストールするものでした。

1年前にエニグモに入社した頃、支給されたMacBookProに搭載されているmacOSの標準シェルは既にzshになっていました。(標準シェルがzshになったのはmacOS 10.15 Catalina以降です)

せっかくの機会なので気持ちを新たにプラグインマネージャーも替えてみようと思い立ち、いくつかzshプラグインマネージャーを調べたところZinitが良さそうに思えたので導入することにしました。今回は導入した感想を軽く綴ってみようと思います。

github.com

(2021年12月6日閲覧、以下記載URLも同様)

いいところ

いくつか公式ドキュメントでもアピールされていますが、個人的に良いと思うところを挙げます。

zshの起動が速くなる

公式ドキュメントで喧伝されているのがzshの起動スピードについてです。早いことをアピールしています。

Zinit is currently the only plugin manager out there that provides Turbo mode which yields 50-80% faster Zsh startup

訳(Zinitは現在、ターボモードを提供する唯一のプラグインマネージャーであり、Zshの起動が50〜80%速くなります。)

cf. https://github.com/zdharma-continuum/zinit#zinit

ここでターボモードとは何ぞやとなるのですが、waitを使った遅延読み込みのことを指すようです。これについては後ほど紹介しますが、ターボモードを使わなくても従来のプラグインマネージャーと比較するとzshの読み込み速度は高速になっていると思います。

OhMyZshおよびPreztoプラグインとライブラリの読み込みをサポートしている

OhMyZshやPreztoなどを利用していた方もその資産を継承できます。なお私はOhMyZshのプラグインは現在は読み込まずに使っています。気になる方は以下をご覧ください。

参考URL

https://zdharma-continuum.github.io/zinit/wiki/INTRODUCTION/#oh_my_zsh_prezto

使ってみよう

Zinitのインストール方法はこちらからご覧いただけます。

https://github.com/zdharma-continuum/zinit#automatic-installation-recommended

sh -c "$(curl -fsSL https://git.io/zinit-install)"

source ~/.zshrc

zinit self-update

こちらを実行することで~/.local/share/zinit/zinit.gitにzinitがインストールされ、zshrcにzinitの設定が追加されます。

ここから自分好みにカスタマイズしていくわけですが、現時点の私のzshrcを見てみるとこんな感じになってました。1~7行目はromkatv/powerlevel10kを使うために設定しているものです。一言でいうとターミナルのUIをカラフルにしてくれるものです。ペアプログラミングの機会があると「ターミナルのUIがカラフルですね」とよく言われます。ディレクトリ名やブランチ名が見やすいのでOhMyZshを使っている時からずっと使っています。

  1 # Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
  2 # Initialization code that may require console input (password prompts, [y/n]
  3 # confirmations, etc.) must go above this block; everything else may go below.
  4 if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  5   source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
  6 fi
  7
  8 ### Added by Zinit's installer
  9 if [[ ! -f $HOME/.zinit/bin/zinit.zsh ]]; then
 10     print -P "%F{33}▓▒░ %F{220}Installing %F{33}DHARMA%F{220} Initiative Plugin Manager (%F{33}zdharma/zinit%F{220})…%f"
 11     command mkdir -p "$HOME/.zinit" && command chmod g-rwX "$HOME/.zinit"
 12     command git clone https://github.com/zdharma/zinit "$HOME/.zinit/bin" && \
 13         print -P "%F{33}▓▒░ %F{34}Installation successful.%f%b" || \
 14         print -P "%F{160}▓▒░ The clone has failed.%f%b"
 15 fi
 16
 17 source "$HOME/.zinit/bin/zinit.zsh"
 18 autoload -Uz _zinit
 19 (( ${+_comps} )) && _comps[zinit]=_zinit
 20
 21 # Load a few important annexes, without Turbo
 22 # (this is currently required for annexes)
 23 zinit light-mode for \
 24     zinit-zsh/z-a-rust \
 25     zinit-zsh/z-a-as-monitor \
 26     zinit-zsh/z-a-patch-dl \
 27     zinit-zsh/z-a-bin-gem-node
 28
 29 ### End of Zinit's installer chunk
 30 以下略

さて、プラグインを設定してみます。zshを使う上で外せないのは補完とシンタックスハイライトではないかと思います。

# 補完
zinit light zsh-users/zsh-autosuggestions
# シンタックスハイライト
zinit load zdharma/fast-syntax-highlighting

ここで、プラグインの読み込み方法はloadlightがあります。

loadを使うことでプラグインのトラッキングを可能にします。zinit report {plugin-spec}プラグインの情報を出力し、zinit unload {plugin-spec}プラグインを無効にします。

一方lightを使うとプラグインのトラッキング機能が無効になり、loadに比べて読み込み速度が速くなるようです。

またsnipetを使うと、URLを直接指定する形でプラグインを読み込むことができます。

zinit snippet https://gist.githubusercontent.com/hightemp/5071909/raw/

cf. https://zdharma-continuum.github.io/zinit/wiki/INTRODUCTION/#basic_plugin_loading

このような感じでお好みのプラグインを追加していきましょう。筆者のzshrcをみるとzdharma/history-search-multi-wordというコマンド履歴を検索するプラグインが入っています。

zinit load zdharma/history-search-multi-word

f:id:enigmo7:20211202102734g:plain

設定例はzinitのドキュメントに記載されているので私はこれを参考にして設定したのですが、ここでiceというものが出てきます。

zinit ice pick"async.zsh" src"pure.zsh"
zinit light sindresorhus/pure

zinit ice depth=1; zinit light romkatv/powerlevel10k

zinit iceは直後の行で実行されるloadlightの挙動を変更します。iceの後のpicksrcなどはice-modifiersと呼ばれるもので、 iceという名前の由来は、氷は飲み物に入れて少し経つと溶けることから、変更が一時的なものであることを意味すると公式ドキュメントでは説明されています。ice-modifiersの後ろにクォーテーションやイコールで指定されているのは引数です。ice-modifiersが引数によってzinitの挙動を制御します。例えば上記のpickであれば、引数として与えられた"async.zsh"に実行権限を与えてPATHに追加するようにzinitに対して指示しています。

その他のice-modifiersの用法についてはこちらを参照してください。

https://github.com/zdharma-continuum/zinit#ice-modifiers

おわりに

基本的な使い方はできていると思いますが、まだまだ知らないオプションが多いのでもっと使いこなせるように日々精進したいと思います。

次回の記事の担当はデータアナリストの井原さんです。お楽しみに!!


株式会社エニグモ 正社員の求人一覧

hrmos.co