branch: externals/osm
commit 25fe7dff4ab4c12971847116fe3b3edc914f620c
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    Add imenu support
---
 osm.el | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/osm.el b/osm.el
index 765c3475e1..d59d7d0f5f 100644
--- a/osm.el
+++ b/osm.el
@@ -890,7 +890,8 @@ Local per buffer since the overlays depend on the zoom 
level.")
               mwheel-scroll-down-function #'osm--zoom-in-wheel
               mwheel-scroll-left-function #'osm--zoom-out-wheel
               mwheel-scroll-right-function #'osm--zoom-in-wheel
-              bookmark-make-record-function #'osm--bookmark-record-default)
+              bookmark-make-record-function #'osm--bookmark-record-default
+              imenu-create-index-function #'osm--imenu-index)
   (when (boundp 'mwheel-coalesce-scroll-events)
     (setq-local mwheel-coalesce-scroll-events t))
   (when (boundp 'pixel-scroll-precision-mode)
@@ -1590,6 +1591,20 @@ When called interactively, call the function `osm-home'."
       (`(,name ,_group ,id ,lat ,lon ,zoom) (osm--goto lat lon zoom nil id 
name))
       (_ (user-error "No pin selected")))))
 
+(defun osm--imenu-index ()
+  "Create Imenu index."
+  (let (index)
+    (osm--each-pin
+     (lambda (id lat lon zoom name)
+       (push (list name (vector lat lon zoom) #'osm--imenu-goto)
+             (alist-get (capitalize (substring (symbol-name id) 4))
+                        index nil nil #'equal))))
+    (sort index (lambda (x y) (string< (car x) (car y))))))
+
+(defun osm--imenu-goto (_name pos)
+  "Goto Imenu POS."
+  (osm--goto (aref pos 0) (aref pos 1) (aref pos 2) nil nil nil))
+
 (defun osm--fetch-json (url)
   "Get json from URL."
   (osm--check-libraries)

Reply via email to