初心者向け .zshrc: とりあえず設定してみよう

##
先日、後輩のターミナルを覗いたら真っ黒背景に白文字オンリーなターミナルで作業をしていました。

![白黒ターミナル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/0505378c-8ba4-1e71-63e4-b2001315cbc9.png)

Macを使用しているので`zsh`環境ですね。
「それ、見にくくないか？」と思い、昔使ってた`.zshrc`をプレゼントしました。
少し早いですが後輩へのクリスマスプレゼントです。
今回はそれを公開しておきます ~~(手抜き)~~。

とりあえず、ターミナル初心者で同じ様な白黒画面の人は設定してみてください。
そのあとで、細かいところは自分で調べたり設定を調整したりすることで、知識の向上に繋がります。
自分で作業しやすい環境を作る意識ができるといいですね。

設定できると以下の様な感じになります。
Gitのブランチ名の表示に加えて、状態を色で教えてくれています。

![スクリーンショット 2024-12-19 10.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/d00b5ef6-1855-bcbb-8699-48dd6350e39c.png)

## .zshrc

※ 見返したら重複があったりしたのでもろもろ整理しました。(2024/12/20)

```zsh
#!/bin/zsh
export LANG='ja_JP.UTF-8'
export LC_ALL='ja_JP.UTF-8'
export LC_TIME='en_US.UTF-8'
export LC_MESSAGES='ja_JP.UTF-8'

## PATH
export PATH=/usr/bin:/usr/local/bin:/usr/local/sbin:$HOME/bin:$PATH

## ヒストリ設定
HISTFILE=$HOME/.zsh-history
HISTSIZE=100000
SAVEHIST=100000
setopt extended_history       # zsh の開始, 終了時刻をヒストリファイルに書き込む
setopt share_history          # ヒストリを共有
setopt hist_verify            # ヒストリを呼び出してから実行する間に一旦編集
setopt hist_ignore_dups       # 重複を無視
zstyle ':completion:*' history-size $HISTSIZE
zstyle ':completion:*' save-history $SAVEHIST

## カラー設定
export TERM=xterm-256color
export LSCOLORS=ExFxCxdxBxegedabagacad
export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
export ZLS_COLORS=$LS_COLORS

## 補完候補をカラー表示
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([%0-9]#)*=0=01;31'
zstyle ':completion::complete:*' use-cache true

## プロンプトにカラーを使用する
autoload -U colors; colors

## 表示毎にPROMPTで設定されている文字列を評価する
setopt prompt_subst

## プロンプト表示設定
function {
  # ホスト名とディレクトリ名を表示
  PROMPT="%{${fg[green]}%}%n@%m %{${fg[yellow]}%}%3~%{${reset_color}%} "
  # コマンドの続きを表示する際のプロンプト
  PROMPT2="%{${fg[green]}%}%_%%%{${reset_color}%} "
  # スペルミスを修正する際のプロンプト
  SPROMPT="%{${fg[green]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
  # リモートホストの場合はホスト名を表示
  [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
  RPROMPT='`check_git_status`'
}

## gitのbranch名とstatus表示
function check_git_status {
  local name st color

  # .gitディレクトリ内での実行をスキップ
  if [[ "$PWD" =~ '/\.git(/.*)?$' ]]; then
    return 0
  fi

  # gitのbranch名を取得
  name=$(git symbolic-ref HEAD 2> /dev/null | sed 's!refs/heads/!!')

  # ブランチ名が空の場合はスキップ
  if [[ -z $name ]]; then
    return 0
  fi

  # gitのステータスを取得
  st=$(git status --short 2> /dev/null)
  # ステータスに応じた色を設定
  case "$st" in
    "") color=${fg[green]} ;;           # Status clean
    *"\?\? "* ) color=${fg[yellow]} ;;  # Untracked
    *"\ M "* ) color=${fg[red]} ;;      # Modified
    * ) color=${fg[cyan]} ;;            # Added to commit
  esac

  echo "[%{$color%}$name%{$reset_color%}]"
}

## 補完機能を初期化して有効化
autoload -U compinit promptinit; compinit
## コマンドにsudoを付けても補完
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
## スペルチェック
setopt correct
## TAB で順に補完候補を切り替える
setopt auto_menu
## 補完候補を一覧表示
setopt auto_list
## 補完候補を詰めて表示
setopt list_packed
## 補完候補一覧でファイルの種別をマーク表示
setopt list_types
## 最後のスラッシュを自動的に削除しない
setopt noautoremoveslash
## 大文字，小文字を区別しないで補完（大文字は開始は大文字限定）
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
## カッコの対応などを自動的に補完
setopt auto_param_keys
## --prefix=/usr などの = 以降も補完
setopt magic_equal_subst
## 出力の文字列末尾に改行コードが無い場合でも表示
unsetopt promptcr
## ビープを鳴らさない
setopt nobeep
## ファイル名で #, ~, ^ の 3 文字を正規表現として扱う
setopt extended_glob
## ファイル名の展開で辞書順ではなく数値的にソート
setopt numeric_glob_sort
## 出力時8ビットを通す
setopt print_eight_bit
```

## 設定方法
ホームディレクトリ直下に`.zshrc`を作成します。
既存の設定がある人は注意してマージしてください(特にPATH設定)。
ファイルの中身が空の人は何も気にせず設定を配置していただいてOKです。
設定が完了したらターミナルを再起動するか、以下のコマンドで`.zshrc`を読み込みませます。
```
source ~/.zshrc
```

ちなみに自分は`zsh`ではなく、`fish`を使用しています。

https://fishshell.com/

興味がある人はこちらも調べてみてください。