Aufbewahrung des Verlaufs pro Arbeitsverzeichnis (vgl. Pro Shell-Sitzung)

11

Gibt es eine Möglichkeit, die Geschichte einer modernen Shell auf einen Pfad zu beschränken?

Meine Arbeitskontexte sind als Pfade im Dateisystem aufgeteilt, und das Muster der Shell-Aktivität, wie z. B. wiederholt ausgegebene Befehle, unterscheidet sich in der Regel von Projekt zu Projekt. Es wäre schön, wenn ich die Verlaufsfunktion auf Befehle aus dem aktuellen Pfad (oder Unterpfad) ausdehnen könnte.

Sohocoke
quelle

Antworten:

5

Mit zshkönnten Sie tun:

mkdir -p ~/.zsh/dirhist

Und füge deinem ~ / .zshrc hinzu:

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()wird aufgerufen, wenn sich das aktuelle Verzeichnis ändert. Dort setzen wir die Verlaufsdatei auf etwas zurück, wie ~/.zsh/dirhist/@foo@barSie es cdmöchten /foo/bar.

Stéphane Chazelas
quelle
Ich mag diesen Ansatz, da es nicht erforderlich ist, meine Shell-Nutzungsgewohnheiten zu ändern, und in den wenigen Tagen des Testens scheint es gut zu laufen.
Sohocoke
9

Keine nette Antwort, aber eine Alternative, wenn Sie bashals Shell verwenden: Sie könnten einen Alias ​​in Ihrem erstellen .bashrc.

Zum Beispiel:

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'

Wenn Sie dann Folgendes eingeben a:

  1. Sie werden in Ihr Projektverzeichnis verschoben
  2. Der aktuelle Verlauf wird gespeichert ( history -w)
  3. dann wird der im Speicher gespeicherte Verlauf zurückgesetzt ( history -c)
  4. Die Projektverlaufsdatei wird auf gesetzt /home/user/.a_historyund gelesen ( history -r)
apaul
quelle
Mir ist klar, dass meine Frage einen Wunsch / eine Anforderung ausgelassen hat. Entschuldigen Sie das fehlende Detail. Nämlich: Ich würde es vorziehen, nicht daran denken zu müssen, Aliase / Funktionen zu verwenden; Das heißt, das Scoping sollte als Add-On zu der Art und Weise funktionieren, wie ich normalerweise mit der Shell interagiere.
Sohocoke
Nicht exportieren HISTFILE. Es gibt keinen Grund, es in andere Programme zu exportieren, und ~ / .bashrc wird für jeden interaktiven Bash-Prozess ausgeführt, sodass Ihr Code zum Festlegen ohnehin in jedem Bash ausgeführt wird. Wenn eine Shell-definierte Variable nicht standardmäßig exportiert wird, sollten Sie sie im Allgemeinen selten exportieren.
Chris Seite
1

Wenn Sie ZSH verwenden, schauen Sie sich dieses kleine Plugin an, das ich kürzlich geschrieben habe, um dies zu handhaben:

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

Es speichert HISTFILEfür jedes Verzeichnis, in dem Sie Befehle ausgeführt haben, ein separates Verzeichnis und fügt einen chpwdHook hinzu, mit dem HISTFILESie beim Ändern von Verzeichnissen zwischen s wechseln können.

Es bietet auch ein Zle-Widget, das Sie an einen Tastendruck binden können, der HISTFILEzwischen Ihrem ursprünglichen "globalen" HISTFILEund dem HISTFILEfür Ihr aktuelles Arbeitsverzeichnis umschaltet .

Es basierte ursprünglich auf Jim Hesters Plugin für den Verzeichnisverlauf , wurde jedoch seitdem von Grund auf neu geschrieben, um viele Probleme mit diesem Plugin zu beheben.

Eric Freese
quelle
Von Antworten nur auf Links wird hier abgeraten. Bitte fügen Sie eine Erklärung hinzu, was / wie es funktioniert.
0

Ich habe ein ZSH-Plugin geschrieben, das macht, was Sie wollen: https://github.com/tymm/zsh-directory-history

Im Gegensatz zu anderen Lösungen greift mein Plugin automatisch auf die globale Historie zurück. Das bedeutet, dass Sie nicht zwischen Verzeichnisverlauf und globalem Verlauf wechseln müssen.

Die anderen Lösungen sind jedoch etwas leichter, denke ich.

tymm
quelle