mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-02-27 01:56:43 +00:00
197 lines
157 KiB
HTML
197 lines
157 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html lang="en-US" dir="ltr">
|
|||
|
<head>
|
|||
|
<meta charset="utf-8">
|
|||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|||
|
<title>Macros | QMK Firmware</title>
|
|||
|
<meta name="description" content="Documentation for QMK Firmware">
|
|||
|
<meta name="generator" content="VitePress v1.1.3">
|
|||
|
<link rel="preload stylesheet" href="/assets/style.R_mF0amW.css" as="style">
|
|||
|
|
|||
|
<script type="module" src="/assets/app.BYXWzDH8.js"></script>
|
|||
|
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|||
|
<link rel="modulepreload" href="/assets/chunks/framework.DyMmIvSC.js">
|
|||
|
<link rel="modulepreload" href="/assets/chunks/theme.vwpNwX24.js">
|
|||
|
<link rel="modulepreload" href="/assets/feature_macros.md.CqZWbmVr.lean.js">
|
|||
|
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|||
|
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<div id="app"><div class="Layout" data-v-5d98c3a5><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0f60ec36></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0f60ec36> Skip to content </a><!--]--><!----><header class="VPNav" data-v-5d98c3a5 data-v-ae24b3ad><div class="VPNavBar has-sidebar top" data-v-ae24b3ad data-v-ccf7ddec><div class="wrapper" data-v-ccf7ddec><div class="container" data-v-ccf7ddec><div class="title" data-v-ccf7ddec><div class="VPNavBarTitle has-sidebar" data-v-ccf7ddec data-v-ab179fa1><a class="title" href="/" data-v-ab179fa1><!--[--><!--]--><!--[--><!--[--><!--[--><img class="VPImage dark logo" src="/badge-community-dark.svg" alt data-v-8426fc1a><!--]--><!--[--><img class="VPImage light logo" src="/badge-community-light.svg" alt data-v-8426fc1a><!--]--><!--]--><!--]--><!----><!--[--><!--]--></a></div></div><div class="content" data-v-ccf7ddec><div class="content-body" data-v-ccf7ddec><!--[--><!--]--><div class="VPNavBarSearch search" data-v-ccf7ddec><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-ccf7ddec data-v-7f418b0f><span id="main-nav-aria-label" class="visually-hidden" data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="./" tabindex="0" data-v-7f418b0f data-v-9c663999><!--[--><span data-v-9c663999>Home</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-ccf7ddec data-v-e6aabb21><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-e6aabb21 data-v-d1f28634 data-v-1d5665e3><span class="check" data-v-1d5665e3><span class="icon" data-v-1d5665e3><!--[--><span class="vpi-sun sun" data-v-d1f28634></span><span class="vpi-moon moon" data-v-d1f28634></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-ccf7ddec data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://reddit.com/r/olkb" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-eee4e7cb><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 29 3 C 28.0625 3 27.164063 3.382813 26.5 4 C 25.835938 4.617188 25.363281 5.433594 25 6.40625 C 24.355469 8.140625 24.085938 10.394531 24.03125 13.03125 C 19.234375 13.179688 14.820313 14.421875 11.28125 16.46875 C 10.214844 15.46875 8.855469 14.96875 7.5 14.96875 C 6.089844 14.96875 4.675781 15.511719 3.59375 16.59375 C 1.425781 18.761719 1.425781 22.238281 3.59375 24.40625 L 3.84375 24.65625 C 3.3125 26.035156 3 27.488281 3 29 C 3 33.527344 5.566406 37.585938 9.5625 40.4375 C 13.558594 43.289063 19.007813 45 25 45 C 30.992188 45 36.441406 43.289063 40.4375 40.4375 C 44.433594 37.585938 47 33.527344 47 29 C 47 27.488281 46.6875 26.035156 46.15625 24.65625 L 46.40625 24.40625 C 48.574219 22.238281 48.574219 18.761719 46.40625 16.59375 C 45.324219 15.511719 43.910156 14.96875 42.5 14.96875 C 41.144531 14.96875 39.785156 15.46875 38.71875 16.46875 C 35.195313 14.433594 30.800781 13.191406 26.03125 13.03125 C 26.09375 10.546875 26.363281 8.46875 26.875 7.09375 C 27.164063 6.316406 27.527344 5.757813 27.875 5.4375 C 28.222656 5.117188 28.539063 5 29 5 C 29.460938 5 29.683594 5.125 30.03125 5.40625 C 30.378906 5.6875 30.785156 6.148438 31.3125 6.6875 C 32.253906 7.652344 33.695313 8.714844 36.09375 8.9375 C 36.539063 11.238281 38.574219 13 41 13 C 43.75 13 46 10.75 46 8 C 46 5.25 43.75 3 41 3 C 38.605469 3 36.574219 4.710938 36.09375 6.96875 C 34.3125 6.796875 33.527344 6.109375 32.75 5.3125 C 32.300781 4.851563 31.886719 4.3125 31.3125 3.843
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "keyboard"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"handwired/my_macropad"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "keymap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"my_keymap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "macros"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"down"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"keycodes"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"LSFT"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]},</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "hello world1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"up"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"keycodes"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"LSFT"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]}</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"tap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"keycodes"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"LCTL"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"LALT"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"DEL"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]}</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ding!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"beep"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"tap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"keycodes"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"F1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]},</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"delay"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"duration"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"action"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"tap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">"keycodes"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"PGDN"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]}</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "layout"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"LAYOUT_all"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "layers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QK_MACRO_0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QK_MACRO_1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QK_MACRO_2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QK_MACRO_3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h3 id="selecting-your-host-keyboard-layout" tabindex="-1">Selecting Your Host Keyboard Layout <a class="header-anchor" href="#selecting-your-host-keyboard-layout" aria-label="Permalink to "Selecting Your Host Keyboard Layout""></a></h3><p>If you type in a language other than English, or use a non-QWERTY layout like Colemak, Dvorak, or Workman, you may have set your computer's input language to match this layout. This presents a challenge when creating macros - you may need to type different keys to get the same letters! To address this you can add the <code>host_language</code> key to your <code>keymap.json</code>, like so:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "keyboard"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"handwired/my_macropad"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "keymap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"my_keymap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "host_language"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"dvorak"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "macros"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello, World!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "layout"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"LAYOUT_all"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "layers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QK_MACRO_0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>The current list of available languages is:</p><table><thead><tr><th style="text-align:center;">belgian</th><th style="text-align:center;">bepo</th><th style="text-align:center;">br_abnt2</th><th style="text-align:center;">canadian_multilingual</th></tr></thead><tbody><tr><td style="text-align:center;"><strong>colemak</strong></td><td style="text-align:center;"><strong>croatian</strong></td><td style="text-align:center;"><strong>czech</strong></td><td style="text-align:center;"><strong>danish</strong></td></tr><tr><td style="text-align:center;"><strong>dvorak_fr</strong></td><td style="text-align:center;"><strong>dvorak</strong></td><td style="text-align:center;"><strong>dvp</strong></td><td style="text-align:center;"><strong>estonian</strong></td></tr><tr><td style="text-align:center;"><strong>finnish</strong></td><td style="text-align:center;"><strong>fr_ch</strong></td><td style="text-align:center;"><strong>french_afnor</strong></td><td style="text-align:center;"><strong>french</strong></td></tr><tr><td style="text-align:center;"><strong>french_osx</strong></td><td style="text-align:center;"><strong>german_ch</strong></td><td style="text-align:center;"><strong>german</strong></td><td style="text-align:center;"><strong>german_osx</strong></td></tr><tr><td style="text-align:center;"><strong>hungarian</strong></td><td style="text-align:center;"><strong>icelandic</strong></td><td style="text-align:center;"><strong>italian</strong></td><td style="text-align:center;"><strong>italian_osx_ansi</strong></td></tr><tr><td style="text-align:center;"><strong>italian_osx_iso</strong></td><td style="text-align:center;"><strong>jis</strong></td><td style="text-align:center;"><strong>latvian</strong></td><td style="text-align:center;"><strong>lithuanian_azerty</strong></td></tr><tr><td style="text-align:center;"><strong>lithuanian_qwerty</strong></td><td style="text-align:center;"><strong>norman</strong></td><td style="text-align:center;"><strong>norwegian</strong></td><td style="text-align:center;"><strong>portuguese</strong></td></tr><tr><td style="text-align:center;"><strong>portuguese_osx_iso</strong></td><td style="text-align:center;"><strong>romanian</strong></td><td style="text-align:center;"><strong>serbian_latin</strong></td><td style="text-align:center;"><strong>slovak</strong></td></tr><tr><td style="text-align:center;"><strong>slovenian</strong></td><td style="text-align:center;"><strong>spanish_dvorak</strong></td><td style="text-align:center;"><strong>spanish_latin_america</strong></td><td style="text-align:center;"><strong>spanish</strong></td></tr><tr><td style="text-align:center;"><strong>swedish</strong></td><td style="text-align:center;"><strong>turkish_f</strong></td><td style="text-align:center;"><strong>turkish_q</strong></td><td style="text-align:center;"><strong>uk</strong></td></tr><tr><td style="text-align:center;"><strong>us_international</strong></td><td style="text-align:center;"><strong>workman</strong></td><td style="text-align:center;"><strong>workman_zxcvm</strong></td><td style="text-align:center;"></td></tr></tbody></table><h3 id="macro-basics" tabindex="-1">Macro Basics <a class="header-anchor" href="#macro-basics" aria-label="Permalink to "Macro Basics""></a></h3><p>Each macro is an array consisting of strings and objects (dictionaries). Strings are typed to your computer while objects allow you to control how your macro is typed out.</p><h4 id="object-format" tabindex="-1">Object Format <a class="header-anchor" href="#object-format" aria-label="Permalink to "Object Format""></a></h4><p>All objects have one required key: <code>action</code>. This tells QMK what the object does. There are currently 5 actions: beep, delay, down, tap, up</p><p>Only basic keycodes (prefixed by <code>KC_</code>) are supported. Do not include the <code>KC_</code> prefix when listing keycodes.</p><ul><li><code>beep</code><ul><li>Play a bell if the keyboard has <a href="./feature_audi
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> QMKBEST </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> SAFE_RANGE,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> process_record_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (keycode) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> QMKBEST:</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when keycode QMKBEST is pressed</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> SEND_STRING</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QMK is the best thing ever!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when keycode QMKBEST is released</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PROGMEM keymaps</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">[]</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[MATRIX_ROWS][MATRIX_COLS] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {QMKBEST, KC_ESC},</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // ...</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span></code></pre></div><p>What happens here is this: We first define a new custom keycode in the range not occupied by any other keycodes. Then we use the <code>process_record_user</code> function, which is called whenever a key is pressed or released, to check if our custom keycode has been activated. If yes, we send the string <code>"QMK is the best thing ever!"</code> to the computer via the <code>SEND_STRING</code> macro (this is a C preprocessor macro, not to be confused with QMK macros). We return <code>true</code> to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality). Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button.</p><p>?>It is recommended to use the SAFE_RANGE macro as per <a href="./custom_quantum_functions">Customizing Functionality</a>.</p><p>You might want to add more than one macro. You can do that by adding another keycode and adding another case to the switch statement, like so:</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">enum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> custom_keycodes {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> QMKBEST </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> SAFE_RANGE,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> QMKURL,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MY_OTHER_MACRO,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> process_record_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (keycode) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> QMKBEST:</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when keycode QMKBEST is pressed</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> SEND_STRING</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QMK is the best thing ever!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when keycode QMKBEST is released</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> QMKURL:</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when keycode QMKURL is pressed</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> SEND_STRING</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"https://qmk.fm/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when keycode QMKURL is released</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> MY_OTHER_MACRO:</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> SEND_STRING</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SS_LCTL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"ac"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">));</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // selects all and copies</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> PROGMEM keymaps</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">[]</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[MATRIX_ROWS][MATRIX_COLS] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {MY_CUSTOM_MACRO, MY_OTHER_MACRO},</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // ...</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>An enumerated list of custom keycodes (<code>enum custom_keycodes</code>) must be declared before <code>keymaps[]</code> array, <code>process_record_user()</code> and any other function that use the list for the compiler to recognise it.</p></div><h4 id="advanced-macros" tabindex="-1">Advanced Macros <a class="header-anchor" href="#advanced-macros" aria-label="Permalink to "Advanced Macros""></a></h4><p>In addition to the <code>process_record_user()</code> function, is the <code>post_process_record_user()</code> function. This runs after <code>process_record</code> and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.</p><p>In this example, we modify most normal keypresses so that <code>F22</code> is pressed before the keystroke is normally sent, and release it <strong>only after</strong> it's been released.</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">static</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> f22_tracker;</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> process_record_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (keycode) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> KC_A ... KC_F21:</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //notice how it skips over F22</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> KC_F23 ... KC_EXSEL:</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //exsel is the last one before the modifier keys</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> register_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(KC_F22);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //this means to send F22 down</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> f22_tracker</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> register_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(keycode);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> post_process_record_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (keycode) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> KC_A ... KC_F21:</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //notice how it skips over F22</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> KC_F23 ... KC_EXSL:</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //exsel is the last one before the modifier keys</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> f22_tracker</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">f22_tracker) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> unregister_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(KC_F22);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //this means to send F22 up</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h4 id="tap-down-and-up" tabindex="-1">TAP, DOWN and UP <a class="header-anchor" href="#tap-down-and-up" aria-label="Permalink to "TAP, DOWN and UP""></a></h4><p>You may want to use keys in your macros that you can't write down, such as <code>Ctrl</code> or <code>Home</code>. You can send arbitrary keycodes by wrapping them in:</p><ul><li><code>SS_TAP()</code> presses and releases a key.</li><li><code>SS_DOWN()</code> presses (but does not release) a key.</li><li><code>SS_UP()</code> releases a key.</li></ul><p>For example:</p><pre><code>SEND_STRING(SS_TAP(X_HOME));
|
|||
|
</code></pre><p>Would tap <code>KC_HOME</code> - note how the prefix is now <code>X_</code>, and not <code>KC_</code>. You can also combine this with other strings, like this:</p><pre><code>SEND_STRING("VE"SS_TAP(X_HOME)"LO");
|
|||
|
</code></pre><p>Which would send "VE" followed by a <code>KC_HOME</code> tap, and "LO" (spelling "LOVE" if on a newline).</p><p>Delays can be also added to the string:</p><ul><li><code>SS_DELAY(msecs)</code> will delay for the specified number of milliseconds.</li></ul><p>For example:</p><pre><code>SEND_STRING("VE" SS_DELAY(1000) SS_TAP(X_HOME) "LO");
|
|||
|
</code></pre><p>Which would send "VE" followed by a 1-second delay, then a <code>KC_HOME</code> tap, and "LO" (spelling "LOVE" if on a newline, but delayed in the middle).</p><p>There's also a couple of mod shortcuts you can use:</p><ul><li><code>SS_LCTL(string)</code></li><li><code>SS_LSFT(string)</code></li><li><code>SS_LALT(string)</code> or <code>SS_LOPT(string)</code></li><li><code>SS_LGUI(string)</code>, <code>SS_LCMD(string)</code> or <code>SS_LWIN(string)</code></li><li><code>SS_RCTL(string)</code></li><li><code>SS_RSFT(string)</code></li><li><code>SS_RALT(string)</code>, <code>SS_ROPT(string)</code> or <code>SS_ALGR(string)</code></li><li><code>SS_RGUI(string)</code>, <code>SS_RCMD(string)</code> or <code>SS_RWIN(string)</code></li></ul><p>These press the respective modifier, send the supplied string and then release the modifier. They can be used like this:</p><pre><code>SEND_STRING(SS_LCTL("a"));
|
|||
|
</code></pre><p>Which would send Left Control+<code>a</code> (Left Control down, <code>a</code>, Left Control up) - notice that they take strings (eg <code>"k"</code>), and not the <code>X_K</code> keycodes.</p><h4 id="alternative-keymaps" tabindex="-1">Alternative Keymaps <a class="header-anchor" href="#alternative-keymaps" aria-label="Permalink to "Alternative Keymaps""></a></h4><p>By default, it assumes a US keymap with a QWERTY layout; if you want to change that (e.g. if your OS uses software Colemak), include this somewhere in your keymap:</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "sendstring_colemak.h"</span></span></code></pre></div><h4 id="strings-in-memory" tabindex="-1">Strings in Memory <a class="header-anchor" href="#strings-in-memory" aria-label="Permalink to "Strings in Memory""></a></h4><p>If for some reason you're manipulating strings and need to print out something you just generated (instead of being a literal, constant string), you can use <code>send_string()</code>, like this:</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">char</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> my_str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ok."</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">send_string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(my_str);</span></span></code></pre></div><p>The shortcuts defined above won't work with <code>send_string()</code>, but you can separate things out to different lines if needed:</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">char</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> my_str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "ok."</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SEND_STRING</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"I said: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">send_string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(my_str);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SEND_STRING</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">".."</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SS_TAP</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(X_END));</span></span></code></pre></div><h3 id="advanced-macro-functions" tabindex="-1">Advanced Macro Functions <a class="header-anchor" href="#advanced-macro-functions" aria-label="Permalink to "Advanced Macro Functions""></a></h3><p>There are some functions you may find useful in macro-writing. Keep in mind that while you can write some fairly advanced code within a macro, if your functionality gets too complex you may want to define a custom keycode instead. Macros are meant to be simple.</p><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>You can also use the functions described in <a href="./ref_functions">Useful function</a> and <a href="./feature_advanced_keycodes#checking-modifier-state">Checking modifier state</a> for additional functionality. For example, <code>reset_keyboard()</code> allows you to reset the keyboard as part of a macro and <code>get_mods() & MOD_MASK_SHIFT</code> lets you check for the existence of active shift modifiers.</p></div><h4 id="record-event-pressed" tabindex="-1"><code>record->event.pressed</code> <a class="header-anchor" href="#record-event-pressed" aria-label="Permalink to "`record->event.pressed`""></a></h4><p>This is a boolean value that can be tested to see if the switch is being pressed or released. An example of this is</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // on keydown</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // on keyup</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span></code></pre></div><h4 id="register-code-kc" tabindex="-1"><code>register_code(<kc>);</code> <a class="header-anchor" href="#register-code-kc" aria-label="Permalink to "`register_code(<kc>);`""></a></h4><p>This sends the <code><kc></code> keydown event to the computer. Some examples would be <code>KC_ESC</code>, <code>KC_C</code>, <code>KC_4</code>, and even modifiers such as <code>KC_LSFT</code> and <code>KC_LGUI</code>.</p><h4 id="unregister-code-kc" tabindex="-1"><code>unregister_code(<kc>);</code> <a class="header-anchor" href="#unregister-code-kc" aria-label="Permalink to "`unregister_code(<kc>);`""></a></h4><p>Parallel to <code>register_code</code> function, this sends the <code><kc></code> keyup event to the computer. If you don't use this, the key will be held down until it's sent.</p><h4 id="tap-code-kc" tabindex="-1"><code>tap_code(<kc>);</code> <a class="header-anchor" href="#tap-code-kc" aria-label="Permalink to "`tap_code(<kc>);`""></a></h4><p>Sends <code>register_code(<kc>)</code> and then <code>unregister_code(<kc>)</code>. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it).</p><p>If <code>TAP_CODE_DELAY</code> is defined (default 0), this function waits that many milliseconds before calling <code>unregister_code(<kc>)</code>. This can be useful when you are having issues with taps (un)registering.</p><p>If the keycode is <code>KC_CAPS</code>, it waits <code>TAP_HOLD_CAPS_DELAY</code> milliseconds instead (default 80), as macOS prevents accidental Caps Lock activation by waiting for the key to be held for a certain amount of time.</p><h4 id="tap-code-delay-kc-delay" tabindex="-1"><code>tap_code_delay(<kc>, <delay>);</code> <a class="header-anchor" href="#tap-code-delay-kc-delay" aria-label="Permalink to "`tap_code_delay(<kc>, <delay>);`""></a></h4><p>Like <code>tap_code(<kc>)</code>, but with a <code>delay</code> parameter for specifying arbitrary intervals before sending the unregister event.</p><h4 id="register-code16-kc-unregister-code16-kc-tap-code16-kc-and-tap-code16-delay-kc-delay" tabindex="-1"><code>register_code16(<kc>);</code>, <code>unregister_code16(<kc>);</code>, <code>tap_code16(<kc>);</code> and <code>tap_code16_delay(<kc>, <delay>);</code> <a class="header-anchor" href="#register-code16-kc-unregister-code16-kc-tap-code16-kc-and-tap-code16-delay-kc-delay" aria-label="Permalink to "`register_code16(<kc>);`, `unregister_code16(<kc>);`, `tap_code16(<kc>);` and `tap_code16_delay(<kc>, <delay>);`""></a></h4><p>These functions work similar to their regular counterparts, but allow you to use modded keycodes (with Shift, Alt, Control, and/or GUI applied to them).</p><p>Eg, you could use <code>register_code16(S(KC_5));</code> instead of registering the mod, then registering the keycode.</p><h4 id="clear-keyboard" tabindex="-1"><code>clear_keyboard();</code> <a class="header-anchor" href="#clear-keyboard" aria-label="Permalink to "`clear_keyboard();`""></a></h4><p>This will clear all mods and keys currently pressed.</p><h4 id="clear-mods" tabindex="-1"><code>clear_mods();</code> <a class="header-anchor" href="#clear-mods" aria-label="Permalink to "`clear_mods();`""></a></h4><p>This will clear all mods currently pressed.</p><h4 id="clear-keyboard-but-mods" tabindex="-1"><code>clear_keyboard_but_mods();</code> <a class="header-anchor" href="#clear-keyboard-but-mods" aria-label="Permalink to "`clear_keyboard_but_mods();`""></a></h4><p>This will clear all keys besides the mods currently pressed.</p><h3 id="advanced-example" tabindex="-1">Advanced Example: <a class="header-anchor" href="#advanced-example" aria-label="Permalink to "Advanced Example:""></a></h3><h4 id="supe
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> alt_tab_timer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // we will be using them soon.</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">enum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> custom_keycodes {</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Make sure have the awesome keycode ready</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ALT_TAB </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> SAFE_RANGE,</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> process_record_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (keycode) {</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // This will do most of the grunt work with the keycodes.</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ALT_TAB:</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">is_alt_tab_active) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> is_alt_tab_active </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> register_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(KC_LALT);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> alt_tab_timer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> timer_read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> register_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(KC_TAB);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> unregister_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(KC_TAB);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
|
|||
|
<span class="line"></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> matrix_scan_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // The very important timer.</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (is_alt_tab_active) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">timer_elapsed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(alt_tab_timer) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> unregister_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(KC_LALT);</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> is_alt_tab_active </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|||
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></div></div></main><footer class="VPDocFooter" data-v-39a288b8 data-v-09de1c0f><!--[--><!--]--><!----><nav class="prev-next" data-v-09de1c0f><div class="pager" data-v-09de1c0f><a class="VPLink link pager-link prev" href="/mod_tap" data-v-09de1c0f><!--[--><span class="desc" data-v-09de1c0f>Previous page</span><span class="title" data-v-09de1c0f>Mod-Tap</span><!--]--></a></div><div class="pager" data-v-09de1c0f><a class="VPLink link pager-link next" href="/feature_mouse_keys" data-v-09de1c0f><!--[--><span class="desc" data-v-09de1c0f>Next page</span><span class="title" data-v-09de1c0f>Mouse Keys</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
|
|||
|
<script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog_20190830.md\":\"Drtq3lMy\",\"changelog_20210227.md\":\"BWOtCaeS\",\"feature_os_detection.md\":\"DZib_QdQ\",\"feature_led_indicators.md\":\"CZMu7H5E\",\"feature_grave_esc.md\":\"Dfk03Mwq\",\"feature_dynamic_macros.md\":\"CQqgFNCL\",\"changelog_20201128.md\":\"7XXL02Bn\",\"feature_hd44780.md\":\"yQt2vqod\",\"changelog_20200229.md\":\"DNsowwM1\",\"feature_mouse_keys.md\":\"Iyt3Hb3p\",\"apa102_driver.md\":\"DGTINeKZ\",\"adc_driver.md\":\"DGNSFJQa\",\"api_development_environment.md\":\"EhJClb9f\",\"api_overview.md\":\"0FPaUsMb\",\"api_development_overview.md\":\"Dcey4ntL\",\"changelog_20210828.md\":\"X99NaKjy\",\"api_docs.md\":\"CRoD6CbL\",\"arm_debugging.md\":\"BH-H2Ukz\",\"capabilities_inc.md\":\"Ca9zpMce\",\"audio_driver.md\":\"YKqJ1wkZ\",\"breaking_changes.md\":\"BtdqWQlY\",\"breaking_changes_history.md\":\"CkzdD6x8\",\"capabilities.md\":\"D_J-XtW-\",\"changelog_20240225.md\":\"CGDoAFQ4\",\"breaking_changes_instructions.md\":\"BAjIGeJb\",\"chibios_upgrade_instructions.md\":\"B5dMtL5R\",\"cli.md\":\"BLzAdA6l\",\"cli_commands.md\":\"CyobrwxG\",\"cli_configuration.md\":\"DE7-bdby\",\"cli_tab_complete.md\":\"B7wjrflU\",\"compatible_microcontrollers.md\":\"6HA6FJZJ\",\"configurator_architecture.md\":\"DEFTvTlS\",\"config_options.md\":\"D0qoSxZG\",\"changelog_20220827.md\":\"I6ja7C5w\",\"coding_conventions_python.md\":\"BV-OK1s5\",\"changelog_20210529.md\":\"CR1YNfZX\",\"documentation_templates.md\":\"Bhkum0wD\",\"easy_maker.md\":\"BLadB4D_\",\"eeprom_driver.md\":\"CJGhJYmK\",\"driver_installation_zadig.md\":\"BIO-iq8r\",\"faq_build.md\":\"Bryo1ywz\",\"feature_secure.md\":\"DTio1NtX\",\"faq_general.md\":\"BC3pFw4U\",\"feature_bluetooth.md\":\"bG-tYvch\",\"changelog_20221126.md\":\"BOpHhXi2\",\"hardware_keyboard_guidelines.md\":\"Bvlp0QQ-\",\"faq_debug.md\":\"uJtFRvCN\",\"how_a_matrix_works.md\":\"kbkC_Qqf\",\"how_keyboards_work.md\":\"CB7z8ocb\",\"i2c_driver.md\":\"sPsXYlGc\",\"feature_audio.md\":\"CZCAuU3V\",\"feature_backlight.md\":\"DBI0guDv\",\"configurator_default_keymaps.md\":\"B3v8dlHd\",\"feature_send_string.md\":\"ucKdf_1f\",\"feature_rawhid.md\":\"_qE_L8rS\",\"feature_digitizer.md\":\"D7mG1fUR\",\"feature_auto_shift.md\":\"Dqbx4mPc\",\"documentation_best_practices.md\":\"D_UwEt1C\",\"feature_autocorrect.md\":\"MXySdvB8\",\"custom_quantum_functions.md\":\"BabGw-ye\",\"feature_key_overrides.md\":\"DXeoCP3-\",\"changelog_20220226.md\":\"Ee8ZP8S1\",\"getting_started_make_guide.md\":\"fsRi0mqX\",\"feature_debounce_type.md\":\"CUrSp0Iy\",\"gpio_control.md\":\"BXAY05Da\",\"hand_wire.md\":\"DrA6YbSw\",\"isp_flashing_guide.md\":\"DfzdHli4\",\"feature_macros.md\":\"CqZWbmVr\",\"feature_caps_word.md\":\"DFEidvi5\",\"feature_encoders.md\":\"DzEjkR0q\",\"faq_misc.md\":\"qGrhOTu4\",\"feature_layers.md\":\"DHhp24oY\",\"getting_started_introduction.md\":\"BOJreqSs\",\"flashing_bootloadhid.md\":\"fHtXqWj8\",\"feature_ps2_mouse.md\":\"DgKRvSpd\",\"newbs_flashing.md\":\"phca4mvb\",\"platformdev_chibios_earlyinit.md\":\"BQJSTP3y\",\"platformdev_proton_c.md\":\"CDRuJBvD\",\"newbs_building_firmware_workflow.md\":\"YeGfwwbu\",\"getting_started_github.md\":\"OYq7IT7B\",\"feature_key_lock.md\":\"DBAH_Fju\",\"keycodes.md\":\"OXRg0uVR\",\"newbs_building_firmware.md\":\"D-rVQJMN\",\"newbs_git_resolving_merge_conflicts.md\":\"72w3BRmm\",\"newbs_building_firmware_configurator.md\":\"yyo-1QDE\",\"newbs_git_resynchronize_a_branch.md\":\"YGDefQFx\",\"newbs_git_using_your_master_branch.md\":\"B9DxZCl8\",\"faq_keymap.md\":\"BNm1UZCq\",\"newbs_testing_debugging.md\":\"D-c7Gle_\",\"keycodes_basic.md\":\"CHIeCvwn\",\"newbs_external_userspace.md\":\"pD9Lc-a5\",\"newbs_getting_started.md\":\"bEdEplPb\",\"newbs_git_best_practices.md\":\"BI2-EVI5\",\"newbs.md\":\"DnEWW2K4\",\"keycodes_us_ansi_shifted.md\":\"Cs78SDfM\",\"support.md\":\"CwJ_H6Qx\",\"support_deprecation_policy.md\":\"CCo4ljiw\",\"flashing.md\":\"CGYYQUk5\",\"keymap.md\":\"DG7FvBbs\",\"other_eclipse.md\":\"C-zqyJO9\",\"uart_driver.md\":\"Cby_2B9q\",\"syllabus.md\":\"0-MOMJnE\",\"feature_leader_key.md\":\"Bmrl3zQy\",\"contributing.md\":\
|
|||
|
|
|||
|
</body>
|
|||
|
</html>
|