GNU bug report logs - #77089
[PATCH] Simplify Eshell history de-duplication

Previous Next

Package: emacs;

Reported by: Morgan Smith <Morgan.J.Smith <at> outlook.com>

Date: Mon, 17 Mar 2025 22:35:04 UTC

Severity: normal

Tags: patch

Full log


Message #11 received at 77089 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Morgan Smith <Morgan.J.Smith <at> outlook.com>,
 Jim Porter <jporterbugs <at> gmail.com>
Cc: 77089 <at> debbugs.gnu.org, johnw <at> gnu.org
Subject: Re: bug#77089: [PATCH] Simplify Eshell history de-duplication
Date: Tue, 18 Mar 2025 14:47:51 +0200
> Cc: John Wiegley <johnw <at> gnu.org>
> From: Morgan Smith <Morgan.J.Smith <at> outlook.com>
> Date: Mon, 17 Mar 2025 18:33:50 -0400
> 
> I was noticing a perceptible delay in starting eshell of 0.838 seconds.
> Turns out it was because I had `eshell-hist-ignoredups' set to 'erase
> and I had a 5000 line shell-history file.
> 
> This patch speeds it up for me to 0.011 seconds.

Thanks, I'm adding Jim to the discussion.

> >From 68160b6c84c2f8946caca5a6be274434f4e3d053 Mon Sep 17 00:00:00 2001
> From: Morgan Smith <Morgan.J.Smith <at> outlook.com>
> Date: Mon, 17 Mar 2025 18:19:21 -0400
> Subject: [PATCH] Simplify Eshell history de-duplication
> 
> This also increases performance significantly for large history
> files when `eshell-hist-ignoredups' is set to 'erase.
> 
> * lisp/eshell/em-hist.el (eshell-read-history): Run
> `delete-duplicate-lines' on the shell history text instead of
> checking for duplicates at every insertion.
> ---
>  lisp/eshell/em-hist.el | 17 ++++++-----------
>  1 file changed, 6 insertions(+), 11 deletions(-)
> 
> diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el
> index 3f779f95acd..78ceed4bd6a 100644
> --- a/lisp/eshell/em-hist.el
> +++ b/lisp/eshell/em-hist.el
> @@ -458,22 +458,17 @@ eshell-read-history
>  	     (ignore-dups eshell-hist-ignoredups))
>  	(with-temp-buffer
>  	  (insert-file-contents file)
> +          (when ignore-dups
> +            (delete-duplicate-lines (point-min) (point-max) t
> +                                    (not (eq ignore-dups 'erase))))
>  	  ;; Watch for those date stamps in history files!
>  	  (goto-char (point-max))
>  	  (while (and (< count size)
>  		      (re-search-backward "^[ \t]*\\([^#\n].*\\)[ \t]*$"
>  					  nil t))
> -	    (let ((history (match-string 1)))
> -              (when (or (ring-empty-p ring)
> -                        (null ignore-dups)
> -                        (and (not (string-equal
> -                                   (ring-ref ring (1- (ring-length ring)))
> -                                   history))
> -                             (not (and (eq ignore-dups 'erase)
> -                                       (ring-member ring history)))))
> -                (ring-insert-at-beginning
> -		 ring (subst-char-in-string ?\177 ?\n history))
> -                (setq count (1+ count))))))
> +            (ring-insert-at-beginning
> +             ring (subst-char-in-string ?\177 ?\n (match-string 1)))
> +            (setq count (1+ count))))
>  	(setq eshell-history-ring ring
>  	      eshell-history-index nil
>                eshell-hist--new-items 0))))))
> -- 
> 2.48.1
> 




This bug report was last modified 89 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.