Unbegrenzte Geschichte in Zsh

41

In zshmöchte ich unbegrenzte Geschichte haben. Ich stelle ein HISTSIZE=, was in funktioniert bash. Jetzt importiere ich eine alte Geschichte

mv old_history .history

Das ist ziemlich groß

wc -l .history
43562 .history

Wenn ich jetzt schließe und von vorne anfange, zshverstehe ich

wc -l .history
32234 .history

Kann ich nicht unbegrenzt Geschichte haben zsh?

pfnuesel
quelle
zsh scheint funktioniert anders als bash wiki.gentoo.org/wiki/Zsh/Guide#History diese Anleitung sollten Sie in zsh Geschichte helfen.
Aurelien

Antworten:

49

Es gibt die Grenzen und Möglichkeiten Ihrer Maschinen.

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.

Aus der ZSH-Mailingliste :

Sie sollten bestimmen, wie viel Speicher Sie haben, wie viel davon Sie für die Historie zulassen können (AFAIK ist immer voll in den Speicher geladen) und entsprechend vorgehen. Das Aufheben des Limits ist nicht klüger, da Sie den Eindruck haben, dass es kein Limit gibt, während es immer durch die verfügbaren Ressourcen begrenzt ist.

Wenn Sie nicht glauben, dass Sie jemals ein Problem mit der Erschöpfung der Ressourcen haben werden, können Sie HISTSIZE in limits.h auf LONG_MAX setzen: Dies ist die maximale Anzahl, die HISTSIZE haben kann.

Welche erklären die Gentoo-Lösung:

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

Der Verlauf wird ohne den folgenden Befehl nicht gespeichert:

export SAVEHIST=$HISTSIZE

Um zu verhindern, dass der Verlauf doppelte Einträge aufzeichnet (wie z. B. ls -l, das während einer einzelnen Shell-Sitzung mehrfach eingegeben wurde), können Sie die Option hist_ignore_all_dups festlegen:

setopt hist_ignore_all_dups

Ein nützlicher Trick, um zu verhindern, dass bestimmte Einträge in einem Verlauf aufgezeichnet werden, indem ihnen mindestens ein Leerzeichen vorangestellt wird.

setopt hist_ignore_space
Aurelien
quelle
Ich verstehe nicht, wie das meine Frage beantwortet. Die Größe meiner History-Datei beträgt 683 kB, sicherlich nicht zu groß für meinen Speicher?
Pfnuesel
3
Benutzer $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 ist außerhalb der Möglichkeiten Ihres Computers. Sie müssen diese Nummer so einstellen, dass sie Ihren Wünschen und Computermöglichkeiten am besten entspricht.
Aurelien
Ich kann es einstellen 50000, aber das wird mein Problem nicht beheben.
Pfnuesel
1
Ihre Frage ist Kann ich nicht unbegrenzt Geschichte in zsh haben? Der ZSH-Autor antwortet Nein, aber Sie können es einstellen, wie Sie möchten. Gentoo erklärt einfach richtig wie es geht.
Aurelien
1
Keine dieser Lösungen funktioniert in zsh. Nach ein oder zwei Wochen wird es immer noch abgeschnitten. Ich beschäftige mich seit Jahren mit diesem Problem und es ist so absurd. Ich habe schließlich Logrotate verwendet, um es zu tun.
kristopolous
16

Sie müssen beide HISTSIZEund einstellen SAVEHIST. Sie geben an, wie viele Zeilen des Verlaufs im Speicher bzw. wie viele Zeilen in der Verlaufsdatei gespeichert werden sollen.

Ich glaube nicht, dass zsh eine Einstellung hat, die "unendlich" bedeutet, aber praktisch ist eine Milliarde unendlich, während sie auf 32-Bit-Computern maschinenrepräsentierbar bleibt.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE
Gilles 'SO - hör auf böse zu sein'
quelle
Muss ich mir Sorgen machen, dass so viele Zeilen im Speicher meinen Computer verlangsamen?
Becko
7
Sie werden in Ihrem Leben nicht genug Verlaufslinien eingeben, um einen PC der 2010er Jahre zu verlangsamen.
Gilles 'SO- hör auf böse zu sein'
1

Ich hatte ein Problem mit der Geschichte an einer Kappe bedeckt ist , 10000bis ich merkte , oh-my-zsh seine eigene einstellte HISTSIZEund SAVEHISTWerte. TL; DR, stellen Sie sicher, dass die Zeilen am unteren Rand Ihrer .zshrc.

Matthew D. Scholefield
quelle
0

Das Problem lag nicht bei zshoder bei mir .zshrc, sondern bei meiner Geschichte. Es gab einige seltsame Einträge wie

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

das verwirrt zshund alles nach diesen Einträgen wurde abgeschnitten. Ich weiß nicht, welchem ​​Charakter er ^@entspricht oder wie diese Einträge in meinem Verlauf gelandet sind, aber das Entfernen hat das Problem behoben.

pfnuesel
quelle
Welches Terminal und welchen Editor verwenden Sie?
Aurelien
denn die frage ist nun, kommt das später nochmal zurück?
Aurelien
terminologyund vim.
Pfnuesel
1
^@ist das ASCII NUL ( \0) Zeichen.
muru
6
Die ^ @ ^ @ ^ @ ^ @ -Zeichen sind Nullen und werden häufig angezeigt, wenn zwei Programme gleichzeitig versuchen, in dieselbe Datei zu schreiben, und keine atomaren Schreibvorgänge (z. B. gepufferte Schreibvorgänge) oder Sperren verwenden . Oder es kann durch Beschädigung des Dateisystems, fehlerhafte Wiederherstellung durch Sicherung oder ähnliches verursacht werden.
user222658