Adithya Kumar

Emacs in the terminal vs GUI

2025-11-02

I love applications that run directly on the terminal. They are much simpler, require minimal dependencies, and play very nicely with other terminal tools like tmux. While there are a few things I lose when running apps in the terminal, the pros far outweigh the cons.

I’ve been using Emacs in the terminal for over five years now. I’ve occasionally switched to a GUI app, but it never stuck with me. The only reason I switched was because the GUI app has a better look and feel to it. But look and feel do not get the job done.

Con: Look and feel

As I said before, there is no doubt that the GUI version of Emacs looks a lot better than the terminal version. This probably depends on the terminal you use, but Emacs in the most beautiful terminal emulator feels less polished than the GUI version.

For example, - Markdown and Org files look much better with custom font sizes in the GUI, but look rather bland in the terminal. - LSP can be configured to look much better in the GUI, whereas you’ll have to stick to a simpler interface in the terminal.

Con: Setup

The GUI version of Emacs is much easier to set up. The keybindings and theming configuration work as expected, and nothing specific to GUI will surprise you.

The terminal version needs a little more setup work. In my experience I’ve always had to spend some time fixing the theme and/or keybindings in the terminal. While I’m able to reliably fix the key bindings, the theme always gives me issues.

The keybindings won’t work out of the box, as the terminal either does not recognize the input key codes or the input is lost because some application in the middle eats the input. The only reliable fix to this is to have a compatibility layer in Emacs and some application that can listen to keystrokes and translate them according to the compatibility layer.

In my case, the following key combinations don’t work directly out of the box: - M-O - C-<return> - C-/

My compatibility layer looks like the following:

(defun configure-compatibility ()
  (define-key key-translation-map (kbd "C-c c u") (kbd "C-/"))
  (define-key key-translation-map (kbd "C-c c e") (kbd "C-<return>"))
  (define-key key-translation-map (kbd "C-c c o") (kbd "M-O")))

I’ve picked C-c c as the compatibility prefix here, but any prefix that passes through should work.

This should be followed by somehow capturing these key combinations in the OS layer and passing the translated variants to the applications. You can use AutoHotkey on Windows, Kmonad on Linux, and Karabiner on Darwin.

Pro: Can be used over the network

If you’re already accustomed to using Emacs on the terminal, your workflow would be exactly the same when working on other machines over the network. Just scp your init.el to the remote machine and start working.

This isn’t possible on GUI Emacs. Yes, there are some ways where things partially work. You can possibly use TRAMP or sshfs, but you’ll eventually run into problems you cannot fix. TRAMP (sometimes) is incredibly slow, and a lot of your tools may not be usable. The latency while using sshfs will gravely affect your workflow.

VS Code does a great job at connecting to remote machines by using a client-server model. Although Emacs has such a model, I’ve never gotten something like that to work. I’m very tempted to compare VS Code and Emacs now, but that is a discussion for another day.

Pro: Infinitely enhanced by tmux

My workflow heavily relies on tmux, and this is one of the major reasons I can never switch to GUI. tmux is far more than a terminal multiplexer. To me, it’s a very elaborate workspace manager and a session manager.

Tmux essentially acts like a cheap window manager for different instances of Emacs. Each Emacs instance corresponds to a separate workspace with dedicated settings. I use tmux to switch between sessions, and Emacs takes care of the rest.

Tmux also lets me manage multiple terminals in the same session for different processes I want to run.

Tmux is a must when working with remote machines, as it enables persistent sessions. Since I already use tmux, working on remote machines is straightforward.

Final Thoughts

This post may seem very opinionated, and that is because it is :-). Some of you may have better and more manageable workflows using GUI Emacs and an elaborate window manager. But using Emacs + tmux is the simplest, non-invasive, and easiest solution to managing Emacs and shells.

Feel free to write to me at functional.binder@gmail.com with any suggestions or possible improvements to this blog post.