macOS Montereyにアップグレードしたので、zshの設定ファイルを見直してみた

重い腰を上げて、クリーンインストール含めてmacOS Montereyにアップグレードした。
クリーンインストールのついでに、zshの設定ファオルを見直してみた。

.zshenv

.zshenvは、どの設定ファイルでも読み込まれる共通設定を入れる。なので必要最低限の記述を入れておく。

#----
# locale
#----
export LC_ALL=ja_JP.UTF-8


#----
# load
#----
if [[ -n $ZSH_VERSION ]]; then
  source $HOME/.zshrc
fi

ロケール設定を日本語/Unicodeにする指定はいらないかもしれないけどお試しに。

下の環境変数「$ZSH_VERSION」はzshのバージョンを取得している。
nオプションで文字列の長さが0でなければ.zshrcを実行するよう設定。(例えばzshを使っていなければバージョンを取得できずに空文字が返るので.zshrcは実行されない)
注意点として、zshではなくbashを使っている場合には「$BASH_VERSION」になる。

.zprofile

普段通りに.zshrcを読み込む。

#----
# load
#----
if [ -f $HOME/.zshrc ]; then
  source $HOME/.zshrc
fi

以前の記述が「. ~/.zshrc」だったので、今回は勉強がてら「source $HOME/.zshrc」に変更。
環境変数「$HOME」はログインユーザーのホームディレクトリを取得。
「.」と「source」はLinuxのディストリビューションによっては若干違いがあるらしい。一見でわかりやすい「source」を使用することにした。

.zshrc

historyコマンドの履歴管理を見直してみた。

#----
# history
#----
# 保存しないコマンドを設定(書き込み時)
HISTORY_IGNORE="(ls|cat|less|cd|pwd|exit|which)"

# 保存しないコマンドを設定(メモリ)
zshaddhistory() {

  local line=${1%%$'\n'}
  local cmd=${line%% *}

  [[

  # コマンドライン全体が4文字以下なら保存しない
  ${#line} -ge 5

  && ${cmd} != ${~HISTORY_IGNORE}

  ]]

}

# historyコマンドは保存しない
setopt hist_no_store

# historyに追加されるコマンドが古いものと重複したら保存しない
setopt hist_ignore_all_dups

# スペースで始まるコマンドは保存しない
setopt hist_ignore_space


#----
# brew
#----
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH
export PATH=/usr/local/Cellar:$PATH

「HISTORY_IGNORE」には指定のコマンドを履歴に残さないようにした。
ターミナルでのhistoryコマンドを残さない場合には「HISTORY_IGNORE」の中にhistoryコマンドを追加するのではなく「setopt hist_no_store」を設定する。

bashではなくzshだと「HISTORY_IGNORE」だけではメモリ側でコマンド履歴が残るので、zshaddhistoryを設定。
関数内で変数スコープ「line」で末尾の改行を取り除く。
最初の判定では文字数で判定し、コマンドライン全体が4文字以下なら保存しないよう設定。(lineの頭に#を付けて文字数を取得)
「HISTORY_IGNORE」はパターン検索するよう設定している。

最後にはHomebrewのパスを設定。