Histoire illimitée en zsh

42

Dans zsh, je veux avoir une histoire illimitée. Je mets HISTSIZE=, qui travaille dans bash. Maintenant j'importe une vieille histoire

mv old_history .history

qui est assez gros

wc -l .history
43562 .history

Si je ferme maintenant et recommence zsh, je vois

wc -l .history
32234 .history

Je ne peux pas avoir une histoire illimitée zsh?

pfnuesel
la source
zsh semble fonctionner différemment de bash wiki.gentoo.org/wiki/Zsh/Guide#History ce guide devrait vous aider dans l'histoire de zsh.
aurelien

Réponses:

51

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.

De 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 autoriser à occuper par l'historique (autant que je sache, 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 penser 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: il s'agit du nombre maximal que HISTSIZE peut avoir.

Ce qui explique la solution Gentoo:

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

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

export SAVEHIST=$HISTSIZE

Pour empêcher l’historique d’enregistrer des entrées dupliquées (tel que ls -l entré plusieurs fois au cours d’une session shell unique), vous pouvez définir l’option hist_ignore_all_dups:

setopt hist_ignore_all_dups

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

setopt hist_ignore_space
aurélien
la source
Je ne vois pas comment cela répond à ma question. La taille de mon fichier d’historique est de 683 Ko, sûrement pas trop volumineuse pour ma mémoire?
Pfnuesel
3
user $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999 sera hors des possibilités de votre ordinateur. Vous devez définir ce nombre afin qu'il corresponde le mieux possible à vos souhaits et à vos possibilités informatiques.
aurelien
Je peux le régler sur 50000, mais cela ne résoudra pas mon problème.
Pfnuesel
1
Votre question est: je ne peux pas avoir d’historique illimité dans zsh? L'auteur ZSH répond Non, mais vous pouvez le définir comme vous le souhaitez. Gentoo explique juste comment faire.
aurelien
1
Aucune de ces solutions ne fonctionne en zsh. Il le coupe toujours après environ une semaine ou deux. Je traite ce problème depuis des années et c'est tellement absurde. J'ai finalement utilisé logrotate pour le faire.
Kristopolous
17

Vous devez définir les deux HISTSIZEet SAVEHIST. Ils indiquent le nombre de lignes de l'historique à conserver en mémoire et le nombre de lignes à conserver dans le fichier d'historique, respectivement.

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
Gilles, arrête de faire le mal
la source
Devrais-je avoir à me soucier de garder un aussi grand nombre de lignes en mémoire ralentir mon ordinateur?
Becko
7
Vous n’allez pas taper suffisamment de lignes d’historique dans votre vie pour ralentir un PC des années 2010.
Gilles 'SO- arrête d'être méchant'
1

J'avais un problème avec l' histoire étant plafonnée à 10000jusqu'à ce que je me suis rendu oh-my-zsh mettait ses propres HISTSIZEet des SAVEHISTvaleurs. TL; DR, assurez-vous de mettre les lignes au bas de votre .zshrc.

Matthew D. Scholefield
la source
0

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

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

que confus zshet tout après ces entrées a été tronqué. Je ne sais pas à quel caractère ^@correspond ni comment ces entrées se sont retrouvées dans mon historique, mais leur suppression a résolu le problème.

pfnuesel
la source
quel terminal et éditeur utilisez-vous?
aurelien
parce que la question est la suivante: est-ce que cela reviendra plus tard?
aurelien
terminologyet vim.
pfnuesel
1
^@est le caractère ASCII NUL ( \0).
Muru
6
Les caractères ^ @ ^ @ ^ @ @ @ @ @ sont nuls et apparaissent fréquemment lorsque deux programmes tentent d'écrire dans le même fichier en même temps et n'utilisent pas d'écriture atomique (par exemple, ils sont en mémoire tampon) ou de verrouillage . Cela peut également être causé par une corruption du système de fichiers, une restauration incorrecte à partir d'une sauvegarde ou similaire.
user222658