~protesilaos/logos

05cf789a08e71ba0fd36d08e5852b900b42f7d58 — Protesilaos Stavrou 1 year, 1 month ago be3333b
REVISE fallback of logos-outline-regexp-alist

The previous value did not account for the buffer-local values of
'outline-regexp' or 'page-delimiter', nor did it adapt to any changes
in those values.  Instead, it would capture whatever the value was at
the time of declaration.

We remove the 't' condition altogether and instead handle the fallback
value internally.  Logos will either return the current buffer-local
value of 'outline-regexp' or 'page-delimiter', in this order.

Put simply, this has the same intent as before, but works properly.
2 files changed, 25 insertions(+), 19 deletions(-)

M README.org
M logos.el
M README.org => README.org +8 -11
@@ 233,8 233,7 @@ changes out-of-the-box ([[#h:2bb57369-352a-43bf-afe3-0bed2fcc7359][Extra tweaks]
(setq logos-outline-regexp-alist
      `((emacs-lisp-mode . "^;;;+ ")
        (org-mode . "^\\*+ +")
        (markdown-mode . "^\\#+ +")
        (t . ,(if (boundp 'outline-regexp) outline-regexp logos--page-delimiter))))
        (markdown-mode . "^\\#+ +")))

;; These apply when `logos-focus-mode' is enabled.  Their value is
;; buffer-local.


@@ 418,7 417,9 @@ Or simply exclude all programming modes:
By default, the page motions only move between the =^L= delimiters.
While the option ~logos-outlines-are-pages~ changes the behaviour to
move between outline headings instead.  What constitutes an "outline
heading" is determined by the ~logos-outline-regexp-alist~.
heading" is determined by the ~logos-outline-regexp-alist~ with an
automatic fallback to either ~outline-regexp~ or ~page-delimiter~
(Logos handles this fallback condition internally).

Provided this:



@@ 435,8 436,7 @@ as an outline, else the standard =^L=.
#+begin_src emacs-lisp
(setq logos-outline-regexp-alist
      `((emacs-lisp-mode . "^;;;+ ")
        (org-mode . "^\\*+ +")
        (t . ,(if (boundp 'outline-regexp) outline-regexp logos--page-delimiter))))
        (org-mode . "^\\*+ +")))
#+end_src

It is possible to tweak those regular expressions to target both the


@@ 445,8 445,7 @@ outline and the page delimiters:
#+begin_src emacs-lisp
(setq logos-outline-regexp-alist
      `((emacs-lisp-mode . ,(format "\\(^;;;+ \\|%s\\)" (default-value 'page-delimiter)))
        (org-mode . ,(format "\\(^\\*+ +\\|%s\\)" (default-value 'page-delimiter)))
        (t . ,(if (boundp 'outline-regexp) outline-regexp logos--page-delimiter))))
        (org-mode . ,(format "\\(^\\*+ +\\|%s\\)" (default-value 'page-delimiter)))))
#+end_src

The form =,(format "\\(^;;;+ \\|%s\\)" logos--page-delimiter)= expands


@@ 459,8 458,7 @@ pattern).  Putting it all together:
#+begin_src emacs-lisp
(setq logos-outline-regexp-alist
      `((emacs-lisp-mode . ,(format "\\(^;;;+ \\|%s\\)" logos--page-delimiter))
        (org-mode . ,(format "\\(^\\*+ +\\|^-\\{5\\}$\\|%s\\)" logos--page-delimiter))
        (t . ,(if (boundp 'outline-regexp) outline-regexp logos--page-delimiter))))
        (org-mode . ,(format "\\(^\\*+ +\\|^-\\{5\\}$\\|%s\\)" logos--page-delimiter))))
#+end_src

Another Org-specific tweak is to use heading levels up to a specific


@@ 473,8 471,7 @@ end result can look like this:
#+begin_src emacs-lisp
(setq logos-outline-regexp-alist
      `((emacs-lisp-mode . ,(format "\\(^;;;+ \\|%s\\)" logos--page-delimiter))
        (org-mode . ,(format "\\(^\\*\\{1,3\\} +\\|^-\\{5\\}$\\|%s\\)" logos--page-delimiter))
        (t . ,(if (boundp 'outline-regexp) outline-regexp logos--page-delimiter))))
        (org-mode . ,(format "\\(^\\*\\{1,3\\} +\\|^-\\{5\\}$\\|%s\\)" logos--page-delimiter))))
#+end_src

** Leverage logos-focus-mode-extra-functions

M logos.el => logos.el +17 -8
@@ 107,23 107,23 @@ When this variable is nil, pages are demarcated by the
  :package-version '(logos . "0.1.0")
  :group 'logos)

(defconst logos--page-delimiter (default-value 'page-delimiter)
  "The default value of `page-delimiter'.")

(defcustom logos-outline-regexp-alist
  `((emacs-lisp-mode . "^;;;+ ")
    (org-mode . "^\\*+ +")
    (markdown-mode . "^\\#+ +")
    (t . ,(if (boundp 'outline-regexp) outline-regexp logos--page-delimiter)))
    (markdown-mode . "^\\#+ +"))
  "Alist of major mode and regular expression of the outline.
Only used when `logos-outlines-are-pages' is non-nil.

The major mode also targets any of its derivatives.  For example,
`lisp-interaction-mode' (the standard scratch buffer) is based on
`emacs-lisp-mode' so one only needs to set the outline regexp of
the latter."
the latter.

If the current buffer's major mode is not specified herein, Logos
will try to use the `outline-regexp', else fall back to the
generic `page-delimiter'."
  :type `(alist :key-type symbol :value-type string) ; TODO 2022-03-02: ensure symbol is mode?
  :package-version '(logos . "0.1.0")
  :package-version '(logos . "0.6.0")
  :group 'logos)

(defcustom logos-hide-cursor nil


@@ 226,13 226,22 @@ and disabled, then use the `logos-focus-mode-hook' instead."

;;;; Page motions

(defconst logos--page-delimiter (default-value 'page-delimiter)
  "The default value of `page-delimiter'.")

(defun logos--outline-or-delimiter ()
  "Return the current `outline-regexp' or page delimiter."
  (if (bound-and-true-p outline-regexp)
      outline-regexp
    logos--page-delimiter))

(defun logos--outline-regexp ()
  "Return page delimiter from `logos-outline-regexp-alist'."
  (let ((outline logos-outline-regexp-alist)
        (mode major-mode))
    (or (alist-get mode outline)
        (alist-get (get mode 'derived-mode-parent) outline)
        (alist-get t outline))))
        (logos--outline-or-delimiter))))

(defun logos--page-delimiter ()
  "Determine the `page-delimiter'."