127
112

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

NIJIBOXAdvent Calendar 2020

Day 15

【Zsh】大改造ターミナル環境【Zinit】

Last updated at Posted at 2020-12-14

エンジニアの必須アプリであるターミナル
どうせなら格好良くて使いやすいようにカスタマイズしたいですよね。

自分もエンジニアになりたての頃、こちらのQiitaの記事を参考にZshのフレームワークであるPreztoでターミナル環境を整えていましたが、そろそろ自分の好きなようにカスタマイズしたくなってきました。

本記事は、数あるZshプラグインマネージャの中でもターミナル起動速度が早いといわれるZinitを使用し、ターミナル環境を整えていくやり方の備忘録となります。

手順

①ターミナルアプリのiTerm2をインストール
②macOS用パッケージマネージャであるHomebrewをインストール
③HomebrewからZshをインストール
④Zsh用プラグインマネージャであるZinitをインストール
⑤Zinitで便利なプラグインをインストール

※過去に別のフレームワークやパッケージマネージャを使用している場合は、それらを事前にアンインストールしておきましょう。

例)zpreztoのアンインストール
$ rm -rf ~/.zprezto ~/.zlogin ~/.zlogout ~/.zpreztorc ~/.zprofile ~/.zshenv ~/.zshrc

参考Macにzshとpreztoのインストール&アンインストール、諸々の設定 - Qiita

①iTerm2

デフォルトのターミナルアプリだと設定できる項目が物足りないです。
そのため拡張版のターミナルアプリであるiTerm2をインストールしましょう。

公式サイトからDLする、もしくはすでにHomebrewをインストールしているならば、こちらのコマンドでcliからインストールすることもできます。

$ brew install --cask iterm2

(1) ホットキー設定

iTerm2を使うなら、これだけは絶対にやってほしい設定。
設定したキーを押すだけで、ターミナルウインドウを出したり消したりできます。

参考iTerm2のおすすめ設定〜ターミナル作業を効率化する〜 - Qiita
c1.gif

(2) 設定同期

会社の端末と私物PCで同じ設定にしたい。。
そんなときは設定ファイルをGitHubやiCloudにアップすることで、複数の端末で設定を同期できます。

参考ITerm2の設定をGitHubで共有……できんやんけ!って思ってたけどそうでもなかった - めっちゃいいタイトル思いついたんだけど風呂入ったら忘れちゃった
iterm2douki.png

②Homebrew

以下コマンドで、Homebrewがインストールされているか確かめることができます。
インストール済みの場合はHomebrewのバージョンが表示されます。

$ brew -v

(1) Homebrewインストールがまだの人

xcode-selectインストール

Homebrewを使用するためには、xcode-selectと呼ばれるコマンドラインツールが必要です。
まずはインストールされているか確かめます。

$ xcode-select -v
xcode-select version 2373.

バージョンが表示されればインストール済みです。

まだの人はこちらのコマンドでインストールできます。

$ xcode-select --install

Homebrewインストール

続いてHomebrewについて。
以下コマンドでインストールできます。公式サイトはこちら

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

バージョンが表示されれば、インストール完了です。

$ brew -v
Homebrew 2.6.0

(2) Homebrewをインストール済みの人

アップデート

ついでにやってしまいましょう。

$ brew update

参考brewのupdateとupgradeの違い - Qiita

問題チェック

brew doctorコマンドはHomebrewの問題をチェックしてくれるコマンド。
何も問題がない場合は、以下のように表示されます。

$ brew doctor
Your system is ready to brew.

参考Homebrewの問題を確認する"brew doctor"コマンドとWarning対策集[macOS] - 一馬力のメモ帳

③Zsh

macOSでは**「Catalina」バージョンから、デフォルトのシェルがBashからZsh**に変わりました。
ただし、デフォルトで入っているものは大抵古いバージョンのため、ここでは新規Zshをインストールし直すところから始めます。

(1) Zshのインストール

HomebrewからZshをインストールします。

$ brew install zsh

(2) ログインシェルの変更

シェルをインストールしただけでは、ターミナルに反映されません。
起動時にこのシェルを使用するよ!という設定が必要となります。

ログインシェルの確認

まずは現在のログインシェルの確認です。

$ echo $SHELL
/bin/zsh

特に変更を行っていない場合は、/bin/bashとか/bin/zshと出力されていると思います。
これはmacOSのデフォルトのシェルです。

こちらを先程インストールしたZshに変更しましょう。

シェルの変更設定

シェルを管理しているファイルは/etc/shellsというファイルです。
こちらに今回HomebrewでインストールしたZshのパスである、/usr/local/bin/zshを記入します。

vimで編集する場合は、rootでないと書き込み保存不可のためsudoで編集してください。

$ sudo vi /etc/shells
/etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh # 追記しました

chshコマンドでログインシェルを切り替えます。

$ chsh -s /usr/local/bin/zsh

ターミナルを再起動して、再度ログインシェルを確認します。

$ echo $SHELL
/usr/local/bin/zsh

これでログインシェルが、HomebrewでインストールしたZshに変更されました。

(3) エラーが起こる場合

権限エラー

シェルを切り替えてターミナルを立ち上げたら、以下のエラーがでてしまいました。

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?

どうやらZshの管理フォルダがinsecureになっているためのようです。

言われた通りコマンドを実行すると、insecureなディレクトリを教えてくれるため、

$ compaudit
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh

それらの権限を変更してあげましょう。

$ chmod 755 /usr/local/share/zsh/site-functions
$ chmod 755 /usr/local/share/zsh

ターミナルを再起動すると、エラーが消えているはずです。

④Zinit

※2022/10 追記

Zinitは一度プロジェクトごと削除されたため、公式の場所が変わりました。
詳細な経緯などは以下の記事が詳しいです。
zsh の zinit (旧zplugin) が消滅しちゃったよ! 経緯と解決法 - Qiita

次にZshのプラグインをインストールするためのプラグインマネージャをインストールしましょう。
不安な方は、公式を参照してください。

$ bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/zdharma-continuum/zinit/HEAD/scripts/install.sh)"

インストールが成功すると、ホームディレクトリに.zinitというフォルダが生成されているはずです。
Zinitをアクティブにするために~/.zshrcファイルを再読込みし、Zinit自身も最新化しておきましょう。

$ source ~/.zshrc
$ zinit self-update

⑤Zshプラグイン

ここからが本題です。
便利なプラグインをインストールして、快適ターミナル環境を作っていきます!

(1) テーマ設定

まずは見た目の変更です。
ここでは**Powerlevel10k**と呼ばれるZshテーマをインストールします。

プロンプトにアイコンを表示できるところがお気に入りです。
terminal.png

フォント

Powerlevel10kを使いこなすために、まずはMeslo Nerd Fontと呼ばれる推奨のフォントをインストールします。
GitHubのREADMEからインストール可能です。
https://github.com/romkatv/powerlevel10k#fonts

インストールが完了したら、ターミナルのフォント設定をMesloLGS NFに変更してください。
font.png

テーマ

次にPowerlevel10k本体をインストールします。
https://github.com/romkatv/powerlevel10k#installation

Powerlevel10kインストール
$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
$ echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc

インストール後にターミナルを再起動すると、Powerlevel10kの設定が始まります。
1項目ずつスタイルについて聞かれるので、好きな見た目を選択してください。
powerlevel10k.png
やり直したい場合は、p10k configureコマンドでもう一度始めから設定できます。

細かい設定を変更したい場合は、管理ファイルである~/.p10k.zshを直接編集してください。
ちなみに、以下コマンドで設定できるカラーの一覧を表示できます。

for i in {0..255}; do print -Pn "%K{$i}  %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done

(2) zsh-completions

zsh-completions
コマンド補完のプラグインです。
コマンドやファイル名の入力中にTabキーを押すことで、入力候補一覧を表示してくれる機能ですね。
zsh-completions.png

~/.zshrc
## コマンド補完
zinit ice wait'0'; zinit light zsh-users/zsh-completions
autoload -Uz compinit && compinit

## 補完で小文字でも大文字にマッチさせる
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

## 補完候補を一覧表示したとき、Tabや矢印で選択できるようにする
zstyle ':completion:*:default' menu select=1 
  • ~/.zshrcに設定を記述しておくことで、Zsh起動時に足りないプラグインが自動的にインストールされます。便利!
  • zinit ice wait'0';という記述。これは非同期でプラグインを読み込むオプションです。Zsh起動後すぐに必要のないプラグインを非同期で読み込むことで、ターミナル起動の初速を上げています。

参考Zplugin (zinit) を使ってみる

(3) zsh-syntax-highlighting

zsh-syntax-highlighting
コマンドラインの文字の色付けを行うシンタックスハイライトプラグインです。
syntax-highlighting.png

~/.zshrc
## シンタックスハイライト
zinit light zsh-users/zsh-syntax-highlighting

lsコマンドでハイライトが効かない場合

自分の環境だとlsコマンドでシンタックスハイライトが効かなかったのですが、GNU版のコマンド群をインストールすることで上手くいきました。

$ brew install coreutils

さらにデフォルトコマンドでGNU版のコマンドを実行できるようエイリアスを設定しておきます。

~/.zshrc
# alias
alias ls="gls --color=auto"

これでlsコマンドでもハイライトが効くようになりました。

参考bashの表示色をカスタマイズ - Qiita

(4) zsh-autosuggestions

zsh-autosuggestions
こちらも入力補完のプラグイン。コマンド入力中に過去の入力履歴を検索し、サジェストを表示してくれます。
zsh-autosuggestions.png

~/.zshrc
## 履歴補完
zinit light zsh-users/zsh-autosuggestions

サジェストのカラーも変更しておきました。
https://github.com/zsh-users/zsh-autosuggestions#suggestion-highlight-style

~/.zshrc
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=244"

(5) pecoで検索を便利にする

インタラクティブなフィルタリングツールである**peco**。
上手く使用すれば、ターミナル作業効率が跳ね上がります・・!

まずはHomebrewからpecoをインストール。

$ brew install peco

コマンド履歴検索

historyファイルに保存されているコマンド履歴を検索する設定です。
文字を入力することで、インタラクティブに履歴を絞り込むことができます。
peco-min.gif

以下コードではcontrol + Rで起動するようにしてますが、キー設定は好みで。

~/.zshrc
## コマンド履歴検索
function peco-history-selection() {
  BUFFER=`history -n 1 | tac  | awk '!a[$0]++' | peco`
  CURSOR=$#BUFFER
  zle reset-prompt
}
zle -N peco-history-selection
bindkey '^R' peco-history-selection

ディレクトリ移動(コマンド履歴)

control + Eで、過去にcdコマンドで移動したことのあるディレクトリを検索・移動できる設定です。

~/.zshrc
## コマンド履歴からディレクトリ検索・移動
if [[ -n $(echo ${^fpath}/chpwd_recent_dirs(N)) && -n $(echo ${^fpath}/cdr(N)) ]]; then
  autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
  add-zsh-hook chpwd chpwd_recent_dirs
  zstyle ':completion:*' recent-dirs-insert both
  zstyle ':chpwd:*' recent-dirs-default true
  zstyle ':chpwd:*' recent-dirs-max 1000
  zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/chpwd-recent-dirs"
fi
function peco-cdr () {
  local selected_dir="$(cdr -l | sed 's/^[0-9]* *//' | peco)"
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
}
zle -N peco-cdr
bindkey '^E' peco-cdr

ディレクトリ移動(カレントディレクトリ以下のディレクトリ)

こちらはcontrol + Xで、カレントディレクトリ以下の階層にあるディレクトリを検索・移動できます。

~/.zshrc
## カレントディレクトリ以下のディレクトリ検索・移動
function find_cd() {
  local selected_dir=$(find . -type d | peco)
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
}
zle -N find_cd
bindkey '^X' find_cd

Gitリポジトリディレクトリに移動

pecoとリポジトリ管理ツールである**ghq**を組み合わせれば、Gitリポジトリ間の移動が簡単になります。
ghq-min.gif
まずはHomebrewからghqをインストール。

$ brew install ghq

次にghqで管理するディレクトリのrootを設定します。
普段Gitリポジトリをcloneしているディレクトリを指定してください。

~/gitをrootに設定する場合
$ git config --global ghq.root ~/git

最後にこれまで同様~/.zshrcを編集します。
以下は先程設定したルートディレクトリを元に、control + GでGitディレクトリを検索・移動できる設定です。

~/.zshrc
## gitリポジトリ検索・移動
function peco-src () {
  local selected_dir=$(ghq list -p | peco)
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
}
zle -N peco-src
bindkey '^G' peco-src

(6) その他便利設定

やっておくと便利な設定です。

~/.zshrc
## 履歴保存管理
HISTFILE=$ZDOTDIR/.zsh-history
HISTSIZE=100000
SAVEHIST=1000000

## 他のzshと履歴を共有
setopt inc_append_history
setopt share_history

## パスを直接入力してもcdする
setopt AUTO_CD

## 環境変数を補完
setopt AUTO_PARAM_KEYS

参考MacBook Proが届いたのでシェルの設定をする - すだめブログ

dotfiles管理

ここまで~/.zshrcファイルを編集してきましたが、iterm2の設定と同様に、シェルの設定も他端末と同期したいですよね。

シェル設定ファイルに限らず、ホームディレクトリに存在する.(ドット)から始まる隠しファイルのことをdotfilesと呼び、それらをGitリポジトリ上で管理することで複数端末で設定を同期する手法が存在します。(dotfiles管理

今回設定した~/.zshrcファイルについても、dotfiles管理してみました。
https://github.com/obake-fe/dotfiles/blob/master/.zsh/.zshrc

設定がうまく行かないときは、上記リンク先のファイルと見比べてみてください。

参考
ようこそdotfilesの世界へ - Qiita
最強の dotfiles 駆動開発と GitHub で管理する運用方法 - Qiita

さらにカスタマイズしたい人向け

ここで紹介した以外にも、Zshには数え切れないほど様々なプラグインがあります。
興味が湧いた人は自分でカスタマイズしていき、自分好みのターミナル環境を作っていきましょう!

参考
zshの外部プラグインまとめ - Qiita
awesome-zsh-plugins | Curated list of awesome lists | Project-Awesome.org
Zinit Wiki

全体参考

127
112
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
127
112

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?