2010-05-13 5 views
5

Je voulais atteindre le même résultat que celui demandé ici Saving current directory to bash history mais dans zsh shell. Je ne l'ai pas fait de trickry zsh avant, mais jusqu'à présent je:Enregistrement du répertoire courant dans l'historique zsh

function precmd { 
hpwd=$history[$((HISTCMD-1))] 
if [[ $hpwd == "cd" ]]; then 
cwd=$OLDPWD 
else 
cwd=$PWD 
fi 
hpwd="${hpwd% ### *} ### $cwd" 
echo "$hpwd" >>~/.hist_log 
} 

En ce moment j'enregistrer la commande annotée avec le nom du répertoire dans un fichier journal. Cela fonctionne bien pour moi. Je pensais juste qu'il pourrait y avoir un moyen de faire le remplacement dans le tampon de l'histoire lui-même.

+3

duplication possible de [Comment puis-je (à partir d'un script) ajouter quelque chose à l'historique des commandes de zsh?] (Http://stackoverflow.com/questions/2816225/how-can-i-from-a-script-add -quelque-chose-à-la-zsh-commande-histoire) –

Répondre

6
function _-accept-line() { 
    [[ -z "${BUFFER" ]] || [[ "${BUFFER}" =~ "### ${(q)PWD}\$" ]] || BUFFER="${BUFFER} ### ${PWD}" 
    zle .accept-line 
} 
zle -N accept-line _-accept-line 

Ajoutez ### ${PWD} à votre ligne de commande. Pas la meilleure solution que vous pourriez utiliser, mais cela fonctionne.

UPD: Réponse basée sur le commentaire de @Dennis Williamson:

function zshaddhistory() { 
    print -sr "${1%%$'\n'} ### ${PWD}" 
    fc -p 
} 
+0

Merci Dennis et Zyx. Cela fonctionne comme prévu. Dennis, c'est un doublon. D'une façon ou d'une autre, cette question ne s'est pas révélée pendant ma recherche. Votre article sur l'histoire de bash/zsh est utile et informatif. – Sandeep

+0

Quelqu'un peut-il m'expliquer pourquoi 'fc -p' est nécessaire? Pourquoi est-ce que quand je ne place pas 'fc -p' ici, la liste de l'historique gagne deux entrées pour chaque commande (la première étant celle incluant le chemin, et la seconde entrée est une seule)? –

+0

Je me débattais avec zsh en essayant d'analyser les caractères '#', mais l'activation de 'setopt interactivecomments' a résolu cela et je suis content de cette configuration maintenant. Cela bloque un peu l'histoire de la commande quand vous la traversez, ce qui me rend triste. –

3

Plutôt que de stocker sur chaque commande j'ajouté ce qui suit à la beginging de ma fonction precmd() pour stocker quand je change les répertoires:

if [ "$LAST_DIR" != "$PWD" ] 
    then 
      print -s "##dir## $PWD" 
      LAST_DIR=$PWD 
    fi 

Ajoute une ligne autonome «## dir ## dir name» à l'historique chaque fois qu'une commande est exécutée à partir d'un nouveau répertoire.

+1

J'aime 'print -s" $ PWD # Chemin "', de cette façon je peux faire apparaître cette entrée de l'historique tout-normal, et il est prêt pour que j'appuie sur Entrée pour auto-cd sur ce chemin (c'est une fonctionnalité de 'zsh', si vous fournissez simplement un chemin, c'est' cd'/'pushd' pour vous). ** CEPENDANT ** Je crois que cette approche est fondamentalement erronée: Si vous avez deux termes ouverts, chacun dans un répertoire différent, alors gardez leurs répertoires respectifs, mais passez d'une commande à l'autre, il n'est pas possible de savoir quel répertoire ces commandes sont arrivées dans! C'est échouer :( –

Questions connexes