Skip to content

Commit 7036af2

Browse files
committed
feat: add sidebar keybindings for journal navigation
Add keybindings to vulpea-ui-sidebar-mode-map for quick navigation: - [ : Go to previous journal entry - ] : Go to next journal entry - t : Go to today's journal - d : Pick a date Commands use vulpea-journal-ui--visit-date to open notes in the main window without disrupting the sidebar layout.
1 parent 26c5852 commit 7036af2

3 files changed

Lines changed: 70 additions & 5 deletions

File tree

CHANGELOG.org

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
* Unreleased
44

5+
** Added
6+
7+
- Sidebar keybindings for quick journal navigation: =[= (previous), =]= (next), =t= (today), =d= (pick date).
8+
59
* v1.0.0-rc.1
610

711
Initial release candidate.

README.org

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,17 @@ Reference orders for vulpea-ui widgets: stats=100, outline=200, backlinks=300, l
198198
| =vulpea-journal-previous= | Go to previous journal entry |
199199
| =vulpea-journal-setup= | Enable calendar integration |
200200

201+
* Sidebar Keybindings
202+
203+
When viewing a journal note, the sidebar provides quick navigation:
204+
205+
| Key | Action |
206+
|-----+--------------------------------|
207+
| =[= | Go to previous journal entry |
208+
| =]= | Go to next journal entry |
209+
| =t= | Go to today's journal |
210+
| =d= | Pick a date |
211+
201212
* Calendar Integration
202213

203214
After calling =vulpea-journal-setup=, the Emacs calendar gains journal superpowers:

vulpea-journal-ui.el

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,7 @@ This is the date of the journal entry you are currently viewing."
159159
"Visit journal for DATE from sidebar context.
160160
Opens the note in the main window, not the sidebar."
161161
(require 'vulpea-journal)
162-
(let ((note (vulpea-journal-note date))
163-
(main-win (vulpea-ui--get-main-window)))
164-
(when main-win
165-
(select-window main-win))
166-
(vulpea-visit note)))
162+
(vulpea-ui-visit-note (vulpea-journal-note date)))
167163

168164
(defun vulpea-journal-ui--strip-drawers (text)
169165
"Remove org drawers from TEXT."
@@ -513,6 +509,60 @@ ON-SELECT is callback to handle date selection."
513509
(format-time-string "%Y%m%d" (plist-get entry :date)))))))))
514510

515511

512+
;;; Sidebar Keybindings
513+
514+
(declare-function vulpea-journal "vulpea-journal")
515+
(declare-function vulpea-journal-note-p "vulpea-journal")
516+
(declare-function vulpea-journal-note-date "vulpea-journal")
517+
(declare-function vulpea-journal--adjacent-date "vulpea-journal")
518+
(declare-function vulpea-journal--read-date "vulpea-journal")
519+
520+
(defun vulpea-journal-ui--sidebar-note ()
521+
"Get the current journal note from sidebar context.
522+
Works whether called from sidebar or main window."
523+
(or vulpea-ui--current-note
524+
(when-let ((main-win (vulpea-ui--get-main-window)))
525+
(with-current-buffer (window-buffer main-win)
526+
(when-let ((file (buffer-file-name)))
527+
(car (vulpea-db-query-by-file-path file 0)))))))
528+
529+
(defun vulpea-journal-ui-previous ()
530+
"Navigate to the previous journal entry from sidebar."
531+
(interactive)
532+
(let ((note (vulpea-journal-ui--sidebar-note)))
533+
(if (not (vulpea-journal-note-p note))
534+
(user-error "Not viewing a journal note")
535+
(if-let* ((current-date (vulpea-journal-note-date note))
536+
(prev-date (vulpea-journal--adjacent-date current-date 'prev)))
537+
(vulpea-journal-ui--visit-date prev-date)
538+
(message "No previous journal entry")))))
539+
540+
(defun vulpea-journal-ui-next ()
541+
"Navigate to the next journal entry from sidebar."
542+
(interactive)
543+
(let ((note (vulpea-journal-ui--sidebar-note)))
544+
(if (not (vulpea-journal-note-p note))
545+
(user-error "Not viewing a journal note")
546+
(if-let* ((current-date (vulpea-journal-note-date note))
547+
(next-date (vulpea-journal--adjacent-date current-date 'next)))
548+
(vulpea-journal-ui--visit-date next-date)
549+
(message "No next journal entry")))))
550+
551+
(defun vulpea-journal-ui-today ()
552+
"Navigate to today's journal from sidebar."
553+
(interactive)
554+
(vulpea-journal-ui--visit-date (current-time)))
555+
556+
(defun vulpea-journal-ui-date (date)
557+
"Navigate to journal for DATE from sidebar."
558+
(interactive (list (vulpea-journal--read-date)))
559+
(vulpea-journal-ui--visit-date date))
560+
561+
(define-key vulpea-ui-sidebar-mode-map (kbd "[") #'vulpea-journal-ui-previous)
562+
(define-key vulpea-ui-sidebar-mode-map (kbd "]") #'vulpea-journal-ui-next)
563+
(define-key vulpea-ui-sidebar-mode-map (kbd "t") #'vulpea-journal-ui-today)
564+
(define-key vulpea-ui-sidebar-mode-map (kbd "d") #'vulpea-journal-ui-date)
565+
516566
;;; Widget Registration
517567

518568
(defun vulpea-journal-ui--get-order (widget)

0 commit comments

Comments
 (0)