Welcome to MSDN Blogs Sign in | Join | Help

JoeN's Blog

XNA Shaman
So why did the C# keybindings change?

Andy wants my blood but on an internal email thread both Don Box and Chris Sells also want it.

I was responsible for the new C# keybindings (I’ll let you have a moment to stick that pin into the Microsoft PM Voodoo doll you all have J). It all started when I was given the keyboard randomizing dice that the last person used to determine VS keybindings...

Seriously, we actually spent a lot of time thinking about the C# keybindings in VS 2005 before making any changes. To put this issue into perspective you need to know something of the history of keybindings.

In VS 2002 and 2003 we (the C# team, well actually me againJ) didn't really look at the keyboard bindings that closely. If you look at the Start Page in VS 2002/2003 and you select the C# Developer Profile you'll notice that we simply use the “VS Default” keybindings.

So who decided the “VS Default” keybindings? The short answer is individual teams within VS. As teams introduce new commands each team simply hunts for an open key binding, finds one and assigns it. Timing plays a big part in what keys you get and once you have a specific keybinding possession is 9/10’s of the law.

Now the good thing is that teams are usually consistent with the key bindings they have for their commands but with so many teams contributing many commands it can quickly fragment and of course every team believes that their commands are pivotal to the success of Visual StudioJ.

Let’s have a look at some of the VS Default keybindings in VS 2003. With no project opened the View Menu in VS 2003 has the following commands and keybindings:

  • Solution Explorer     Ctrl+Alt+L
  • Class View            Ctrl+Shift+C
  • Server Explorer       Ctrl+Alt+S
  • Resource View         Ctrl+Shift+E
  • Properties Window     F4
  • Object Browser        Ctrl-Alt-J
  • Toolbox               Ctrl-Alt+X

See any connections here? I didn’t think so.

If you start a debugging here's a subset of the commands and their keybindings under the Debug Menu:

  • Breakpoints           Ctrl+Alt+B
  • Autos                 Ctrl+Alt+V, A
  • Call Stack            Ctrl+Alt+C
  • Threads               Ctrl+Alt+H

The debugger team appears to have a consistent access method, but why is Threads H? (Answer: Ctrl+Alt+T was taken by View.DocumentOutline). Why does Autos have a two key combination etc?

In VS 2005 we have introduced the idea of profiles which allows each team to create a consistent experience for their developers. This essentially allows teams to actually look at the keybindings from an overall product perspective and decide the logical set of commands for their users and then map appropriate keybindings for them.

When I went about looking at the C# keybindings for VS 2005, the first thing I did was map all the Global and Editor keys from VS Default keybindings into a spreadsheet (oh the glamorous life of a PM). It was interesting to actually go through the process and watch a form of key bingo being played as teams searched for the last slot and the different key modifiers. If you are interested VS uses nearly all the modifier keys and their combinations. On the spreadsheet I mapped the following modifier keys: Ctrl, Ctrl+Shift, Alt, Shift, Shift+Alt, Ctrl+Alt, Ctrl-Alt-Shift.

Here’s how we went about coming up with new keybindings:

1.      Create command themes. We wanted to create some command themes that allowed us to gather common commands together. Examples of themes we used were: Design time windows, Debug time windows, Refactoring commands, IntelliSense commands, Bookmarks, Help etc. These themes make the group of commands more understandable as well as easier to learn. For each of these themes we created a two chord key combination, the first one activates the theme and the next one activates the command so: 

  • Ctrl+W, S   Window, Solution Explorer
  • Ctrl+W, C   Window, Class View
  • Ctrl+R, E   Refactor, Extract Method
  • Ctrl+R, R   Refactor, Rename
  • Ctrl+D, A   Debug, Autos Window
  • Ctrl+D, B   Debug, Breakpoints Window

2.      Prefer common C# commands. There were a number of places where common C# commands either didn’t have the obvious keyboard combination in VS2003, or there were natural conflicts with the commands. In these cases here, we preferred the command we thought would be more common for C# developers to use and if this didn't work then we preferred the old keyboard letter. 

3.      Push the new commands to the front. Commands in VS can have multiple keybindings. In order to encourage users to use the new keys we have moved the new keys to the front of the list so they get shown on all the menus. The other keybindings are still there, they just don’t get shown.

After applying this philosophy we obviously ended up with some a fair number of changes. Using the commands above this is what they now look like:

  • Solution Explorer     Ctrl+W, S
  • Class View            Ctrl+W, C
  • Server Explorer       Ctrl+W, L (we prefer S for Solution Explorer over Server Explorer)
  • Resource View         Ctrl+W, R (moved this off the main menu to submenu)
  • Properties Window     Ctrl+W, P (F4 is still bound)
  • Object Browser        Ctrl+W, J (preferred O for Output window, so we kept old letter)
  • Toolbox               Ctrl-W, X (preferred T for TaskList, so we kept old letter)
  • Breakpoints           Ctrl+D, B
  • Autos                 Ctrl+D, A
  • Call Stack            Ctrl+D, C
  • Threads               Ctrl+D, T

But while we think the new keybindings are a lot more logical and easier to learn we totally understand that people don’t like gratuitous changes and want to be able to use that muscle memory they have developed. So what we are going to do is make as many of the old keybindings available as well (the new ones will be shown by default but the olds ones will also work).

Unfortunately (you knew it was coming) in the Community Previews as well as the upcoming Beta for VS 2005 we haven’t actually put many of the “old” keybindings back into the C# profile (I promise this isn’t a conspiracy theory – we will get this in soon).

I’d be interested in what you think. Should we have:

  1. Left the keys alone . Let you discover the new commands and bind them to keys you think are appropriate.
  2. Left the keys alone and find new keys (no matter how unnatural) for any new commands we introduced
  3.  Do what we have currently done.

 

Posted: Thursday, June 10, 2004 9:45 PM by JoeN
Filed under:

Comments

Andy Pennell's WebLog said:

# June 18, 2004 12:49 PM

Omer van Kloeten said:

After reading, thinking, and repeating those two actions over five times, I still have no idea what you're asking people here.
I blame it on English not being my mother-tongue.

Could you re-explain what you're asking?
# June 18, 2004 11:22 AM

Ron said:

I see the logic in the change, but there's still an emotional attachment to my "old" bindings. Obviously, it would have been better to make this change in VS2002.

That said, do you plan to take this to it's logical conclusion? :)

Ctrl+C, S //Copy selection
Ctrl+C, W //Copy word
Ctrl+C, L //Copy line
Ctrl+C, P //Copy paragraph
Ctrl+C, B //Copy to beginning of line
Ctrl+C, E //Copy to end of line
.
.
.

Ctrl+D, I //Step into
Ctrl+D, O //Step over
Ctrl+D, U //Step out
Ctrl+D, R //Step to cursor
.
.
.

Ctrl+B, S //Build solution
Ctrl+B, P //Build project
Ctrl+B, R //Rebuild solution
Ctrl+B, J //Rebuild project
.
.
.
# June 18, 2004 11:40 AM

Vlad said:

Like many of my friends, we still use VC++6 key mappings.

Please, Please, Please, kepp this profile around!
# June 18, 2004 12:00 PM

AndrewSeven said:

I can't get accustomed to the chord style shortcuts.

You could have left the mappings alone and added (and recommended) a new key mapping.
# June 18, 2004 12:14 PM

Steve Tibbett said:

Same here, old key bindings. I thought about trying to use the VS.NET 2003 ones but it seemed to me they were probably transitional (I don't know why), turns out I was right.

Here's something that would be very useful (and helpful for learning the new commands): a command that popped up a window with a list of every command and what key it was bound to, so you could hit this key, start typing 'Class View' until you can see the command you want (and it's binding), and hit return on it. Like IntelliSense for the IDE commands.

Sort of like what you have for the Command window now, but using the name of the command ("Class View"), not a programmatic sort of name that requires you know where the command is to invoke it (ie, building the current project is Build {ProjectName}, not Project.BuildOnlyProject).


# June 18, 2004 12:20 PM

Michael Ruck said:

Please Please change the mappings! And please please include the suggestions made by Ron above.

It makes VS a lot more usable in my opinion. And those people who prefer to use emacs should not scream about keyboard shortcuts - They have enough shortcuts in memory already - a couple of new ones won't hurt ;-)
# June 18, 2004 12:26 PM

Mark Watts said:

Being new to VS with version 2003 I did not have any muscles to retrain, however in learning the VS.2003 keys, I found the inconsistency frustrating.

Needless to say I am not looking forward to having to retrain the old fingers yet again, but at the same time, introducing some consistency into the key bindings is very appealing.

I say go ahead and change them. Then during either the first run or setup, let the user select the key binding they want to use. I don't remember, this might be done now.

Also, as part of the selection process point them to either this blog or some other text that gives some explanation behind the reason for introducing a new binding. If you just change it most users, including me would probably just start saying some of those choice 4 letter words, but if there is an explanation associated, they where an explanation associated with it demonstrates that some thought went into the decision, whether or not we agree with the end result.
# June 18, 2004 12:35 PM

Keith Wedinger said:

The problem with this (and it affects all of the user configurable VS settings, not just keybindings) is that I cannot export my VS.NET 2003 settings and then, import them into VS.NET 2005. I spent a lot time configuring the keys, the syntax highlighting and the window layouts and I must resort to registry trickery and moving files around under "Documents and Settings" to get things the way I want them.
# June 18, 2004 12:38 PM

Chris said:

Change the bindings, it makes sense and change is good for everyone. I do think you should make the mappings completely configurable - throw in a base set and just allow folks to change it to their liking. If it blows up on them, then just reload the base set. Customization of the environment is key and it takes alot of time, but I work different from the next guy so I like the option to configure extensively.
# June 18, 2004 12:46 PM

Michael Davidson said:

Clearly you should've left the key bindings alone. It's all muscle memory anyway; changing them does no one any good at all.
# June 18, 2004 1:15 PM

DavidC said:

Why is this such a big deal?

I don't understand why you can't have an XML file with all of the internal commands mapped to key bindings and then the developer picks his XML that he wants to use.

Why hard code it at all?

Make me understand?

Dave C.
# June 18, 2004 1:32 PM

AdrianP said:

DavidC, maybe MS have a XML parse error. They talk so much about XML but..
# June 18, 2004 1:57 PM

Kevin Dente said:

Generally I'm OK with the chording. What I'm most happy about is that Build won itself a shorter shortcut. The three-key finger-twister in VS2002/3 was terrible.

That's a key thing for me. Make the stuff that I use most frequently the most easily keyboarded.

BTW, is there a general goal to turn all (or most) three-key shortcuts into chords? Things like Find in Files, Add New Item, etc are still 3-keyers.

# June 18, 2004 3:28 PM

Doug Finke said:

I am master of the keyboard. I have been since Windows 1.0 for the Office products, dev products etc. Learning new key chords is not a problem.

I silently grumbled after downloding the Whidbey preview and realized "oh the product isn't broken" they just remapped the $#@!&% key bindings.

Now I need to take that extra step and think which IDE version I'm working with (2003, 2005) so I can be productive.
# June 18, 2004 3:30 PM

David said:

I'm sympathize with the desire to rework the messy state of the current keyboard shortcuts. But chords are the wrong solution. They're slower and more confusing than one-step shortcuts (even three key ones like ctrl-shift-b). It's harder to get them into muscle memory. It's too easy to press one key of the chord, pause, and forget what you pressed (a line in the status bar with the current chord is not a solution). And the chords are hard on your hands (I think frequent use of Emacs, with its ctrl-x ctrl-s and ctrl-x ctrl-c would contort my hand into a claw).

So go ahead and rework the shortcuts, but don't use chords. Make common commands easy (ctrl-s, F5), and then give the obscure commands whatever's left. And make sure there's an option to use the old settings.

Also, I'm sure there are lots of interesting ways that you can introduce new keyboard shortcuts to the user and allow configuration of them. But that's no excuse for bad defaults.
# June 18, 2004 4:01 PM

anonymous said:

I use many different editors while programming. Since many of the keybindings between apps are so different I personally dont use that many. save all, auto-complete, build, run, step through, step into, step over, cut, copy, paste is pretty much it.

those who are nagging about little things like keybindings (which can be changed) should invest 1/2 hour setting VS up how they like it. I personally didnt like keybindings in vs 2003, and doubt i will in 2005. Partially because i work on a cramped laptop keyboard that makes common ones (like build) a sort of finger gymnastics. The other reason is i am still supporting an old VB6 app where most all the keys are different anyway.

# June 18, 2004 4:28 PM

Rob McAfee said:

As long as we have a way to easily configure the binding to match older versions of VS, I'm happy.
# June 19, 2004 9:12 AM

Mike Gunderloy said:

So what do you do when VS2K7 adds a bunch of new features? Remap everything again for what seems most logical then? Count this as a vote for leaving things compatible rather than trying to make them sensible.
# June 19, 2004 9:15 AM

Tony Schreiner said:

My suggestions:

Rather than coming up with a complicated scheme to try to cover every command in a uniform way, make the most frequently used commands easy to reach and remember. I can just imagine where you actually implement something like what Ron states, and I have to use "Ctrl+D, O" rather than F10 to step in the debugger. Ugh.

Don't assign key bindings to less frequently used commands. Instead, go with an approach like emacs where you can easily enter it by name (eg. Esc-x untabify-all). If the developer finds himself using one of these commands frequently, he can choose his own key binding for it.

As a corollary to the above, leave one accelerator combination completely open for customization. For example, I've configured emacs so *all* ALT keybindings go to the commands I choose, including my own macros. This is extremely convenient. (I believe that having keybinding consistency between multiple users' machines for infrequently used commands is a non-scenario.)

Finally, make the configuration easily portable. I should be able to copy it as easily as I copy my .emacs file. This should also include toolbar and window layout as well as "External Commands" I've added to the Tools window.
# June 19, 2004 10:28 AM

Tony Schreiner said:

As for the root question: keep the keybindings as consistent as possible with not only old releases, but other editors and editing environments.

Here's a very applicable quote from The Pragmatic Programmer:

"We think it is better to know one editor very well, and use it for all editing tasks: code, documentation, memos, system administration, and so on. Without a single editor you face a modern day Babel of confusion. . . If you use a single editor (or set of keybindings) across all text editing activities, you don't have to stop and think to accomplish text manipulation: the necessary keystrokes will be a reflex. The editor will be an extension of your hand; the keys will sing as they slice their way through text and thought. That's our goal."
# June 19, 2004 10:34 AM

Shannon said:

Isn't going to two keystrokes reinventing something that's already there: menu shortcuts?

If I hit "Alt-V, P", I open the Solution Explorer (in VS.Net). How is "Ctrl-W, S" a shortcut for this? It's not any more memorable or easy to use...

If you do go to multiple keystrokes, then making them match the menu usage (where possible) will make them instantly discoverable and memorable. Muscle memory will help train.

(Personally, I'm still addicted to the Brief keymapping (and I still use the numpad). I use a third party editor because VS doesn't have them, but would change in a flash if VStudio provided them. :-)
# June 19, 2004 12:51 PM

Keith Hil said:

I love almost all of the new keyboard shortcuts. I especially like chorded shortcuts because it is easier for me to remember that Ctrl+D gets me into the Debug keyboard shortcuts and then something like C (as in Ctrl+D,C) brings up the Call Stack. I say just try real hard to get them right this time and allow folks to switch back to previous binding settings.
# June 20, 2004 9:10 PM

Keith Hil said:

Uh, what is memorable about Alt-V,P? The "P" in Solution Explorer is buried. Ctrl+W,S is easy if you use the mnemonic Ctrl+W (windows), S (solution explorer).
# June 20, 2004 9:14 PM

Ian said:

Have to bounce between F7 and Ctrl-Shift F7 (I use VS.NET and VS 6) is a real pain!

Why the change from F7 to the 'other' 3 finger salute?

I like the idea of getting the mappings right for once, instead of adding new random ones each release. However, people do get used to mappings (even weird ones) so its important to either keep the old ones, or allow the mapping to be totally customized by the user.

Like Don, I don't want to have to re-learn key mappings every release of the product.
Chords are fine, although I prefered F2 for bookmarks that Ctrl-K,K :-) but lets keep the chords sensible, and logically grouped.
# June 20, 2004 9:52 PM

Shannon said:

I didn't mean to say that Alt-V,P was easier, only that it was the same number as keystrokes as the new bindings. In addition, it is more visible, discoverable, and self-teaching.

If one called the menu "Window" and made the Solution Explorer's hotkey S, then Alt+W,S will have the menu and the keystrokes match.
# June 20, 2004 9:56 PM

James said:

The new keys look much better to me. I don't use many shortcuts currently because they're too difficult to remember!

Why not add a Visual Studio 2003 profile for people that are used to the current keys?
# June 21, 2004 1:29 AM

adam said:

keep the simple keys simple.
Build - F7
break point, Step over/info - F9, F10, F11
toggle/move to Bookmark Ctrl-F2/F2

These kinds of things I do more often than any other CTRL-SHIFT-B is too much, and CTRL-K-K for bookmarks!

Maybe if the function keys are left open so we can map you usefull items to them without overwriting existing mappings. Having said that windows already uses a bunch of them for it's own purposes.
# June 21, 2004 2:07 AM

SimonT said:

Stop griping

So they are changing Key bindings, so what, I came from VB and had to get used to them and now Im gonna have to get used to them again.

Chances are I'll remap them anyway to a unholy combination of new c# old c# and vb mappings anyway. Thats the beauty of VS its tailorable.

# June 21, 2004 2:33 AM

Dr Pizza said:

Will these mappings apply to all the languages? They ought to, but the descriptions all seem very C#-centric.

# June 21, 2004 3:09 AM

Paulo Morgado said:

At a previous job I had to come up with a coding alghoritm for more that 10000 possible products. With minor changes (mostly because th software now allows longer product codes), after more than 10 years, it still hold.

They key for my achivment was thinking like Joe is thinking now: patterns.

The current schema has no pattern for most of the shortcuts, so I don't bother to remember them.

Just have one thing in mind Joe, not everyone uses US keyboards. I never new there was a matching brackets until I complained. Someone told me that it was Ctrl+[ and Ctrl+Shift+[. In the pt-pt keyboard [ is AltGr+8 and it didn't work. Asking around, I found out the name of the feature and found out that, for my keyboard, the shortcut is Ctrl+« and Ctrl+Shift+«.
# June 21, 2004 3:43 AM

John Morales said:

note that most responders to your post are old-school people and not the "average" user of vs.

make the new system the default profile, and allow the old "vs 2003", "vc++6", "vb6", whatever profile's available from the start page.

don't let these these dinosaurs change your thinking. as programmers we are problem solvers. you propose an elegant solution to an age old problem.

i would like the chords to have a visual component. when you type ctrl+c, a context menu or smart tag or status text will pop up with the choices avaialable for that chord. maybe an "Accelerator" menu strip that shows the root chords as main menu items and then the items beneath it. granted that this idea would duplicate the existing menu structure/ui, but i think it might be a good jump off point for further design. how about an "accelerator" sound that plays when you type the chord character?
# June 21, 2004 7:01 AM

Asbjørn Ulsberg said:

I think the old bindings work, but they make absolutely no sense. I think this change should have been made in 2002 or 2001, but it's a welcome change even in 2005. I think it looks neat, and it will make it easier to learn new shortcuts when they get added in newer versions (I presume this change is rather permanent).

I like the new scheme, and I think I will switch to it when VS.NET 2005 ships. My current scheme is a mix of the C# default and a set of my own keybindings (e.g. CTRL + W to close file, CTRL+SHIFT+K, P to attach a process, etc).
# June 21, 2004 7:27 AM

Curt Koppang said:

As a longtime customer in the "enterprise" space - keyboard remapping can be real annoying. I agree with most of the thoughts already expressed here. I feel the need to add a couple more thoughts…

• There is something to be said for standards even if the standard is wrong. Why does a commodity programmer have to relearn something as insignificant as key combos when I already have to spend time discussing more important topics like security and transactions?

• There is something to be said for making people feel at ease with change. There is already a bunch of new things people need to learn when moving to the next version of VS – is there something you can do to easy that transition? I think people on this thread have already expressed some ideas.

• Communication. If I had a nickel for every time I was working over someone’s shoulder and I said “F10 over that line of code”. It’s just become part of my vocabulary - once I upgraded my vocabulary from the previous version.

I appreciate the fact that the keyboard remapping may be needed, just wanted to add some more grist for the mill.

curt
# June 21, 2004 9:15 AM

Ken Brubaker said:

The Visual Studio team will be changing the C# text editor key bindings once again.
# June 21, 2004 4:59 PM

Kevin Dente said:

+1 for John Morales' idea - intellisense for keyboard shortcuts.

Also, another issue is that there isn't an obvious way to cancel a shortcut mid-chord. The obvious solution, hitting Esc, does have the net effect of cancelling, with a message saying that the Ctrl-W Esc sequence has no mapped shortcut - but theoretically there could be.
# June 21, 2004 5:12 PM

TrackBack said:


Knowing .NET
# June 22, 2004 7:22 PM

Andrew Tweddle said:

This is slightly off topic. But another irritation is when 2 separate key combinations are used where 1 would suffice.

F7 and Shift-F7 are the ones that bug me.
You know the current context is either a form designer or code. Just use F7 to toggle between them.

Then Shift-F7 is available for some other use (or becomes free for add-ins to use). And so are some of my neurons.

The Delphi IDE does this (using F10 not F7/Shift-F7). When will VS.Net become as user-friendly?
# June 24, 2004 3:07 AM

Keith Hill said:

I like the F7 toggle idea. I can never remember which F7 vs Shift+F7 will take be to. I've also been pushing to have Ctrl+D,D changed from "Go To Disassembly" to "Toggle Disassembly". When I go to the disassembly view I want an easy way to get back to the source code view. Toggles are great for that kind of scenario.
# June 24, 2004 9:52 AM

Keith Hill said:

Doh! For those who can't speak or read gibberish, let me translate:

I can never remember which view F7 or Shift+F7 will take me to.
# June 24, 2004 1:24 PM

Paul said:

Yes, make the bindings make sense. I vote for choice #3. I've almost never used the key bindings, because they're not systematic. I appreciate everyone's reluctance to change, but in the spirit of progress, whidbey and longhorn, let's fix it for good!

By the way, I did read this suggestion:
http://blogs.msdn.com/joen/archive/2004/06/10/153245.aspx#160139
I think it would be really good to get the menus and shortcut keybindings to sync up. Either that, or have the menu structure accomodate the key bindings? It does seem strange to be able to access a bit of functionality via the keyboard with two different key paths, one for shortcuts and one for menu accelerators.

Now I'm arguing against myself and begin to see why people want to avoid chorded keyboard shortcuts. FEH! Consistency over convenience! I remain in favor of choice #3 !!
# June 30, 2004 6:55 PM

Paul said:

I like the idea for key-chord intellisense:
http://blogs.msdn.com/joen/archive/2004/06/10/153245.aspx#161377

I like the idea for view toggles:
http://blogs.msdn.com/joen/archive/2004/06/10/153245.aspx#164553

Thanks!



# June 30, 2004 7:01 PM

Paul said:

Keith Wedinger brings up a great point:

http://blogs.msdn.com/joen/archive/2004/06/10/153245.aspx#159565

The more transparent you make the inner workings of the preferences, the better. I almost NEVER change my preferences because I don't want to bother with hunting them down if I need to reinstall. MSBuild is going to a well defined XML format, why can't the rest of Visual Studio ?!?

/rant

# June 30, 2004 7:04 PM

Marc Brooks said:

I like the idea of getting some consistency. Make sure you only use corded keystrokes in the process, hopefully only the CTRL and CTRL-SHIFT ones, so that Windows UI standards aren't violated regarding the ALT key... which also absolves you from getting them in sync with the Menu letters.

Also, while we're at it, PLEASE make them XML settable so I can edit them once to get it all right.

I do agree with the wonderful idea of a incremental search selection of commands by "name" as well as the command method name.

Lastly, can someone please give me my grey-minus means cut-current-line and grey-plus means paste-line. I miss that from my Brief days. (David Nanian be praised)
# July 9, 2004 4:01 PM

Ignas Vysniauskas said:

Definitely 3. It just gonna be easier to learn.
# July 13, 2004 5:45 AM

Wanderson Santos said:

As teclas de atalho do VS C# v
# July 14, 2004 10:33 AM

Wanderson Santos said:

Visual Studio C# shortcuts will change!
# July 14, 2004 11:01 AM

dianying xia zai said:

# July 25, 2004 11:57 PM

Brian Schwab said:

Is there any reason why I can't assign a bare numpad key to a mapping like I could in v. 6.0? I can assign Alt-Num0, but not just Num0. Why? I've been using the numpad for single key macro buttons for 6+ years. Please tell me there's still a way.

Brian
# July 26, 2004 7:22 PM

Joe said:

Brian,

You can bind the numpad keys but only in the "Text Editor". When setting the keybinding you need to set the scope of the binding to be "Text Editor" and then you can bind the numpad keys to whatever command you want.

Joe
# July 29, 2004 10:21 AM
Anonymous comments are disabled
Page view tracker