Skip to main content

Behavior Configuration

Some behaviors have properties to adjust how they behave. These can also be used as templates to create custom behaviors when none of the built-in behaviors do what you want.

See Configuration Overview for instructions on how to change these settings.

See the zmk/app/dts/behaviors/ folder for all default behaviors.

Common

Kconfig

ConfigTypeDescriptionDefault
CONFIG_ZMK_BEHAVIORS_QUEUE_SIZEintMaximum number of behaviors to allow queueing from a macro or other complex behavior64

Caps Word

Creates a custom behavior that behaves similar to a caps lock but deactivates when any key not in a continue list is pressed.

See the caps word behavior documentation for more details and examples.

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml

Applies to: compatible = "zmk,behavior-caps-word"

PropertyTypeDescriptionDefault
labelstringUnique label for the node
#binding-cellsintMust be <0>
continue-listarrayList of key codes which do not deactivate caps lock<UNDERSCORE BACKSPACE DELETE>
modsintA bit field of modifiers to apply<MOD_LSFT>

continue-list is treated as if it always includes alphanumeric characters (A-Z, 0-9).

See dt-bindings/zmk/modifiers.h for a list of modifiers.

You can use the following nodes to tweak the default behaviors:

NodeBehavior
&caps_wordCaps Word

Hold-Tap

Creates a custom behavior that triggers one behavior when a key is held or a different one when the key is tapped.

See the hold-tap behavior documentation for more details and examples.

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml

Applies to: compatible = "zmk,behavior-hold-tap"

PropertyTypeDescriptionDefault
labelstringUnique label for the node
#binding-cellsintMust be <2>
bindingsphandle arrayA list of two behaviors (without parameters): one for hold and one for tap
flavorstringAdjusts how the behavior chooses between hold and tap"hold-preferred"
tapping-term-msintHow long in milliseconds the key must be held to trigger a hold
quick-tap-msintTap twice within this period (in milliseconds) to trigger a tap, even when held-1 (disabled)
global-quick-tapboolIf enabled, quick-tap-ms also applies when tapping another key and then this one.false
retro-tapboolTriggers the tap behavior on release if no other key was pressed during a holdfalse
hold-trigger-key-positionsarrayIf set, pressing the hold-tap and then any key position not in the list triggers a tap.

The flavor property may be one of:

  • "hold-preferred"
  • "balanced"
  • "tap-preferred"
  • "tap-unless-interrupted"

See the hold-tap behavior documentation for an explanation of each flavor.

hold-trigger-key-positions is an array of zero-based key position indices.

You can use the following nodes to tweak the default behaviors:

NodeBehavior
&ltLayer-tap
&mtMod-tap

Key Repeat

Creates a custom behavior that repeats the whatever key code was last sent.

See the key repeat behavior documentation for more details and examples.

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-key-repeat.yaml

Applies to: compatible = "zmk,behavior-key-repeat"

PropertyTypeDescriptionDefault
labelstringUnique label for the node
#binding-cellsintMust be <0>
usage-pagesarrayList of HID usage pages to track<HID_USAGE_KEY>

For the usage-pages property, use the HID_USAGE_* defines from dt-bindings/zmk/hid_usage_pages.h.

You can use the following nodes to tweak the default behaviors:

NodeBehavior
&key_repeatKey repeat

Macro

Creates a custom behavior which triggers a sequence of other behaviors.

See the macro behavior documentation for more details and examples.

Kconfig

ConfigTypeDescriptionDefault
CONFIG_ZMK_MACRO_DEFAULT_WAIT_MSintDefault value for wait-ms in macros.15
CONFIG_ZMK_MACRO_DEFAULT_TAP_MSintDefault value for tap-ms in macros.30

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml

Applies to: compatible = "zmk,behavior-macro"

PropertyTypeDescriptionDefault
labelstringUnique label for the node
#binding-cellsintMust be <0>
bindingsphandle arrayList of behaviors to trigger
wait-msintThe default time to wait (in milliseconds) before triggering the next behavior.CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS
tap-msintThe default time to wait (in milliseconds) between the press and release events of a tapped behavior.CONFIG_ZMK_MACRO_DEFAULT_TAP_MS

The following macro-specific behaviors can be added at any point in the bindings list to change how the macro triggers subsequent behaviors.

BehaviorDescription
&macro_tapSwitches to tap mode
&macro_pressSwitches to press mode
&macro_releaseSwitches to release mode
&macro_pause_for_releasePauses the macro until the macro key itself is released
&macro_wait_time TIMEChanges the time to wait (in milliseconds) before triggering the next behavior.
&macro_tap_time TIMEChanges the time to wait (in milliseconds) between the press and release events of a tapped behavior.

Mod-Morph

Creates a custom behavior that triggers one of two behaviors depending on whether certain modifiers are held.

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml

Applies to: compatible = "zmk,behavior-mod-morph"

PropertyTypeDescription
labelstringUnique label for the node
#binding-cellsintMust be <0>
bindingsphandle arrayA list of two behaviors: one for normal press and one for mod morphed press
modsintA bit field of modifiers. The morph behavior is used if any of these are pressed.

See dt-bindings/zmk/modifiers.h for a list of modifiers.

You can use the following nodes to tweak the default behaviors:

NodeBehavior
&grescGrave escape

Sticky Key

Creates a custom behavior that triggers a behavior and keeps it pressed it until another key is pressed and released.

See the sticky key behavior and sticky layer behavior documentation for more details and examples.

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml

Applies to: compatible = "zmk,behavior-sticky-key"

PropertyTypeDescriptionDefault
labelstringUnique label for the node
#binding-cellsintMust match the number of parameters the bindings behavior uses
bindingsphandle arrayA behavior (without parameters) to trigger
release-after-msintReleases the key after this many milliseconds if no other key is pressed1000
quick-releaseboolRelease the sticky key on the next key press instead of releasefalse
ignore-modifiersboolIf enabled, pressing a modifier key does not cancel the sticky keytrue

You can use the following nodes to tweak the default behaviors:

NodeBehavior
&skSticky key
&slSticky layer

Tap Dance

Creates a custom behavior that triggers a different behavior corresponding to the number of times the key is tapped.

Devicetree

Definition file: zmk/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml

Applies to: compatible = "zmk,behavior-tap-dance"

PropertyTypeDescriptionDefault
labelstringUnique label for the node
#binding-cellsintMust be <0>
bindingsphandle arrayA list of behaviors from which to select
tapping-term-msintThe maximum time (in milliseconds) between taps before an item from bindings is triggered.200