zsh(+ dotfiles)入門
はじめに
こんにちは, @kazuです.
この記事ではzsh
の,
- インストール
- 設定方法
- dotfilesについて
- おすすめプラグイン
等について書いていきます.
対象者
この記事は, 以下のような方を読者として想定しています.
- ターミナルをカスタマイズしてみたい人
- ターミナルと仲良くなりたい人
- ターミナルでの作業効率を上げたい人
- そもそもターミナルってカスタマイズ出来るの?って人
すでに自分でいろいろカスタマイズしている方には物足りない記事となることをご了承下さい.
この記事でやること
-
zsh
について -
zsh
のインストール - シェルの変更
-
.zshrc
の記述 dotfiles
- 個人的おすすめ設定
- 最後に
zsh
について
まずは本記事のメインであるzsh
について軽く触れておきます.
zsh
とは, シェルの一種であり, 簡単に言うとMacとかのターミナル上で動いているアレの一種です.
あの黒い画面ですが, 実は中身のシェルを何にするかで使い勝手が変わってきます.
シェルには様々な種類があり, zsh
以外にも,
bash
fish
csh
Nu Shell
などがあります.
上述の通りの本記事の対象読者であれば, 現在bash
かzsh
を使用していると思います.
linuxやWSL等でlinux環境,あるいはCatalina以前のMac OS Xであればbash
がデフォルトであり,
Catalina以降のMac OS Xではzsh
がデフォルトとなっています.
両者の違いですが, 簡単に言うとbash
の拡張的な位置づけにあたるものがzsh
となっています.
そのため, 現在bash
を使っている人でも, 特にこだわりが無いのであればbash
に移行してしまっても良いように思います.
両者の細かい比較などは, [zsh bash 違い]でググればたくさん出てきますので, 本記事では割愛します.
zsh
のインストール
Mac
の場合
brew
を使ってインストール出来ます.
brew install zsh
Linuxの場合
apt
(Ubuntu等), yum
(CentOS)を使ってインストールします.
sudo apt install zsh
# または
sudo yum install zsh
確認
which
コマンドで, zsh
がインストールされたpathを調べます.
which zsh
# -> /usr/bin/zsh 等出ればOK
ログインシェルとして使えるように設定
/etc/shells
というファイルの中に, whichコマンドで表示されたパスが無ければ追記します.
# /etc/shellsの中身確認
cat /etc/shells
# catの出力にzshのパスが無ければ
sudo vim /etc/shells
# で末尾にwhichコマンドの出力のパスを追記する
シェルの変更
続いて, 先程インストールしたzsh
を, chsh
コマンド( ch ange sh ell)でログインシェルに設定します.
先程のwhich
コマンドの出力を指定します.
chsh -s /usr/bin/zsh
一回ログアウトし, 再度ターミナルを開いて以下のような画面が出ればzsh
で起動しています.
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~). This function can help you with a few settings that should
make your use of the shell easier.
You can:
(q) Quit and do nothing. The function will be run again next time.
(0) Exit, creating the file ~/.zshrc containing just a comment.
That will prevent this function being run again.
(1) Continue to the main menu.
(2) Populate your ~/.zshrc with the configuration recommended
by the system administrator and exit (you will need to edit
the file by hand, if so desired).
--- Type one of the keys in parentheses ---
この画面では, zsh
の初期設定をするかどうか聞かれていますが,この後手動で設定していくので q
を押して画面を閉じます.
ちなみに,選択肢は以下の通りです.
-
q
: 何もせずにこの画面を抜ける. -
0
: ほぼ空の~/.zshrc
を作成して抜ける. -
1
: メインメニューに移動する.(対話的に設定が始まります.) -
2
: システムおすすめの設定で.zshrc
を作成する.
.zshrc
の記述
zsh
をログインシェルとして設定が出来たので, 次は.zshrc
に設定を書き込んでいきます.
.zshrc
は, bash
で言うところの.bashrca
のようなもので, コマンド履歴や補完の仕方などについて記述していきます.
以下は僕の.zshrc
から基本的な部分を抜粋してきたものです.
オプション等については, ここ や ここ に詳しいドキュメントがあります.
最初からいろいろ設定するのは大変だと思うので, コピペから初めて都度ドキュメントを見て自分好みに変えていくと良いと思います.
では, 以下の内容で.zshrc
を作成し, ホームディレクトリに保存してください.
################################# HISTORY #################################
# history
HISTFILE=$HOME/.zsh-history # 履歴を保存するファイル
HISTSIZE=100000 # メモリ上に保存する履歴のサイズ
SAVEHIST=1000000 # 上述のファイルに保存する履歴のサイズ
# share .zshhistory
setopt inc_append_history # 実行時に履歴をファイルにに追加していく
setopt share_history # 履歴を他のシェルとリアルタイム共有する
################################# COMPLEMENT #################################
# enable completion
autoload -Uz compinit && compinit
# 補完候補をそのまま探す -> 小文字を大文字に変えて探す -> 大文字を小文字に変えて探す
zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' '+m:{[:upper:]}={[:lower:]}'
### 補完方法毎にグループ化する。
zstyle ':completion:*' format '%B%F{blue}%d%f%b'
zstyle ':completion:*' group-name ''
### 補完侯補をメニューから選択する。
### select=2: 補完候補を一覧から選択する。補完候補が2つ以上なければすぐに補完する。
zstyle ':completion:*:default' menu select=2
################################# OTHERS #################################
# automatically change directory when dir name is typed
setopt auto_cd
# disable ctrl+s, ctrl+q
setopt no_flow_control
ファイルを保存したら,
source ~/.zshrc
を実行して, 保存した.zshrc
を読み込んで適応させます.
設定が反映されていれば, ls
やcat
コマンドでタブ補完を行った時にfiles
のように補完の種類が表示されます.
下の画像では, 自分の環境でls
でタブ補完を行った時のスクリーンショットです.
external command
やalias
のように, 種類ごとに補完の候補が表示されていることが解ると思います.
これで基本的な.zshrc
の設定を行うことが出来ました.
dotfiles
dotfiles
とは
続いて, dotfiles
について説明していきます.
先程作成した.zshrc
ですが, 長く使っていると
- 他の環境でも同じ設定をしたい
- バージョン管理したい
などの要望が出てくると思います.
そういう時に便利なのがdotfiles
です.
dotfiles
とは, 簡単に言うと「設定ファイルを一元管理しよう」という概念(?)です.
専用のソフトウェアが有るわけではありませんが,
-
.zshrc
などの設定ファイルを - 一元的にバージョン管理し,
- 簡単に環境の再現を可能にする
ことを一般的にdotfiles
といいます.
.zshrc
の他にも, .vimrc
や.tmux.conf
などの設定ファイルもdotfiles
で一緒に管理することが多いです.
dotfiles
は, 基本的に
- 管理したいファイルを1つのディレクトリにまとめる
- gitで管理出来るようにする
- 設定ファイルを所定の位置に配置するスクリプトを書く
という3つの手順が必要となります.
実践
では, 実際に先程作成した.zshrc
をdotfiles
で管理出来るようにしましょう.
管理したいファイルを1つのディレクトリにまとめる
まずは設定ファイルを纏めておくディレクトリを作成します.
ここでは, 自分のホームディレクトリ直下に作成します.
mkdir ~/dotfiles
続いて, 管理したいファイル(今は.zshrc
)をdotfiles
ディレクトリに移動させます,
mv ~/.zshrc ~/dotfiles/
# 確認
ls -la ~/dotfiles
# -> .zshrcがあればOK
gitで管理出来るようにする
不具合がある場合や, 設定が気に食わない時に気軽に前の設定に戻したり出来るように, gitで管理します.
cd dotfiles
git init
git add .zshrc
git commit -m "init"
必要に応じてgithub
でレポジトリを作っておくと便利です.
設定ファイルを所定の位置に配置するスクリプトを書く
.zshrc
をdotfiles
に移動させたのは良いですが, .zshrc
はホームディレクトリ直下に置く必要があり, このままでは設定を読み込んでくれません.
そこで, dotfiles/.zshrc
のシンボリックリンクをホームディレクトリに配置します.
ln -sv ~/dotfiles/.zshrc ~/
# 確認
ls -la ~/
# .zshrc のシンボリックリンクがあればOK
上記のようにln
コマンドを利用すればシンボリックリンクの配置が出来ます.
実際は, 環境の再現を簡単に行えるように, 設定ファイルを配置する以下のようなスクリプトを書いていたほうが楽です.(.zshrc
と.tmux.conf
を配置する場合の例)
#!/bin/bash
# 配置したい設定ファイル
dotfiles=(.zshrc .tmux.conf)
# .zshrc と .tmux.conf という設定ファイルのシンボリックリンクを
# ホームディレクトリ直下に作成する
for file in "${dotfiles[@]}"; do
ln -svf $file ~/
done
このようなスクリプトを作成した場合は, dotfiles
の中で
# 初回は実行権限の付与が必要
chmod +x deploy.sh
# スクリプトを実行しシンボリックリンクを一気に作成する
./deploy.sh
とするだけで簡単にシンボリックリンク作成が行えます.
このスクリプトもgit add
してコミットしておいてください.
後は設定ファイルを編集するたびにきちんとコミットしておけば, 安心してカスタマイズが出来ます.
個人的おすすめ設定
とりあえず前項で基本的な設定・構築が終わったので, ここからは僕が気に入っている設定(プラグイン)について紹介していきます.
zdharma/zinit
まず, 他のプラグインの前に, zinit
を入れておく事をおすすめします.
zinit
は, いわゆるプラグイン管理のためのプラグインです.
zinit
に限らずですが, プラグイン管理ツールを使うことで,
- プラグインをコード上で管理できる.
- プラグインのインストールを手軽に行える.
- 何より設定ファイルを
dotfiles
で管理できる.
などのメリットがあります.
インストール方法
基本的には以下のように公式のインストール方法に従えばOKです.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
インストール中に, いくつかAnnexes
(プラグインのようなもの)をインストールするかと聞かれます.
Annexes
については, ここに説明があります.
僕は要らないのでn
を押してキャンセルしました.
インストールが終わると,.zshrc
最下部に以下のような記述が追加されます.
### Added by Zinit's installer
if [[ ! -f $HOME/.zinit/bin/zinit.zsh ]]; then
print -P "%F{33}▓▒░ %F{220}Installing %F{33}DHARMA%F{220} Initiative Plugin Manager (%F{33}zdharma/zinit%F{220})…%f"
command mkdir -p "$HOME/.zinit" && command chmod g-rwX "$HOME/.zinit"
command git clone https://github.com/zdharma/zinit "$HOME/.zinit/bin" && \
print -P "%F{33}▓▒░ %F{34}Installation successful.%f%b" || \
print -P "%F{160}▓▒░ The clone has failed.%f%b"
fi
source "$HOME/.zinit/bin/zinit.zsh"
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit
### End of Zinit's installer chunk
プラグインを追加する時は, この追加された箇所より下に決められた構文で記述していきます.
このまま.zshrc
に書いていっても良いのですが, ファイルが肥大化しそうなので別ファイルに分けましょう.
僕は以下のようなファイル構成にしています.
e89b547847c7% tree -a dotfiles
dotfiles
|-- .zshrc
`-- zsh
|-- config.zsh
`-- plugins.zsh
1 directory, 3 files
まず,zsh/config.zsh
には, 「.zshrc
の記述」の項で述べた内容をそのまま書いています.
そして,zsh/plugins.zsh
には, プラグイン追加のための設定を記述しています.
最後に, それらの2つのファイルを, .zshrc
から読み込むような設定にしています.
従って, 最終的な.zshrc
の中身は以下のようになっています.
### Added by Zinit's installer
# 上記と同じなので省略
### End of Zinit's installer chunk
SCRIPT_DIR=$HOME/dotfiles
source $SCRIPT_DIR/zsh/plugins.zsh
source $SCRIPT_DIR/zsh/config.zsh
# 設定の反映
source ~/.zshrc
同様にエイリアスを記述するためのalias.zsh
なんかも作っています.
plugins.zsh
の記述の仕方は, 必要に応じてこれ以降の項で説明します.
詳しく知りたい方は公式wikiをご参照ください.
romkatv/powerlevel10k
まず最初におすすめしたいのは, powerlevel10k
(以下p10k
)です.
p10k
とは, 以下の画像のようにターミナルの見た目を変えるプラグインです.
(画像はromkatv/powerlevel10kより)
p10k
を入れることで,
- 黒い画面をカラフルに出来る(!!)
-
git
のステータスを表示できる - 現在時刻を表示できる
- その他, PCの情報(CPU使用率やメモリ使用率等)も表示できる
などのメリットがあります.
ぶっちゃけ見た目に関しては好みがあると思いますが, コマンドを打たなくてもgit
のステータスがひと目で確認できるところが気に入っています.
インストール方法
基本的にはzsh/plugins.zsh
に記述するだけでよいのですが, p10k
に関してはフォントの設定が推奨されています.
ターミナルにNerd Fonts
という種類のフォントを設定することにより, アイコンなどが表示できるようになります.
フォントのインストール
普通はNerd Fonts
の中から好きなものを選べばよいのですが, 我々は日本人なので日本語に対応してくれているフォントを選択する必要があります.
僕は, こちらで紹介されている, Hack Gen
のHackGenNerd Console
を使用しています.
フォントをPCにインストールした後に, お使いのターミナルの設定画面からHackGenNerd Console
を指定してください.
plugins.zsh
に追加
フォントのインストールが終わったら, zsh/plugins.zsh
を記述していきます.
書く内容は, 公式に従います.
zinit ice depth=1; zinit light romkatv/powerlevel10k
この1行を追加したら, 設定ファイルをリロードして設定を反映させます.
source ~/.zshrc
すると, p10k
のダウンロードが始まり, 続けて初期設定が対話的に行われます.
「この記号がひし形に見えるか?」等表示に関する質問や, 好みのスタイルについての質問が表示されるので, 指示に従って答えていけば大丈夫です.
初期設定が終わると, コンソールの表示が以下のようにカラフルになります(質問にどう答えたかによります.)
無味乾燥だったコンソールが少し賑やかになりましたね!!
dotfiles
の管理下に移す
設定ファイルをさて, p10k
の設定ファイルは, ~/.p10k.zsh
というパスで作成されます.
見た目を弄りたかったらこのファイルを書き換えるのですが, その前にこれもdotfiles
の管理に入れておきましょう.
mv ~/.p10k.zsh ~/dotfiles/zsh/p10k.zsh #あえてファイル名先頭のピリオドを消しています.
# 確認
# tree -a ~/dotfiles
# dotfiles
# |-- .zshrc
# `-- zsh
# |-- config.zsh
# |-- p10k.zsh
# `-- plugins.zsh
#
# 1 directory, 4 files
次に, .zshrc
を編集します.
実は, p10k
を入れた時点で最下部に以下のような記述が追記されています.
# 前略
source $SCRIPT_DIR/zsh/plugins.zsh
source $SCRIPT_DIR/zsh/config.zsh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
この部分は, ~/.p10k.zsh
があれば読み込むという挙動なのですが, 今はdotfiles/zsh/p10k.zsh
に移動させたので以下のように書き換えます.
# 前略
source $SCRIPT_DIR/zsh/plugins.zsh
source $SCRIPT_DIR/zsh/config.zsh
source $SCRIPT_DIR/zsh/p10k.zsh # <- 変更箇所
これでp10k
の設定ファイルもdotfiles
で管理できるようになりました.
p10k.zsh
を編集する
ここはお好みですが, 簡単にp10k.zsh
ファイルを変更しておきます.
とりあえず,
- cpu負荷
- メモリ負荷
- ストレージ使用容量
を表示させようと思います.
お好きなエディタでdotfiles/zsh/p10k.zsh
を開いてください.
30行目付近の,
# The list of segments shown on the left. Fill it with the most important segments.
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
os_icon # os identifier
dir # current directory
vcs # git status
prompt_char # prompt symbol
)
と書かれた箇所が, プロンプトの左側に表示される情報で, その下の長いセグメントが右側に表示される情報です.
以下抜粋
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
# 省略
# load # CPU load
# disk_usage # disk usage
# ram # free RAM
# 省略
)
この中の,
- load
- disk_usage
- ram
をそれぞれコメントアウトを外して設定のリロードを行えば, コンソールにそれらの情報を表示させることが出来ます.
画像のように, 右側にそれぞれの情報が増えていると思います.
同様の手順で自分好みに見た目をカスタマイズすることが出来ます.
変更をコミットして, p10k
の設定は終わりです.
長くなってきたので,次のプラグインからはサクサク行きます.
zdharma/fast-syntax-highlighting
続いてのおすすめプラグインは, zdharma/fast-syntax-highlightingです.
これは, その名の通りコマンドに対してシンタックスハイライトをしてくれるプラグインです.
(画像はzdharma/fast-syntax-highlightingより引用)
以下の画像と, p10k
の項で貼ったスクリーンショットを見比べると, シンタックスハイライトが効いていることが解ると思います.
有効なコマンドや引数の場合にハイライトが効くので地味に便利です.
インストール
zinit light zdharma/fast-syntax-highlighting
追加後にsource ~/.zshrc
することで自動的にダウンロードされます.
zsh-users/zsh-autosuggestions
以下の画像のように, 入力中のコマンドと一致するコマンドを履歴から探してサジェストしてくれます.
1回目のecho
コマンドの後に, e
と入力するだけでecho
コマンドを引数とともにサジェストしてくれています.
インストール
zinit light zsh-users/zsh-autosuggestions
bindkey '^j' autosuggest-accept
1行目はプラグインのインストールのための記述で,
2行目がサジェストを受け入れるためのキーバインドを設定しています.
例えば, 上記の画像のようにサジェストされた状態で, <Control + j>でサジェストを受け入れるように設定しています.
paulirish/git-open
以下のようにして現在のgitレポジトリをブラウザで開いてくれます.
git open
他にもいろいろな開き方があるので, ぜひ公式githubを見てみてください.
インストール
zinit light paulirish/git-open
sharkdp/bat
bat
に関しては別のzsh
のプラグインではありませんが, 便利なのでついでに紹介しておきます.
bat
は, 簡単にいうと見やすいcat
です.
上記のようにシンタックスハイライトが効く他, 長いファイルだとless
みたいにページャー的に表示してくれたりもします.
インストール
zinit ice as"program" from"gh-r" mv"bat* -> bat" pick"bat/bat"
zinit light sharkdp/bat
# 以下はただのエイリアス設定
if builtin command -v bat > /dev/null; then
alias cat="bat"
fi
さて, 先程までと記述方法が変わっています.
このように書くことで, バイナリとしてダウンロードして, pathを通すことが出来ます.
実際にダウンロードするものを指定しているのは2行目の
zinit light sharkdp/bat
ですが, 1行目でそれに対しいろいろオプションをつけてます.
-
ice
: 次の行に対してオプションを付与する -
as"program"
:zsh
のソースファイルではなく,コマンドとして扱う -
from"gh-r"
: githubのリリースからダウンロードする -
mv
: ダウンロードしたものをリネームする -
pick
: pathを通すものの指定
このように, zsh
のプラグインに限らず, githubのリリースで配布するものもzinit
で管理することで, 容易に環境復元が可能になります.
最後に
ちょっと想定より長くなってしまったので, とりあえずこのへんで終わりにしようと思います.
僕は半年掛けてちょこちょこカスタマイズしていっているのですが, まだまだ改善の余地があるなぁと感じています.
ある意味沼にハマりかけている僕のdotfiles
はこちらになります.
良ければ参考にしてください.
さらに, dotfiles
を構築したり再現性を確かめたりするための環境を作るdocker-compose
も置いておくので良かったら使ってください.
それでは, 良いzsh
ライフを!!
追記欄
zinit
のプラグイン遅延読み込み
コメントにてzinit
のwait
オプションとlucid
オプションをおすすめして頂きました.
-
wait
: プラグインを遅延読み込みすることでプロンプトの起動を速くする. プラグインの読み込みが終わるまでそのプラグインは有効にならないが,その分プロンプトの起動を速くなる. -
lucid
:wait
していたプラグインが読み込まれた時に出てくるLoaded <plugin name>
というメッセージを非表示にする.
wait
オプションは,条件とともに指定可能で,wait"1"
ならば起動後1秒後から読み込みが開始されます. (wait
はwait"0"
と同義)
さらに読み込む順番等も指定できます.詳しくは公式wiki.
p10k
のinstant promptモード
同じくp10k
のinstant promptについても教えていただきました.
こちらは,zsh
の起動を高速化してくれるモードです.
githubのレポジトリでは,
Powerlevel10k can remove Zsh startup lag even if it's not caused by a theme.
(p10k
はzsh起動時の遅延を無くすことが出来るぜ,たとえそれがテーマに起因する遅延じゃ無くともな!)
と書いてあるので,恐らくp10k
の設定のみならず他のプラグイン由来の遅延も解消してくれます.
こちらを有効にするには,
.zshrc
の最初に以下の設定(公式から引用)を書き込みます.
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
上記にコメントアウトされている通りなのですが,対話的に入力を求める処理はこの部分より上に書く必要があります.
起動時の遅延が気になるという方はぜひ2つの設定を行ってみてください.
Discussion
このシェルスクリプトだと、自分自身にシンボリックリンクを貼るという謎な挙動になる気がします。こんなふうにしてみるとうまくいきました。