Arrow Keys Efficiency: vim HJKL vs IJKL

By Xah Lee. Date: . Last updated: .

vim use {h j k l} keys to move cursor. Another approach is Inverted T {i j k l}. This page investigates which is more efficient.

ADM 3A terminal layout 6aec4
The ADM-3A terminal keyboard layout. [see History of Emacs and vi Keys]

Considering Key Frequency

Let's assign score to key positions with respect to ease of key press. Let's set k to have the max score of 1. We'd have something like this:

                  i
                 0.8
      h     j     k     l
     0.5   0.9    1    0.7

now look at these command's frequency.

Arrow Keys Frequency
keycommand%
previous-line15.48
next-line17.10
backward-char3.23
forward-char5.51

[see Emacs's Command Frequency Statistics]

Multiply the percentage with the score.

Here's JavaScript script to calculate.

// is vi's {h j k l} keys more efficient or inverted T {i j k l}

const key_score = {
    "i":0.8,
    "j":0.9,
    "k":1,
    "l":0.7,
    "h":0.5,
};

const command_frequency = {
    "up":15.48,
    "down":17.1,
    "left":3.23,
    "right":5.51,
};

const vi_key_map = {
    "h":"left",
    "j":"down",
    "k":"up",
    "l":"right",
};

const inverted_T_map = {
    "i":"up",
    "j":"left",
    "k":"down",
    "l":"right"};

const vi_score = Object.keys ( vi_key_map ).map ( ((kk) => (key_score[kk] * command_frequency[vi_key_map[kk]])) ) . reduce ( ((x,y) => (x+y)) );

const invertedT_score = Object.keys ( inverted_T_map ).map ( ((kk) => (key_score[kk] * command_frequency[inverted_T_map[kk]])) ) . reduce ( ((x,y) => (x+y)) );

console.log ("vi score", vi_score); // 36.342
console.log ("inverted T score", invertedT_score); // 36.248

Here's Python version.

# -*- coding: utf-8 -*-
# python

# is vi's {h j k l} keys more efficient or inverted T {i j k l}

key_score = {
    "i":0.8,
    "j":0.9,
    "k":1,
    "l":0.7,
    "h":0.5,
}

command_frequency = {
    "up":15.48,
    "down":17.1,
    "left":3.23,
    "right":5.51,
}

vi_key_map = {
    "h":"left",
    "j":"down",
    "k":"up",
    "l":"right",
}

inverted_T_map = {
    "i":"up",
    "j":"left",
    "k":"down",
    "l":"right"}

vi_score =sum(map(lambda x: (key_score[x[0]] * command_frequency[x[1]]) , vi_key_map.iteritems()))

invertedT_score =sum(map(lambda x: (key_score[x[0]] * command_frequency[x[1]]) , inverted_T_map.iteritems()))

print("vi score", vi_score)                # 36.342
print("inverted T score", invertedT_score) # 36.248

so, this means, they are about the same degree of efficiency.

Try to adjust the key score or command frequency. Overall, score comes out about the same.

This test only considers ease of each key press. For just these 4 keys, this simple measure can be considered a reasonable test of efficiency. But note that a robust test should also consider bigram frequency and other factors. [see What's the Most Efficient Keyboard Layout?]

Considering Bigrams

google pacman
Google Pacman

vi has h moved away, while inverted T has the i moved away. Which one is better? I think if you consider this, then the inverted T is better. Because, consider all 2-key combinations involving the one key that's moved away. The vi way, involving a moved index finger left/right for , is more costy than the moved middle finger up/down. This with vi is pretty bad. This can be easily seen when playing pacman.

Considering Intuitiveness

Another factor is intuitiveness. The inverted T is more intuitive. vi's row arrows require learning. That's one big win for inverted T.

Conclusion

Inverted T is probably slightly better. The winning point is when considering bigram. vi's way is especially bad when you have frequent left/right movement.

Did i $save$ you from getting a brick?

$5 me, at patreon
or paypal to xah@xahlee.org

If you have a question, put $5 at patreon and message me.

  1. Ergo Keyboards
  2. PC Keyboards
  3. Fun Keyboards
  4. Keypads
  5. Do-It-Yourself
  6. History
  7. Design
  8. Layout
  9. Keybinding
  10. Typing
  11. Key How-To
  12. Mouse
  13. Trackball
  14. Misc
  15. Blog