Skip to main content

Nested leader key

To nest leader keys, use a variables:

  • Set the variable on the leader key (Default value 1; 0 when unset)
  • Set the variable to different value on each nested leader key (other than 1 or 0)
  • Unset the variable on all action keys and escape key(s)
  • (optional) Use notification for hints

Example code: ( Open in the online editor → )

let raycastEmoji = 'raycast/emoji-symbols/search-emoji-symbols'
let escape = [toUnsetVar('leader'), toRemoveNotificationMessage('leader')]

let rules = [
rule('Leader Key').manipulators([
// When no leader key or nested leader key is on
withCondition(ifVar('leader', 0))([
// Leader key
map('l', 'Hyper') // Or mapSimultaneous(['l', ';']) ...
.toVar('leader', 1)
.toNotificationMessage('leader', 'Leader Key: Open, Raycast, ...'),
]),

// When leader key or nested leader key is on
withCondition(ifVar('leader', 0).unless())([
// Escape key(s)
map('escape').to(escape),
]),

// When leader key but no nested leader key is on
withCondition(ifVar('leader', 1))([
// Nested leader keys
withMapper(['o', 'r'])((x) =>
map(x)
.toVar('leader', x)
.toNotificationMessage('leader', `leader ${x}`),
),
]),

// leader o - Open
withCondition(ifVar('leader', 'o'))(
[
map('f').toApp('Finder'),
// f - Finder, ...
].map((x) => x.to(escape)),
),

// leader r - Raycast
withCondition(ifVar('leader', 'r'))(
[
map('e').to$(`open raycast://extensions/${raycastEmoji}`),
// e - Emoji, ...
].map((x) => x.to(escape)),
),
]),
]