]> code.delx.au - gnu-emacs-elpa/commitdiff
multishell - Suppress trivial duplicates in completions list presentation.
authorKen Manheimer <ken.manheimer@gmail.com>
Fri, 12 Feb 2016 09:05:54 +0000 (04:05 -0500)
committerKen Manheimer <ken.manheimer@gmail.com>
Fri, 12 Feb 2016 09:05:54 +0000 (04:05 -0500)
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.

multishell-list.el

index d2765dd1ac4d79db45b83dd0230f300db2f93f19..8d1cb42e69b6cfe124af411420357ce0980ce996 100644 (file)
@@ -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))))