Hợp nhất lịch sử từ nhiều eshells


9

Trước khi chuyển sang eshell tôi đã thiết lập zsh để nó sẽ:

  • Viết ra tệp lịch sử sau mỗi lệnh
  • Nối vào thay vì ghi đè lên tệp lịch sử để khi chạy nhiều shell, tất cả chúng sẽ được hợp nhất thành một lịch sử lớn

Cả hai tùy chọn zsh đều được ghi lại ở đây (xem APPEND_HISTORY và INC_APPEND_HISTORY).

Điều này cực kỳ hữu ích khi được kết hợp với kích thước lịch sử lớn vì bạn có thể mở một shell shell mới sau khi ban hành lệnh và tìm thấy nó trong lịch sử của bạn (không có các tùy chọn này, lịch sử lớn sẽ vô dụng vì nó sẽ chỉ chứa lịch sử của lần đóng gần đây nhất vỏ). Điều đó cũng có nghĩa là bạn có thể mở các shell mới và cho chúng biết ngay các lệnh gần đây nhất của bạn trong các shell khác. Có cách nào để thiết lập eshell với hành vi này không? Viên đạn đầu tiên có vẻ đủ dễ dàng nhưng việc nối thêm có vẻ phức tạp hơn ...

Câu trả lời:


3

Tuyên bố miễn trừ trách nhiệm: Tôi không sử dụng eshell, vì vậy hãy dùng nó với một hạt muối.

eshellxuất hiện để gọi eshell-write-historyđể viết lịch sử, trong đó có một đối số tùy chọn appendmặc định nil. Đối số này dường như không được sử dụng eshellhiện tại, nhưng có vẻ như hoạt động (nó chuyển đối số thông qua write-region, mà không nối đúng).

Có một vài lựa chọn ở đây.

  1. (setq eshell-save-history-on-exit nil)và gọi eshell-write-historycho mình
  2. Xác định lại eshell-write-historyđể đáp ứng yêu cầu của bạn.

Cá nhân, tôi sẽ đi với 1.

Ví dụ:

(setq eshell-save-history-on-exit nil)
(defun eshell-append-history ()
  "Call `eshell-write-history' with the `append' parameter set to `t'."
  (when eshell-history-ring
    (let ((newest-cmd-ring (make-ring 1)))
      (ring-insert newest-cmd-ring (car (ring-elements eshell-history-ring)))
      (let ((eshell-history-ring newest-cmd-ring))
        (eshell-write-history eshell-history-file-name t)))))
(add-hook eshell-pre-command-hook #'eshell-append-history)

Cảm ơn @ joseph-garvin về eshell-append-historychức năng làm việc đã được sửa

Điều này không xử lý tự động tải nội dung lịch sử mới vào shell (ví dụ: chạy lệnh Xtrong shell A và để nó xuất hiện trong lịch sử trong shell B mà không cần tải lại; như SHARE_HISTORY của zsh). Tôi không biết hiệu quả của nó như thế nào eshell-read-history, vì vậy tôi sẽ do dự khi chạy nó trong một cái móc.

Cũng có thể bạn sẽ kết thúc với các mục trùng lặp với eshell-append-historychức năng này . Bạn có thể cần phải thực hiện một số shenanigans với việc xóa tất cả trừ mục nhập gần đây nhất từ eshell-history-ringđó, sau đó đặt lại nó về giá trị cũ sau khi viết lịch sử.

Ví dụ

(let ((old-ring (copy-list eshell-history-ring)))
  (setq eshell-history-ring (list (car eshell-history-ring)))
  ; write
  (setq eshell-history-ring old-ring))

Cảm ơn, điều này có vẻ tuyệt vời. Đoạn đầu tiên của bạn đang thiếu một trích dẫn ở cuối chuỗi doc.
Joseph Garvin

Tôi đã phải chỉnh sửa nó một số, hóa ra các vòng cần được sửa đổi bởi các hàm ring- * hoặc bạn gặp lỗi. Ngoài ra, tôi sử dụng liên kết động để tạm thời ghi đè định nghĩa của eshell-history-ring thay vì tạo một bản sao. Nếu bạn đặt mã ở đây vào câu trả lời của mình, tôi sẽ đánh dấu là đã được chấp nhận kể từ khi bạn bắt đầu lăn bóng: pastebin.com/zEE7B6d7
Joseph Garvin

@JosephGarvin đã làm xong!
J David Smith

Giải pháp này hoạt động rất tốt, nhưng tôi cũng phải đặt eshell-exit-hookthành không vì nó sẽ tự động được tải khi eshell bắt đầu : (add-hook 'eshell-exit-hook 'eshell-write-history nil t). Tôi đặt hook thành số không cục bộ như vậy (theo mặc định là toàn cầu):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
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.