Emacs as a tmux replacement

Years ago I did what many developers do — built an IDE of sorts by combining Vim, Tmux and Bash. By the use of scripting, REPLs and such one can glue all these tools together to have things like “open a new shell and send this text to it” done with a bit of work.

Brave new world

Eventually I switched (back to) to Emacs. After refreshing my muscle memory and building a sane config I proceeded to replace Vim with Emacs.

One of the reasons for switching was that I get to write a lot of Lisp — mostly Clojure and some Scheme (Chicken Scheme in particular, but I’m also looking at Racket).

Emacs being a Lisp machine the tooling for working with Lisps is phenomenal. Packages like CIDER and Geiser show how Emacs can become an IDE, without being a huge mess of a toolbars, popups and a taking too many resources.

Initially I’d ran a terminal version of Emacs within a tmux session. Then, I started exploring things like inf-ruby and running terminals within Emacs (via ansi-term) more often than opening tmux windows and panes. There was simply no need for that.

The only thing that I used tmux for was persisting the session on the machine to quickly resume what I was working on. That has a major drawback — ssh-agent details get lost when that happens, which means tools like magitbecome less useful and require Emacs restart.

Removing tmux

Using daemon mode in Emacs one can replicate all features (and more) of tmux/screen:

  • sessions can be suspended and resumed

  • universal copy and paste between terminal any type of a buffer

  • window/pane layout management

  • tmux ‘windows’ can be emulated with packages like eyebrowse

ssh-agent issue when using magit

With a simple shell script:

if pgrep -f emacs ; then
  emacs --daemon

fi

emacsclient -nw

and an extra package I can now use magit without any issues. It simply injects relevant SSH environment variables and “magically” fixes the problem.

Better navigation

Window number mode is really handy. It adds number to visible buffers/windows and dynamically creates mappings to jump between, similar to how tmux does it.

So given 3 visible buffers, pressing C-x C-j 2 will jump to 2nd visible buffer.

Issues?

Only issue I keep running into is that a long running (week?) Emacs session sometimes becomes corrupted and syntax highlighting in some major modes starts to crap out. I haven’t found a fix for this, but given my experience with Emacs so far the fix surely exists. On top of that — I don’t mind occasional Emacs server restarts.

codeŁukasz Korecki