História ilimitada no zsh

42

Em zsh, eu quero ter uma história ilimitada. Eu defino HISTSIZE=, que funciona bash. Agora eu importo uma história antiga

mv old_history .history

que é bem grande

wc -l .history
43562 .history

Se eu fechar agora e começar de zshnovo, vejo

wc -l .history
32234 .history

Não posso ter histórico ilimitado zsh?

pfnuesel
fonte
O zsh parece funcionar de maneira diferente do bash wiki.gentoo.org/wiki/Zsh/Guide#History Este guia deve ajudá-lo na história do zsh.
AURELIEN

Respostas:

50

Existe o limite e as possibilidades de suas 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.

Na lista de discussão do ZSH :

Você deve determinar quanta memória possui, quanto dela pode permitir que seja ocupada pelo histórico (o AFAIK está sempre totalmente carregado na memória) e age de acordo. A remoção do limite não é mais sábia, pois você tem uma idéia de que não há limite, enquanto é sempre limitado pelos recursos disponíveis.

Ou se você acha que algum dia encontrará um problema com a exaustão de recursos, basta definir HISTSIZE como LONG_MAX a partir de limits.h: é o número máximo que HISTSIZE pode ter.

O que explica a solução Gentoo:

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

O histórico não será salvo sem o seguinte comando:

export SAVEHIST=$HISTSIZE

Para impedir que o histórico grave entradas duplicadas (como ls -l inseriu várias vezes durante a sessão de shell único), você pode definir a opção hist_ignore_all_dups:

setopt hist_ignore_all_dups

Um truque útil para impedir que entradas específicas sejam registradas em um histórico, precedendo-as com pelo menos um espaço.

setopt hist_ignore_space
aurelien
fonte
Não vejo como isso responde à minha pergunta. O tamanho do meu arquivo de histórico é 683 kB, certamente não muito grande para a minha memória?
Pfnuesel
3
user $ export HISTSIZE = 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 estarão fora das possibilidades do seu computador. Você precisa definir esse número para que se ajuste da melhor maneira possível às suas necessidades e possibilidades de computador.
AURELIEN
Posso configurá-lo como 50000, mas isso não resolverá o meu problema.
Pfnuesel #
11
Sua pergunta é Não posso ter histórico ilimitado no zsh? O autor do ZSH responde Não, mas você pode configurá-lo como desejar. O Gentoo explica corretamente como fazê-lo.
AURELIEN
11
nenhuma dessas soluções funciona no zsh. Ainda o interrompe após cerca de uma semana ou duas. Eu tenho lidado com esse problema há anos e é tão absurdo. Finalmente usei o logrotate para fazer isso.
Kristopolous
17

Você precisa definir ambos HISTSIZEe SAVEHIST. Eles indicam quantas linhas do histórico devem ser mantidas na memória e quantas linhas devem ser mantidas no arquivo de histórico, respectivamente.

Não acho que o zsh tenha uma configuração que significa "infinito", mas, para todos os fins práticos, um bilhão é infinito, enquanto permanece representável por máquina em máquinas de 32 bits.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE
Gilles 'SO- parar de ser mau'
fonte
Devo ter que me preocupar em manter um número tão grande de linhas na memória deixando meu computador lento?
Becko
7
Você não digitará linhas de história suficientes no seu tempo de vida para desacelerar o PC de 2010.
Gilles 'SO- stop be evil'
1

Eu estava tendo um problema com a história sendo limitado a 10000até que eu percebi oh-meu-zsh estava montando a sua própria HISTSIZEe SAVEHISTvalores. TL; DR, certifique-se de colocar as linhas na parte inferior do seu .zshrc.

Matthew D. Scholefield
fonte
0

O problema não era com zshou com o meu .zshrc, mas com a minha história. Havia algumas entradas estranhas como

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

que confuso zshe tudo depois que essas entradas foram truncadas. Não sei a que caractere ^@corresponde ou como essas entradas acabaram no meu histórico, mas removê-las resolveu o problema.

pfnuesel
fonte
qual terminal e editor você usa?
Aurelien 02/04
porque a pergunta agora é: isso voltará mais tarde?
AURELIEN
terminologye vim.
Pfnuesel
11
^@é o caractere ASCII NUL ( \0).
Muni
6
Os caracteres ^ @ ^ @ ^ @ ^ @ são nulos e aparecem frequentemente quando dois programas tentam gravar no mesmo arquivo ao mesmo tempo e não estão usando gravações atômicas (por exemplo, gravações em buffer) ou bloqueio . Ou pode ser causado por corrupção do sistema de arquivos, restauração incorreta do backup ou similar.
user222658