web-dev-qa-db-ja.com

作業ディレクトリごとの履歴の保持(シェルセッションごとを参照)

最新のシェルの履歴機能をパスにスコープする方法はありますか?

私の作業コンテキストはファイルシステム上のパスとして分割されており、繰り返し発行されるコマンドなどのシェルアクティビティのパターンは、「プロジェクト」ごとに異なる傾向があります。履歴機能を現在のパス(またはサブパス)から発行されたコマンドにスコープできると便利です。

11
sohocoke

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_のようなものにリセットされます。

5

わかりやすい答えではありませんが、シェルとして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)が読み取られます。
10
apaul

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

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

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

また、キーを押すとバインドできるzleウィジェットが提供され、元の「グローバル」HISTFILEと現在の作業ディレクトリのHISTFILEの間でHISTFILEが切り替わります。

元々は Jim Hesterのディレクトリごとの履歴 プラグインに基づいていましたが、その後、そのプラグインの問題の多くを修正するためにゼロから書き直されました。

1
Eric Freese

私はあなたが望むことをするZSHプラグインを書きました: https://github.com/tymm/zsh-directory-history

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

ただし、他のソリューションはもう少し軽量だと思います。

0
tymm