まだ oh-my-zsh で消耗してるの?

  • 217
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

2015年も終わるというのに、まだ「oh-my-zsh を入れて最高の zsh 環境作ろう」といった記事が散見される。もう oh-my-zsh は古いし、それで作る環境は最強ではない。そう断言できる。

tl;dr

oh-my-zsh から作る zsh 環境はもうおしまい。ゆえに oh-my-zsh が大好きな人や、oh-my-zsh で作る環境に満足する人はこの記事の読者には成り得ない。

oh-my-zsh とは

oh-my-zsh とは zsh 用の設定フレームワークとして位置づけられていて、簡易的なプラグイン機構やテーマ機構を有するコミュニティドリブンで開発されるプロジェクトである。コミュニティドリブンであるために永遠に未完成であり、OSS 界隈な人たちが寄ってたかって自分らが便利とする設定を取り込ませ続けた産物とも言える。

oh-my-zsh では役割ごとにディレクトリが切られていて、まとめると以下のとおりである。

ディレクトリ 説明
cache キャッシュディレクトリ
custom ユーザが個々に設定していくディレクトリ。oh-my-zsh には取り込まれず個人がローカルで管理する
lib oh-my-zsh によって必ず読み込まれるファイルが格納される
log ログ用ディレクトリ
plugins プラグイン用のディレクトリ。実態はプラグインファイルを読み込むためのファイルなどサポートファイルであったりプラグイン実態であったりまちまち。メンテされていないものも多くある
templates zshrc などのテンプレートの保管場所
themes テーマファイルの格納ディレクトリ。テーマと言ってもシェルプロンプトの変更などアピアランスに関わる設定を行うだけ
tools oh-my-zsh の curl インストール用のスクリプトやアップデートに使用するスクリプトなど、oh-my-zsh 自身のユーティリティを保管している

そして同階層に oh-my-zsh.sh というファイルがあり、これが oh-my-zsh の実体になっている。一度読み込むと以下のフローでシェルが設定されていく。

  1. 本体ファイルの自動アップデートを有効化/無効化
  2. fpath の設定と compinit の設定
  3. 各種 oh-my-zsh 用の環境変数を初期化
  4. lib 以下にある *.zsh ファイルをすべて読み込む
  5. customplugins 以下を fpath に登録する
  6. OS ごとにホスト名を設定
  7. compinit 用のダンプファイルを用意
  8. customplugins 以下の *.plugin.zsh を全て source する
  9. テーマを設定する

プラグインやテーマの量が多いため、そのロードなどに多くの時間をかけているっぽい。

メリット

  • 色々な人たちの設定が組み合わさった集合知である
  • なので初めて zsh に触る人でも簡単にフルカスタマイズ zsh マンになれる
  • プラグイン機構を有するので、ある程度のローカルカスタマイズを受け付ける

デメリット

  • フレームワークとしての完成度が低い(fish や bash のものと比べたとき)
  • カスタマイズが盛り込まれすぎているため遅い/重い
  • 後継にあたる Prezto が産まれている
  • エイリアスまでも設定されてしまっている
  • プラグインがサブモジュール化されていないためアップストリームに追いつけていない
  • プラグインの更新が何年も止まっているものもある(後述)
  • インストールスクリプトが結構危ないことをしている(chsh や zshrc の削除など)

oh-my-zsh からの脱却

oh-my-zsh で利用できるプラグインは最大で5年間、メンテされていない。この時点でこのフレームワークの信ぴょう性を疑う。

Antigen

zsh のプラグインマネージャに Antigen がある(Antigen はフレームワークではなくプラグインマネージャである)。Antigen は oh-my-zsh からの脱却のために(カスタマイザブルな zshrc 作成のために)立ち上がったプロジェクトである。

脱却を助けるための機能として、oh-my-zsh プラグインの読み込みがある。事実 oh-my-zsh ユーザの多くは plugins 以下にあるプラグイン設定に依存しているようである。

# oh-my-zsh の lib 以下を読み込み antigen から oh-my-zsh を使用できるようにする
antigen use oh-my-zsh
# plugins 以下のディレクトリ名をそのまま記述すれば読み込める
antigen bundle git
antigen bundle brew
antigen bundle cpanm

# その他 GitHub ライクな記述をすれば clone してプラグインを管理できる
antigen bundle zsh-users/zsh
antigen bundle zsh-users/zsh

antigen apply

Prezto

Antigen はプラグインマネージャであるが、フレームワークではない。設定が面倒なので oh-my-zsh のようにやってくれという人は Prezto が良いかもしれない。設計・仕様がしっかり作りこまれていて、oh-my-zsh より洗練されたフレームワークであり、より簡単にセットアップが可能になっている。プラグインもサブモジュール化されているため、メンテナンス停滞などの問題もなさそうだ。

すでにある程度まとめられた記事があるためあえて紹介はしない(フレームワーク系が好きじゃないというのもある)が、oh-my-zsh を使うくらいなら Prezto を使ったほうがいいと個人的に思っている。

Antigen からの脱却

実は Antigen は oh-my-zsh の代わりになるために作られたが、プラグインマネージャとしての完成度が低かった。

ここらへんの使い勝手の悪さや問題点は以下の記事でまとめてある。

zgen

Antigen の遅さを改善したのが zgen である。読み込むべきファイルを毎回動的生成している Antigen に対し、zgen は静的ファイルに書き出すことで高速化を図っている。静的ファイルの更新は zshrc などの変更(zgen 以外の変更でも)によって生じる。その他の操作体系はサブコマンド名こそは違うものの Antigen と全く同じ。

zplug

Antigen alternative として作られていないプラグインマネージャ。既存のものと違い、プラグインだけでなくコマンドの管理や、gist ファイルや bitbucket、GitHub Releases のバイナリも管理対象になっている。リビジョンロック・ブランチロックの機能もあり、インストールやアップデートは非同期処理によって高速化されている。

ロード問題は zgen のようにキャッシュ機構によって高速化がされていて、プラグインの追加/削除によってキャッシュが更新される。NeoBundle のような遅延読み込み機能など目下開発中のプラグインマネージャ。

もちろんというのは悲しいことだが、oh-my-zsh からの乗り換え促進のために oh-my-zsh 以下の読み込み機能が付いている。

その他のプラグインマネージャ

スター数を多く獲得している他のプラグインマネージャはこれくらいしかない。しかし上記2つは zsh 以外の言語によって開発されている。これは zsh プラグインマネージャにとってあまりいいものとは思えない。

以下に Antigen, zgen, zplug のスコアタイムがある。

非同期処理によって獲得した高速インストールで zplug が抜きん出ており、キャッシュ機構によってロード時間も zgen と同じくらいに肩を並べている。

まとめ

oh-my-zsh はプラグインのメンテ不足・仕様、両方で時代遅れ感が否めない。おそらく、PR や issues などがたくさん立ち上がり、スター・フォーク・ウォッチどれをとっても多くのユーザを抱えているために乗っかってしまう人も多そうだ。また、前に oh-my-zsh を導入していて、脱却したくとも面倒でそのままといったケースもあるだろう。

しかし普段使いの環境なんだから整備しましょうよ、ということで(年末ですしね)。