Yes, the answer you link to is 100% accurate.
I didn't go further because I didn't think it was particularly relevant. Vi uses HJKL for reasons outside of its creator's control. He didn't "choose" HJKL over JKL; or JIKL. He just used what made most sense in what was his current context.
Bullet point #3 was deep enough for the problem at hand.
Now, the history of ASCII is messy and lots of discussions happened over decades for which we have no minutes left. Control codes were added, removed, and moved around for many reasons, including political, economical, and practical (have you heard about "card lacing"?). FWIW, the first version of ASCII, didn't even have ^H
, ^J
, ^K
, or ^L
.
Here is a picture of a teletype (the precursor to the glass terminal), with a dedicated LF, left and up arrows on O and N, etc.
SO, what do we have?
^H
, ^J
, ^K
, and ^L
were used in the ADM-3A to move the cursor on screen.
Here is an overview from the user manual:

And here is an explanation of what actually happened when pressing those keys:

Basically, moving the cursor down implied pressing both CTRL and J, which is not very ergonomic to begin with, let alone touch-typing friendly.
What character was used for what control code was mostly a matter of bitwise arithmetics. LF
is ^J
because J
happens to be at the corresponding location in the corresponding column of the table (+ 64 in decimal), not because J
happens to be on the home-row or some other nonsense.

Note that this is a design decision made by the ASCII people, not LSI's.
The last piece of the puzzle is the way LSI engineers shoehorned ^K
and ^L
into this scheme. Per the standard, ^K
and ^L
don't really move the cursor up or right so it was a conscious decision to pervert their meaning in order to provide cursor movement. What, exactly motivated that decision and how the eventual discussions that led to that decision went is still a mystery and it is likely to stay that way forever.
A few interesting factoids to take into consideration:
- Having dedicated cursor keys and grouping them together was already an established practice before the ADM-3A.
- LSI only produced one single glass terminal without dedicated cursor keys, the ADM-3A.
- All the other LSI glass terminals had full-ish keyboards.
- The ADM-3A was meant to be cheap, which justified using a smaller keyboard without cursor keys and numeric pad (the latter being sold separately).
- The "
^H
for "left", ^J
for "down", ^K
for "up", and ^L
for "right"" scheme predates the ADM-3A. Previous models already used that scheme even if they had physical cursor keys, and later models did, too.
That last factoid is key: the physical ↑ already sent ^K
before someone decided to print ↑ on the side of the K key.
With all that in mind, I think it is relatively safe to assume they followed a line of reasoning not too far from this one:
- We want the terminal to be compact.
- Which makes a full keyboard unacceptable.
- We remove the numeric pad and the cursor keys.
- Numeric pads are kind of useful, though, so we will sell them separately.
- But we need a way to move the cursor without physical keys.
- We already use
^H
for "left", ^J
for "down", ^K
for "up", and ^L
for "right" anyway, so let's print arrows on the H, J, K, and L keys.
In short, pressing the physical ↑ already sent the ^K
control code in previous terminal models made by LSI and kept doing so in later models. In fact, users could choose to either press CTRLK or ↑, with the exact same effect. In that specific model though, the ADM-3A, the physical keys were removed but the functionality was somewhat preserved. Users could no longer press the physical ↑ but they could still press CTRLK and this had to somehow be indicated to the user… by printing the arrows on the corresponding keys.
So when Bill Joy sat at his ADM-3A terminal to work on a screen oriented interface for ex, he of course needed to let the user move the cursor around. The most logical, then and now, would have been the cursor keys, which are literally made for that exact purpose but there were none on his keyboard. There was no standard "UP" control code at the time, though, and what LSI did with ^H
, ^J
, ^K
, and ^L
wasn't exactly reliable and cross-platform enough… so no ^<key>
either. But the modal concept he was working with allowed him to give super powers to regular keys. He had to find regular alphabetic keys for "Up", "Down", and friends. And what better choice for that than… the keys with the arrows printed on them?
So…
Q: Why HJKL?
A: Because the arrows were printed on HJKL on the author's keyboard.
Q: Why not JKL;, which would have made more sense from a touch-typer POV?
A: Because touch-typing has nothing to do with any of this.
Q: Why not JIKL, which would have made more ergonomic sense from my POV?
A: Because you weren't there to convince Bill Joy, thankfully. And ergonomics have nothing to do with any of this anyway.
More than you ever wanted to know about ASCII