diff --git a/etc/init.lisp b/etc/init.lisp index ec2f57c..53dac8b 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -209,6 +209,8 @@ (define-key "\\\\ m" #'thread-search-previous-message-meta *thread-keymap*) +(define-key "N" #'repeat-search *thread-keymap*) + (define-key "n" #'thread-search-next-unread-message *thread-keymap*) (define-key "home" #'thread-goto-first-message *thread-keymap*) @@ -289,6 +291,8 @@ (define-key "/" #'message-search-regex *message-keymap*) +(define-key "N" #'repeat-search *message-keymap*) + (define-key "npage" #'message-scroll-next-page *message-keymap*) (define-key "ppage" #'message-scroll-previous-page *message-keymap*) @@ -305,6 +309,8 @@ (define-key "/" #'message-search-regex *gemini-message-keymap*) +(define-key "N" #'repeat-search *gemini-message-keymap*) + (define-key "npage" #'message-scroll-next-page *gemini-message-keymap*) (define-key "ppage" #'message-scroll-previous-page *gemini-message-keymap*) diff --git a/src/package.lisp b/src/package.lisp index a65397d..46a64f0 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -1262,11 +1262,12 @@ :min-id :fetch-remote-status-event :process-event + :search-next-event :search-regex-message-content-event - :thread-goto-message :thread-search-message-body-event :search-direction :thread-search-message-meta-event + :thread-goto-message :delete-all-status-event :quit-program-event :error-message-event @@ -2208,6 +2209,7 @@ :thread-search-previous-message-body :thread-search-next-message-meta :thread-search-previous-message-meta + :repeat-search :thread-search-next-unread-message :thread-open-selected-message :thread-mark-delete-selected-message diff --git a/src/program-events.lisp b/src/program-events.lisp index 578469c..3db4c7c 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -395,7 +395,19 @@ (dbg "fetch single status ~a" dump)) (db:update-db status))) -(defclass search-regex-message-content-event (program-event) ()) +(defparameter *search-next-saved-event* nil) + +(defclass search-event (program-event) ()) + +(defmethod process-event :before ((object search-event)) + (setf *search-next-saved-event* object)) + +(defclass search-next-event (program-event) ()) + +(defmethod process-event ((object search-next-event)) + (push-event *search-next-saved-event*)) + +(defclass search-regex-message-content-event (search-event) ()) (defmethod process-event ((object search-regex-message-content-event)) (let ((regexp (payload object))) @@ -406,13 +418,7 @@ (error () (ui:error-message (_ "Invalid regular expression"))))))) -(defclass thread-goto-message (program-event) ()) - -(defmethod process-event ((object thread-goto-message)) - (let ((message-index (payload object))) - (thread-window:goto-message specials:*thread-window* message-index))) - -(defclass thread-search-event (program-event) +(defclass thread-search-event (search-event) ((search-direction :initform nil :initarg :search-direction @@ -436,6 +442,12 @@ (thread-window:search-next-message-meta specials:*thread-window* text-looking-for) (thread-window:search-previous-message-meta specials:*thread-window* text-looking-for)))) +(defclass thread-goto-message (program-event) ()) + +(defmethod process-event ((object thread-goto-message)) + (let ((message-index (payload object))) + (thread-window:goto-message specials:*thread-window* message-index))) + (defclass delete-all-status-event (program-event) ()) (defmethod process-event ((object delete-all-status-event)) diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index b26a82b..f179c99 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -280,6 +280,10 @@ Metadata includes: "Jump to next unread message" (thread-window:search-next-unread *thread-window*)) +(defun repeat-search () + "Repeat the last search performed" + (push-event (make-instance 'search-next-event))) + (defun thread-open-selected-message () "Open selected message" (setf (windows:keybindings specials:*message-window*)