Announcing termonad-


Termonad is a terminal emulator written in Haskell. It is similar to other terminal emulators like Gnome Terminal, Terminator, Sakura, or ROXTerm. However, unlike these other terminal emulators, Termonad is fully configurable in Haskell. It aims to be the XMonad of terminal emulators.1

A few weeks ago I released termonad- It has been a while since I did a release announcement. Since version, Termonad has grown a bunch of new features.

This article lists the new features in Termonad. At the end of the article, I've included links to some features I'd like help with.

Short Introduction to Termonad

Installation and usage instructions for Termonad can be found in the README on GitHub.

Termonad is similar to XMonad in that you have your own Haskell configuration file, ~/.config/termonad/termonad.hs. When termonad launches, it uses GHC to compile your configuration file into a new termonad binary. It then re-execs into that new binary. You get a Termonad with all your own settings.

This is convenient for Haskellers, but it is probably too much trouble for people who don't know Haskell.

New Features

There have been two big features added since the release2:

  • A menu option to enlarge/shrink the font at runtime. You can do this with the Ctrl + and Ctrl - keys.

  • Search and find functionality. There is now a way to search for text within the console. This is convenient if you forgot to redirect command output to a file, so you can't open it in less or vim, but you want to find something in the text.

    Searching for regexes is supported.

These were the two remaining features I really wanted from a terminal emulator. With these two features available, I feel completely comfortable using Termonad everyday, and recommending it to other people.

Outstanding Issues (and future features)

The following issues would all be nice additions to Termonad's feature set. The issues on GitHub provide a little more context, as well as how to get started on them if you are new to the Termonad code-base.

  • Allow user to modify keybindings

    Currently, keybindings for Termonad (for opening a new tab, closing a tab, changing font size, etc) are hard-coded. It would be be nice to give the user a way to change these keybindings within the Termonad config file.

  • Add a preferences dialog to configure Termonad at runtime

    If you want to configure Termonad, you have to do it in Haskell code. This is nice for most Haskellers, but is a little too complicated for people not familiar with Haskell.

    It would be nice to provide a GTK dialog that new users could use to configure Termonad.

  • Use gi-gtk-declarative

    Termonad uses the haskell-gi family of libraries to interact with the underlying GTK libraries. The haskell-gi libraries are very high quality, but they are only a thin wrapper around the underlying GTK libraries. The GTK libraries are IO-heavy and very procedural.

    Oskar Wickström created a library for making haskell-gi much more declarational and easy to test: gi-gtk-declaractive. It would be interesting to try using this for Termonad.


I would like to thank the people who helped contribute fixes and pull requests to Termonad

If you find any bugs, or there are any features you'd like to see, please feel free to open an issue or PR on GitHub.


  1. It is more accurate to describe Termonad as a GUI wrapped around a terminal emulation library. Termonad is a GTK app, written using the haskell-gi family of libraries. Termonad uses the VTE terminal emulation library. VTE is a product of the Gnome team, and it is written in C and C++. It is the core of many other popular terminal emulator packages, like gnome-terminal.

    Because Termonad doesn't actually implement a full terminal emulator in Haskell, there is a limit to just how much you can customize the actual terminal emulation experience with Termonad. If there was a full terminal emulation library written in Haskell, I'd be very interested in switching over to it instead of using VTE.↩︎

  2. Check the CHANGELOG for more small changes and fixes.↩︎

tags: haskell