Beautifying the Mode Line
Tags: emacs
Published: 2019-02-19 08:22:47

---
title: Beautifying the Mode Line
published: true
tags: emacs
canonical_url: http://www.gonsie.com/blorg/modeline.html
---

There are some beautiful Emacs mode line packages out there, including the gorgeous [doom-modeline](https://github.com/seagle0128/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](https://github.com/gonsie/dotfiles/blob/master/emacs/theme.el#L75).

![dusk mode line](http://gonsie.com/images/modeline-shot.png)

## 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](https://www.colorhexa.com/) to pick colors close to what I use as the background.

```elisp
(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:

```elisp
(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:

```elisp
vc-mode

Git:develop

```

Luckily, the `doom-modeline` package gets it right.

```elisp
(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

```elisp
'(: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.