hamacs/ha-display.org
Howard Abrams 0599164dec Finally fixed my fonts so that variable-pitch works in org
At least, it works in Org with the ability to change the font sizes,
which is important when giving presentations with larger fonts.

The real culprit was the mixed-pitch project that didn't allow for
changing font sizes (which was easy enough to configure).
2022-03-18 14:17:20 -07:00

16 KiB
Raw Blame History

Emacs Graphical Display Configuration

A literate programming file to configure the Emacs UI.

Dashboard

The emacs-dashboard project makes a nicer startup screen.

  (use-package dashboard
    :init
    (defun ha-dashboard-version ()
      (let ((smaller-version (replace-regexp-in-string
                     (rx " (" (zero-or-more any) eol) "" (emacs-version))))
        (string-replace "\n" "" smaller-version)))

    (setq dashboard-banner-logo-title
          (format "Emacs %s ⸺ %s"
                  (if (and (fboundp 'native-comp-available-p)
                           (native-comp-available-p))
                      "with Native Compilation" "")
                  (ha-dashboard-version))
          dashboard-startup-banner "~/other/hamacs/support/levitating-gnu.png"
          dashboard-center-content t
          dashboard-set-init-info t
          dashboard-projects-switch-function 'projectile-persp-switch-project
          dashboard-items '((projects . 5)
                            ;; (agenda . 5)
                            (bookmarks . 5)))
    :config
    (dashboard-setup-startup-hook)

    (setq dashboard-footer-messages (list (ha--dad-joke))))

Mode Line

Let's install and load some of packages from the Doom Emacs project, like doom-modeline and maybe the themes:

  (use-package doom-modeline
    :init
    (setq doom-modeline-minor-modes nil
          doom-modeline-buffer-encoding nil
          doom-modeline-percent-position nil)
    :config
    (doom-modeline-mode +1))

  (use-package doom-themes)

Find the Bloody Cursor

Large screen, lots of windows, so where is the cursor? While I used to use hl-line+, I found that the prolific Protesilaos Stavrou introduced his Pulsar project is just what I need. Specifically, I might loose the cursor and need to have it highlighted (using F6), but also, this automatically highlights the cursor line with specific actions , like changing windows.

  (use-package pulsar
    :straight (:type git :protocol ssh :host gitlab :repo "protesilaos/pulsar")
    :custom
    (pulsar-pulse-functions '(recenter-top-bottom
                              move-to-window-line-top-bottom
                              reposition-window
                              bookmark-jump
                              other-window
                              delete-window
                              delete-other-windows
                              forward-page
                              backward-page
                              scroll-up-command
                              scroll-down-command
                              windmove-right
                              windmove-left
                              windmove-up
                              windmove-down
                              windmove-swap-states-right
                              windmove-swap-states-left
                              windmove-swap-states-up
                              windmove-swap-states-down
                              winum-select-window-1
                              winum-select-window-2
                              winum-select-window-3
                              winum-select-window-4
                              winum-select-window-5
                              winum-select-window-6
                              winum-select-window-7
                              winum-select-window-8
                              winum-select-window-9
                              winner-undo
                              winner-redo
                              tab-new
                              tab-close
                              tab-next
                              org-next-visible-heading
                              org-previous-visible-heading
                              org-forward-heading-same-level
                              org-backward-heading-same-level
                              outline-backward-same-level
                              outline-forward-same-level
                              outline-next-visible-heading
                              outline-previous-visible-heading
                              outline-up-heading))
    (pulsar-face 'pulsar-magenta)
    (pulsar-delay 0.055)
    :bind ("<f6>" . pulsar-pulse-line))

Themes

One does get used to a particular collection of colors. Mine is Tomorrow:

(use-package color-theme-sanityinc-tomorrow)

Most of the time, Emacs is on my desk is a darkened room, so I choose the dark theme:

(defun laptop-inside ()
  (interactive)
  (load-theme 'sanityinc-tomorrow-night t)
  (set-face-attribute 'region nil :background "#000096")
  (set-face-attribute 'mode-line nil :background "black")
  (set-face-attribute 'mode-line-inactive nil :background "#333333"))

But, when feeling adventurous, I sometimes take my laptop outside:

(defun laptop-in-the-sun ()
  (interactive)
  (load-theme 'sanityinc-tomorrow-day t)
  (set-face-attribute 'region nil :background "orange1")
  (set-face-attribute 'mode-line nil :background "#cccccc")
  (set-face-attribute 'mode-line-inactive nil :background "#888888"))

Oh, and turn off the line highlighting:

(global-hl-line-mode -1)

And of course, the default is inside where it is dark and safe:

(laptop-inside)

Full Size Frame

Taken from this essay, I figured I would start the initial frame automatically in fullscreen, but not any subsequent frames (as this could be part of the capturing system).

(add-to-list 'initial-frame-alist '(fullscreen . maximized))

Font Configuration

Am I ever really ever satisfied with any font? I regularly change my font based on the monospace du jour… Source Code Pro is attractive, and has been a staple on every programmers' screen. However, we all want ligatures, Hasklig is a nice font that is thinner and easier to read than Fira, but Iosevka seems to have it all. Oh, Microsoft just gave us Cascadia and that seems shiny. However, the Nerd Font project adds the ligatures as well as all the other niceties to a font.

Choosing a Font

I stole the following idea from Protesilaos Stavrou's dotfile configuration, and the following should minimally be readable:

Similarities Regular
()[]{}<>«»‹› ABCDEFGHIJKLMNOPQRSTUVWXYZ
6bB8& abcdefghijklmnopqrstuvwxyz
0ODdoaoOQGC 0123456789
I1tilIJL ~!@#$%^&*+
!¡ij `'"‘’“”.,;:…
5$§SsS5 ()[]{}—-_=<>/\
17ZzZ2 ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ
9gqpG6 αβγδεζηθικλμνξοπρστυφχψω
hnmMN
uvvwWuuwvy
x×X #include <stdio.h> // <= quickly.
.,·°% int main(int argc, char **argv) {
¡!¿? long il1[]={1-2/3.4,5+6==7/8};
:; int OxFaced=0xBAD "[{(CQUINE";
`''"‘’“” unsigned O0,l1,Z2,S5,G6,B8__XY;
—-~≈=≠+*_ printf("@$Hamburgefo%c`",'\n');
…⋯ return ~7&8^9?0:l1 !"j->k+=*w";

The following is from Hack's website:

//  The four boxing wizards jump
#include <stdio.h> // <= quickly.
int main(int argc, char **argv) {
  long il1[]={1-2/3.4,5+6==7/8};
  int OxFaced=0xBAD||"[{(CQUINE";
  unsigned O0,l1,Z2,S5,G6,B8__XY;
  printf("@$Hamburgefo%c`",'\n');
  return ~7&8^9?0:l1|!"j->k+=*w";
}

To install a font, I use the following command on my Mac:

brew tap homebrew/cask-fonts
brew install --cask font-hack-nerd-font

Specifying a Font

My current favorite font is actually the top list of fonts that may be installed on my system (they usually are):

  (defvar ha-fixed-font
    (when window-system
      (cond
       ((x-list-fonts "Hack Nerd Font") "Hack Nerd Font")
       ((x-list-fonts "Cousine Nerd Font") "Cousine Nerd Font")
       ((x-list-fonts "Iosevka Nerd Font") "Iosevka Nerd Font")
       ((x-list-fonts "Iosevka")           "Iosevka")
       ((x-list-fonts "FantasqueSansMono Nerd Font") "FantasqueSansMono Nerd Font")
       ((x-list-fonts "Monoid Nerd Font")  "Monoid Nerd Font")
       ((x-list-fonts "Hasklig")           "Hasklig")
       ((x-list-fonts "Cascadia Code PL")  "Cascadia Code PL")
       ((x-list-fonts "Source Code Pro")   "Source Code Pro")
       ((x-list-fonts "Anonymous Pro")     "Anonymous Pro")
       (t "monospaced")))
    "My fixed width font based on what is installed, `nil' if not defined.")

Force something as well:

(setq ha-fixed-font "Hack Nerd Font")

I probably don't need to have such a ranking system, as chances are really good that I'll have all of them installed. Still.

(defvar ha-variable-font
  (when window-system
    (cond ((x-list-fonts "Overpass")        "Overpass")
          ((x-list-fonts "Source Sans Pro") "Source Sans Pro")
          ((x-list-fonts "Lucida Grande")   "Lucida Grande")
          ((x-list-fonts "Verdana")         "Verdana")
          ((x-family-fonts "Sans Serif")    "Sans Serif")
          (nil (warn "Cannot find a Sans Serif Font.  Install Source Sans Pro."))))
  "My variable width font available to org-mode files and whatnot.")

Simple function that gives me the font information based on the size I need. Recently updated after reading this essay, as I wanted my fixed-pitch to scale along with my variable-pitch font.

  (defun ha-set-favorite-font-size (size)
    "Set the default font size as well as equalize the fixed and variable fonts."
    (let ((fav-font (format "%s-%d" ha-fixed-font size)))
      (set-face-attribute 'default nil :font fav-font)
      (set-face-attribute 'fixed-pitch nil :family ha-fixed-font :inherit 'default :height 1.0)
      (set-face-attribute 'variable-pitch nil :family ha-variable-font :inherit 'default :height 1.15)))

Define interactive functions to quickly adjusting the font size based on my computing scenario:

  (defun ha-mac-monitor-fontsize ()
    "Quickly set reset my font size when I connect my laptop to a monitor on a Mac."
    (interactive)
    (ha-set-favorite-font-size 17))

  (defun ha-linux-monitor-fontsize ()
    "Quickly set reset my font size when I connect my laptop to a monitor on Linux."
    (interactive)
    (ha-set-favorite-font-size 12))

  (defun ha-mac-laptop-fontsize ()
    "Quickly set reset my font size when I disconnect my laptop to a monitor from a Mac."
    (interactive)
    (ha-set-favorite-font-size 32))

  (defun ha-linux-laptop-fontsize ()
    "Quickly set reset my font size when I disconnect my laptop to a monitor from Linux."
    (interactive)
    (ha-set-favorite-font-size 14))

  (defun ha-imac-fontsize ()
    "Quickly set reset my font size when I am on my iMac."
    (interactive)
    (ha-set-favorite-font-size 16))

Which font to choose?

  (defun font-monitor-size-default ()
    "Set the default size according to my preference."
    (interactive)
    (cond
     ((eq system-type 'gnu/linux)         (ha-linux-monitor-fontsize))
     ((s-starts-with? "imac" system-name) (ha-imac-fontsize))
     (t                                   (ha-mac-monitor-fontsize))))

  (defun font-laptop-size-default ()
    "Set the default size according to my preference."
    (interactive)
    (if (eq system-type 'gnu/linux)
        (ha-linux-laptop-fontsize)
      (ha-mac-laptop-fontsize)))

  (font-monitor-size-default)

Zooming or Increasing Font Size

Do we want to increase the size of font in a single window (using text-scale-increase), or globally (using my new font-size-increase)?

Increase or decrease the set size of the face:

  (defun font-size-adjust (delta)
    "Adjust the current frame's font size.
  DELTA would be something like 1 or -1."
    (interactive "nFont size difference: ")
    (when (null delta) (setq delta 1))

    (let* ((font-family (face-attribute 'default :font))
           (font-size   (font-get font-family :size))
           (new-size    (+ delta font-size)))
      (ha-set-favorite-font-size new-size)))

  (defun font-size-increase ()
     "Increase the `default' font size of all frames."
     (interactive)
     (font-size-adjust 1))

  (defun font-size-decrease ()
     "Decrease the `default' font size of all frames."
     (interactive)
     (font-size-adjust -1))

And some keybindings to call them:

  (global-set-key (kbd "s-+") 'font-size-increase)
  (global-set-key (kbd "s-=") 'font-size-increase)
  (global-set-key (kbd "s--") 'font-size-decrease)
  (global-set-key (kbd "s-0") 'font-size-monitor-default)
  (global-set-key (kbd "s-9") 'font-size-laptop-default)

Icons and Whatnot

Not use what I'm doing with the all-the-icons package, but the Doom Modeline uses much of this.

(use-package all-the-icons)

Note: Install everything with the function, all-the-icons-install-fonts.

Ligatures

Seems like getting ligatures to work in Emacs has been a Holy Grail. On Mac, I've used special builds that have hacks, but now with Emacs 27 and Harfbuzz, I should be able to get > to look like it should.

(setq prettify-symbols-unprettify-at-point 'right-edge)

(global-prettify-symbols-mode +1)
(prettify-symbols-mode +1)

Note, in Doom, is appears we have a ligatures module. We'll start using that instead, but changing it in general-programming file.