rougier/book-mode

A clean interface for org files (Emacs)

Emacs Lisp

323

10 commits

updated Jan 9, 2024

See the code

README


#+attr_org: :width 600
[[./book-mode.png]]

*Book mode* - /Nicolas Rougier - January 9, 2023/ (*WIP*)

Book mode is an attempt at offering an interface for reading org-mode files with a clean layout. It is based on the use of large margins, headline and mode-line, with leading stars and bullets in the left margin using right alignment and different symbols. All decorations are part of the header-line (including upper left colored part and right upper glyph) and messages are displayed in the mode-line.

*See also* inside article directory for a more advanced and experimental example.

* Section

Using font lock keywords, we can have outer indent by moving leading stars into the left margin such that text is always aligned. This could be extended to org-num-mode but it would require a bigger margin and dedicated regex. This is applied for level 1, 2 and 3 while level 4 has a special transformation to make it appear like a paragraph (see below).

** Subsection

Using the same trick, we can also move list bullets in the margin and use a nicer glyph ("•" instead of "-"):

- Item 1
- Item 2

Not everyone like to have bullets in the margin though.

*** Subsubsection

The hl-line has been extended to margins such that it goes from side to side and plays nicely with leading stars and bullets.

**** Paragraph
This is actually a fourth level heading with a special keyword that suppress the (first) line jump. This results in the first paragraph to immediately follows the heading (like a paragraph in LaTeX).

#+begin_src emacs-lisp :results none

(when (derived-mode-p 'org-mode)
  (add-to-list 'font-lock-extra-managed-props 'display)
  ;;(setq left-margin 5)
  ;;(setq left-margin-width left-margin)
  ;;(set-window-margins (selected-window) left-margin 0)
  (let ((margin-format (format "%%%ds" left-margin-width)))
    (font-lock-add-keywords nil
       `(
         ("^\\(\\- \\)\\(.*\\)$"
          1 '(face nano-default display ((margin left-margin)
                                         ,(propertize (format margin-format "• ")
                                                      'face '(:inherit nano-default :weight light)) append)))

         ("^\\(\\*\\{1\\} \\)\\(.*\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "# ")
                                                    'face '(:inherit nano-faded :weight light)) append))
          2 '(face bold append))

         ("^\\(\\*\\{2\\} \\)\\(.*\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "## ")
                                                    'face '(:inherit nano-faded :weight light)) append))
          2 '(face bold append))

         ("^\\(\\*\\{3\\} \\)\\(.*\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "### ")
                                                    'face '(:inherit nano-faded :weight light)) append))
          2 '(face bold append))

         ("^\\*\\{4\\} .*?\\(\n\\)"
          1 '(face nil display " - "))

         ("^\\(\\*\\{4\\} \\)\\(.*?\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "§ ")
                                                    'face '(:inherit nano-faded :weight light))  append))
          2 '(face bold append)))))

  (font-lock-fontify-buffer)
  ;; (visual-line-mode)
  )

#+end_src

Not written in Markdown, so it's shown here as plain text — view it formatted on GitHub.

Contributors

rougier

8 commits

albreche

1 commits

ckeen

1 commits

rougier/book-mode

A clean interface for org files (Emacs)

Emacs Lisp

323

10 commits

updated Jan 9, 2024

See the code

README


#+attr_org: :width 600
[[./book-mode.png]]

*Book mode* - /Nicolas Rougier - January 9, 2023/ (*WIP*)

Book mode is an attempt at offering an interface for reading org-mode files with a clean layout. It is based on the use of large margins, headline and mode-line, with leading stars and bullets in the left margin using right alignment and different symbols. All decorations are part of the header-line (including upper left colored part and right upper glyph) and messages are displayed in the mode-line.

*See also* inside article directory for a more advanced and experimental example.

* Section

Using font lock keywords, we can have outer indent by moving leading stars into the left margin such that text is always aligned. This could be extended to org-num-mode but it would require a bigger margin and dedicated regex. This is applied for level 1, 2 and 3 while level 4 has a special transformation to make it appear like a paragraph (see below).

** Subsection

Using the same trick, we can also move list bullets in the margin and use a nicer glyph ("•" instead of "-"):

- Item 1
- Item 2

Not everyone like to have bullets in the margin though.

*** Subsubsection

The hl-line has been extended to margins such that it goes from side to side and plays nicely with leading stars and bullets.

**** Paragraph
This is actually a fourth level heading with a special keyword that suppress the (first) line jump. This results in the first paragraph to immediately follows the heading (like a paragraph in LaTeX).

#+begin_src emacs-lisp :results none

(when (derived-mode-p 'org-mode)
  (add-to-list 'font-lock-extra-managed-props 'display)
  ;;(setq left-margin 5)
  ;;(setq left-margin-width left-margin)
  ;;(set-window-margins (selected-window) left-margin 0)
  (let ((margin-format (format "%%%ds" left-margin-width)))
    (font-lock-add-keywords nil
       `(
         ("^\\(\\- \\)\\(.*\\)$"
          1 '(face nano-default display ((margin left-margin)
                                         ,(propertize (format margin-format "• ")
                                                      'face '(:inherit nano-default :weight light)) append)))

         ("^\\(\\*\\{1\\} \\)\\(.*\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "# ")
                                                    'face '(:inherit nano-faded :weight light)) append))
          2 '(face bold append))

         ("^\\(\\*\\{2\\} \\)\\(.*\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "## ")
                                                    'face '(:inherit nano-faded :weight light)) append))
          2 '(face bold append))

         ("^\\(\\*\\{3\\} \\)\\(.*\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "### ")
                                                    'face '(:inherit nano-faded :weight light)) append))
          2 '(face bold append))

         ("^\\*\\{4\\} .*?\\(\n\\)"
          1 '(face nil display " - "))

         ("^\\(\\*\\{4\\} \\)\\(.*?\\)$"
          1 '(face nano-faded display ((margin left-margin)
                                       ,(propertize (format margin-format "§ ")
                                                    'face '(:inherit nano-faded :weight light))  append))
          2 '(face bold append)))))

  (font-lock-fontify-buffer)
  ;; (visual-line-mode)
  )

#+end_src

Not written in Markdown, so it's shown here as plain text — view it formatted on GitHub.

Contributors

rougier

8 commits

albreche

1 commits

ckeen

1 commits

Languages

Emacs Lisp

76.2%

TeX

23.8%