はじめに
ターミナルをよく使うようになってきた。数年前にターミナルを初めて触ったときは、cdでディレクトリを移動すると聞いて「こんなものは人間のやることではない」と思った。慣れとは恐ろしいもので今となってはターミナルを全く触らない日はなくなってしまった。よく考えたら、初めてPCに触った小学生の時にキーボードでローマ字を打つと聞いて「こんなものは人間のやることではない」と思っていた気がする。ただし、慣れだけの問題ではなくターミナルを使いやすくする設定を知るようになったことも大きいだろう。本記事では、Mac標準のZshの設定ファイル.zshrcのカスタマイズに関してまとめる。
環境
- M1 Macbook Air
- ターミナルエミュレータ:Ghostty
設定ファイルのためのalias
Zshの設定は.zshrcというファイルに書き込まなければならない。まずは、設定をしやすくするための設定をする。.zshrcはターミナルを開くたびに下記コマンドで読み込まれる。
source ~/.zshrcつまり、設定変更後にこのコマンドを打てば設定が読み込まれて更新される。alias(別名)を登録して、すぐに読み込めるようにする。
alias zs='source ~/.zshrc'この設定でzsをターミナルで押すと.zshrcが読み込まれるようになる(キーはzsでなくても何でも良い)。次に、.zshrcを編集するためのaliasを登録する。
alias ze='nvim ~/.zshrc'Neovimで.zshrcを開くaliasを作った。もちろんエディターはNeovimでなくても良い。
この時~はホームディレクトリを意味する。ホームディレクトリは$HOMEという変数でも良い。ただし一重引用符の中では変数は展開されない(二重引用符の中では展開される)し、~はコマンドでは認識されるが変数のように展開されないというルールが存在する。
ここでルール分かっています感を出して書くと下記の様になる。
export EDITOR='nvim'
alias ze="$EDITOR $HOME/.zshrc"
alias zs="source $HOME/.zshrc"zsh-autosuggestions
zsh-autosuggestionsはZshの定番の補完システムで、過去に打ったコマンドを提案してくれる。一度打ったコマンドは簡単に打ち直すことができるようになる。

Homebrewでインストール
brew install zsh-autosuggestions.zshrcの末尾に追記
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zshzsh-syntax-highlighting
zsh-syntax-highlightingもZshの定番ツールの1つで、コマンドに色をつけてくれる。間違ったコマンドでは赤、正しいコマンドでは緑色になるのでコマンドの初手のスペルミスが減る。

Homebrewでインストール
brew install zsh-syntax-highlighting.zshrcの末尾に追記
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zshfzf
fzfはリアルタイム曖昧検索ができるツールである。何にでも使える高機能検索であるが、Zshとの統合機能がついている。

Homebrewでインストール
brew install fzf.zshrcに下記を記載
# Set up fzf key bindings and fuzzy completion
source <(fzf --zsh)解放される機能は3つ
- Ctrl+R: コマンド履歴検索
- Ctrl+T: ファイル名検索
- Alt+C: ファイル名検索→ディレクトリ移動
fzfのZsh統合機能を使えば、うろ覚えでもコマンド実行やディレクトリ移動ができてしまう。
Starship
Starshipはシェルの定番プロンプトで、ディレクトリのGitブランチや使用言語、バージョンなどをいい感じに表示してくれる。入れるだけのゼロ設定でいい感じに情報量が増えるというのが嬉しいポイント。

Homebrewでインストール
brew install starship.zshrcに記載
eval "$(starship init zsh)"edit-command-line
コマンドを打つ時に特定のキーを打つとエディタが起動してエディタ内でコマンドが打てる。SNSで教えていただいた設定。長いコマンドの誤送信防止に有効。
エディタは$EDITOR変数に指定したものが使用される。
export EDITOR='nvim'
autoload -Uz edit-command-line
zle -N edit-command-line
bindkey '\ee' edit-command-lineこの例ではEsc→eでエディターが起動する。
beginning-search
上述のzleの機能が他にないか検索したらでてきた機能。コマンド履歴は通常↑↓キーで遡れるが、途中まで打った場合でも有効になる。例えばgitと打った状態で↑↓を押すと過去のgitコマンドに遡れる。
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey '^[[A' up-line-or-beginning-search
bindkey '^[[B' down-line-or-beginning-search参考:ZSH: search history on up and down keys? - Unix & Linux Stack Exchange
aliasやfunction
よく使うコマンドはaliasで別名登録にすると良い。また、複雑な機能はfunctionで自動化することも可能だ。例えば、Gitリポジトリのrootディレクトリ、なければフォールバックでカレントディレクトリを返すfunctionと、そこにcdで移動するaliasを示す。
alias gr='cd "$(git_root)"'
function git_root() {
git rev-parse --show-toplevel 2>/dev/null || pwd
}この程度ならaliasやfunctionにしなくても良いかもしれないが、よく使う動きがあるなら自動化や短縮が可能であるということだ。ちなみにfunctionという宣言の表示は合ってもなくても良いらしい。
起動時に実行するコマンド
.zshrcにコマンドを記載しておくと、起動時に実行してくれる。
fastfetch
例えばPCの情報を表示するfastfetch。

Homebrewでインストール
brew install fastfetch.zshrcに記載
fastfetchメッセージを表示
シンプルに
echo 'message'日付表示
dateなどが考えれれるが、折角なので少しfunctionで凝ったことをしてみる。一文字ずつ文字を押し出すタイプライター風のfunctionだ。
_typewriter() {
local msg="$1"
for ((i=0; i<${#msg}; i++)); do
printf "%s" "${msg:$i:1}"
if read -s -t 0.04 -k 1 2>/dev/null; then
printf "%s" "${msg:$((i+1))}"
break
fi
done
printf "\n"
}
_typewriter 'Welcome to underground...'
起動時に古の2chのコピペWelcome to underground...がタイプライター風の演出で表示される。起動に1秒の遅延が入るがキーボード入力で演出は強制終了する。
採用しなかった選択肢
Oh My Zsh
Oh My ZshはZshの設定を簡便にリッチにするための人気フレームワークだが、不要な設定も多く入りそうであること、ちょっと重くなりそうであることから採用を見送った。
compinit
Zshのタブ補完機能をフルに解放する設定。
autoload -U compinit
compinitfzfやautosuggestionsで十分であると思ったのと、起動が若干遅くなるようなので見送った。
おわりに
設定としてはこれくらいだろうか。後はaliasやfunctionに頻用動作を順次入れていけば日に日にターミナルは使いやすくなっていくだろう。