From d330642c2e6b0f443a2cfccb4827c9df25ee3fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ellis=20Keny=C5=91?= Date: Sat, 6 Jul 2024 20:31:40 -0400 Subject: [PATCH] feat(literate): add +literate/find-heading command A command for jumping to an Org heading in your literate org config file. Close: #7716 --- modules/config/default/+evil-bindings.el | 2 ++ modules/config/literate/autoload.el | 35 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 5564192ec..f6c32c68f 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -485,6 +485,8 @@ :desc "Browse emacs.d" "E" #'doom/browse-in-emacsd :desc "Find file" "f" #'find-file :desc "Find file from here" "F" #'+default/find-file-under-here + (:when (modulep! :config literate) + :desc "Open heading in literate config" "h" #'+literate/find-heading) :desc "Locate file" "l" #'locate :desc "Find file in private config" "p" #'doom/find-file-in-private-config :desc "Browse private config" "P" #'doom/open-private-config diff --git a/modules/config/literate/autoload.el b/modules/config/literate/autoload.el index 0da5f0867..7ea7996b3 100644 --- a/modules/config/literate/autoload.el +++ b/modules/config/literate/autoload.el @@ -106,6 +106,41 @@ ;;;###autoload (defalias '+literate/reload #'doom/reload) +(defun +literate--flatten-imenu-index (index &optional prefix) + "Flatten an org-mode imenu index." + (let ((flattened '())) + (dolist (item index flattened) + (let* ((name (propertize (car item) 'face (intern (format "org-level-%d" (if prefix (+ 2 (cl-count ?/ prefix)) 1))))) + (prefix (if prefix (concat prefix "/" name) name))) + (if (imenu--subalist-p item) + (setq flattened (append flattened (+literate--flatten-imenu-index (cdr item) prefix))) + (push (cons prefix (cdr item)) flattened)))) + (nreverse flattened))) + +(defvar imenu-auto-rescan) +;;;###autoload +(defun +literate/find-heading (&optional level) + "Jump to a heading in your literate org config file." + (interactive "P") + (let* ((buffer (or (find-buffer-visiting +literate-config-file) + (find-file-noselect +literate-config-file t)))) + (with-current-buffer buffer + (let* ((imenu-auto-rescan t) + (org-imenu-depth (or level 8)) + (index (+literate--flatten-imenu-index (imenu--make-index-alist)))) + (let ((c (current-window-configuration)) + (result nil)) + (unwind-protect + (progn + (switch-to-buffer buffer) + (if (modulep! :completion vertico) + (setq result (consult-outline level)) + (let ((entry (assoc (completing-read "Go to heading: " index nil t) index))) + (setq result entry) + (imenu entry)))) + (unless result + (set-window-configuration c)))))))) + ;; ;;; Hooks