mirror of
https://github.com/doomemacs/doomemacs
synced 2025-08-01 12:17:25 -05:00
Adapted from Janfel's snippet in Wilfred/helpful#250. And bound to C-{o,i} and {<,>} for evil users, and C-c C-{b,f} and {l,r} for vanilla users (mirroring the back/forward keybinds for help.el). Ref: Wilfred/helpful#250
63 lines
2.5 KiB
EmacsLisp
63 lines
2.5 KiB
EmacsLisp
;;; lang/emacs-lisp/autoload/helpful.el -*- lexical-binding: t; -*-
|
||
|
||
(defvar +emacs-lisp--helpful-buffer-ring-size 5
|
||
"How many buffers are stored for use with `*helpful-next'.")
|
||
|
||
(defvar +emacs-lisp--helpful-buffer-ring (make-ring +emacs-lisp--helpful-buffer-ring-size)
|
||
"Ring that stores the current Helpful buffer history.")
|
||
|
||
(defun +emacs-lisp--helpful-buffer-index (&optional buffer)
|
||
"If BUFFER is a Helpful buffer, return it’s index in the buffer ring."
|
||
(let ((buf (or buffer (current-buffer))))
|
||
(and (eq (buffer-local-value 'major-mode buf) 'helpful-mode)
|
||
(seq-position (ring-elements +emacs-lisp--helpful-buffer-ring) buf #'eq))))
|
||
|
||
;;;###autoload
|
||
(defun +emacs-lisp-record-new-buffers-a (buf)
|
||
"Update the buffer ring according to the current buffer and HELP-BUF."
|
||
(let ((buf-ring +emacs-lisp--helpful-buffer-ring))
|
||
(let ((newer-buffers (or (+emacs-lisp--helpful-buffer-index) 0)))
|
||
(dotimes (_ newer-buffers) (ring-remove buf-ring 0)))
|
||
(when (/= (ring-size buf-ring) +emacs-lisp--helpful-buffer-ring-size)
|
||
(ring-resize buf-ring +emacs-lisp--helpful-buffer-ring-size))
|
||
(ring-insert buf-ring buf)))
|
||
|
||
(defun +emacs-lisp--helpful-next (&optional buffer)
|
||
"Return the next live Helpful buffer relative to BUFFER."
|
||
(let ((buf-ring +emacs-lisp--helpful-buffer-ring)
|
||
(index (or (+emacs-lisp--helpful-buffer-index buffer) -1)))
|
||
(cl-block nil
|
||
(while (> index 0)
|
||
(cl-decf index)
|
||
(let ((buf (ring-ref buf-ring index)))
|
||
(if (buffer-live-p buf) (cl-return buf)))
|
||
(ring-remove buf-ring index)))))
|
||
|
||
(defun +emacs-lisp--helpful-previous (&optional buffer)
|
||
"Return the previous live Helpful buffer relative to BUFFER."
|
||
(let ((buf-ring +emacs-lisp--helpful-buffer-ring)
|
||
(index (1+ (or (+emacs-lisp--helpful-buffer-index buffer) -1))))
|
||
(cl-block nil
|
||
(while (< index (ring-length buf-ring))
|
||
(let ((buf (ring-ref buf-ring index)))
|
||
(if (buffer-live-p buf) (cl-return buf)))
|
||
(ring-remove buf-ring index)))))
|
||
|
||
;;;###autoload
|
||
(defun +emacs-lisp/helpful-next ()
|
||
"Go to the next Helpful buffer."
|
||
(interactive)
|
||
(if-let* ((buf (+emacs-lisp--helpful-next)))
|
||
(funcall helpful-switch-buffer-function buf)
|
||
(user-error "No helpful buffer to switch to")))
|
||
|
||
;;;###autoload
|
||
(defun +emacs-lisp/helpful-previous ()
|
||
"Go to the previous Helpful buffer."
|
||
(interactive)
|
||
(if-let* ((buf (+emacs-lisp--helpful-previous)))
|
||
(funcall helpful-switch-buffer-function buf)
|
||
(user-error "No helpful buffer to switch to")))
|
||
|
||
;;; helpful.el ends here
|