branch: externals/logos commit 8c2e85033db982ef13a5e041012dc45d86d9de32 Author: Omar AntolĂn Camarena <o...@matem.unam.mx> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Improve how pages/outlines are handled when narrow 1. If logos-outlines-are-pages is non-nil, it now includes the match of the page-delimiter regexp in the narrowed region and leaves point right after the page-delimiter ---so in Org mode, after the stars. (I thought it was better to leave point there than at the very beginning of the narrowed buffer to match the behavior of logos-forward-page-dwim when the buffer is not narrowed.) 2. To avoid skipping pages in the narrowed case, the function checks if you are right at the start of a page-delimiter and if so move you past the delimiter in the opposite direction you are moving: so if you are moving back, it puts you after the delimiter, and if you are moving forward it puts you before the delimiter. (The bug was that if the point was at point-max while narrowed and moving forward, it would skip past a page and the same in the opposite direction with point-min.) 3. Changed logos-narrow-dwim to call logos--narrow-to-page instead of narrow-to-page, so that it too includes the page-delimiter match in the page. --- logos.el | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/logos.el b/logos.el index 4c4e89fa32..7d1b2d8559 100644 --- a/logos.el +++ b/logos.el @@ -166,11 +166,34 @@ This is only relevant when `logos-focus-mode' is enabled." (defun logos--narrow-to-page (count &optional back) "Narrow to COUNTth page with optional BACK motion." + ;; Position point to avoid skipping pages. + (when (and (buffer-narrowed-p) + (save-restriction + (widen) + (looking-at page-delimiter))) + (goto-char (if back + (1+ (match-end 0)) + (1- (match-beginning 0))))) (if back (narrow-to-page (or (- count) -1)) (narrow-to-page (or (abs count) 1))) - ;; Avoids the problem of skipping pages while cycling back and forth. - (goto-char (point-min))) + (let ((page-start (point-min-marker))) + ;; If outlines are pages, include match of page-delimiter in page + (when (and logos-outlines-are-pages + (save-excursion + (goto-char (point-min)) + (save-restriction + (widen) + (looking-back page-delimiter (line-beginning-position))))) + (let ((match-start (match-beginning 0)) + (page-end (point-max-marker))) + (widen) + (narrow-to-region match-start page-end))) + ;; Leave point at a standard location: if outlines are pages, + ;; leave it right after the page-delimiter (to match the + ;; unnarrowed behavior); if outlines are not pages, leave it at + ;; the beginning of the page. + (goto-char page-start))) (defvar logos-page-motion-hook nil "Hook that runs after a page motion. @@ -272,7 +295,10 @@ If narrowing is in effect, widen the view." (null (buffer-narrowed-p))) (narrow-to-region (region-beginning) (region-end))) ((logos--page-p) - (narrow-to-page)) + ;; Use our own narrow to page function because when + ;; logos-outlines-are-pages is t, the page delimiter + ;; is included in the region narrowed to. + (logos--narrow-to-page 0)) ((null (buffer-narrowed-p)) (logos-narrow-visible-window)) ((widen))))