はじめに

ターミナルをよく使うようになってきた。数年前にターミナルを初めて触ったときは、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の定番の補完システムで、過去に打ったコマンドを提案してくれる。一度打ったコマンドは簡単に打ち直すことができるようになる。

zsh-autosuggestions-screenshot

Homebrewでインストール

brew install zsh-autosuggestions

.zshrcの末尾に追記

source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh

zsh-syntax-highlighting

zsh-syntax-highlightingもZshの定番ツールの1つで、コマンドに色をつけてくれる。間違ったコマンドでは赤、正しいコマンドでは緑色になるのでコマンドの初手のスペルミスが減る。

zsh−syntax-highlighting-screenshot

Homebrewでインストール

brew install zsh-syntax-highlighting

.zshrcの末尾に追記

source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

fzf

fzfはリアルタイム曖昧検索ができるツールである。何にでも使える高機能検索であるが、Zshとの統合機能がついている。

fzf-official-screenshot

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ブランチや使用言語、バージョンなどをいい感じに表示してくれる。入れるだけのゼロ設定でいい感じに情報量が増えるというのが嬉しいポイント。

starship-screenshot

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

fastfetch-screenshot

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...'

typewriter

起動時に古の2chのコピペWelcome to underground...がタイプライター風の演出で表示される。起動に1秒の遅延が入るがキーボード入力で演出は強制終了する。

採用しなかった選択肢

Oh My Zsh


Oh My ZshはZshの設定を簡便にリッチにするための人気フレームワークだが、不要な設定も多く入りそうであること、ちょっと重くなりそうであることから採用を見送った。

compinit

Zshのタブ補完機能をフルに解放する設定。

autoload -U compinit
compinit

fzfやautosuggestionsで十分であると思ったのと、起動が若干遅くなるようなので見送った。

おわりに

設定としてはこれくらいだろうか。後はaliasやfunctionに頻用動作を順次入れていけば日に日にターミナルは使いやすくなっていくだろう。