tntmarket / vimmyroam

Vim like keybindings for Roam Research, inspired by Vimium
17 stars 0 forks source link

Investigate alternatives to hint based navigation #4

Open tntmarket opened 4 years ago

tntmarket commented 4 years ago

Existing Approaches to Keyboard Navigation

"Tab based navigation" is the default strategy for keyboard based navigation. The process is:

  1. Identify what you want to click
  2. Press tab until what you want to click is focused
  3. Press enter

"Hint based navigation" seems to be the most popular alternative in browsers today. The process is:

  1. Identify what you want to click
  2. Bring up hints
  3. Identify the hint matching what you want to click
  4. Type the hint

Analysis of Existing Keyboard Navigation Strategies

The shortcoming of tab based navigation is the sheer amount of key presses it takes to reach your destination. The advantage is simplicity - it's easy to execute fast consistently.

The shortcoming of mouse based navigation is the complexity of the motion which limits how fast you can execute an action. The advantage is flexibility, you can express a wide range of subtly different intentions.

The shortcoming of hint based navigation is the extra attention it requires. Hint navigation requires an extra round trip between Human -> Machine.

The bottleneck is the cognitive burden of reacting to the hint. The reaction is hard to train, because the hints can't be predicted.

Summary of tradeoffs:

Criteria Tab based navigation Hint based navigation Mouse
Time Required Many key presses Few key presses Short hand/arm motion
Attention Required Mindless Mindful Mindless
Expressiveness Breaks down in non-linear UIs Limited to clicks Click, hover, drag

Alternative Approaches Keyboard Navigation

I haven't tried it, but Vivaldi has a Spatial Navigation feature.

I imagine it lets you focus whatever is up/down/left/right. Kind of like mouse keys, but your mouse snaps to whatever is focus-able.

Here's a prototype of spatial navigation for Roam, see #5 for more thoughts on this:

spatial_nav_prototype