<< Introducing David Marginian | Home | Collaboration in Bespin >>

Command Lines

When I was fresh out of college, my first job was working for the OpenGroup, and my command line looked something like this:

In 2009, fired by the white heat of years of cutting edge research and development, my command line looks a lot more like this:

To be fair, we've now got transparency, anti-aliasing, our shells now do better completion. But that's about it for changes. Considering how much the rest of the industry has changed, that's shockingly glacial.

For the past week or so, I've had the privilege of working on the Bespin command line, and I think there's a lot that we can do to make things better.

This is what my Bespin command line looks like now:

This post is all about how we can make command lines better.

The core of the unix command line philosophy seems to be: small programs and pipe. There’s a lot to be said for loose coupling but there are some drawbacks as well...

Zsh

I love Zsh, and love the fancy completion that it does. Basic file completion has been around since ksh, IIRC:

$ ls [TAB]
Applications/  Mesh/       Projects/
Desktop/       Movies/     Public/
Documents/     Music/      Sites/
Downloads/     Parallels/  backup/
Library/       Pictures/   bin/

But zsh can complete against more than just files:

$ telnet [TAB]
192.168.0.1
192.168.0.12
download.directwebremoting.org
download.dojotoolkit.org
getahead.org
hg.mozilla.com
localhost
people.mozilla.com
sandbox.dojotoolkit.org
svn.directwebremoting.org

Zsh knows that you don’t telnet to a file, so it completes against hosts (Does anyone know where that host list came from BTW?)

Zsh also knows about other commands:

$ git [TAB]
add                 -- add paths to the index
apply               -- apply patch on a git index file and a work tree
applymbox           -- apply patches from a mailbox
applypatch          -- apply one patch extracted from an e-mail
archimport          -- import an Arch repository into git
bisect              -- find the change that introduced a bug
branch              -- create and show branches
checkout            -- checkout and switch to a branch
cherry              -- find commits not merged upstream
cherry-pick         -- cherry-pick the effect of an existing commit
clone               -- clones a repository into a new directory
commit              -- record changes to the repository
...

That list of commands is the result of a 'git help' command, but that's not what I typed. Zsh has been doing something funky behind my back when I pressed [TAB].

Zsh can do different things depending on where in a command you are:

$ git add [TAB]
Applications/  Mesh/       Projects/
Desktop/       Movies/     Public/
Documents/     Music/      Sites/
Downloads/     Parallels/  backup/
Library/       Pictures/   bin/

My point, is that, whilst all of this is very clever, the implementation is also insane.

In order to make this work, the zsh guys have had to reverse engineer every single unix command (or at least all most of the ones that I use). And any time those commands change, then zsh is going to have to change too.

It's very useful, and I'm glad that zsh has done it, and they probably didn't have much of a choice, but this way of going about things is not the Best Idea ever.

I'm sure somewhere the bash guys are working on the same feature themselves, or maybe they've already done it. I don’t care - it just strengthens the point about the lunacy of the situation.

The Unix philosophy of small programs and pipe has a lot to be said for it, but there are serious drawbacks too.

Here's some of the ways that we're innovating when it comes to the Bespin command line, and benefiting from being about to integrate things better.

GUI integration

Traditionally you've had a set of shells (bash, zsh, etc) that work in a set of terminal emulators (xterm, terminal, gnome-terminal, konsole, etc) But there's so much more you could do if you had one program do both.

In Bespin:

  • If you click on an old command, it gets copied to the prompt (the blue highlight is a mouseover).
  • If you double click it's re-executed.
  • Output is not restricted to ascii in a grid. We (predictably) use HTML.
  • Error output is visually different to normal output
  • You can minimize or maximize output (the help output has been minimized above) - I hate it when a vcs diff operation takes up 4k lines of scrollback obliterating what I wanted to see.

There's no reason why you couldn't do this in Unix (or even Windows). I don't think you’d want such a gui-shell as your login shell, but since its use is very much from within a GUI, that's OK - you’d probably launch it from the GUI anyway.

In Bespin we don't have pipes yet, but would it be neat to be able to inspect a pipeline visually as it's working, I'm sure it's possible with a gui-shell.

Linking Output to Commands

We link the output from a command to the command that created it. The obvious effect is that output from slow running commands no longer gets confused with what's happening now.

The 'slow' command is just something I hacked up to demonstrate asynchronous behavior.

A nice upshot of this is that we can implicitly add & to the end of every command, and you no longer have to wait for anything.

In essence, each command has it’s own separate stdout, which goes to it’s own div. Maybe there is a reason why unix shells don’t do something similar. Would it mean shells being curses based or something?

Command Meta-Data

With the exception of the reverse-engineering of the command line structure done by zsh, the integration between commands and the shell is limited. In Bespin, a command is a structure like this

{
    name: 'createproject',
    takes: ['projectname'],
    preview: 'create a new project',
    usage: '[newprojectname]',
    execute: function(commandLine, projectname) {
        /* code to do the work */
    }
}

This means that we can provide help as the user is typing. The idea is that TAB will guess what you want to do at all times.

This ties in a lot with GUI integration too. If the command line knows that the next parameter is a file, when the user presses TAB without typing anything to complete on, we can offer a dialog to allow selection of a file, and so on. This isn’t about forcing the user to switch to the mouse, but it is about allowing better feedback from the system about what options are available.

We've only really got started with this part - there’s a lot more work to do. I hope we'll be able to do some of the funky GUI integration that Ubiquity has been pioneering.

Attention Guides

There's a lot to look at on any command line, I want to find ways to keep the most important bits in front of your eyes at all times. I'd like to expire older commands more intelligently than a standard terminal (oldest dies first), Commands are more important if:

  • They are still in progress
  • They keep being re-executed
  • They are waiting for input
  • etc

We've only basically started on this right now, with the ability to hide/show output, but there's potential for it to make the command line lots more usable.

Plug-ins

Linking everything together is easy if you make one big monolithic lump. That's not the plan - we're evolving a plug-in strategy as we go, and planning on making as much of Bespin itself use the plug-in system. The key to coupling is to get the right level of coupling.

Status Messages

My other integration obsession is about status messages. There's a huge amount we could do to integrate the familiar concept of "what are you doing now" with commit messages, bug trackers, chat, and team tracking. More soon.

What other things could we do to trick out the command line?

Tags :


auto-completed host list

The host list comes from, I believe, a combination of /etc/hosts and ~/.ssh/known_hosts

auto-completed host list

Thanks, that would make sense.

auto-completed host list

information is extraordinay..Seo expert Seo Services professional seo

bash completion

I was curious about this a while back, and I found that bash has similar functionality implemented via the bash-completion project (http://www.caliban.org/bash/). Basically, bash fills the autocomplete by passing the command line into a series of shell scripts. Third parties can add additional scripts to a directory (/opt/local/etc/bash_completion on Mac OS X dports) to enable completion for a new command. Also, yes, commands are not auto backgrounded in shells because they may need full control over the output stream to use curses-like functionality. In fact, implementing a shell such that curses features work correctly is quite difficult, and even emacs does a poor job. I have been thinking about these exact shell features in an AJAX environment for about a year now without doing anything about it. I clearly need to get involved with Bespin.

"xmlshell"

Thanks for bringing this up, as there's so much unexplored potential here! Back in the early days of Mozilla Seamonkey - 1999 or so - someone cooked up the beginnings of a Mozilla-based command shell which would execute commands on the given machine and then display the XML/HTML returned inline. It had its own versions of common commands like "ls" which - because it had the full HTML renderer at its disposal - could do things like image thumbnails in the file listing. The project was called something like "XMLShell" but Google is not returning anything useful, alas.

Re: Command Lines

It was called xmlterm.

Re: Command Lines

This blog is b0rked (I only get the HTML - unless there's a 502 "Error reading from remote server" - and no CSS or images). That's a pity.

Re: Command Lines

Seems fixed - thanks!

Re: Command Lines

This makes sense.

Re: Command Lines

Commands are not auto backgrounded in shells because they may need full control over the output stream to use curses-like functionality. Could do things like image thumbnails in the file listing. The project was called something like "XMLShell" but Google is not returning anything useful. free advertising |job|iphone repair

Re: Command Lines

Command lines does have many important jobs that are to be done with every programs. The video that you have provided has been a good insight into that, the video clearly clarifies every detail. There are many applications which makes use of the functions of the command line in general. They are applied every where in chats, messaging and every where . The proper and good use of these would make the program the better or the worse. Contact Center | Wildblue | VM Ware

Command Lines are more productive

I have regressed from command lines to using everything graphical. the problem is I realize is that I spend lots of time opening, closing and navigating windows and to some extent started to be counterproductive. Going back to some tasks with command lines saw my productivity went up as I could focus and have very little distractions.
homedepot.com/opinion | tellgamestop.com | Match.com Login

Re: Command Lines

Great tips and video tutorial! Custom Essay | Custom Term Paper | Custom Research Paper

Re: Command Lines

I also started out working with command line. You have to start somewhere and after learning the basics of command line, I have moved on to bigger and better things and now work for an Indianapolis web design company. If you put in enough time and research, you can become an expert in any field.

Re: Command Lines

Kynsihuone LimeDesign tarjoaa rakennekynnet ja geelikynnet sekä harjoittaa kynsihuoltoa Tampereella. Kynsistudion toimenkuvaan kuuluu myös kynsikoristelu ja kynsien geelaus, samoin ranskalainen manikyyri ja rakennekynsien poisto.

Re: Command Lines

It took me a while to get the hang of these command lines. I have spent so much time working on my cheap auto insurance website I never took the time to learn my won computer. Thanks for the valuable information.

Re: Command Lines

Command lines are very hard for me to understand. I have a hard time remembering what they are. I work at a Sarasota marketing company and all of the designers there know these commands by heart. I just cant remember haha.

Re: Command Lines

I am definitely going to recommend this to my students. That should put them on the right track for sorting out programming group projects. Very useful for distance learning courses.

Re: Command Lines

Thanks a lot for tutorial

Re: Command Lines

The tutorial on Command Lines was very extensive and covered the topic well. Though due to my non-technical background I had to read it twice to get everything clearly. The videos were a great help in grasping the concept. Though these days I'm very much involved in developing my site How to get a flat stomach but later on I can use the concepts I have learned here.

Re: Command Lines

Yeha very Useful information , this is both good reading for, have quite a few good key points, and I learn some new stuff from it too, thanks for sharing your information. Now i will work on my Boxfresh shoes shop!

Re: Command Lines

Thanks for great tips! Custom wordpress design

Re: Command Lines

Re: Command Lines


Add a comment Send a TrackBack