Zshの起動時間をチューニング ぱーと2

Zshの起動時間をチューニング ぱーと1のつづき。

スピードと引き換えに失われた利便性を取り戻すため、preztoをインストール/設定する。

oh my zshprezto

両者の違いを簡単に箇条書きでまとめ。
細かな事はこことか、こことか見ると良い感じ。

  • oh my zshは便利だが設定が複雑で面倒なzsh環境を簡単に用意できるためのフレームワーク
    • とっても便利だが、起動のスクリプトが遅かったり、補完も若干のラグがあってキモチヨクナイ
    • プラグインがとっても豊富
  • preztoはoh my zshをフォークして始まったもの
    • 主にスピードをカイゼンする為にコードを書きなおして別物となったらしい
    • 実際oh my zshより速く、機能的にも劣らないらしい

と、事前情報をなんとなく集め、oh my zshのもたつき具合に嫌気が指してしまったので、とりあえずpreztoに乗り換えてみる。

Preztoのインストール

まず、oh my zshが入っている場合アンインストールする。(uninstall_oh_my_zsh)

README.mdにある通りにコマンドを実行。

# クローン
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

# 設定ファイルのsymlinkを作成
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

# zshをデフォルトシェルに変更
chsh -s $(which zsh)

この時、.zshrcが既に存在する場合symlinkが作成できないので、下記をファイルトップに追記する事で対応。

if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

以上!これでとりあえず動作する。

早速起動してみると…速い!!oh my zshとは比較にならないほど速い!

設定していく

oh my zshでテーマやら、プラグイン(preztoではモジュールと呼ぶ)を利用していたので、preztoでも設定。
以下、簡単にメモ。

モジュールの概要は、modules/README.mdに記載されている。

基本的には、zstyle ':prezto:load' pmodule 'environment' 'terminal' などとして利用したいモジュールを指定するだけ。
更にそれぞれのモジュールの設定を変更したい場合、個別の設定をzstyleで指定していく。

中には互いに依存するモジュールが存在するため、読み込む順番を気をつける。

テーマ

  • prompt -lで有効なテーマを一覧する
  • prompt -p <theme> でプレビュー
    • もちろん、prompt -pの時点で、テーマ名がTAB補完される
  • ~/.zpreztorc を更新する事で設定
    • zstyle ':prezto:module:prompt' theme 'sorin'の部分を更新

oh my zshで使っていたcloudテーマがあったのでこれにしようかと思いつつ、変化が欲しかったのでsorinに決定。

Gitモジュール

  • テーマが対応していれば、有効にするだけでpromptにGitの状態が表示される
  • git logのフォーマットをここで設定可能
  • いくつものエイリアスが作成される…
  • ~/.zpreztorc で定義されている zstyle ':prezto:load' pmodulegit を追加する

Tmuxモジュール

  • zsh起動時にtmuxを自動で起動(or アタッチ)させる事ができる
  • いくつかのエイリアスが作成される
  • ~/.zpreztorc で定義されている zstyle ':prezto:load' pmoduletmux を追加する
  • zsh起動時に起動させたいので、 zstyle ':prezto:module:tmux:auto-start' local 'yes' のコメントアウトを解除

OS Xでtmuxを起動するとエラーメッセージが表示されるようで、reattach-to-user-namespaceを設定する事で回避できるらしいので、設定するべし。

(reattach-to-user-namespaceの設定で他にやりたいことがあるので、これはまたその時にやる)

OS Xモジュール

  • Mac OS Xで便利につかえるエイリアスが作成される p - 中でも Quick Lookを起動するqlは便利!この機能が欲しくて自作のaliasを使っていた
  • ~/.zpreztorc で定義されている zstyle ':prezto:load' pmoduleosx を追加する

History Substring Searchモジュール

  • 文字をタイプ後、Ctl-pなどでヒストリーを辿ると、タイプした文字にマッチした結果のみが表示されるようになる
    • 地味に便利。
  • ~/.zpreztorc で定義されている zstyle ':prezto:load' pmodulehistory-substring-module を追加する

Archive

  • zip, tar, tar.bz2 などなどの、圧縮ファイルを解凍できるfunctionが定義される
    • unarchive で大体どんなファイルでも解凍可能!
  • ~/.zpreztorc で定義されている zstyle ':prezto:load' pmodulearchive を追加する

Fasd

  • zのような、瞬間移動を提供するFasdをインタラクティブに実行できるエイリアスjを作成
  • 利用するにはFasdがインストールされている必要がある
    • brew install fasd でインストール可能
  • ~/.zpreztorc で定義されている zstyle ':prezto:load' pmodulefasd を追加する
    • オートコンプリート機能を有効にするため、completionモジュールの*後*に定義する

おわりに

Prezto良いよ!Prezto!! 欲しかった機能は網羅されていて、速くて、言う事なし。
nvm モジュール も入れたい所だが、いかんせ起動がもたつくので見送った。((誰かがnodebrew対応してくれると嬉しい限り))

前のポストと合わせて、結構な時間を費やした甲斐もあり、起動は2秒→1秒未満に改善できた 。
oh my zshは全く設定をしていなかった事もあり、機能も強化され大変便利な環境になった!

今回設定した内容はGithubにのせてます。大分更新が滞っていたので、よいきっかけになった。

SHOTA

I'm WEB developer

Tokyo, Japan http://senta.me/