Mantenere la cronologia per directory di lavoro (cfr. Per sessione di shell)


11

C'è un modo per fare in modo che la funzionalità della cronologia di una shell moderna venga portata su un percorso?

I miei contesti di lavoro sono suddivisi come percorsi nel file system e il modello di attività della shell, come i comandi emessi ripetutamente, tende a essere distinto per ogni "progetto". Sarebbe bello se potessi estendere la funzionalità della cronologia ai comandi emessi dal percorso corrente (o sotto-percorso).

Risposte:


5

Con zsh, potresti fare:

mkdir -p ~/.zsh/dirhist

E aggiungi al tuo ~ / .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()viene chiamato ogni volta che cambia la directory corrente. Lì, abbiamo reimpostare il file storia per qualcosa di simile ~/.zsh/dirhist/@foo@barquando si cda /foo/bar.


Mi piace questo approccio, in quanto non richiede di cambiare le mie abitudini di utilizzo della shell e nei pochi giorni di test sembra andare bene.
sohocoke,

10

Non una risposta bashchiara ma un'alternativa se stai usando come shell: potresti creare un alias nel tuo .bashrc.

Per esempio:

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'

Quindi, se si digita a:

  1. verrai spostato nella directory del tuo progetto
  2. la cronologia corrente verrà salvata ( history -w)
  3. quindi la cronologia mantenuta in memoria verrà ripristinata ( history -c)
  4. il file della cronologia del progetto verrà impostato /home/user/.a_historye letto ( history -r)

Mi rendo conto che la mia domanda aveva omesso un desiderio / requisito, scusate il dettaglio mancante. Vale a dire: preferirei non dover ricordare di usare alias / funzioni; cioè lo scoping dovrebbe funzionare come un componente aggiuntivo al modo in cui normalmente interagisco con la shell.
sohocoke,

Non esportare HISTFILE. Non c'è motivo di esportarlo in altri programmi e ~ / .bashrc viene eseguito per ogni processo bash interattivo, quindi il tuo codice per impostarlo verrà comunque eseguito in ogni bash. In generale, se una variabile definita dalla shell non viene esportata per impostazione predefinita, raramente è necessario esportarla.
Chris Page

1

Se stai usando ZSH, dai un'occhiata a questo piccolo plugin che ho scritto di recente per gestirlo:

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

Memorizza un separato HISTFILEper ogni directory in cui hai eseguito i comandi e aggiunge un chpwdhook per passare da una HISTFILEs all'altra quando cambi directory.

Fornisce inoltre un widget zle che è possibile associare a un tasto premuto che alternerà HISTFILEtra il "globale" originale HISTFILEe il HISTFILEper la directory di lavoro corrente.

Originariamente era basato sul plug -in della cronologia per directory di Jim Hester , ma da allora è stato riscritto da zero per risolvere molti dei problemi con quel plug-in.


Link solo le risposte sono scoraggiate qui, si prega di aggiungere alcune spiegazioni di cosa è / come funziona.

0

Ho scritto un plug-in ZSH che fa quello che vuoi: https://github.com/tymm/zsh-directory-history

A differenza di altre soluzioni, il mio plugin ritorna automaticamente alla storia globale. Ciò significa che non è necessario passare dalla cronologia delle directory alla cronologia globale.

Tuttavia, credo che le altre soluzioni siano un po 'più leggere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.