I was so pleased today when I read about the announcement of Google Quick Search Box (or QSK). It is simply the reincarnation of Quicksilver for Mac. It is one of my all-time favorite utilities and I'm happy it is not gone for good.
Some general background is in order for non-Mac users (or Mac users which didn't see the light). Quicksilver is a general launch utility for Mac. It was designed by Nicholas Jitkoff from Blacktree, which is now a Google employee. I recommend this 25 minute tech-talk about Quicksilver. It's more than a year old, but still innovative and interesting.
I'll pick two important points from the talk. First, Quicksilver is built on a philosophy: Act Without Doing. Basically, this means you are performing an action as part of your flow, without interruption and with minimal effort. An example would be: I'm working on a document and suddenly remember a task I need to do. If I can use a single keystroke to bring a small box, write my task and dismiss it - that is minimal effort with no interruption to the flow. Unlike a case where I would have to switch to my task management application.
The second issue to understand is how actions are performed in Quicksilver:
- Search for the object by typing its' name (can be partial name).
- Select the object from the list of results.
- Browse to associated objects until you find the object you specifically target.
- Perform an action on that object: select from a relevant actions which are appropriate to the specific object. You might need to provide some extra parameters to do that.
For example: I want to send an email. I search for a contact name by typing his name. I find a number of matching contacts and select the appropriate one. From there, I browse all the contacts given addresses and select the one I want to address. I choose the action: send email. For a contact, other actions may be relevant like send to my mobile phone. Finally, I provide the email text and the email is sent.
My question is: how do we implement this in the IDE? It seems like a very complex environment that could use simplifying.
The object being searched can be a component (type, interface, method, field, spring bean definition, etc.). Browsing associated objects would mean tracing component associations like class which extends another class or implements an interface. Maybe a method which modifies a field or invokes another method.
Once you located your target component, what actions would you want to perform? Here are some thoughts:
- Open the source file. This is trivial.
- Show associated components. Well, that's what happened when we were searching for the component.
- Depending on the component type: show documentation, set up a breakpoint, check it into the source control, open a defect related to the element, add it to a workspace. You can probably think of other actions.
nWire, the Eclipse plugin I've been working on for some time, takes this about 80% of the way. It lets you search and browse. It currently performs only the single action of opening the source file, which is the most important. However, this is just a first release, so expect this to expand.
I took a bit of a different approach, of using an integral view (see some screenshots) rather than opening a dialog box. Mostly because that this seems more useful to the flow of coding. It takes a bit more space, but it gives you a lot more. Nevertheless, I'm considering a future option to show it in a way which is more Quicksilverish.
Another common feature is the ability to extend the catalog of components. Quicksilver has a plugin mechanism which allows adding new type of components and associations. For example, adding bookmarks from del.icio.us to the catalog. nWire, is also built for extending and adding components from different programming languages and frameworks. The initial version is Java only, but this is just the beginning.