Historia ilimitada en zsh

42

En zsh, quiero tener una historia ilimitada. Me puse HISTSIZE=, que funciona en bash. Ahora importo una vieja historia

mv old_history .history

que es bastante grande

wc -l .history
43562 .history

Si ahora cierro y empiezo de zshnuevo, veo

wc -l .history
32234 .history

¿No puedo tener un historial ilimitado zsh?

pfnuesel
fuente
zsh parece funcionar de manera diferente a bash wiki.gentoo.org/wiki/Zsh/Guide#History esta guía debería ayudarlo en la historia de zsh.
aurelien

Respuestas:

51

Existe el límite y las posibilidades de sus máquinas.

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 lista de correo de ZSH :

Debe determinar la cantidad de memoria que tiene, la cantidad que puede permitir que esté ocupada por el historial (AFAIK siempre está completamente cargada en la memoria) y actuar en consecuencia. Eliminar el límite no es más sabio, ya que te deja con la idea de que no hay límite, mientras que siempre está limitado por los recursos disponibles.

O si no cree que alguna vez tendrá un problema con el agotamiento de los recursos, puede establecer HISTSIZE en LONG_MAX desde los límites. H: es el número máximo que HISTSIZE puede tener.

Que explican la solución Gentoo:

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

El historial no se guardará sin el siguiente comando:

export SAVEHIST=$HISTSIZE

Para evitar que el historial registre entradas duplicadas (como ls -l ingresado muchas veces durante una sesión de shell única), puede configurar la opción hist_ignore_all_dups:

setopt hist_ignore_all_dups

Un truco útil para evitar que entradas particulares se registren en un historial precediéndolas con al menos un espacio.

setopt hist_ignore_space
aurelien
fuente
No veo cómo eso responde mi pregunta. El tamaño de mi archivo de historial es de 683 kB, ¿seguramente no es demasiado grande para mi memoria?
pfnuesel
3
user $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 estará fuera de las posibilidades de su computadora. Debe establecer ese número para que se ajuste lo mejor posible a sus deseos y posibilidades informáticas.
aurelien
Puedo configurarlo 50000, pero eso no solucionará mi problema.
pfnuesel
1
Su pregunta es ¿No puedo tener un historial ilimitado en zsh? El autor de ZSH responde No, pero puede configurarlo como desee. Gentoo explica correctamente cómo hacerlo.
aurelien
1
Ninguna de estas soluciones funciona en zsh. Todavía lo corta después de aproximadamente una semana o dos. He estado lidiando con este problema durante años y es muy absurdo. Finalmente usé logrotate para hacerlo.
kristopolous
17

Necesita establecer ambos HISTSIZEy SAVEHIST. Indican cuántas líneas del historial mantener en la memoria y cuántas líneas mantener en el archivo del historial, respectivamente.

No creo que zsh tenga una configuración que signifique "infinito", pero a todos los efectos prácticos, mil millones son infinitos, mientras que son representables por máquina en máquinas de 32 bits.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE
Gilles 'SO- deja de ser malvado'
fuente
¿Debería preocuparme por mantener una cantidad tan grande de líneas en la memoria que ralentizan mi computadora?
Becko
77
No va a escribir suficientes líneas de historial en su tiempo de vida para ralentizar una PC de 2010.
Gilles 'SO- deja de ser malvado'
1

Estaba teniendo un problema con la historia siendo un tope de 10000hasta que realizara oh-my-zsh se estaba poniendo su propia HISTSIZEy SAVEHISTvalores. TL; DR, asegúrese de poner las líneas en la parte inferior de su .zshrc.

Matthew D. Scholefield
fuente
0

El problema no era con zsho mi .zshrc, sino con mi historia. Hubo algunas entradas extrañas como

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

eso confundió zshy todo después de estas entradas se truncó. No sé a qué personaje ^@corresponde o cómo terminaron estas entradas en mi historial, pero eliminarlas solucionó el problema.

pfnuesel
fuente
¿Qué terminal y editor usas?
aurelien
porque la pregunta ahora es: ¿volverá eso más tarde?
aurelien
terminologyy vim.
pfnuesel
1
^@es el carácter ASCII NUL ( \0).
muru
66
Los caracteres ^ @ ^ @ ^ @ ^ @ son nulos y aparecen con frecuencia cuando dos programas intentan escribir en el mismo archivo al mismo tiempo y no utilizan escrituras atómicas (por ejemplo, escrituras almacenadas en búfer) o bloqueadas . O puede ser causado por corrupción del sistema de archivos, mala restauración de la copia de seguridad o similar.
user222658