🖥️

ターミナル環境改善:zshにPreztoとpureを導入する

に公開

開発やらなにやらで使い込んでいるわけでもないので、zshは特別になにかカスタマイズしなくても不都合なくほぼデフォルト状態で使用していましたが、zshプロンプトテーマをpureに変更。

pureは単体でもインストールできますが、Preztoというzshフレームワークから適用させています。また、prezto や pure の導入手順自体は公式やほかの方の既存記事とほぼ同じです。本稿では、実際に導入してハマった点や構成の考え方を中心に書いています。

環境

MacBook Pro (2019)
macOS Sequoia 15.7.3
ターミナル 2.14 (455.1)
zsh 5.9 (x86_64-apple-darwin24.0)

pureのインストール

1. Preztoのインストール

Preztoのリポジトリをダウンロードして配置

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

Preztoの設定ファイルの有効化

Prezto は .zprezto/runcoms 以下の設定ファイルを、~/.zshrc などとしてシンボリックリンクで配置します。そのため既存の設定ファイルがあるとエラーになります。私の場合~/.zshrcが既に存在していたため、まんまとエラーが出たため.zshrcをリネームしました。

  • 既存の zsh 設定がない場合や、削除しても影響が少ない場合
    → そのままリンク作成を実行して問題ありません
  • 既存の設定があり、あとから整理・復元する前提の場合
    → 一度バックアップやリネームを行い、リンク作成後に必要な設定を戻します
  • リンク作成を行わずに共存させたい場合
    .zshrc の末尾にsource "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"を追記します。リンク作成のコマンドは実行しません。
シンボリックリンクの作成、有効化のコマンド

※コマンドは一気にコピペ

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

zshを再起動(ログインシェルとして再読込)

exec $SHELL -l

プロンプトの見た目もコマンド補完も素のzshを使うよりも随分様変わりしています。デフォルトで設定されているテーマはsorinですが、pureに変更しなくてもよさそう。(三連プロンプトがカラフルでカワイイ)

2. pureの適用

気を取り直してプロンプトテーマをpureに変更します。エディタで.zpreztorcを開き以下の箇所をsorinからpureに変更。ファイル内の後半(だいたい148行目あたり)に記載されています。

# .zpreztorc
- zstyle ':prezto:module:prompt' theme 'sorin'
+ zstyle ':prezto:module:prompt' theme 'pure'

ついでにsyntax-highlighting(シンタックスハイライト)とautosuggestions(コマンド自動補完)のモジュールも設定します。モジュール名は'prompt'の前に記述。'autosuggestions''syntax-highlighting'より下に記述します。

# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'history-substring-search' \
  'syntax-highlighting' \
  'autosuggestions' \
  'prompt'

保存したら、zsh再起動

exec $SHELL -l

プロンプトが一行表示から、二行表示になりました。プロンプト記号も三連ではなくなりました。コマンド自動補完はちょっとお節介で、慣れる必要がありそう。(直近の履歴から即候補を出すし、途中でEnterを押すと似た綴りのどれを実行するか確認されます) autosuggestions、無理にモジュール有効化しなくても良いです。

01_autosuggestion.png

3. .zshrcの復元

ホームディレクトリで ls -al を実行すると、新しく .zshrc が作成されていることが分かります。
この .zshrc の内容は ~/.zprezto/runcoms/zshrc と同一のため、# Customize to your needs... 以下に、事前にリネームしておいた旧 .zshrc から必要な設定をコピーします。

※この方法は prezto 導入直後の復元手順。最終的には .zshrc を直接編集しない構成に変更しました。(後述)

4. (おまけ)zshでログイン

新規のターミナルを開くとプロンプトが「元に戻って」いました。ログインシェルの変更を試してみても設定済みといわれる……

  • コマンド
chsh -s /bin/zsh
  • 実行結果
chsh: no changes made

zshのインストールは最終手段として、いったんターミナルの設定を見直してみます。
ターミナルの設定から一般設定を確認すると、「開くシェル」の設定がなぜか明示的にbashで開くように記述されていたので、「デフォルトのログインシェル」に設定変更して無事解決。

そもそもターミナルウィンドウの名前(デフォルト設定)に「-bash」と書かれていて、新規接続時にごちゃごちゃとzshのアナウンスがトップに出力される時点で気付くべき案件でした。典型的なヒューマンミス……

  • ターミナル→設定→一般設定タブ→開くシェル
    02_humanerror.png

5. (おまけ).zshrcの管理

.zshrcだけがホームディレクトリ配下に実体としてあるのが気になるので次のように見直しました。

  1. .zshrcもシンボリックリンクにする
  2. 自分で設定した(今後する)ものは、.zshrcから分離する

.zshrcのリンク

.zshrcは再度リネームしておきます。実体ファイルは~/.zprezto/runcoms/zshrcなので、シンボリックリンクを作成します。

mv ~/.zshrc ~/.zshrc.bak
ln -s ~/.zprezto/runcoms/zshrc ~/.zshrc
  • リンクの確認(フルパス表記)
ls -l ~/.zshrc
/Users/myname/.zshrc -> /Users/myname/.zprezto/runcoms/zshrc

設定用ファイルの分離

適当な名前で設定用ファイルを作成し、個別設定はそちらを見に行くように.zshrcに記述します。

ファイルの作成

touch ~/.zshrc.local  # 任意のファイル名

エディタでzshrcを開き、設定ファイルを見るよう追記し保存

# Customize to your needs...

# 自分の設定はここにある
[[ -r $HOME/.zshrc.local ]] && source $HOME/.zshrc.local

.zshrc.localの設定(例) ※中身の整理や間違い修正も併せて実施

# --- user local settings ---
# パスの重複排除と優先順位コントロール
typeset -U path PATH
[[ -d /usr/local/bin ]] && path=(/usr/local/bin $path)

# locale
export LANG=ja_JP.UTF-8

# history behavior
setopt INC_APPEND_HISTORY
setopt SHARE_HISTORY
setopt HIST_IGNORE_ALL_DUPS

# (省略)

# --- alias
# シェルの再起動
alias relogin='exec $SHELL -l'

# などなど

.zshrcの再読み込み

source ~/.zshrc

設定を反映させるため、最後に.zshrcを再読み込みして完了です。

Discussion