Skip to content
a new kind of terminal
Go C++ Shell Other
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
cmd move into github namespace
keys rename space key
readline move into github namespace
shell fix tests
ui also exclude c++ files in headless mode
vt100 more erase escape codes
.gitignore ignore basic bin
.travis.yml travis: try harder on dependencies
LICENSE import
Makefile move into github namespace show build status in readme
color.go import environment for gopath
font.go more progress on making test run travis: quieter
logview.go move into github namespace more notes
prompt_test.go move into github namespace screen recorder
smash.go add a headless mode for travis
smash_main_gui.go add a headless mode for travis
smash_main_headless.go add a headless mode for travis
termview.go debug helper
view.go move into github namespace
view_test.go move into github namespace

smash, a terminal emulator experiment
Copyright 2015 Evan Martin.

Build Status

All day long I work using a shell under a terminal emulator -- a combination of software that hasn't changed much in 30 years. Why? I use the command line because it is powerful and expressive and because all the other tools I use work well with it. But at the same time it seems we ought be able to improve on the interface while keeping the fundamental idea.

Smash is an attempt to improve the textual user interface while preserving the the good parts. Reasonable people can disagree over what exactly that means. If this whole idea makes you upset please see the first question in the FAQ.


Smash integrates the shell, terminal emulator, and GUI into a single program so they can work as one. This allows Smash to:

  • smooth scroll the display, even when running Smash-unaware programs like less.

  • tab completion is a popup, yet it reuses the existing bash completion logic.


Smash is not:

  • a new shell scripting language; nobody needs yet another one of those.

  • a replacement for the Unix suite of commands; my fingers remember "ls".

  • intended for inexperienced users; while there is interesting work being done in newbie-friendly shells, it is not a problem that I am interested in solving.

Future work

Some other things I plan to implement:

  • concurrently running commands should not interleave their output.

  • job control can be exposed visually.

Here are some other ideas that I am considering:

  • when you ssh somewhere, all typing ought to be handled locally; you only should need to round-trip to the remote host for tab completion and command execution.

  • perhaps you can introduce a type-system-like structure to shell pipelines, in that text streams can sometimes be viewed as arrays of lines and lines can sometimes be viewed as arrays of columns.

Something went wrong with that request. Please try again.