History of Emacs and vi Keys

By Xah Lee. Date: . Last updated: .

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 Ctrl 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 A Curious Look at Emacs's One Thousand Keybindings]

Symbolics's Lisp Machine keyboard PN 365407 Rev C. (Photo by Joey Devilla [https://www.globalnerdy.com/2009/02/05/hacklabtos-lisp-machine-keyboard/] , Used with permission.)

[see Lisp Machine Keyboards]

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.

[see Daniel Weinreb on Emacs Keybinding]

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

Because, in terminal, Control+Shift+letter has the same signal as Control+letter.

See also:

vi's Esc key and j k h l

terminal ADM 3A
ADM-3A, 1976
adm-3a keyboard cb140
ADM-3A keyboard [image source https://vintagecomputer.ca/lear-siegler-adm-3a-terminal/]

Note the position of the Escape key and the arrows on H J K L, and the position of Ctrl, and position of the colon : key.

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 j k h i for cursor movement, and the choice of Escape key for mode switching, came from the keyboard it was developed on, the ADM-3A terminal.

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 (example: 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.

If you look at this picture of an ASR-33 Teletype you'll see that come of the control characters on the keyboard correspond to those in the ASCII set. This is because ASCII evolved from the earlier teletype character sets: https://upload.wikimedia.org/wikipedia/commons/0/0b/ASR-33_2.jpg

[source: https://news.ycombinator.com/item?id=3684515 (local copy hackernews_why_vi_terminal_adm_3a_uses_ijkl.txt )]

ASCII Control Charbackspacelinefeedvertical tabformfeed
Input MethodCtrl+hCtrl+jCtrl+kCtrl+l

see ASCII Table

See also: on vi Keybinding vs Emacs Keybinding

The above does not fully answer why the ADM-3A terminal keyboard has arrows printed on the H J K L keys. To really know, one must read the ADM-3A terminal manual.

ADM 3A terminal manual arrow keys
“ADM-3A interactive display terminal, OPERATORS MANUAL”, on arrow keys

So, apparantly, the arrows keys are used with control key held down. It simply sends the corresponding ASCII control codes, and these 4 control codes, are interpreted to move cursor.

The vi designer Bill Joy, simply used the same key in vi's modal way, without needing to hold Control key.

Interview with Bill Joy (creator of vi)

Interview with Bill Joy (creator of vi)

See also:

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.

For detail, see: Linux: Terminal Control Sequence Keys .

Gaming's WASD

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

wasd keys transculent top keycaps 0026

It was made famous by Dennis Fong (aka Tresh), the most famous champion of first person shooter gamer, in Quake, in late 1990s.

Dennis Fong (traditional Chinese: 方鏞欽; simplified Chinese: 方镛钦; pinyin: Fāng Yōngqīn; Jyutping: fong1 jung4 jam1), better known by his online alias Thresh, is an American businessman and retired professional player of the first-person shooter video games Quake and Doom. He is a co-founder of Xfire, an instant messenger and social networking site for gamers, which was acquired by Viacom for US$102 million in April 2006. He also co-founded Lithium Technologies, a social customer relationship management (CRM) company. In his playing career his highest profile victory came in 1997 at the Red Annihilation Quake tournament, where he placed first and won id Software CEO John D. Carmack's Ferrari 328. Fong is recognized by the Guinness World Records as the first professional gamer.[1]

2021-06-18 [ Thresh (gamer) ] [ 2021-06-18 https://en.wikipedia.org/wiki/Thresh_(gamer) ]

[How WASD became the standard PC control scheme By Tyler Wilde. At https://www.pcgamer.com/how-wasd-became-the-standard-pc-control-scheme/ ]

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

 A S D

and why not for example:

 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 {CapsLock, 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 X C V keys for Cut Copy Paste. This came from Apple.

Apple Macintosh 512 keyboard 18366
Macintosh Keyboard (M0110) (year 1984) (photo by Muirium. image source)

[see Apple Macintosh Keyboard M0110, Year 1984]

 A S D
  Z X C V

Apple computer, starting with the Macintosh in 1984, 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.

See also: Control Key and Capslock Key Positions in Old Keyboards

Windows's PrtScn/SysRq for Screenshot

Backspace Insert PrtScn keys
PrintScreen/SysRq, ScrollLock, Pause/Break, Insert

On today's PC keyboard, you'll find quite a few relic keys. PrintScreen/SysRq, ScrollLock, 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.

See also:


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.

[see Dvorak Keyboard Layout]

Emacs's primary modifier the Ctrl is much better at the Alt position on today's PC keyboards.

“vi”'s Escape might be better today at PC keyboard's Alt or CapsLock positions. vi's {h j k l} is still pretty good, but {i j k l} is equally efficient but more intuitive. [see Arrow Keys Efficiency: vim HJKL vs IJKL]

The way CapsLock 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 Ban Key Chords]

The defunct keys: Insert, PrintScreen, ScrollLock, Pause, Break, really should be gone. [see Print Screen, SysRq, ScrLk, Pause, Break Keys] The NumLock 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]

2013-07-17 addendum: Hacker News discussion. https://news.ycombinator.com/item?id=6056420

2013-07-29 thanks to Liam Proven ([2013-07-29 https://twitter.com/lproven ]) for correction on Apple keyboard photo used.

2017-05-18 addendum: Hacker News discussion. https://news.ycombinator.com/item?id=14367207

Lisp Machine Keyboards

SAIL keyboard b1c80-s306x204
lisp knight keyboard-s339x184
lmi-cadr keyboard 1st gen space cadget 31997-s289x217
Space-Cadet keyboard 2-s392x159
Xerox 1108/1109
symbolics keyboard pn364000 mrq3w-s349x179
Symbolics PN 364000
Symbolics keyboard PN 365407 130df-s349x179
Symbolics PN 365407
Racal-Norsk KPS-10 keyboard 1-s303x206
Racal-Norsk KPS-10
Lisp Machine Keyboards
Keyboard Design for the LISP Machine
History of Emacs and vi Keys

Hacker Lore Keyboards

Keybinding and Input-System