Visual Configuration

Dashboard

(use-package dashboard
  :straight (:build t)
  :ensure t
  :after all-the-icons
  :config
  (setq dashboard-banner-logo-title "Phundrak’s Vanilla Emacs"
        dashboard-startup-banner    'logo
        dashboard-center-content    t
        dashboard-show-shortcuts    t
        dashboard-set-navigator     t
        dashboard-set-heading-icons t
        dashboard-set-file-icons    t
        initial-buffer-choice       (lambda () (get-buffer "*dashboard*"))
        dashboard-projects-switch-function 'counsel-projectile-switch-project-by-name)
  (setq dashboard-navigator-buttons
        `(((,(all-the-icons-faicon "language" :height 1.1 :v-adjust 0.0)
            "Linguistics Website"
            ""
            (lambda (&rest _) (browse-url "https://langue.phundrak.com")))

           (,(all-the-icons-faicon "firefox" :height 1.1 :v-adjust 0.0)
            "Config Website"
            ""
            (lambda (&rest _) (browse-url "https://config.phundrak.com"))))

          ((,(all-the-icons-octicon "git-branch" :height 1.1 :v-adjust 0.0)
            "Dotfiles Sources"
            ""
            (lambda (&rest _) (browse-url "https://labs.phundrak.com/phundrak/dotfiles")))
           ("!" "Issues" "Show issues" (lambda (&rest _)
                                         (browse-url "https://labs.phundrak.com/phundrak/dotfiles/issues"))
            warning))
          ((,(all-the-icons-faicon "level-up" :height 1.1 :v-adjust 0.0)
            "Update Packages"
            ""
            (lambda (&rest _) (progn
                                (require 'straight)
                                (straight-pull-all)
                                (straight-rebuild-all)))))))

  (setq dashboard-items '((recents  . 15)
                          (agenda   . 10)
                          (projects . 10)))
  (dashboard-setup-startup-hook)
  :init
  (add-hook 'after-init-hook 'dashboard-refresh-buffer))

Fringe

It’s nice to know which lines were modified since the last commit in a file.

(use-package git-gutter-fringe
  :straight (:build t)
  :hook ((prog-mode     . git-gutter-mode)
         (org-mode      . git-gutter-mode)
         (markdown-mode . git-gutter-mode)
         (latex-mode    . git-gutter-mode)))

Icons? Did someone say icons?

YES! ALL OF THEM!

Ahem…

The package all-the-icons allows us to use a wide variety of icons in Emacs for various purposes, wherever we want, and THAT is GREAT! I’ll (ab)use this feature in my config, be warned! NOTE: The first time a configuration with all-the-icons loads on a machine, the needed fonts might not be available, so you’ll need to install them with the command M-x all-the-icons-install-fonts.

(use-package all-the-icons
  :defer t
  :straight t)

prettify-symbols-mode is also a nifty feature of Emacs, and it is built-in! With that, I can replace strings of my choice by another character of my choice! First, let’s declare the general symbols that will be used everywhere.

(defun prog-mode-set-symbols-alist ()
  (setq prettify-symbols-alist '(("lambda"  .)))
  (prettify-symbols-mode 1))

(add-hook 'prog-mode-hook #'prog-mode-set-symbols-alist)

We can now take care of the language-specific symbols. First, let’s declare some symbols for the Lisp languages.

(setq-default lisp-prettify-symbols-alist '(("lambda"    .)
                                            ("defun"     . ?𝑓)
                                            ("defvar"    . ?𝑣)
                                            ("defcustom" . ?𝑐)
                                            ("defconst"  . ?𝐶)))

(defun lisp-mode-prettify ()
  (setq prettify-symbols-alist lisp-prettify-symbols-alist)
  (prettify-symbols-mode -1)
  (prettify-symbols-mode 1))

(dolist (lang '(emacs-lisp lisp common-lisp scheme))
  (add-hook (intern (format "%S-mode-hook" lang))
            #'lisp-mode-prettify))

Finally, similar to how org-appear behaves, let’s show the real string of our symbols when the cursor is on it.

(setq prettify-symbols-unprettify-at-point t)

Ligatures

The font I’m using supports ligatures, but Emacs in GUI mode does not. And of course, there’s a package for that.

(use-package ligature
  :straight (ligature :type git
                      :host github
                      :repo "mickeynp/ligature.el"
                      :build t)
  :config
  (ligature-set-ligatures 't
                          '("www"))
  ;; Enable traditional ligature support in eww-mode, if the
  ;; `variable-pitch' face supports it
  (ligature-set-ligatures '(eww-mode org-mode elfeed-show-mode)
                          '("ff" "fi" "ffi"))
  ;; Enable all Cascadia Code ligatures in programming modes
  (ligature-set-ligatures 'prog-mode
                          '("|||>" "<|||" "<==>" "<!--" "####" "~~>" "***" "||=" "||>"
                            ":::" "::=" "=:=" "===" "==>" "=!=" "=>>" "=<<" "=/=" "!=="
                            "!!." ">=>" ">>=" ">>>" ">>-" ">->" "->>" "-->" "---" "-<<"
                            "<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->"
                            "<--" "<-<" "<<=" "<<-" "<<<" "<+>" "</>" "###" "#_(" "..<"
                            "..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~="
                            "~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|"
                            "[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:"
                            ">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:"
                            "<$" "<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#=" "#!"
                            "##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?" "+>" "++" "?:"
                            "?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)"
                            "\\\\" "://"))
  (global-ligature-mode t))

Modeline

The DoomEmacs modeline looks nice in my opinion, let’s use it.

(use-package doom-modeline
  :straight (:build t)
  :defer t
  :init
  (doom-modeline-mode 1)
  (setq find-file-visit-truename t)
  :custom
  (doom-modeline-height 15)
  (doom-modeline-enable-word-count t)
  (doom-modeline-continuous-word-count-modes '(markdown-mode gfm-mode org-mode))
  (doom-modeline-mu4e t)
  (doom-modeline-env-version t)
  (doom-modeline-buffer-file-name-style 'truncate-upto-project)
  :config
  (mu4e-alert-enable-mode-line-display))

Pixel-perfect alignment of Markdown and org-mode tables

Usually, I have no issue with the alignment of the tables I write in org-mode and (more rarely) Markdown. However, there are occurrences where I’ll use a character that does not exactly respect my monospace font, which messes with the alignment of the table (often when I do linguistics stuff). A solution to this is the package valign. A little caveat though, as its name implies valign helps with vertical alignment. If some lines are too high, they won’t exactly fit. Unless? Unless valign-fancy-bar is set to t.

For now, I disabled the hook with org-mode and markdown-mode because it slows down opening these files quite a lot. I’ll re-enable the hook once it is fixed.

(use-package valign
  :defer t
  :straight (:build t)
  :after (org markdown-mode)
  ;; :hook ((org-mode markdown-mode) . valign-mode)
  :custom ((valign-fancy-bar t)))

Secret mode

Sometimes, I want to hide the text displayed by Emacs but not lock altogether my computer. In this case, secret-mode comes in handy.

(use-package secret-mode
  :defer t
  :straight (secret-mode :build t
                         :type git
                         :host github
                         :repo "bkaestner/secret-mode.el"))

Solaire: Incandescent Emacs

A common issue when you have a lot of windows opened in Emacs is sometimes there’s just too much. Is the first window source code? Is the other one just an open email? Oh, let’s not forget the *Messages* buffer open next to another source buffer.

Solaire-mode applies a subtle but useful tweak to your current colour scheme: the background of programming buffers is slightly lighter than the background of other buffers. (Or is it other buffers that have a slightly darker background? I’m not sure.)

(use-package solaire-mode
  :defer t
  :straight (:build t)
  :init (solaire-global-mode +1))

Theme

You may have noticed I use the Nord theme pretty much everywhere on my computer, why not Emacs? In my opinion, its aurora variant is nicer than the default Nord theme since it is richer in colours — just a personal preference.

(use-package doom-themes
  :straight (:build t)
  :defer t
  :init (load-theme 'doom-nord-aurora t))

Rainbow Delimiters

This makes Lisp especially more readable, but it’s also nice to have for any language that has delimiters like brackets too.

(use-package rainbow-delimiters
  :straight (:build t)
  :defer t
  :hook (prog-mode . rainbow-delimiters-mode))

Y’all want some more COLOURS?

It is possible to make info buffers much more colourful (and, in my opinion, easier to read) with this simple package:

(use-package info-colors
  :straight (:build t)
  :commands info-colors-fnontify-node
  :hook (Info-selection . info-colors-fontify-node)
  :hook (Info-mode      . mixed-pitch-mode))