aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbard <[email protected]>2024-03-17 21:16:58 -0400
committerbard <[email protected]>2024-03-17 21:16:58 -0400
commit438df49cca1dfeb5af0444d3eb09e250a665e760 (patch)
tree60597ccbcc449cb4dd746f3e391973fcbfd2eec3
parente0fc689e4a69e6786586fee7a7d5da36c0411108 (diff)
outline searching
-rw-r--r--bard-elisp/bard-search.el48
1 files changed, 48 insertions, 0 deletions
diff --git a/bard-elisp/bard-search.el b/bard-elisp/bard-search.el
new file mode 100644
index 0000000..949a9d1
--- /dev/null
+++ b/bard-elisp/bard-search.el
@@ -0,0 +1,48 @@
+;; Code provided by Protesilaos Starvou's dotemacs configuration.
+
+;;;; Outline
+
+(defun prot-search--get-outline ()
+ "Return alist of outline outline-regexp and positions."
+ (let* ((outline-regexp (format "^\\(?:%s\\)" (or (bound-and-true-p outline-regexp) "[*\^L]+")))
+ (heading-alist (bound-and-true-p outline-heading-alist))
+ (level-fun (or (bound-and-true-p outline-level)
+ (lambda () ;; as in the default from outline.el
+ (or (cdr (assoc (match-string 0) heading-alist))
+ (- (match-end 0) (match-beginning 0))))))
+ candidates)
+ (save-excursion
+ (goto-char (point-min))
+ (while (if (bound-and-true-p outline-search-function)
+ (funcall outline-search-function)
+ (re-search-forward outline-regexp nil t))
+ (push
+ (format "%-5s %s"
+ (line-number-at-pos (point))
+ (buffer-substring-no-properties (line-beginning-position) (line-end-position)))
+ candidates)
+ (goto-char (1+ (line-end-position)))))
+ (if candidates
+ (nreverse candidates)
+ (user-error "No outline"))))
+
+(defun prot-search--outline-prompt ()
+ "Prompt for outline among headings retrieved by `prot-search--get-outline'."
+ (completing-read
+ "Go to outline: "
+ (prot-common-completion-table-no-sort 'imenu (prot-search--get-outline))
+ nil :require-match))
+
+(defvar prot-search-outline-hook nil
+ "Normal hook to run at the end of `prot-search-outline'.")
+
+;;;###autoload
+(defun prot-search-outline ()
+ "Go to the line of the given outline using completion."
+ (interactive)
+ (when-let ((selection (prot-search--outline-prompt))
+ (line (string-to-number (car (split-string selection "\t")))))
+ (goto-line line)
+ (run-hooks 'prot-search-outline-hook)))
+
+(define-key global-map (kbd "M-s M-o") #'prot-search-outline)