diff --git a/etc/init.lisp b/etc/init.lisp index c72759e..d1cee74 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -440,6 +440,14 @@ (define-key "p" #'gemini-toc-scroll-up-page *gemini-toc-keymap*) +(define-key "home" #'gemini-toc-scroll-begin *gemini-toc-keymap*) + +(define-key "end" #'gemini-toc-scroll-end *gemini-toc-keymap*) + +(define-key "/" #'gemini-toc-search *gemini-toc-keymap*) + +(define-key "N" #'repeat-search *gemini-toc-keymap*) + ;; gemini stream window keymap (define-key "a" #'gemini-abort-download *gemini-downloads-keymap*) diff --git a/src/package.lisp b/src/package.lisp index 8e5e20f..f5d2c49 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -1527,6 +1527,9 @@ :gemlog-refresh-all-event :gemini-toc-jump-to-section :gemini-toc-open + :gemini-toc-scroll-begin + :gemini-toc-scroll-end + :gemini-toc-search :get-chat-messages-event :get-chats-event :chat-show-event @@ -1535,6 +1538,7 @@ :chat-change-label-event :chat-create-event :search-link-event + :search-toc-event :help-apropos-event :redraw-window-event :send-to-pipe-event diff --git a/src/program-events.lisp b/src/program-events.lisp index ea77b52..b7c1c88 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -1581,6 +1581,22 @@ (regex regex)) object (line-oriented-window:search-row window regex))) +(defclass search-toc-event (search-event) + ((window + :initform nil + :initarg :window + :accessor window) + (regex + :initform nil + :initarg :regex + :accessor regex))) + +(defmethod process-event ((object search-toc-event)) + (with-accessors ((window window) + (regex regex)) object + (line-oriented-window:search-row window regex) + (ui:gemini-toc-jump-to-entry))) + (defclass help-apropos-event (program-event) ((regex :initform nil diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index f026997..851e921 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -1335,6 +1335,7 @@ This makes sense only for gemini file stream, if not this command performs the s (defun line-oriented-window-scroll-begin (window) (when (and window (not (line-oriented-window:rows-empty-p window))) + (line-oriented-window:unselect-all window) (line-oriented-window:select-row window 0) (windows:win-clear window) (windows:draw window))) @@ -1342,6 +1343,7 @@ This makes sense only for gemini file stream, if not this command performs the s (defun line-oriented-window-scroll-end (window) (when (and window (not (line-oriented-window:rows-empty-p window))) + (line-oriented-window:unselect-all window) (line-oriented-window:select-row window (1- (line-oriented-window:rows-length window))) (windows:win-clear window) (windows:draw window))) @@ -2231,6 +2233,26 @@ gemini page the program is rendering." (defun gemini-toc-scroll-up-page () (message-window:scroll-up *message-window*)) +(defun gemini-toc-scroll-begin () + (line-oriented-window-scroll-begin *gemini-toc-window*) + (gemini-toc-jump-to-entry)) + +(defun gemini-toc-scroll-end () + (line-oriented-window-scroll-end *gemini-toc-window*) + (gemini-toc-jump-to-entry)) + +(defun gemini-toc-search () + "Search toc with a text matching a regular expression" + (flet ((on-input-complete (regex) + (when-let* ((window (main-window:focused-window *main-window*))) + (let ((event (make-instance 'search-toc-event + :window window + :regex regex))) + (push-event event))))) + (ask-string-input #'on-input-complete + :prompt (_ "Search key: ") + :complete-fn #'complete:complete-always-empty))) + (defun ask-input-on-tofu-error (condition fn) (let ((host (gemini-client:host condition))) (flet ((on-input-complete (maybe-accepted)