👌

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

動作の仕組み

  1. .zsh_history.dディレクトリが作成され、ここにディレクトリごとの履歴が保存されます
  2. ディレクトリのパスは@記号で区切られて保存されます(例:HOME@Projects@MyApp
  3. ディレクトリを移動するたびにchpwd関数が呼び出され、履歴ファイルが自動的に切り替わります

設定のカスタマイズ

履歴の保存件数を変更

HISTSIZE=2000    # メモリ上の履歴数
SAVEHIST=2000    # ファイルに保存する履歴数

追加の履歴オプション

setopt hist_expire_dups_first    # 履歴を削除する必要がある場合、まず重複しているものから削除
setopt hist_find_no_dups         # 履歴検索で重複したものを表示しない
setopt hist_reduce_blanks        # 余分な空白を削除して保存

トラブルシューティング

履歴が保存されない場合

  1. .zsh_history.dディレクトリが正しく作成されているか確認
  2. ディレクトリのパーミッションを確認
  3. chpwd関数が正しく呼び出されているか確認
GitHubで編集を提案

Discussion