import { _ as _export_sfc, c as createElementBlock, o as openBlock, a8 as createStaticVNode } from "./chunks/framework.Cauyuiy8.js"; const __pageData = JSON.parse('{"title":"One Shot Keys","description":"","frontmatter":{},"headers":[],"relativePath":"one_shot_keys.md","filePath":"one_shot_keys.md","lastUpdated":null}'); const _sfc_main = { name: "one_shot_keys.md" }; const _hoisted_1 = /* @__PURE__ */ createStaticVNode('

One Shot Keys

One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys".

For example, if you define a key as OSM(MOD_LSFT), you can type a capital A character by first pressing and releasing shift, and then pressing and releasing A. Your computer will see the shift key being held the moment shift is pressed, and it will see the shift key being released immediately after A is released.

One shot keys also work as normal modifiers. If you hold down a one shot key and type other keys, your one shot will be released immediately after you let go of the key.

Additionally, hitting keys five times in a short period will lock that key. This applies for both One Shot Modifiers and One Shot Layers, and is controlled by the ONESHOT_TAP_TOGGLE define.

You can control the behavior of one shot keys by defining these in config.h:

c
#define ONESHOT_TAP_TOGGLE 5  /* Tapping this number of times holds the key until tapped once again. */\n#define ONESHOT_TIMEOUT 5000  /* Time (in ms) before the one shot key is released */

Keycodes

KeyAliasesDescription
QK_ONE_SHOT_TOGGLEOS_TOGGToggles One Shot keys status
QK_ONE_SHOT_ONOS_ONTurns One Shot keys on
QK_ONE_SHOT_OFFOS_OFFTurns One Shot keys off
OSL(layer)Switch to layer for one keypress
OSM(mod)Hold mod for one keypress
OS_LCTLHold Left Control for one keypress
OS_LSFTHold Left Shift for one keypress
OS_LALTHold Left Alt for one keypress
OS_LGUIHold Left GUI for one keypress
OS_LCSHold Left Control and Left Shift for one keypress
OS_LCAHold Left Control and left Alt for one keypress
OS_LCGHold Left Control and Left GUI for one keypress
OS_LSAHold Left Shift and Left Alt for one keypress
OS_LSGHold Left Shift and Left GUI for one keypress
OS_LAGHold Left Alt and Left GUI for one keypress
OS_LCSGHold Left Control, Left Shift and Left GUI for one keypress
OS_LCAGHold Left Control, Left Alt and Left GUI for one keypress
OS_LSAGHold Left Shift, Left Alt and Left GUI for one keypress
OS_RCTLHold Right Control for one keypress
OS_RSFTHold Right Shift for one keypress
OS_RALTHold Right Alt for one keypress
OS_RGUIHold Right GUI for one keypress
OS_RCSHold Right Control and Right Shift for one keypress
OS_RCAHold Right Control and Right Alt for one keypress
OS_RCGHold Right Control and Right GUI for one keypress
OS_RSAHold Right Shift and Right Alt for one keypress
OS_RSGHold Right Shift and Right GUI for one keypress
OS_RAGHold Right Alt and Right GUI for one keypress
OS_RCSGHold Right Control, Right Shift and Right GUI for one keypress
OS_RCAGHold Right Control, Right Alt and Right GUI for one keypress
OS_RSAGHold Right Shift, Right Alt and Right GUI for one keypress
OS_MEHHold Left Control, Left Shift and Left Alt for one keypress
OS_HYPRHold Left Control, Left Shift, Left Alt and Left GUI for one keypress

When One Shot keys are turned off, OSM() and OSL() will behave like normal modifier keys and MO(), respectively.

INFO

The mod parameter to the OSM() keycode must use the MOD_* prefix, rather than KC_*, eg. OSM(MOD_LCTL | MOD_LSFT).

Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine.

For one shot layers, you need to call set_oneshot_layer(LAYER, ONESHOT_START) on key down, and clear_oneshot_layer_state(ONESHOT_PRESSED) on key up. If you want to cancel the oneshot, call reset_oneshot_layer().

For one shot mods, you need to call set_oneshot_mods(MOD_BIT(KC_*)) to set it, or clear_oneshot_mods() to cancel it.

WARNING

If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.

Callbacks

When you'd like to perform custom logic when pressing a one shot key, there are several callbacks you can choose to implement. You could indicate changes in one shot keys by flashing an LED or making a sound, for example.

There is a callback for OSM(mod). It is called whenever the state of any one shot modifier key is changed: when it toggles on, but also when it is toggled off. You can use it like this:

c
void oneshot_mods_changed_user(uint8_t mods) {\n  if (mods & MOD_MASK_SHIFT) {\n    println("Oneshot mods SHIFT");\n  }\n  if (mods & MOD_MASK_CTRL) {\n    println("Oneshot mods CTRL");\n  }\n  if (mods & MOD_MASK_ALT) {\n    println("Oneshot mods ALT");\n  }\n  if (mods & MOD_MASK_GUI) {\n    println("Oneshot mods GUI");\n  }\n  if (!mods) {\n    println("Oneshot mods off");\n  }\n}

The mods argument contains the active mods after the change, so it reflects the current state.

When you use One Shot Tap Toggle (by adding #define ONESHOT_TAP_TOGGLE 2 in your config.h file), you may lock a modifier key by pressing it the specified amount of times. There's a callback for that, too:

c
void oneshot_locked_mods_changed_user(uint8_t mods) {\n  if (mods & MOD_MASK_SHIFT) {\n    println("Oneshot locked mods SHIFT");\n  }\n  if (mods & MOD_MASK_CTRL) {\n    println("Oneshot locked mods CTRL");\n  }\n  if (mods & MOD_MASK_ALT) {\n    println("Oneshot locked mods ALT");\n  }\n  if (mods & MOD_MASK_GUI) {\n    println("Oneshot locked mods GUI");\n  }\n  if (!mods) {\n    println("Oneshot locked mods off");\n  }\n}

Last, there is also a callback for the OSL(layer) one shot key:

c
void oneshot_layer_changed_user(uint8_t layer) {\n  if (layer == 1) {\n    println("Oneshot layer 1 on");\n  }\n  if (!layer) {\n    println("Oneshot layer off");\n  }\n}

If any one shot layer is switched off, layer will be zero. When you're looking to do something on any layer change instead of one shot layer changes, layer_state_set_user is a better callback to use.

If you are making your own keyboard, there are also _kb equivalent functions:

c
void oneshot_locked_mods_changed_kb(uint8_t mods);\nvoid oneshot_mods_changed_kb(uint8_t mods);\nvoid oneshot_layer_changed_kb(uint8_t layer);

As with any callback, be sure to call the _user variant to allow for further customizability.

', 28); const _hoisted_29 = [ _hoisted_1 ]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("div", null, _hoisted_29); } const one_shot_keys = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]); export { __pageData, one_shot_keys as default };