👌
zshでディレクトリごとにコマンド履歴を管理する方法
はじめに
zshのコマンド履歴(history)は通常、全てのディレクトリで共有されています。しかし、プロジェクトごとに異なるコマンドを使用することが多く、ディレクトリごとに履歴を分けて管理したいケースがあります。この記事では、zshでディレクトリごとに異なる履歴を管理する方法を解説します。
メリット
- プロジェクトごとに関連するコマンドだけを履歴に表示できる
- 異なるプロジェクト間でコマンド履歴が混ざることを防げる
- 履歴検索が効率的になる
設定方法
まず、~/.zshrcに以下の設定を追加します:
# ディレクトリごとの履歴ファイルを保存するディレクトリを作成
HISTDIR="${HOME}/.zsh_history.d"
[[ ! -d "${HISTDIR}" ]] && mkdir -p "${HISTDIR}"
# カレントディレクトリが変更されたときに呼ばれる関数
function chpwd() {
local history_file="${HISTDIR}/${PWD//\//@}"
# 履歴ファイルが存在しない場合は作成
[[ ! -f "$history_file" ]] && touch "$history_file"
# HISTFILE変数を更新
HISTFILE="$history_file"
}
# 履歴の保存件数を設定
HISTSIZE=1000
SAVEHIST=1000
# 履歴を共有
setopt share_history
# 重複を記録しない
setopt hist_ignore_dups
# スペースで始まるコマンドは履歴に追加しない
setopt hist_ignore_space
# 初期設定
chpwd
動作の仕組み
-
.zsh_history.dディレクトリが作成され、ここにディレクトリごとの履歴が保存されます - ディレクトリのパスは
@記号で区切られて保存されます(例:HOME@Projects@MyApp) - ディレクトリを移動するたびに
chpwd関数が呼び出され、履歴ファイルが自動的に切り替わります
設定のカスタマイズ
履歴の保存件数を変更
HISTSIZE=2000 # メモリ上の履歴数
SAVEHIST=2000 # ファイルに保存する履歴数
追加の履歴オプション
setopt hist_expire_dups_first # 履歴を削除する必要がある場合、まず重複しているものから削除
setopt hist_find_no_dups # 履歴検索で重複したものを表示しない
setopt hist_reduce_blanks # 余分な空白を削除して保存
トラブルシューティング
履歴が保存されない場合
-
.zsh_history.dディレクトリが正しく作成されているか確認 - ディレクトリのパーミッションを確認
-
chpwd関数が正しく呼び出されているか確認
Discussion