여러 eshell에서 히스토리 병합


9

eshell로 전환하기 전에 다음과 같이 zsh를 설정했습니다.

  • 모든 명령 후에 히스토리 파일에 기록
  • 히스토리 파일을 덮어 쓰지 않고 추가하므로 여러 쉘을 실행할 때 모두 하나의 큰 히스토리로 병합됩니다.

두 zsh 옵션 모두 여기 에 설명되어 있습니다 (APPEND_HISTORY 및 INC_APPEND_HISTORY 참조).

명령을 실행 한 후 새 셸 주를 열고 기록에서 찾을 수 있기 때문에 큰 기록 크기와 결합 할 때 매우 유용합니다 (이 옵션이 없으면 가장 최근에 닫힌 기록 만 포함하므로 큰 기록은 쓸모가 없습니다) 껍질). 또한 새 쉘을 열고 다른 쉘에서 가장 최근의 명령을 즉시 알 수 있도록합니다. 이 동작으로 eshell을 설정하는 방법이 있습니까? 첫 번째 글 머리 기호는 충분히 쉬운 것처럼 보이지만 추가하는 것이 까다로워 보입니다 ...

답변:


3

면책 조항 : 나는 eshell을 사용하지 않으므로 소금 한알과 함께 섭취하십시오.

eshelleshell-write-history기록을 작성 하기 위해 호출 하는 것처럼 보이며 , append기본값 은 선택적인 인수 입니다 nil. 이 인수는 eshell현재 사용되지 않는 것처럼 보이지만 작동하는 것으로 보입니다 (에 인수를 전달하여 write-region제대로 추가합니다).

여기 몇 가지 옵션이 있습니다.

  1. (setq eshell-save-history-on-exit nil)eshell-write-history너 자신에게 전화 해
  2. eshell-write-history요구 사항을 충족하도록 재정의 하십시오.

개인적으로 나는 1과 함께 갈 것입니다.

예로서:

(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)

올바른 작동 eshell-append-history기능을 위한 @ joseph-garvin 덕분에

이것은 새로운 히스토리 컨텐츠를 쉘에 동적으로로드하는 것을 처리하지 않습니다 (예 : X쉘 A에서 명령 을 실행 하고 다시로드하지 않고 쉘 B에서 히스토리에 표시하는 것 (zsh의 SHARE_HISTORY 등)). 나는 얼마나 효율적인지 모른다 eshell-read-history. 그래서 나는 그것을 훅으로 돌리는 것을 주저 할 것이다.

eshell-append-history기능을 사용하면 중복 항목이 생길 수도 있습니다 . 에서 가장 최근 항목을 제외한 모든 shenanigans를 수행 eshell-history-ring한 다음 기록을 작성한 후 이전 값으로 재설정해야 할 수도 있습니다.

예 :

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

고마워요. 첫 번째 스 니펫에는 docstring 끝에 따옴표가 없습니다.
Joseph Garvin

나는 그것을 편집해야했고, ring- * 기능으로 링을 수정해야하거나 오류가 발생했습니다. 또한 동적 바인딩을 사용하여 사본을 만드는 대신 eshell-history-ring의 정의를 일시적으로 무시합니다. 당신이 당신의 대답에 여기에 코드를 삽입하면 당신이 볼 압연을 가지고 있기 때문에 가능으로 표시 할 수 있습니다 : pastebin.com/zEE7B6d7
조셉 가빈

@JosephGarvin 완료!
J David Smith

이 솔루션은 훌륭하게 작동하지만 eshell-exit-hookeshell이 ​​시작될 때 자동으로로드되기 때문에 nil 로 설정 해야했습니다 (add-hook 'eshell-exit-hook 'eshell-write-history nil t). 나는 훅을 로컬처럼 nil로 설정했다 (기본적으로 전역 적으로 nil이다) :(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.