Skip to content
Home-row mods & timing

Home-row mods & timing

A hold-tap key sends one thing when tapped and another when held: on BASE, F is F when tapped and Shift when held. The hard part is telling the two apart while typing fast, and the settings below are how this keymap does it.

The behaviors

This table is read from config/eyelash_sofle.keymap every time the site builds, so it always matches the firmware:

BehaviorUsed on (tap → hold)flavortapping-termrequire-prior-idlequick-tapOpposite hand onlyHold on release
hmlS → LALT, D → LCTRLbalanced280 ms230 ms175 msyesyes
hmrK → RCTRL, L → LALTbalanced280 ms230 ms175 msyesyes
hml_idxF → LSHFThold-preferred280 ms70 ms175 msyesyes
hmr_idxJ → RSHFThold-preferred280 ms70 ms175 msyesyes
ralt_mtF12 → RALTbalanced280 ms230 ms175 msnono

What the columns mean:

  • tapping-term: hold longer than this and it’s a hold.
  • require-prior-idle: if another key was pressed less than this long before, the key is always a tap. This is what keeps fast typing from firing modifiers.
  • quick-tap: tap the key again within this window after a tap and it is a tap again, so holding it repeats the letter.
  • flavor: balanced makes it a hold when another key is pressed and released inside the tapping term; hold-preferred makes it a hold as soon as another key is pressed.
  • Opposite hand only (hold-trigger-key-positions): it can only become a hold when the other key is on the other hand. Same-hand rolls stay letters.
  • Hold on release (hold-trigger-on-release): the positional check happens when the other key is released, not pressed, which allows holding two mods on the same hand and then pressing a key on the other.

Finger mapping

Ring finger Alt, middle Ctrl, index Shift, on both hands: S D F and L K J. The mirror image is easy to remember, and keeps Alt off the inner index positions (G, H), where it was being mistyped.

The index-finger exception

hml_idx and hmr_idx (F and J, the Shifts) are tuned apart from the others. The index finger rolls and holds less evenly, so a long idle requirement made Shift on F and J feel sluggish for CamelCase and quick rolls. They get a much shorter require-prior-idle and the hold-preferred flavor, which commits the Shift on the next key’s press instead of its release. The opposite-hand rule still blocks same-hand rolls, and the short idle window still blocks most misfires mid-word.

The idea comes from Sunaku’s home-row mods guide.

AltGr on the thumb

ralt_mt is the right-thumb F12 key: F12 when tapped, Right Alt (AltGr) when held. It has no opposite-hand rule, because AltGr accents (AltGr+E is é, AltGr+O is ó) are typed on both hands, and a thumb is comfortable to hold while the other fingers reach either side.

Tuning

ProblemTry
Modifiers fire while typingraise require-prior-idle-ms
A modifier doesn’t fire when you mean itlower tapping-term-ms (for example 250)
Key repeat doesn’t workraise quick-tap-ms to your fastest double tap
Deliberate holds feel slowtry flavor = "tap-unless-interrupted"

The behaviors are in the behaviors {} block of config/eyelash_sofle.keymap. After a change, run mise run draw and commit the keymap with the new render; this page picks up the new values on its next build.