]> git.eshelyaron.com Git - emacs.git/commitdiff
Add 'minibuffer-action' to 'imenu'
authorEshel Yaron <me@eshelyaron.com>
Mon, 17 Jun 2024 10:46:14 +0000 (12:46 +0200)
committerEshel Yaron <me@eshelyaron.com>
Mon, 17 Jun 2024 10:46:14 +0000 (12:46 +0200)
lisp/imenu.el

index e9221d33326ba5b0d720d82acd828f30a1a3cb2e..54008683529137567f9a389fcb43fd3032206b68 100644 (file)
@@ -958,6 +958,22 @@ function placed in a special index-item."
       (widen))
   (goto-char position))
 
+(defun imenu-minibuffer-action (string)
+  (let ((choice (or
+                 ;; FIXME: `completion--replace' leaves stale
+                 ;; `imenu-choice' property on parts of input that it
+                 ;; keeps unchagned, so we can't use the next line ATM.
+                 ;; (get-text-property 0 'imenu-choice string)
+                 (assoc string minibuffer-completion-table))))
+    (when (or (imenu--subalist-p choice) (equal choice imenu--rescan-item))
+      (user-error "`%s' is not associated with a specific position" string))
+    (with-selected-window (minibuffer-selected-window)
+      (push-mark nil t)
+      (pcase choice
+        (`(,name ,pos ,fn . ,args) (apply fn name pos args))
+        (`(,name . ,pos) (funcall imenu-default-goto-function name pos)))
+      (run-hooks 'imenu-after-jump-hook))))
+
 ;;;###autoload
 (defun imenu (index-item)
   "Jump to a place in the buffer chosen using a buffer menu or mouse menu.
@@ -976,6 +992,8 @@ for more information."
       (`(,name . ,pos) (imenu (list name pos imenu-default-goto-function)))
       (_ (error "Unknown imenu item: %S" index-item)))))
 
+(put 'imenu 'minibuffer-action '(imenu-minibuffer-action . "imenu"))
+
 (defun imenu-flush-cache ()
   "Flush the current imenu cache.
 This forces a full rescan of the buffer to recreate the index alist