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 Characters

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 .

Gamers WASD Keys History

Gamers WASD Keys History

The X C V for Cut Copy Paste

Windows's PrtScn/SysRq for Screenshot


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 Arrangement 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, etc} 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

Keybinding and Input-System

Xah Keyboard Guide