Emacs: logos version 0.5.0

The logos package provides a simple approach to setting up a “focus mode”. It uses the page-delimiter or the outline together with some commands to move between pages whether narrowing is in effect or not. It also provides some optional aesthetic tweaks which come into effect when the buffer-local logos-focus-mode is enabled. The manual shows how to extend the code to achieve the desired result.

Watch the demo of the original version of logos.el (all my videos since early 2022 use logos).

Below are the release notes.

  • Introduced the function logos-update-fringe-in-buffers. This is a convenience function for those who (i) set the user option logos-hide-fringe to a non-nil value and (ii) switch themes while logos-focus-mode is enabled in one or more buffers. This convenience function updates the fringe face to be consistent with the current theme (we technically make the fringe invisible, instead of outright disabling it, as that would not be desirable). It needs to be assigned to a hook that gets called in the post-theme-load phase. The modus-themes or the ef-themes (both by me) provide such a hook. Otherwise the Logos manual explains how to implement one for any theme. Read: https://protesilaos.com/emacs/logos#h:6a254fa0-5706-4032-8a8b-233ffb1f0e6b.

  • Implemented the logos-focus-mode-map. This is a keymap that is active when logos-focus-mode is enabled in the buffer. One can, for example, use it to bind the arrow key to page motions, such as logos-forward-page-dwim.

    Remember that, by default, pages are delimited with the Control-L character (^L), though Logos can treat different delimiters as “page” separators (e.g. Org headings and a horizontal rule of five hyphens). Consult the user options logos-outlines-are-pages, logos-outline-regexp-alist, and check the manual for relevant simple and more advanced code samples. My current setup for those:

    (setq logos-outlines-are-pages t)
    (setq logos-outline-regexp-alist
          `((emacs-lisp-mode . ,(format "\\(^;;;+ \\|%s\\)" logos--page-delimiter))
            (org-mode . ,(format "\\(^\\*+ +\\|^-\\{5\\}$\\|%s\\)" logos--page-delimiter))
            (markdown-mode . ,(format "\\(^\\#+ +\\|^[*-]\\{5\\}$\\|^\\* \\* \\*$\\|%s\\)" logos--page-delimiter))
            (conf-toml-mode . "^\\[")
            (t . ,(or outline-regexp logos--page-delimiter))))
  • Added the logos-repeat-map. This is a keymap that gets enabled when the built-in repeat-mode is active (Emacs 28 or higher). This means that page motions, C-x ] and C-x [, can be repeated by following them up with either ] or [. The repetition stops when another command is invoked.

    Thanks to Lucy McPhail for the patch: https://lists.sr.ht/~protesilaos/logos/patches/34101. The change is below the ~15 line threshold and thus requires no copyright assignment to the Free Software Foundation.

  • Wrote documentation on how to auto-toggle menu and tool bars while using the logos-focus-mode. This is complementary to user options provided by Logos and shows how flexible and extensible the code is. Thanks to Ypot for raising the question in issue 2 on the GitHub mirror: https://github.com/protesilaos/logos/issues/2.

    [ Never hesitate to ask for help if you want to do something with Logos but are not sure how. ]

  • Specified the :version of all user-facing variables. This is helpful while perusing documentation strings in Help buffers, as any change will be assigned to the given version of Logos.

  • Clarified the doc string of the logos-variable-pitch user option with regard to prog-mode buffers. It now reads thus:

    When non-nil, use variable-pitch-mode where appropriate. In programming modes the default font is always used, as that is assumed to be a monospaced typeface, which is appropriate for spacing-sensitive text.

    This is only relevant when logos-focus-mode is enabled.

  • Documented some user options for the built-in eww which make its contents behave like the rest of Emacs in terms of the use of fonts and the filling of paragraphs. In brief:

    (setq shr-max-width fill-column)
    (setq shr-use-fonts nil)

    This is relevant for Logos as we then do not need to implement special casing for logos-focus-mode to work nicely with eww (I am personally annoyed when a buffer has its own opinions about font settings).

    Thanks to Ypot for discussing this in issue 4 on the GitHub mirror: https://github.com/protesilaos/logos/issues/4.

    [ For font-related customisations check the fontaine package on GNU ELPA (by me). ]

  • Named the mailing list address as the Maintainer: of Logos. Together with the other package headers, they help the user find our primary sources and/or communication channels. This change conforms with work being done upstream in package.el by Philip Kaludercic. I was informed about it here: https://lists.sr.ht/~protesilaos/general-issues/%3C875ykl84yi.fsf%40posteo.net%3E.