From: Ken Manheimer Date: Fri, 12 Feb 2016 09:05:54 +0000 (-0500) Subject: multishell - Suppress trivial duplicates in completions list presentation. X-Git-Url: https://code.delx.au/gnu-emacs-elpa/commitdiff_plain/d68099dadbc82e6cbd604f717620b1b305372830 multishell - Suppress trivial duplicates in completions list presentation. The duplicates are useful in minibuffer, distinguishing active shells, but not useful in multishell listing, where active shells are sorted early and with "+" signs before them. --- diff --git a/multishell-list.el b/multishell-list.el index d2765dd1a..8d1cb42e6 100644 --- a/multishell-list.el +++ b/multishell-list.el @@ -247,6 +247,22 @@ Initial sort is from most to least recently used: tabulated-list-entries #'multishell-list-entries) (tabulated-list-init-header)) +(defun multishell-list-cull-dups (entries) + "Return list of multishell ENTRIES sans ones with duplicate names. + +For duplicates, we prefer the ones that have paths." + (let ((tally (make-hash-table :test #'equal)) + got name already) + (mapcar #'(lambda (entry) + (setq name (multishell-name-from-entry entry) + already (gethash name tally nil)) + (when (or (not already) (< (length already) (length entry))) + ;; Add new or replace shorter prior entry for name: + (puthash name entry tally))) + entries) + (maphash #'(lambda (key value) (push value got)) tally) + got)) + ;;;###autoload (defun multishell-list (&optional completing) "Edit your current and historic list of shell buffers. @@ -278,13 +294,11 @@ You can get to the shells listing by recursively invoking (progv ;; Temporarily assign multishell-history only when completing: (when completing '(multishell-history)) - (when completing (list (mapcar 'substring-no-properties completing))) + (when completing + (list (multishell-list-cull-dups (mapcar 'substring-no-properties + completing)))) (tabulated-list-print)) (when completing - ;; XXX Do proper completion prep. - ;; - looks like stuff in minibuffer.el.gz is too hairy w/too little gain. - ;; - Add a buffer-change hook that throws a 'multishell-completion-done, - ;; and revise the catch in multishell-pop-to-shell ) (when from-entry (multishell-list-goto-item-by-entry from-entry))))