“Focused editing” tools for Emacs
Raw link: https://www.youtube.com/watch?v=SLyierm-vyU
In this video I showcase the various tools I have pieced together into a coherent paradigm for a distraction-free writing workflow. These are simple toggles or minor modes that combine built-in and third party packages with my tweaks and configurations. The end result is a state that allows me to concentrate more effectively on the task at hand, whether it is composing prose or coding.
Note that mixed-font settings for org-mode
will depend on the theme
that you use. My Modus
themes are designed to
cope well with such demands.
The following code block is excerpted from my dotemacs. Please bear in mind that I will not be updating it, so check my dotemacs for the most up-to-date code I distribute.
(use-package olivetti
:ensure
:defer
:diminish
:config
(setq olivetti-body-width 0.65)
(setq olivetti-minimum-body-width 72)
(setq olivetti-recall-visual-line-mode-entry-state t)
(define-minor-mode prot/olivetti-mode
"Toggle buffer-local `olivetti-mode' with additional parameters.
Fringes are disabled. The modeline is hidden, except for
`prog-mode' buffers (see `prot/hidden-mode-line-mode'). The
default typeface is set to a proportionately-spaced family,
except for programming modes (see `prot/variable-pitch-mode').
The cursor becomes a blinking bar, per `prot/cursor-type-mode'."
:init-value nil
:global nil
(if prot/olivetti-mode
(progn
(olivetti-mode 1)
(set-window-fringes (selected-window) 0 0)
(prot/variable-pitch-mode 1)
(prot/cursor-type-mode 1)
(unless (derived-mode-p 'prog-mode)
(prot/hidden-mode-line-mode 1)))
(olivetti-mode -1)
(set-window-fringes (selected-window) nil) ; Use default width
(prot/variable-pitch-mode -1)
(prot/cursor-type-mode -1)
(unless (derived-mode-p 'prog-mode)
(prot/hidden-mode-line-mode -1))))
:bind ("C-c o" . prot/olivetti-mode))
(use-package emacs
:commands prot/hidden-mode-line-mode
:config
(setq mode-line-percent-position '(-3 "%p"))
(setq mode-line-defining-kbd-macro
(propertize " Macro" 'face 'mode-line-emphasis))
(setq-default mode-line-format
'("%e"
mode-line-front-space
mode-line-mule-info
mode-line-client
mode-line-modified
mode-line-remote
mode-line-frame-identification
mode-line-buffer-identification
" "
mode-line-position
(vc-mode vc-mode)
" "
mode-line-modes
" "
mode-line-misc-info
mode-line-end-spaces))
(define-minor-mode prot/hidden-mode-line-mode
"Toggle modeline visibility in the current buffer."
:init-value nil
:global nil
(if prot/hidden-mode-line-mode
(setq-local mode-line-format nil)
(kill-local-variable 'mode-line-format)
(force-mode-line-update))))
(use-package face-remap
:diminish buffer-face-mode ; the actual mode
:commands prot/variable-pitch-mode
:config
(define-minor-mode prot/variable-pitch-mode
"Toggle `variable-pitch-mode', except for `prog-mode'."
:init-value nil
:global nil
(if prot/variable-pitch-mode
(unless (derived-mode-p 'prog-mode)
(variable-pitch-mode 1))
(variable-pitch-mode -1))))
(use-package emacs
:config
(setq-default scroll-preserve-screen-position t)
(setq-default scroll-conservatively 1) ; affects `scroll-step'
(setq-default scroll-margin 0)
(define-minor-mode prot/scroll-centre-cursor-mode
"Toggle centred cursor scrolling behaviour."
:init-value nil
:lighter " S="
:global nil
(if prot/scroll-centre-cursor-mode
(setq-local scroll-margin (* (frame-height) 2)
scroll-conservatively 0
maximum-scroll-margin 0.5)
(dolist (local '(scroll-preserve-screen-position
scroll-conservatively
maximum-scroll-margin
scroll-margin))
(kill-local-variable `,local))))
;; C-c l is used for `org-store-link'. The mnemonic for this is to
;; focus the Line and also works as a variant of C-l.
:bind ("C-c L" . prot/scroll-centre-cursor-mode))
(use-package display-line-numbers
:defer
:config
;; Set absolute line numbers. A value of "relative" is also useful.
(setq display-line-numbers-type t)
(define-minor-mode prot/display-line-numbers-mode
"Toggle `display-line-numbers-mode' and `hl-line-mode'."
:init-value nil
:global nil
(if prot/display-line-numbers-mode
(progn
(display-line-numbers-mode 1)
(hl-line-mode 1))
(display-line-numbers-mode -1)
(hl-line-mode -1)))
:bind ("<f7>" . prot/display-line-numbers-mode))
(use-package frame
:commands prot/cursor-type-mode
:config
(setq-default cursor-type 'box)
(setq-default cursor-in-non-selected-windows '(bar . 2))
(setq-default blink-cursor-blinks 50)
(setq-default blink-cursor-interval nil) ; 0.75 would be my choice
(setq-default blink-cursor-delay 0.2)
(blink-cursor-mode -1)
(define-minor-mode prot/cursor-type-mode
"Toggle between static block and pulsing bar cursor."
:init-value nil
:global t
(if prot/cursor-type-mode
(progn
(setq-local blink-cursor-interval 0.75
cursor-type '(bar . 2)
cursor-in-non-selected-windows 'hollow)
(blink-cursor-mode 1))
(dolist (local '(blink-cursor-interval
cursor-type
cursor-in-non-selected-windows))
(kill-local-variable `,local))
(blink-cursor-mode -1))))