Skip to main content
ertius.org

I guess I don't understand terminfo

So, I've been quite happily using ghostty as my terminal lately. It's fast, it has a variety of nice dark themes so I can both get tiny dopamine hits from changing it but also have the consistency of it looking nice and dark. The one downside (aside from not having search) is that it's new, and thus it doesn't have widely dispersed terminfo. Fine, I thought, I can just copy it around myself. And I can, it's quite easy, ghostty even has a ssh override alias to do this. But that's a bit shite and I control all the machines I'm ssh'ing in to anyway, so why not fix it.

Some poking found me this which notes:

Ghostty's terminfo entry is available in ncurses 6.5-20241228 and above. As distros update their ncurses packages, Ghostty's terminfo entry will be available by default system-wide. This will take time to propagate.

while the PTS says:

Package: ncurses-term (6.5+20250216-2)

5 > 4, QED, hooray. But my test program, duf wasn't actually working. Instead of using a pleasing green to show my bountiful disk space, it's all grayscale. But why?

It eventually occurred to me to check if other programs were happier - btop, vim, batcat, all coloured, it's just duf that is not working. A lazy https://kagi.com/search?q=duf+terminfo => https://github.com/muesli/duf/issues/34 and

Unless TERM is set to set xterm-256color, duf outputs black and white information.

wtf. And indeed, if I set COLORTERM=yes it does work. I guess I hadn't noticed this since I had configured SSH to force TERM:

Host *.mine
    ...
    SetEnv TERM=xterm-256color

And I wouldn't notice locally, since ghostty itself sets COLORTERM=truecolor for shells running directly inside it.

OK, so that explains duf, but what about this:

# infocmp
infocmp: couldn't open terminfo file /usr/share/terminfo/x/xterm-ghostty.

Well that's a bit odd. Doesn't Debian ship the terminfo now:

# echo $TERM
xterm-ghostty
# dpkg -L ncurses-term |grep -i ghost
/usr/share/terminfo/g/ghostty

As far as I know, there's no aliasing or anything in in terminfo - you just provide a file and it's looked up according to whatever TERM is set to. Digging in to the ncurses history, I find this, which is currently a useless link since the GitHub commit view can no longer show complicated commits, but the upshot is that it shows the terminfo data being added with just the name ghostty.

Some git archaeology find this from Sep 28, 2023 where the default value for TERM is changed from ghostty to xterm-ghostty to work around a vim bug.

And then finally while searching the ghostty bug tracker, I find this:

Sadly the outcome of this review is that the terminfo added to ncurses is named ghostty, not xterm-ghostty so that means that Ghostty's TERM variable will still be incompatible with distros even after the package is updated.

So, it's not even really a "bug", it's two independent groups (ghostty devs, ncurses dev) making incompatible decisions.

So, I've added a thing to my Ansible that does a symlink:

- name: Create terminfo directory for ghostty symlink
  ansible.builtin.file:
    path: /etc/terminfo/x
    state: directory
    owner: root
    group: root
    mode: "0755"

- name: Create xterm-ghostty symlink to system ghostty terminfo
  ansible.builtin.file:
    src: /usr/share/terminfo/g/ghostty
    dest: /etc/terminfo/x/xterm-ghostty
    state: link

I see yacoob did a similar thing.

I went with /etc/terminfo since it's in the search path by default (/usr/local/share/terminfo isn't) and shouldn't be squashed by future package updates that might fix this.

Overall, a bit of a bummer. Maybe the Debian maintainer will add a symlink as a workaround?