zshの無制限の履歴


42

ではzsh、無制限の履歴が必要です。で設定HISTSIZE=bashます。今、古い履歴をインポートします

mv old_history .history

かなり大きい

wc -l .history
43562 .history

今すぐ閉じてzsh再起動すると、

wc -l .history
32234 .history

で無制限の履歴を作成することはできませんzshか?


zshは、bash wiki.gentoo.org/wiki/Zsh/Guide#Historyとは異なる動作をするようです。このガイドは、zshの歴史に役立つはずです。
-aurelien

回答:


50

マシンには限界と可能性があります。

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.

ZSHメーリングリストから:

どれだけのメモリがあるか、どれだけ履歴を使用できるかを決定し(常にメモリに完全にロードされていることを知る)、それに応じて行動する必要があります。制限を削除することは賢明ではありません。使用可能なリソースによって常に制限されているのに制限はないという考えをあなたに与えるからです。

または、リソースの枯渇で問題が発生すると思わない場合は、limits.hからHISTSIZEをLONG_MAXに設定するだけで済みます。これは、HISTSIZEが持つことができる最大数です。

Gentooソリューションを説明しています:

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

次のコマンドがないと、履歴は保存されません。

export SAVEHIST=$HISTSIZE

履歴が重複したエントリ(単一のシェルセッション中に何度も入力されたls -lなど)を記録しないようにするには、hist_ignore_all_dupsオプションを設定できます。

setopt hist_ignore_all_dups

特定のエントリの前に少なくとも1つのスペースを置くことにより、特定のエントリが履歴に記録されないようにする便利なトリック。

setopt hist_ignore_space

それが私の質問にどのように答えるかわかりません。履歴ファイルのサイズは683 kBで、確かに私の記憶には大きすぎませんか?
pfnuesel

3
user $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999はコンピューターの可能性から外れます。あなたの希望とコンピューターの可能性にできるだけ合うようにその数を設定する必要があります。
-aurelien

に設定する50000ことはできますが、それでも問題は解決しません。
-pfnuesel

1
あなたの質問は、「zshに無制限の履歴がありませんか?」です。ZSH著者の応答はありませんが、あなたが望むようにあなたはそれを設定することができます。Gentooはどうやってそれを行うのかを正確に説明します。
aurelien

1
これらのソリューションはいずれもzshでは機能しません。約1週間か2週間経った後も、まだ切断されています。私は何年もこの問題に取り組んできましたが、それはとてもばかげています。私は最終的にlogrotateを使用してそれを行いました。
kristopolous

17

HISTSIZEとの両方を設定する必要がありSAVEHISTます。それぞれ、メモリに保持する履歴の行数と履歴ファイルに保持する行数を示します。

zshには「無限」を意味する設定はないと思いますが、実際には10億は無限ですが、32ビットマシンではマシン表​​現可能です。

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

このような多数の行をメモリに保持することで、コンピューターの速度が低下することを心配する必要がありますか?
ベッコ

7
2010年代のPCの速度を落とすのに十分な履歴行を入力するつもりはありません。
ジル 'SO-悪であるのをやめる'

1

私は歴史に問題がで制限されて持っていた10000私は、ああ、私の-zshのは、独自の設定をして実現するまでHISTSIZESAVEHIST値を。TL; DR、行をの下部に配置してください.zshrc


0

問題は、zshまたはにありませんでし.zshrcたが、履歴にあります。次のような奇妙なエントリがありました

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

混乱しzsh、これらのエントリ以降はすべて切り捨てられました。私はどのキャラクターに^@対応するのか、これらのエントリーが私の歴史の中でどのように終わったのか分かりませんが、それらを削除することで問題は解決しました。


どの端末とエディターを使用していますか?
-aurelien

なぜなら今の質問は、それは後でまた戻ってくるのでしょうか?
-aurelien

terminologyおよびvim
-pfnuesel

1
^@ASCII NUL(\0)文字です。
ムル

6
^ @ ^ @ ^ @ ^ @文字はヌルであり、2つのプログラムが同じファイルに同時に書き込みを試行し、アトミック書き込み(バッファ書き込みなど)またはロックを使用していない場合に頻繁に表示されます。または、ファイルシステムの破損、バックアップからの不適切な復元などが原因である可能性があります。
user222658
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.