Make going back and forth in timeline buffers more robust

Do not treat the headline as a valid line.
This commit is contained in:
Daniel - 2022-03-31 14:22:52 +02:00
parent 3c7ea1b987
commit 367c8969fc
No known key found for this signature in database
GPG Key ID: 1C7071A75BB72D64
1 changed files with 42 additions and 29 deletions

View File

@ -527,49 +527,62 @@ current values of the relevant buffer local variables."
(goto-char (point-min))
(timeline-tools-next-line))))
(defun timeline-tools--get-entry-from-point ()
"Return timeline entry of point when in timeline buffer."
(defun timeline-tools--get-entry-from-point (&optional noerror)
"Return timeline entry of point when in timeline buffer.
Errors out if there is no entry on the current line, unless
NOERROR is non-nil; in that case, return nil when no text
property could be found (note that this can also happen if point
is outside of the current table)."
(unless (derived-mode-p 'timeline-tools-mode))
(save-mark-and-excursion
(unless (org-at-table-p)
(user-error "Not in table"))
(unless (looking-at "^| ")
(user-error "Not on valid row in timeline"))
(if (not (org-at-table-p))
(if noerror nil (user-error "Not in table"))
(beginning-of-line)
(if (not (looking-at "^| "))
(if noerror nil (user-error "Not on valid row in timeline"))
(org-table-next-field)
(if-let ((entry (get-text-property (point) 'entry)))
entry
(user-error "Not on valid row in timeline"))))
(if noerror nil (user-error "Not on valid row in timeline")))))))
(defun timeline-tools-next-line ()
"Move point to next line in timetable, if possible."
"Move point to next line in timetable, if possible.
Otherwise don't move point and error out."
(interactive)
(unless (eq major-mode 'timeline-tools-mode)
(unless (derived-mode-p 'timeline-tools-mode)
(user-error "Not in Timeline buffer"))
(beginning-of-line)
(let ((point (point)))
(when (looking-at "^| ")
(forward-line))
(unless (re-search-forward "^| " nil 'no-error)
(let ((point (point))
found)
(end-of-line)
(while (and (setq found (re-search-forward "^| " nil t))
(not (timeline-tools--get-entry-from-point 'noerror))))
;; Check whether we've found something when leaving the while-loop; if not,
;; go back and error out, as promised in the docstring.
(unless found
(goto-char point)
(user-error "No next line"))
(beginning-of-line)))
(user-error "No next line")))
(beginning-of-line))
(defun timeline-tools-previous-line ()
"Move point to previous line in timetable, if possible."
"Move point to previous line in timetable, if possible.
Otherwise don't move point and error out."
(interactive)
(unless (eq major-mode 'timeline-tools-mode)
(user-error "Not in Timeline buffer"))
(beginning-of-line)
(let ((point (point)))
;; Make sure we do not move into the headline by checking the `entry'
;; property
(unless (and (re-search-backward "^| " nil 'no-error)
(progn (org-table-next-field)
(get-text-property (point) 'entry)))
(let ((point (point))
found)
(while (and (setq found (re-search-backward "^| " nil t))
(not (timeline-tools--get-entry-from-point 'noerror))))
;; Check whether we've found something when leaving the while-loop; if not,
;; go back and error out, as promised in the docstring.
(unless found
(goto-char point)
(user-error "No previous line"))
(beginning-of-line)))
(user-error "No previous line")))
(beginning-of-line))
(defun timeline-tools--get-timeline-from-buffer ()
"Extract current timeline from buffer and return it.