]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new mode completions-highlight-mode.
authorJimmy Aguilar Mena <spacibba@aol.com>
Thu, 10 Mar 2022 13:36:02 +0000 (14:36 +0100)
committerJimmy Aguilar Mena <spacibba@aol.com>
Thu, 10 Mar 2022 13:37:40 +0000 (14:37 +0100)
doc/emacs/mini.texi
etc/NEWS
lisp/minibuffer.el

index eb2bfce136adba3a901d6511d82a2ac260b51501..afacb9c7cde52b6555bac951b7718af1ea34b8bb 100644 (file)
@@ -665,6 +665,11 @@ mode, header line and a bottom divider, if any.  For a more complex
 control of the Completion window display properties you can use
 @code{display-buffer-alist} (@pxref{Buffer Display Action Alists}).
 
+@vindex completions-highlight-mode
+When the mode @{completions-highlight-mode} is active the candidate
+under the cursor is highlighted when the completion window is
+selected.  The mode uses the face @code{completions-highlight}.
+
 @node Minibuffer History
 @section Minibuffer History
 @cindex minibuffer history
index 5a0d6c8fdbd63305422e57ccb27777806ea23eea..05f219ca03e983a859fc5b1df1c2b9a40d41632e 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -565,6 +565,9 @@ some completion is made.
 *** New user option 'completions-max-height'.
 This option limits the height of the "*Completions*" buffer.
 
+*** New mode completions-highlight.
+This mode highlights the current candidate in the *Completions* buffer
+with the completions-highlight face.
 
 ** Isearch and Replace
 
index cd0c274765f580af8a3588e8b1e92221a7ff1a1e..148ba7a8730e41e52904f1f6f97fd0121fd2a34a 100644 (file)
@@ -2138,6 +2138,52 @@ candidates."
   (run-hooks 'completion-setup-hook)
   nil)
 
+
+(defface completions-highlight
+  '((t :inherit highlight :extend t))
+  "Default face for highlighting the current line in Hl-Line mode."
+  :version "29.1")
+
+(defvar completions--overlay nil
+  "Overlay to use when `completions-highlight-mode' is enabled.")
+
+(defun completions-highlight--delete ()
+  "Highlight current candidate in *Completions* when ``completions-highlight''."
+  (when (overlayp completions--overlay)
+    (delete-overlay completions--overlay)))
+
+(defun completions-highlight--highlight ()
+  "Highlight current candidate if point in a candidate."
+  (let* ((point (point))
+         (hpoint (or (and (get-text-property point 'mouse-face) point)
+                     (and (> point 1) (get-text-property (1- point) 'mouse-face) (1- point)))))
+    (when hpoint
+      (move-overlay completions--overlay
+                    (previous-single-property-change (1+ hpoint) 'mouse-face nil (point-min))
+                    (next-single-property-change hpoint 'mouse-face nil (point-max))))))
+
+(defun completions-highlight--setup-hook ()
+  "Function to call when enabling the `completion-highlight-mode' mode.
+It is called when showing the *Completions* buffer."
+  (with-current-buffer "*Completions*"
+    (completions-highlight--highlight)
+    (add-hook 'pre-command-hook #'completions-highlight--delete nil t)
+    (add-hook 'post-command-hook #'completions-highlight--highlight nil t)))
+
+;;;###autoload
+(define-minor-mode completions-highlight-mode
+  "Completion highlight mode to enable candidates highlight in the minibuffer."
+  :global t
+  :group 'minibuffer
+  (cond
+   (completions-highlight-mode
+    (setq completions--overlay (make-overlay 0 0))
+    (overlay-put completions--overlay 'face 'completions-highlight)
+    (add-hook 'completion-setup-hook #'completions-highlight--setup-hook t))
+   (t
+    (remove-hook 'completion-setup-hook #'completions-highlight--setup-hook)))
+  (completions-highlight--delete))
+
 (defvar completion-extra-properties nil
   "Property list of extra properties of the current completion job.
 These include: