loading...

Beautifying the Mode Line

gonsie profile image Elsa Gonsiorowski Originally published at gonsie.com on ・2 min read

There are some beautiful Emacs mode line packages out there, including the gorgeous doom-modeline. Since I don’t want my themeing to depend on any external packages, I’ve implemented some of features that I like. The results of all this can be found in my dotfiles.

dusk mode line

Size

One of the great things about the doom-modeline is its size. This can be approximated by forming a box around the mode line face (be sure to set it for both the active and inactive mode line). I used an online gradient generator to pick colors close to what I use as the background.

(set-face-attribute 'mode-line nil
                    :background "#353644"
                    :foreground "white"
                    :box '(:line-width 8 :color "#353644")
                    :overline nil
                    :underline nil)

(set-face-attribute 'mode-line-inactive nil
                    :background "#565063"
                    :foreground "white"
                    :box '(:line-width 8 :color "#565063")
                    :overline nil
                    :underline nil)

Git Information

Getting the git branch in the mode line was harder than it should have been. There are a bunch of emacs built-in version control variables and functions, but none that directly get the branch information. The main problem is that the vcs-hooks.el package overloads functions and variable names. This means that you have to get the elisp syntax exactly correct for calling a funciton or returning a variable.

This is a function call which does the wrong thing:

(vc-mode)

Version Control minor mode.
This minor mode is automatically activated whenever you visit a file under
control of one of the revision control systems in `vc-handled-backends'.
VC commands are globally reachable under the prefix `\[vc-prefix-map]':
\{vc-prefix-map}

This returns the value of the variable instead:

vc-mode

Git:develop

Luckily, the doom-modeline package gets it right.

(defun vc-branch ()
  (let ((backend (vc-backend buffer-file-name)))
    (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2))))
(vc-branch)

develop

This function cuts off the version control prefix (such as “Git:” or “Hg:”).

Right-Justified Text

I also like that some of the information is right-justified. This snippet fills in spaces for the same effect. Note that I only put the major mode name on the right

'(:eval (propertize
         " " 'display
         `((space :align-to (- (+ right right-fringe right-margin)
                               ,(+ 3 (string-width mode-name)))))))

Be sure to wrap with '(:eval ) to ensure that this spacing is re-evaluated when mode-name changes.

Summary

Overall, I’m very happy with this mode line. The implementation is simple, yet it looks decent in terminal Emacs and absolutely fabulous in the GUI.

Posted on by:

gonsie profile

Elsa Gonsiorowski

@gonsie

PhD computer scientist helping to run one of the world's largest supercomputers.

Discussion

markdown guide