Conservation de l'historique par répertoire de travail (cf. par session shell)

11

Existe-t-il un moyen de limiter la fonction d'historique d'un shell moderne à un chemin?

Mes contextes de travail sont divisés en chemins sur le système de fichiers, et le modèle d'activité du shell, comme les commandes émises à plusieurs reprises, a tendance à être distinct pour chaque «projet». Ce serait bien si je pouvais étendre la fonction d'historique aux commandes issues du chemin actuel (ou du sous-chemin).

sohocoke
la source

Réponses:

5

Avec zsh, vous pourriez faire:

mkdir -p ~/.zsh/dirhist

Et ajoutez à votre ~ / .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()est appelé chaque fois que le répertoire courant change. Là, nous avons quelque chose comme réinitialiser le fichier historique ~/.zsh/dirhist/@foo@barlorsque vous cdà /foo/bar.

Stéphane Chazelas
la source
J'aime cette approche, car elle ne nécessite pas de changer mes habitudes d'utilisation du shell, et dans les quelques jours de test, elle semble bien se porter.
sohocoke
10

Pas une bonne réponse mais une alternative si vous utilisez bashcomme shell: vous pouvez créer un alias dans votre .bashrc.

Par exemple:

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'

Ensuite, si vous tapez a:

  1. vous serez déplacé dans le répertoire de votre projet
  2. l'historique actuel sera sauvegardé ( history -w)
  3. puis l'historique conservé en mémoire sera réinitialisé ( history -c)
  4. le fichier d'historique du projet sera défini /home/user/.a_historyet lu ( history -r)
apaul
la source
Je me rends compte que ma question avait omis un souhait / exigence, désolé pour le détail manquant. À savoir: je préférerais ne pas avoir à me souvenir d'utiliser des alias / fonctions; c'est-à-dire que la portée devrait fonctionner comme un complément à la façon dont j'interagis normalement avec le shell.
sohocoke
N'exportez pas HISTFILE. Il n'y a aucune raison de l'exporter vers d'autres programmes, et ~ / .bashrc est exécuté pour chaque processus bash interactif, donc votre code pour le configurer sera exécuté dans chaque bash de toute façon. En général, si une variable définie par le shell n'est pas exportée par défaut, vous devez rarement l'exporter.
Chris Page
1

Si vous utilisez ZSH, jetez un œil à ce petit plugin que j'ai récemment écrit pour gérer ceci:

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

Il stocke un HISTFILErépertoire distinct pour chaque répertoire dans lequel vous avez exécuté des commandes et ajoute un chpwdcrochet pour basculer entre HISTFILEs lorsque vous changez de répertoire.

Il fournit également un widget zle que vous pouvez lier à une pression de touche qui basculera HISTFILEentre votre "global" d'origine HISTFILEet le HISTFILEpour votre répertoire de travail actuel.

Il était à l'origine basé sur le plug - in d' historique par répertoire de Jim Hester , mais a depuis été réécrit à partir de zéro pour résoudre de nombreux problèmes avec ce plugin.

Eric Freese
la source
Les réponses aux liens uniquement sont déconseillées ici, veuillez ajouter quelques explications sur ce qu'est / comment cela fonctionne.
0

J'ai écrit un plugin ZSH qui fait ce que vous voulez: https://github.com/tymm/zsh-directory-history

Contrairement à d'autres solutions, mon plugin revient automatiquement à l'histoire globale. Cela signifie que vous n'avez pas à basculer entre l'historique du répertoire et l'historique global.

Cependant, les autres solutions sont un peu plus légères, je suppose.

tymm
la source