Lịch sử không giới hạn trong zsh


42

Trong zsh, tôi muốn có lịch sử không giới hạn. Tôi thiết lập HISTSIZE=, hoạt động trong bash. Bây giờ tôi nhập một lịch sử cũ

mv old_history .history

cái này khá to

wc -l .history
43562 .history

Nếu bây giờ tôi đóng và bắt đầu zshlại, tôi thấy

wc -l .history
32234 .history

Tôi không thể có lịch sử không giới hạn zsh?


zsh dường như hoạt động khác với bash wiki.gentoo.org/wiki/Zsh/Guide#History hướng dẫn này sẽ giúp bạn trong lịch sử zsh.
aurelien

Câu trả lời:


50

Có giới hạn và khả năng của máy móc của bạn.

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.

Từ danh sách gửi thư ZSH :

Bạn nên xác định bạn có bao nhiêu bộ nhớ, bao nhiêu bộ nhớ bạn có thể cho phép bị chiếm giữ bởi lịch sử (AFAIK nó luôn được nạp đầy đủ vào bộ nhớ) và hành động tương ứng. Xóa bỏ giới hạn là không khôn ngoan hơn vì nó cho bạn một ý tưởng rằng không có giới hạn trong khi nó luôn bị giới hạn bởi các tài nguyên có sẵn.

Hoặc nếu bạn không nghĩ mình sẽ gặp phải vấn đề cạn kiệt tài nguyên, bạn chỉ có thể đặt HISTSIZE thành LONG_MAX từ giới hạn.h: đó là số lượng tối đa HISTSIZE có thể có.

Giải thích về giải pháp Gentoo:

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

Lịch sử sẽ không được lưu mà không có lệnh sau:

export SAVEHIST=$HISTSIZE

Để ngăn lịch sử ghi lại các mục trùng lặp (chẳng hạn như ls -l được nhập nhiều lần trong phiên shell duy nhất), bạn có thể đặt tùy chọn hist_ignore_all_dups:

setopt hist_ignore_all_dups

Một mẹo hữu ích để ngăn các mục cụ thể khỏi bị ghi vào lịch sử bằng cách đặt trước chúng với ít nhất một khoảng trắng.

setopt hist_ignore_space

Tôi không thấy câu trả lời của mình như thế nào. Kích thước của tệp lịch sử của tôi là 683 kB, chắc chắn không quá lớn cho bộ nhớ của tôi?
pfnuesel

3
người dùng $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 sẽ nằm ngoài khả năng của máy tính của bạn. Bạn phải đặt số đó sao cho phù hợp nhất có thể với mong muốn và khả năng của máy tính.
aurelien

Tôi có thể thiết lập nó 50000, nhưng điều đó sẽ không khắc phục vấn đề của tôi.
pfnuesel

1
Câu hỏi của bạn là tôi không thể có lịch sử không giới hạn trong zsh? Tác giả ZSH trả lời Không nhưng bạn có thể đặt nó theo ý muốn. Gentoo giải thích chính xác làm thế nào để làm điều đó.
aurelien

1
không có giải pháp nào trong số này hoạt động trong zsh. Nó vẫn cắt nó sau khoảng một hoặc hai tuần. Tôi đã đối phó với vấn đề này trong nhiều năm và nó thật vô lý. Cuối cùng tôi đã sử dụng logrotate để làm điều đó.
kristopolous

17

Bạn cần đặt cả hai HISTSIZESAVEHIST. Chúng cho biết có bao nhiêu dòng lịch sử để giữ trong bộ nhớ và bao nhiêu dòng để giữ trong tệp lịch sử, tương ứng.

Tôi không nghĩ zsh có cài đặt có nghĩa là Vô hạn, nhưng với tất cả các mục đích thực tế, một tỷ là vô hạn, trong khi máy còn lại có thể biểu diễn trên các máy 32 bit.

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

Tôi có nên lo lắng về việc giữ một số lượng lớn dòng như vậy trong bộ nhớ làm chậm máy tính của tôi không?
vẫy tay

7
Bạn sẽ không gõ đủ dòng lịch sử trong thời gian sống của mình để làm chậm PC năm 2010.
Gilles 'SO- ngừng trở nên xấu xa'

1

Tôi đã gặp vấn đề với lịch sử bị giới hạn 10000cho đến khi tôi nhận ra oh-my-zsh đang thiết lập giá trị HISTSIZESAVEHISTgiá trị của riêng nó . TL; DR, đảm bảo đặt các dòng ở dưới cùng của bạn .zshrc.


0

Vấn đề không phải là với zshtôi .zshrc, mà là với lịch sử của tôi. Có một số mục lẻ như

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

mà bối rối zshvà tất cả mọi thứ sau khi các mục này đã bị cắt ngắn. Tôi không biết nhân vật ^@tương ứng với cái gì , hoặc những mục này kết thúc như thế nào trong lịch sử của tôi, nhưng loại bỏ chúng đã khắc phục vấn đề.


bạn sử dụng thiết bị đầu cuối và biên tập viên nào?
aurelien

bởi vì câu hỏi bây giờ là nó sẽ quay trở lại sau?
aurelien

terminologyvim.
pfnuesel

1
^@là ký tự ASCII NUL ( \0).
muru

6
Các ký tự ^ @ ^ @ ^ @ ^ @ là null và chúng thường xuất hiện khi hai chương trình cố gắng ghi vào cùng một tệp cùng một lúc và không sử dụng ghi nguyên tử (ví dụ: chúng được ghi đệm) hoặc khóa . Hoặc nó có thể được gây ra bởi tham nhũng hệ thống tập tin, phục hồi xấu từ sao lưu hoặc tương tự.
dùng222658
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.