最新のシェルの履歴機能をパスにスコープする方法はありますか?
私の作業コンテキストはファイルシステム上のパスとして分割されており、繰り返し発行されるコマンドなどのシェルアクティビティのパターンは、「プロジェクト」ごとに異なる傾向があります。履歴機能を現在のパス(またはサブパス)から発行されたコマンドにスコープできると便利です。
zsh
を使用すると、次のことができます。
_mkdir -p ~/.zsh/dirhist
_
そして、〜/ .zshrcに追加します:
_HISTSIZE=1000
SAVEHIST=10000
setopt HIST_SAVE_NO_DUPS INC_APPEND_HISTORY
HISTFILE=~/.zsh/dirhist/${PWD//\//@}
chpwd() {
[[ $PWD = $OLDPWD ]] || fc -Pp ~/.zsh/dirhist/${PWD//\//@}
}
_
chpwd()
は、現在のディレクトリが変更されるたびに呼び出されます。そこで、cd
を_~/.zsh/dirhist/@foo@bar
_にすると、履歴ファイルが_/foo/bar
_のようなものにリセットされます。
わかりやすい答えではありませんが、シェルとしてbash
を使用している場合は、別の方法があります。.bashrc
にエイリアスを作成できます。
例えば:
alias a='cd /tmp/A ; history -w ; history -c ; export HISTFILE=/home/user/.a_history ; history -r $HISTFILE'
alias b='cd /tmp/B ; history -w ; history -c ; export HISTFILE=/home/user/.b_history ; history -r $HISTFILE'
次に、a
と入力すると:
history -w
)history -c
)/home/user/.a_history
に設定され、(history -r
)が読み取られます。ZSHを使用している場合は、これを処理するために最近作成したこの小さなプラグインを見てください。
https://github.com/ericfreese/zsh-cwd-history
コマンドを実行したディレクトリごとに個別のHISTFILE
を格納し、ディレクトリを変更するときにchpwd
sを切り替えるためのHISTFILE
フックを追加します。
また、キーを押すとバインドできるzleウィジェットが提供され、元の「グローバル」HISTFILE
と現在の作業ディレクトリのHISTFILE
の間でHISTFILE
が切り替わります。
元々は Jim Hesterのディレクトリごとの履歴 プラグインに基づいていましたが、その後、そのプラグインの問題の多くを修正するためにゼロから書き直されました。
私はあなたが望むことをするZSHプラグインを書きました: https://github.com/tymm/zsh-directory-history
他のソリューションとは対照的に、私のプラグインは自動的にグローバル履歴にフォールバックします。つまり、ディレクトリ履歴とグローバル履歴を切り替える必要はありません。
ただし、他のソリューションはもう少し軽量だと思います。