Why hucksh? What makes hucksh different?

Home » Hucksh(ell) » Why hucksh? What makes hucksh different?

Hucksh remembers

Hucksh saves all state in a SQL database.

  • See all commands ever run, and their output, with timestamps of both the commands themselves and their output.
    • Great for people that like picking up where they left off, even if it was months ago and several reboots.
    • Great for those times you really need the output of a command you ran last year. (It’s admittedly not common, but when you need it, it’s really handy.)
  • See all directories ever visited and easily filter by name, last access time, or frequency of use.
  • Add and remove commands from a tab.
  • See all commands run in a given directory or tree, or that contain a given string, or anything you can write a sql query for.
  • All context persists across server restarts, client restarts, network outages, etc.
  • The database is a single sqlite3 file. If you need to give someone a transcript of your shell session, you can just give them a copy of the database and they can view it in the GUI client.

GUI

  • New ways to interact with the shell: Buttons, tooltips, pop-outs, etc.
  • Every command is an individual and gets its own tty, output streams (stdout & stderr) and output area.
  • Run multiple commands in parallel and their output goes to separate window panels and doesn’t overlap.
  • “Zoom” commands to fullscreen, pop them out to their own window, hide output (e.g. if output is long or the command was run accidentally). Wrap or unwrap command output.
  • All interaction (e.g. command editing) is local. No character-by-character back-and-forth to the host just to type a command or search command history.
  • View the same command in different tabs or different windows.
  • Search command history live via regex, over all commands ever run on that host.
  • View a timestamp for every line of command output, including how long since the previous line.

Directory browser

  • View directory contents, easily cd around, filter by regex or file type, sort.
  • Select files and open them in an editor.
  • For local and remote directories. (All information is read from the server; to the client, they’re all “remote”.)

Directory history browser

  • View all directories ever used
  • Filter by regex
  • Sort by name, access count, last access time
  • Edit simple commands in the built-in editor. Edit complex commands (if you so desire) in your actual favorite editor (Vim, Emacs, etc; anything that will edit a file and exit when done).
  • Easily edit files on the remote server in a local editor (e.g. automagically via Vim’s “scp” netrw plugin).
  • Easily view/edit large command output in a local editor.

Written in Go: Client, server, shell, terminal, everything.

Some stuff that’s admittedly not so great yet

All of this is on the roadmap and will work eventually.

  • Selecting command output is limited: You can only select text from a single line, with the same attribute (e.g. foreground color).
    • What you can do instead: 1) View/edit the output in your favorite editor. 2) There are buttons to copy the command itself, its output, or both, at the bottom of the gui.
  • Not great for viewing really voluminous output, like tailing syslog. All output is saved to the database, with (currently) no limits. That can actually be a problem in some circumstances.
  • The terminal emulator is imperfect. Vim, and ranger work okay but aren’t perfect. fzf in particularly weird in that it seems to use the controlling terminal of the server rather than the tty of the command itself. You can fix this by running fzf inside screen (“screen fzf”). I don’t use fzf so there may be other issues.
  • The Directory browser doesn’t show user or group names.
  • It’s not very configurable: colors, hotkeys, etc, all hard-coded.
  • It’s not very accessible.
    • I don’t know anything about screen readers. It seems possible that with the right api, the Hucksh gui could be very accessible, with its reification of commands, directories, paths, and individual command output lines — all are individual widgets and could be referenced as such.