web-dev-qa-db-fra.com

Histoire illimitée dans zsh

Dans zsh, je veux avoir un historique illimité. J'ai mis HISTSIZE=, qui fonctionne dans bash. Maintenant j'importe une vieille histoire

mv old_history .history

ce qui est assez grand

wc -l .history
43562 .history

Si maintenant je ferme et recommence zsh, je vois

wc -l .history
32234 .history

Puis-je avoir un historique illimité dans zsh?

53
pfnuesel

Il y a la limite et les possibilités de vos machines.

HISTFILE="$HOME/.zsh_history"
HISTSIZE=10000000
SAVEHIST=10000000
setopt BANG_HIST                 # Treat the '!' character specially during expansion.
setopt EXTENDED_HISTORY          # Write the history file in the ":start:elapsed;command" format.
setopt INC_APPEND_HISTORY        # Write to the history file immediately, not when the Shell exits.
setopt SHARE_HISTORY             # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST    # Expire duplicate entries first when trimming history.
setopt HIST_IGNORE_DUPS          # Don't record an entry that was just recorded again.
setopt HIST_IGNORE_ALL_DUPS      # Delete old recorded entry if new entry is a duplicate.
setopt HIST_FIND_NO_DUPS         # Do not display a line previously found.
setopt HIST_IGNORE_SPACE         # Don't record an entry starting with a space.
setopt HIST_SAVE_NO_DUPS         # Don't write duplicate entries in the history file.
setopt HIST_REDUCE_BLANKS        # Remove superfluous blanks before recording entry.
setopt HIST_VERIFY               # Don't execute immediately upon history expansion.
setopt HIST_BEEP                 # Beep when accessing nonexistent history.

Depuis la liste de diffusion ZSH :

Vous devez déterminer la quantité de mémoire dont vous disposez, la quantité de mémoire que vous pouvez laisser occuper par l'historique (AFAIK, elle est toujours entièrement chargée en mémoire) et agir en conséquence. Supprimer la limite n'est pas plus sage car cela vous laisse avec une idée qu'il n'y a pas de limite alors qu'elle est toujours limitée par les ressources disponibles.

Ou si vous ne pensez pas que vous rencontrerez un problème d'épuisement des ressources, vous pouvez simplement définir HISTSIZE sur LONG_MAX à partir de limits.h: c'est le nombre maximum que HISTSIZE peut avoir.

Ce qui explique la solution Gentoo:

export HISTSIZE=2000
export HISTFILE="$HOME/.history"

L'historique ne sera pas enregistré sans la commande suivante:

export SAVEHIST=$HISTSIZE

Pour empêcher l'historique d'enregistrer des entrées dupliquées (telles que ls -l entré plusieurs fois au cours d'une seule session Shell), vous pouvez définir l'option hist_ignore_all_dups:

setopt hist_ignore_all_dups

Une astuce utile pour empêcher des entrées particulières d'être enregistrées dans un historique en les précédant d'au moins un espace.

setopt hist_ignore_space
60
aurelien

Vous devez définir à la fois HISTSIZE et SAVEHIST . Ils indiquent respectivement le nombre de lignes d'historique à conserver en mémoire et le nombre de lignes à conserver dans le fichier historique.

Je ne pense pas que zsh ait un paramètre qui signifie "infini", mais à toutes fins pratiques, un milliard est infini, tout en restant représentable par une machine sur des machines 32 bits.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE

J'avais un problème avec le plafonnement de l'histoire à 10000 jusqu'à ce que je réalise que oh-my-zsh définissait ses propres valeurs HISTSIZE et SAVEHIST. TL; DR, assurez-vous de mettre les lignes au bas de votre .zshrc.

Un autre problème que je rencontrais était que mon historique soit tronqué à 1024 lignes. Bien que je ne sache pas pourquoi, je l'ai résolu en procédant comme suit:

  • Réglage HISTFILE=$HOME/.zsh_hist (quelque chose de différent qu'avant)
  • Réglage HISTFILE=$HOME/.bash_history explicitement dans ~/.bashrc
  • Faire les réglages normaux comme HISTSIZE=100000 et SAVEHIST=100000

Je pense que cela aurait pu être lié à l'utilisation de export pour définir HISTFILE, ce qui a amené bash à utiliser la même variable HISTFILE lors du lancement interactif à partir de ZSH, ce qui la tronquerait. La définition du fichier d'historique bash n'est probablement pas nécessaire tant que vous vous assurez de ne pas exportHISTFILE.

Le problème n'était pas avec zsh ou mon .zshrc, mais avec mon histoire. Il y avait des entrées bizarres comme

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@#1453692179

cela a confondu zsh et tout ce qui se trouvait après ces entrées a été tronqué. Je ne sais pas quel personnage ^@ correspond à, ou comment ces entrées se sont retrouvées dans mon historique, mais les supprimer a résolu le problème.

1
pfnuesel