Switching from urxvt to st

Author: Jake Bauer | Published: 2020-02-14

I spend most of my time working in the terminal. Whether it’s email with Neomutt, music with ncmpcpp, programming with Neovim, or administrating my systems, I feel the most comfortable and in control when using the terminal. That’s why it’s really important for me to have a terminal application that performs well, feels good to use, and has every feature that I need without me noticing that something isn’t working or doesn’t look quite right.

Unfortunately, since I started using urxvt about a year ago now, I’ve slowly begun to notice things missing or not working quite right. For example, despite being called “rxvt-unicode-256color”, urxvt doesn’t really handle unicode characters that well. Take a look at the example below:

A screenshot of neovim
    in urxvt showing the statusline with two boxes where unicode characters
    should be.

This was really noticeable and, even though those unicode characters aren’t super important, it would still annoy me when I saw boxes where characters should be. This was even worse when I was browsing the Internet using lynx in urxvt (this page is the W3 Schools HTML5 Symbols Reference):

A screenshot
    of lynx in urxvt on an HTML5 symbols reference page showing boxes where
    unicode symbols should be.

Not to mention, urxvt doesn’t have truecolour support which, while not super important to me, is definitely a bonus in st’s favour. The screenshot below shows urxvt’s output for this truecolour test:

A screenshot of urxvt's
    output when tested for truecolour support where there isn't a smooth colour
    gradient and many characters don't look right.

I heard about st from other people on the Internet and from videos that I came across on Youtube and it intrigued me because of Suckless’ (the creators of st) unique philosophy regarding software development. I also gave some other terminals a try (kitty, konsole, xfce4-terminal) but either found them to need far too many dependencies, have far too many unnecessary features, or take far too long to load so I decided to give st a shot.

Once I got done configuring it and patching it with the couple additions that I wanted (a scrollback buffer and the ability to copy URLs so that I could open them in my browser), I compiled it and started playing around with it. Immediately I noticed that it felt just as fast as urxvt, it used less RAM (something like 10-15M per window instead of 20-25M), and, when testing side-by-side with urxvt, I would sometimes forget which terminal was which because st looked and felt just like urxvt. It was essentially a drop-in replacement even for the scripts that I have which launched applications using urxvt.

But, of course, I was really after better unicode and truecolour support. St delivered perfectly despite only being told to use my regular font (fallback fonts aren’t supported in st without a patch). Have a look:

A screenshot of neovim in st
    showing the statusline with the correct characters displayed.
A screenshot of lynx
    in st on an HTML5 symbols reference page showing the right unicode
A screenshot of st's output
    when tested for truecolour support where there is the expected smooth colour

I am very happy with st and I don’t at all mind the fact that I have to re-compile it when I want to make changes or if a new version is released. It feels like a personal build of the software tailored to my needs without anything else that I don’t need or don’t want.

If you want to try out st, follow this link to the st website. You can view my build of st in my dotfiles repository.