History of Emacs and vi Keys

By Xah Lee. Date: 2010-06-16. Last updated: 2017-05-22.

In my study of keyboarding in the past 20 years, i've noticed that the choices of many shortcuts in many apps are adopted to the many aspects of the keyboard hardware of the time in use by the community. Emacs's keybinding is not simply based on the first letter of commands, but the QWERTY layout's key positions have significant influence on it. This also applies to the letter choice of unix's shell commands. Much of this influences of design are unconscious.

Emacs's Meta and Control

As a example, emacs's Meta key, and heavy use of Control as primary modifier, and avoiding any 【Ctrl+Shift+‹letter›】 in its keyboard shortcuts, are caused by the lisp keyboard hardware and dumb terminals of 1980s.
〔►see List of Emacs Default Keybinding〕

How did emacs's cursor movement keys {C-n, C-p, C-f, C-b} came about?

… At the time [1976] Guy Steele put together the Emacs default key mappings, many people in the target user community (about 20 people at MIT!) were already using these key bindings. It would have been hard to get the new Emacs bindings accepted by the community if they differed for such basic commands. As you point out, anyone using Emacs can very easily change this based on their own ergonomic preferences.

Why emacs doesn't have any Control+Shift+letter key?

vi's Esc key and j k h l

How did vi's mode switching idea came from?

Back in 1970s, terminal screen are 80 columns by 24 lines. There's no real-time editing. You edit by typing a command, then call another command to have the screen update to show the result of your command. Vi's “modal editing” is evolved from this. This is also why emacs's manual calls itself “Real Time Display Editor”. Emacs is the first or one of the first “Real Time Display” editor.

Why vi uses j k h l for cursor movement?

Unix vi's use of jkhi for cursor movement, and the choice of Esc key for mode switching, came from the keyboard it was developed on, the ADM-3A terminal (1975).

Terminal ADM-3A keyboard. Note the position of the Esc key and the arrows on H J K L, also the position of Ctrl.Terminal ADM-3A number pad.The ADM-3A terminal's keyboard layout.
image source

Why does the keyboard use {H J K L} for arrow instead of {I J K L}?

The reason appears to be heavily influenced by the design of the ASCII
encoding, which involved a clever assignment of binary code to the letters
so that if you tweak one bit, the characters A to Z corresponds to the
non-printable character starting with code 0. Some of the non-printable
character by some choice interpretation corresponds to arrow directions, and the corresponding
letter are H J K L.

jgrahamc wrote

The reason that keyboard had those arrows keys on it was because those keys correspond to CTRL-H, J, K, L and the CTRL key back then worked by killing bit 6 (and bit 5) of the characters being typed.

The effect was that H which is ASCII 0x48 would become 0x08 which is backspace. If you look at an ASCII table (e.g. http://www.asciitable.com/) you will notice how the uppercase ASCII letters line up nicely with the control characters so that just dropping bit 6 will get you there. Same thing with the lowercase (drop bits 5 and 6) and you are on the control characters.

The CTRL-H, J, K, L therefore correspond to BS, LF, VT, FF. BS is backspace (i.e. left), LF (down), VT is vertical tab (so up) and FF is form feed (which in this case takes you up [right]). I'm not sure why FF was used for up [right].

This is also why CTRL-I is tab, CTRL-D ends a communication. All of that goes back to teletype days. Also for telnet users out there you'll see that CTRL-[ lines up nicely with ESC. And when you see a ^@ being printed on the terminal you can see why it corresponds to a null byte.

One other interesting thing about ASCII: uppercasing and downcasing can be done by twiddling a single bit.

Terminal Keys

Many of the terminal keys in Linux we are familiar today, are not keyboard shortcuts or keybindings proper. They are simply input method for ASCII control characters. For example, 【Ctrl+d】 exits the terminal, but only if the cursor is at the beginning of the prompt.

Gaming's W A S D

The gaming's convention of WASD for avatar movement keys, is also shaped by the PC keyboard's physical key layout used at the time.

Most people need to use the right hand for the mouse for operating a gun or view, so the left hand is used for controlling the avatar's movement. Right hand is the more dexterous hand for most people, and operating the mouse needs more dexterity than pressing arrow keys.

So, to move the avatar, there's the arrow keys, but those have some problems. The arrow keys are on the right side of the keyboard, making it awkward to use with left hand. So, a cluster of keys on the left side of the keyboard is used instead.

But why

W
A S D

and why not for example:

E
S D F

keys? The E S D F are in the standard typing position. But, W A S D is more suitable here, because W A S D is closer to {Caps Lock, Tab, Shift, Ctrl, Alt}, that gamers need to use for Firing, Shield, Jump, change weapon, etc. So, W A S D became the convention.

Also note that the common layout is QWERTY. W A S D is inverted T on QWERTY layout. For those using the Dvorak Keyboard Layout, the W A S D keys are scattered and is a problem. In fact, in the early days, many games do not respect user's choice of key layout in Operating System, nor does it provide ways for users to change the keys. Even today, some game software still have this problem, notably
Second Life
(as of 2010-06-16).
(In the early days, say mid 1990s, Operating systems such as Windows hardly have a consistent keyboard layout API for programers anyway. Many software protocols, standards, layers, are gradually established later as with most things.)

The X C V for Cut Copy Paste

Another history is the convention of XCV keys for Cut Copy Paste. This came from Apple.

Apple computer, starting in late 1980s, made the {undo, cut, copy, paste} concept popular to the masses, and in general the concept of computer keyboard shortcuts. These keys are chosen because they are all adjacent and on the left side of the keyboard, where under them there's the ⌘ command key. Also in this set are Quit Q, Close W, Select All A, Save S, Duplicate D, and Undo Z. The only exceptions are Open O and Print P on the right side of keyboard.

All these keys have become de facto standard on all applications on {Windows, Mac, Linux} today, except the 【Ctrl+Shift+z】 for redo and D for Duplicate.

Windows's PrtScn/SysRq for Screenshot

PrtScn/SysRq, ScrLk, Pause/Break, Insert

On today's PC keyboard, you'll find quite a few relic keys. PrtScn/SysRq, ScrLk, Pause/Break, Insert. They used to have meaningful purposes in the 1980 or earlier, some of them are separate keys. But computer hardware changes, and software changes, dramatically over the past 20 years. Keyboard itself did not change as fast, due to habit. So, these keys became defunct.

Because the name “Print Screen” somewhat relates to screen capture, so Microsoft have chosen it to be the key for saving screenshots. Similarly, the ⌫ Backspace key, was chosen as the key for web browser to go BACK to previous page. Note that this key is labeled “Delete” on Apple's keyboards, even they sent the exact same signal. In Apple's operating system, in Mac Classic of the 1990s or Mac OS X since early 2000s, this key was not used for browser's back function, only so around ~2006 when Apple started to adopt many Windows's conventions.

Conclusion?

If there's any conclusion, it is that many keyboard shortcut or hotkey
choices are based on what is practical at the time. Issues of logical design,
ergonomics, consistency, efficiency, are less important. Some of these
concept didn't even exist at the time, and some choice was good at the
time but computer systems and hardware and keyboard all have changed.

In retrospect, many of the choices are not the best today. For example, QWERTY layout was practical at the time, but the Dvorak Layout was invented too late, when convention was already established, and concept of keyboard ergonomics may not even exist. But typing on computer is done by everyone today, for chatting, emails, all sorts of communication, and programing has become a field that's some million times more than the number of typists 40 years ago.

The way Caps Lock work should be deprecated. It should work as a key to capitalize the next letter key press. (not as a “lock”) This way, Shift can be entirely removed.

Any modifier keys such as {Shift, ❖ Window, …} should be deprecated. Instead, they should just be special keys, as starting key for a key sequence to call commands. (like how Microsoft Windows's Alt key works (from about Windows 95 to Windows 7).) 〔►see Banish Key Chords〕

The defunct keys: Insert, PrtScn, ScrLk, Pause, Break, really should be gone. 〔►see Print Screen, SysRq/ScrLk, Pause/Break Keys〕 The Num Lock on the number keypad also is a relic, from a time long past that keyboards don't have dedicate arrow keys and Page up/down Home/End etc keys.

Today, there needs to be keys to change sound level, play/pause music, next/previous song. Luckily, these have been on most keyboards since about mid 2000s, just that they have not been standardized in layout. Similarly, there needs keys to launch frequently used apps such as email, web browser. These have also been widely popular in keyboards.
There needs to be keys to switch to previous next app/window/tab.
Also needed is dedicated keys for {copy, cut, paste, undo, redo}. These are used in about every application on a hourly basis. Major keyboard makers Microsoft and Logitech have started to make keyboards with these functions pre-assigned to the F1 to F12 Function keys. However, it creates problems because these function keys already have uses in many applications, especially for programers. Microsoft also introduced the F-Lock key to toggle the purpose of the F function keys, but that created more problem than is worth. 〔►see The F-Lock Key Problem〕