各作業ディレクトリの履歴を保持します(各シェルセッションを参照)。

各作業ディレクトリの履歴を保持します(各シェルセッションを参照)。

最新のシェルの履歴機能をパス範囲に制限する方法はありますか?

私のタスクコンテキストはファイルシステムへのパスに分割され、シェルアクティビティパターン(たとえば、繰り返し実行されるコマンド)は各「プロジェクト」ごとに異なる傾向があります。履歴機能の範囲を現在のパス(またはサブパス)で実行されているコマンドに制限できればよいでしょう。

答え1

これは簡潔な答えではありませんが、シェルとして使用する場合はオプションがあります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

  1. プロジェクトディレクトリに移動します
  2. 現在の履歴が保存されます(history -w
  3. これにより、メモリに保存されている履歴が初期化されます(history -c)。
  4. プロジェクト履歴ファイルはに設定されて/home/user/.a_history読み込まれますhistory -r

答え2

これにより、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()現在のディレクトリが変更されるたびに呼び出されます。そこで、私たちはあなたが訪問した~/.zsh/dirhist/@foo@barときのような履歴ファイルをリセットしました。cd/foo/bar

答え3

ZSHを使用している場合は、最近この問題を処理するために作成したこの小さなプラグインを見てください。

https://github.com/ericfreese/zsh-cwd-history

HISTFILEchpwdコマンドを実行するディレクトリごとに別々のディレクトリを保存し、ディレクトリを変更するときにsを切り替えるためのフックを追加します。HISTFILE

HISTFILEまた、元の「グローバル」ディレクトリHISTFILEHISTFILE現在の作業ディレクトリを切り替えるキーストロークにバインドできるzleウィジェットも提供します。

もともとこれに基づいていました。Jim Hesterのディレクトリ別履歴プラグインですが、その後プラグインの多くの問題を解決するために最初から書き直されました。

答え4

必要な作業を行うZSHプラグインを作成しました。 https://github.com/tymm/zsh-directory-history

他のソリューションと比較すると、私のプラグインは自動的にグローバル履歴に戻ります。つまり、ディレクトリ履歴とグローバル履歴を切り替える必要はありません。

しかし、他の解決策がより軽いと思います。

関連情報