]> code.delx.au - gnu-emacs-elpa/commitdiff
support imenu
authorChen Bin <chenbin.sh@gmail.com>
Sat, 19 Dec 2015 01:19:29 +0000 (12:19 +1100)
committerChen Bin <chenbin.sh@gmail.com>
Sat, 19 Dec 2015 01:19:29 +0000 (12:19 +1100)
counsel.el

index 9c86ec0f05792211e2b470249b93d6b991ed6c0f..44fac93963919eda9fae806ec1aef1c01189348c 100644 (file)
@@ -1296,6 +1296,32 @@ INITIAL-INPUT can be given as the initial minibuffer input."
     (insert (substring-no-properties s))
     (setq counsel-completion-end (point))))
 
+(defun counsel-imenu-get-candidates-from (alist  &optional prefix)
+  "Create a list of (key . value) from ALIST.
+PREFIX is used to create the key."
+  (cl-loop for elm in alist
+           nconc (if (imenu--subalist-p elm)
+                       (counsel-imenu-get-candidates-from
+                        (cl-loop for (e . v) in (cdr elm) collect
+                                 (cons e (if (integerp v) (copy-marker v) v)))
+                        (concat prefix (if prefix ".") (car elm)))
+                   (and (cdr elm) ; bug in imenu, should not be needed.
+                        (setcdr elm (copy-marker (cdr elm))) ; Same as [1].
+                        (list (cons (concat prefix (if prefix ".") (car elm))
+                                    (copy-marker (cdr elm))))))))
+
+;;;###autoload
+(defun counsel-imenu ()
+  "Jump to a buffer position indexed by imenu."
+  (interactive)
+  (let ((imenu-auto-rescan t) items)
+    (unless (featurep 'imenu)
+      (require 'imenu nil t))
+    (setq items (imenu--make-index-alist t))
+    (ivy-read "imenu items:"
+              (counsel-imenu-get-candidates-from (delete (assoc "*Rescan*" items) items))
+              :action (lambda (pos) (goto-char pos)))))
+
 (provide 'counsel)
 
 ;;; counsel.el ends here