{"id":3821,"date":"2023-06-19T15:10:24","date_gmt":"2023-06-19T14:10:24","guid":{"rendered":"https:\/\/pmortensen.eu\/world2\/?p=3821"},"modified":"2026-05-03T00:31:22","modified_gmt":"2026-05-02T23:31:22","slug":"keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard","status":"publish","type":"post","link":"https:\/\/pmortensen.eu\/world2\/2023\/06\/19\/keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard\/","title":{"rendered":"Keychron V5, a reasonably priced fully macro-capable QMK-based mechanical keyboard"},"content":{"rendered":"<p>The short version: The <a href=\"https:\/\/www.keychron.com\/products\/keychron-v5-qmk-custom-mechanical-keyboard-iso-layout-collection\">Keychron V5<\/a> mechanical keyboard is fully capable of macros, including mouse operations (e.g., right-click). This is enabled by the use of <a href=\"https:\/\/docs.qmk.fm\/#\/faq_general?id=what-is-qmk\">QMK<\/a> and the length of macros is only limited by the available flash memory in the keyboard&#8217;s microcontroller (unlike the <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/02\/13\/low-cost-fully-macro-capable-mechanical-keyboard-cooler-master-ck-550\/\">Cooler Master \u2018CK550 V2\u2019<\/a>). <strong><em>A showstopper<\/em><\/strong> may be that there isn&#8217;t any easy way of <strong><em>cancelling macros in progress<\/em><\/strong> (a missing feature of all QMK-based keyboards). It <em>is<\/em> <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/07\/31\/the-basis-for-a-way-to-cancel-qmk-macros-in-progress\/\">possible to cancel macros in QMK<\/a>, but it isn&#8217;t standard and requires significant programming effort (or maybe it already exists somewhere?).<\/p>\n<p>As a 96% keyboard, it is also crippled by the missing <a href=\"https:\/\/en.wikipedia.org\/wiki\/Page_Up_and_Page_Down_keys\">PgUp<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Page_Up_and_Page_Down_keys\">PgDn<\/a> and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Menu_key\">context menu key<\/a> keys; a workaround is presented here. <\/p>\n<p>Another <strong><em>showstopper<\/em><\/strong> may be that very bright RGB light bleeds to the sides (from the so-called <a href=\"https:\/\/www.reddit.com\/r\/MechanicalKeyboards\/comments\/dtygu1\/eli5_whats_the_point_of_southfacing_leds_on\/\">south-facing LEDs<\/a>). This makes <strong><em>the RGB lighting almost useless<\/em><\/strong>: In order to see the legends on the keys (e.g., in darkness or in a low-light conditions), the brightness must be fairly high. But at the normal viewing angle, this bleeds so much light to the side (towards your eyes) that it blinds you. The only way to use it is to lower the brightness, so that the legends are very subtly visible, with the stray light not blinding too much. Or perhaps to make <a href=\"https:\/\/www.reddit.com\/r\/MechanicalKeyboards\/comments\/ysn0nh\/fix_blinding_light_from_southfacing_leds\/\">a modification to the keyboard to stop the stray light<\/a> (this hasn&#8217;t been tried yet).<\/p>\n<p><!--\nKeychron V5, a reasonably priced fully macro-capable QMK-based mechanical keyboard\n\nAlternative title: Something like \"Reasonably priced fully macro-capable mechanical keyboard 'Keychron V5'\"\n--><\/p>\n<h2>Introduction<\/h2>\n<p>The <a href=\"https:\/\/deskthority.net\/wiki\/Keychron\">Keychron<\/a> keyboards (Q and V series only, <strong><em>not<\/em><\/strong> the more common K series) are the only QMK-capable commercial keyboards which are widely distributed, that is, are possible to buy locally. There are a lot of specialised QMK keyboards (but getting them involves more hassle, higher cost, long waiting times, and credit card risks),  and\/or they are crippled by not being full-size keyboards. <\/p>\n<p>QMK enables full programmability, incl. macros, keymapping, any keyboard layout you can imagine or <a href=\"https:\/\/www.youtube.com\/watch?v=EOaPb9wrgDY&#038;t=6m40s\">dream up<\/a> (e.g., <a href=\"https:\/\/en.wikipedia.org\/wiki\/Colemak\">Colemak<\/a>), and full control of the RGB lighting. This can be done by raw C coding or by a number of solutions that hides\/abstract it (at the cost of sacrificing some of the flexibility). For instance, there are web sites where you can design the keymap and get a firmware file as the result, without touching a single line of code (but the macro capability is completely absent). The only remaining step is then to get the firmware onto the keyboard. There are tools to hide that process as well, though it is as simple as a single command line to flash the firmware (e.g., using <a href=\"http:\/\/www.nongnu.org\/avrdude\/\">AVRDUDE<\/a> (is installed with the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Arduino_IDE\">Arduino IDE<\/a>) for <a href=\"https:\/\/en.wikipedia.org\/wiki\/Atmel_AVR\">AVR<\/a>-based keyboards or <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/05\/dfu-util-gotcha-always-use-a-0\/\">dfu-util<\/a> for keyboards with <a href=\"https:\/\/en.wikipedia.org\/wiki\/ARM_architecture\">ARM<\/a> (like the V5 described here)).<\/p>\n<p>The Keychron V5 is much more reasonably priced, and the assembled version is the way to go. Doing this piecemeal by getting an overpriced Q-series PCB-only keyboard and sourcing the switches and keycaps on your own is both expensive and troublesome. The selection of switches may or may not be limited anyway (only available from Keychron?). <\/p>\n<p>Like most of the Keychron keyboards, the switches are hot-swappable.<\/p>\n<h2>Macros<\/h2>\n<p>Macros are not really a part of QMK. It is more like a convention enabled by the ability to override (in function <em>process_record_user()<\/em>) the processing of key presses and key releases. That is, there isn&#8217;t any explicit support for macros in QMK (except for some predefined C macros to make it a little bit easier).<\/p>\n<h3 id=\"Mouse_actions_in_macros\">Mouse actions, e.g. right click<\/h3>\n<p>The action part of a QMK macro to open the link under the mouse cursor in a new tab in Firefox (right-click and select <em>&#8220;Open Link in New Tab&#8221;<\/em> by pressing &#8220;T&#8221;):<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\nSEND_STRING(SS_TAP(X_MS_BTN2));\r\nSEND_STRING(SS_DELAY(400));    \/\/ Wait... This is crucial\r\n                               \/\/ for this to work.\r\n\r\nSEND_STRING(SS_TAP(X_T));\r\n<\/pre>\n<p>Though in this particular example, the context menu key (X_KC_APP) <em>may<\/em> work equally well. This is important for Via macros, as mouse actions are not supported without <a href=\"https:\/\/pmortensen.eu\/world2\/2024\/02\/26\/a-hack-to-use-mouse-actions-in-via-macros\/\">a hack<\/a>. Note: The context menu does not always work for links in a browser; an example would be the &#8220;Permalink&#8221; link in the standard <a href=\"https:\/\/en.wikipedia.org\/wiki\/WordPress\">WordPress<\/a> editor (it only works if <strong><em>that element already has focus<\/em><\/strong> (impractical for real use), at least in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mozilla_Firefox\">Firefox<\/a>).<\/p>\n<p>Also note that for this particular example, <em>Ctrl<\/em> + <em>left click<\/em> is a more robust and faster alternative than using the context menu.<\/p>\n<h3 id=\"Via_macros\">Using Via to prototype macros<\/h3>\n<p><a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/12\/via-a-mechanical-qmk-keyboard-configuration-works-just-fine-without-google-chrome\/\">Via<\/a> enables a very quick turn-around for developing macros: Macros can be recorded, the timings between key presses and key releases changed, and they are applied immediately (if a keymapping has been created). But it can not be used for any serious use of macros, only for prototyping.<\/p>\n<p>Drawbacks: <\/p>\n<ul>\n<li><a href=\"https:\/\/pmortensen.eu\/world2\/2023\/10\/30\/mouse-actions-in-via-macros-qmk\/\">Mouse actions (e.g., right-click) in macros are not supported<\/a>. Only single mouse actions in keymappings are supported (e.g., a single right-click)<\/li>\n<li>Definitions must be restored after every flash (e.g., from stored JSON files with the Via definitions). They are stored in (emulated) EEPROM and thus often wiped out. <\/li>\n<li>There is a maximum of 16 macros (M0 &#8211; M15, both inclusive). It is <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/1aq3gb8\/comment\/kqgk69b\/\">possible to increase<\/a>, though. This is not mentioned anywhere, let alone documented. For example, to increase the number of macros from 16 to 42, add a line with &#8220;#define DYNAMIC_KEYMAP_MACRO_COUNT 42&#8221; in a <em>config.h<\/em> file, e.g. to <em><a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/keyboards\/keychron\/v6\/iso_encoder\/config.h\">keychron\/v6\/iso_encoder\/config.h<\/a><\/em><\/li>\n<li>By default, there is very little memory for macros (as the default configuration is emulating traditional EEPROM memory with only 1 or 2 KB of memory). There is only space for about 150 key actions in total (both key presses, key releases, and modifier keys (both key presses and key releases) count). Though <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/07\/10\/via-macros-on-mechanical-keyboards-with-qmk-are-less-crippled-than-expected\/\">it can be changed to be essentially unlimited<\/a>.<\/li>\n<li>The macros don&#8217;t have names, only numbers (&#8220;M0&#8221;, &#8220;M1&#8221;, &#8230; &#8220;M15&#8221;). And there isn&#8217;t any way to annotate them, e.g., to document their purpose. This must be done by some external means (e.g., in some (text) document)<\/li>\n<li>On some Keychron keyboards with wireless support (e.g., <a href=\"https:\/\/www.keychron.com\/products\/keychron-k10-pro-qmk-via-wireless-mechanical-keyboard-iso-layout-collection\">K10 Pro<\/a>. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bluetooth\">Bluetooth<\/a>), the <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/18iyy33\/review_modification_keychron_k10_pro_repost\/\">Via macros are <\/a> <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/18tcbjm\/c3_pro_github_repository\/\">completely broken<\/a> when the keyboard is used in wireless mode (this was <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/19fn0j3\/comment\/lc3lh1p\/\">later fixed<\/a>).<\/li>\n<\/ul>\n<p>Note: <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/12\/via-a-mechanical-qmk-keyboard-configuration-works-just-fine-without-google-chrome\/\">Via runs just fine standalone<\/a>. It does <strong><em>not<\/em><\/strong> require a web browser (in particular, Google Chrome)<\/p>\n<p>Note: The content of an existing macro is <strong><em>wiped out without warning<\/em><\/strong> if &#8220;RECORD KEYSTROKES&#8221; is pressed (it doesn&#8217;t append the new recording (or <strong><em>respect the user&#8217;s time<\/em><\/strong> defining the original macros)). But it is possible <strong><em>to append (or prepend) a new recording<\/em><\/strong> by this technique:<\/p>\n<ol>\n<li>First save off the source for the macro: Click on the &#8220;&lt;\/>&#8221; icon and copy\/paste the content.<\/li>\n<li>Go back to the original view by clicking on the icon to the left.<\/li>\n<li>Record. Stop recording. Save changes.<\/li>\n<li>Click on the &#8220;&lt;\/>&#8221; icon and paste the saved content from step 1, e.g., prepending or appending. Press Save.<\/li>\n<li>Go back to the original view by clicking on the icon to the left.<\/li>\n<\/ol>\n<h3 id=\"Vial_macros\">Use Vial to upgrade from Via&#8217;s deficiencies<\/h3>\n<p><a href=\"https:\/\/get.vial.today\">Vial<\/a> repairs on most of the serious Via drawbacks: Mouse actions are supported in Vial macros, and it is possible to increase the number of macros from 16 (e.g., to 40 by adding &#8220;#define DYNAMIC_KEYMAP_MACRO_COUNT 40&#8221; in <a href=\"https:\/\/github.com\/vial-kb\/vial-qmk\/blob\/vial\/keyboards\/keychron\/v5\/iso_encoder\/keymaps\/vial\/config.h\">config.h<\/a>).<\/p>\n<p>Though Vial also comes with increased complexity, for example, requirement for special versions of the firmware that is not the official QMK firmware. And the build steps are different from QMK&#8217;s.<\/p>\n<p>As for Via, it is also possible to increase the total number key actions for Vial macros (e.g., 6000 bytes (about 650 key actions) by adding &#8220;#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 6000&#8221; in <a href=\"https:\/\/github.com\/vial-kb\/vial-qmk\/blob\/vial\/keyboards\/keychron\/v5\/iso_encoder\/keymaps\/vial\/config.h\">config.h<\/a>)<\/p>\n<h2 id=\"crippled\">Crippled by not being a full-size keyboard<\/h2>\n<p>I would recommend getting the full-size keyboard <a href=\"https:\/\/www.keychron.com\/products\/keychron-v6-qmk-custom-mechanical-keyboard-iso-layout-collection\">Keychron V6<\/a> instead, but availability may be a problem (e.g., a long wait time). This is a general statement about 96% (and less) keyboards, not just this one. The small-form-factor <em>cult<\/em> never mentions the compromises and drawbacks. <\/p>\n<p>The numbering scheme for the Keychron V series is confusing, but here is <a href=\"https:\/\/www.youtube.com\/watch?v=7HTHdeuxeoA&#038;t=50\">an overview<\/a> (see also the content of the dropdown &#8220;Custom Keyboards&#8221; (third item) on the top of <a href=\"https:\/\/www.keychron.com\/blogs\/news\/k6-key-combinations\">this page<\/a> (click to expand). Or <a href=\"https:\/\/www.keychron.com\/blogs\/news\/difference-among-keychron-keyboards\">the feature matrix<\/a>):<\/p>\n<ul>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v4-qmk-custom-mechanical-keyboard\">V4<\/a>: 60% Has two <em>Fn<\/em> keys, <strong><em>Fn<\/em><\/strong> and <strong><em>Fn1<\/em><\/strong>.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v2-qmk-custom-mechanical-keyboard\">V2<\/a>: 65%. Has two <em>Fn<\/em> keys, <strong><em>Fn1<\/em><\/strong> and <strong><em>Fn2<\/em><\/strong>.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/pages\/keychron-v8-custom-mechanical-keyboard\">V8<\/a>: 65% (Alice Layout, a la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft_Natural_keyboard#Natural_Keyboard\">Microsoft Natural Keyboard<\/a>). Has two <em>Fn<\/em> keys, <strong><em>Fn1<\/em><\/strong> and <strong><em>Fn2<\/em><\/strong>.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v7-qmk-custom-mechanical-keyboard\">V7<\/a>: 70%. Has two <em>Fn<\/em> keys, <strong><em>Fn1<\/em><\/strong> and <strong><em>Fn2<\/em><\/strong>.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v1-qmk-custom-mechanical-keyboard-iso-layout-collection\">V1<\/a>: 75%<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v10-alice-layout-qmk-custom-mechanical-keyboard-iso-layout-collection\">V10<\/a>: 75% (Alice Layout) with five dedicated macro keys on the left<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v3-qmk-custom-mechanical-keyboard\">V3<\/a>: 80% (<a href=\"https:\/\/mechanicalkeyboards.com\/shop\/index.php?l=product_list&#038;c=27\">TKL<\/a> (tenkeyless))<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v5-qmk-custom-mechanical-keyboard-iso-layout-collection\">V5<\/a>: 96% (&#8220;1800&#8221;). Covered in this blog post. Includes a knob.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v6-qmk-custom-mechanical-keyboard-iso-layout-collection\">V6<\/a>: 104%. 108 keys (4 extra keys above the numeric keypad). Includes a knob.<\/li>\n<\/ul>\n<p>There isn&#8217;t any less confusion by the numbering scheme being <strong><em>completely<\/em><\/strong> <a href=\"https:\/\/www.youtube.com\/watch?v=_QsFlWWmKQA&#038;t=1m1s\">different for the K Pro series<\/a> (all wireless (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Bluetooth\">Bluetooth<\/a>) and with QMK capability, unlike the original K series):<\/p>\n<ul>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k12-pro-qmk-via-wireless-mechanical-keyboard\">K12 Pro<\/a>: 60%<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/pages\/keychron-k6-pro\">K9 Pro<\/a>: 60% (slim\/low profile).<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/pages\/keychron-k6-pro\">K6 Pro<\/a>: 65%<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k7-pro-qmk-via-wireless-custom-mechanical-keyboard\">K7 Pro<\/a>: 65% (slim\/low profile)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k11-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard?_pos=1&#038;_sid=09e2c7f22&#038;_ss=r&#038;variant=40531261587545\">K11 Pro<\/a>: 65% (Alice Layout, a la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft_Natural_keyboard#Natural_Keyboard\">Microsoft Natural Keyboard<\/a>. Slim\/low profile)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k14-pro-qmk-via-wireless-mechanical-keyboard\">K14 Pro<\/a>: 70%<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k2-pro-qmk-via-wireless-mechanical-keyboard\">K2 Pro<\/a>: 75%<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k3-pro-qmk-via-wireless-custom-mechanical-keyboard\">K3 Pro<\/a>: 75% (slim\/low profile)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k15-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard\">K15 Pro<\/a>: 75% (Alice Layout. And with five macro keys on the left, M1-M5. And with a knob)<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=d8QOyDvKxZg\">K8 Pro<\/a>: 80% (TKL (tenkeyless))<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/collections\/all-keyboards\/products\/keychron-k1-pro-qmk-via-wireless-custom-mechanical-keyboard\">K1 Pro<\/a>: 80% (TKL (tenkeyless). Slim\/low profile)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k13-pro-qmk-via-wireless-custom-mechanical-keyboard?_pos=1&#038;_sid=e710f991b&#038;_ss=r&#038;variant=40442737229913\">K13 Pro<\/a>: 85%??? (&#8220;numpad TKL&#8221;. Slim\/low profile)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k4-pro-qmk-via-wireless-mechanical-keyboard-iso-layout-collection\">K4 Pro<\/a>: 96% (&#8220;1800&#8221;)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k17-pro-alice-layout-qmk-via-wireless-custom-mechanical-keyboard\">K17 Pro<\/a>: 96% (&#8220;1800&#8221;). (Slim\/low profile)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-k10-pro-qmk-via-wireless-mechanical-keyboard-iso-layout-collection\">K10 Pro<\/a>: 104%. 108 keys (4 extra keys above the numeric keypad). Does <strong><em>not<\/em><\/strong> include a knob.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/collections\/keychron-iso-jis-keyboard-collection\/products\/keychron-k5-pro-qmk-via-wireless-custom-mechanical-keyboard-iso-layout-collection\">K5 Pro<\/a>: 104% (slim\/low profile). 108 keys (4 extra keys above the numeric keypad). Does <strong><em>not<\/em><\/strong> include a knob.<\/li>\n<\/ul>\n<p>The numbering scheme for the <strong><em>original<\/em><\/strong> &#8220;Q&#8221; series (not to be confused with the later &#8220;Q Pro&#8221; series (wireless and with a knob)) seems to follow the &#8220;V&#8221; series:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-q5-qmk-custom-mechanical-keyboard\">Q5<\/a>: 96% (&#8220;1800&#8221;). Does <strong><em>not<\/em><\/strong> include a knob.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-q6-qmk-custom-mechanical-keyboard\">Q6<\/a>: 104%. 108 keys (4 extra keys above the numeric keypad).  Does <strong><em>not<\/em><\/strong> include a knob.<\/li>\n<\/ul>\n<p>Similar for the the later &#8220;Q Pro&#8221; series (wireless and with a knob)):<\/p>\n<ul>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-q5-pro-qmk-via-wireless-custom-mechanical-keyboard\">Q5 Pro<\/a>: 98%. 102 keys. Includes a knob.<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-q6-pro-qmk-via-wireless-custom-mechanical-keyboard\">Q6 Pro<\/a>: 104%. 108 keys (4 extra keys above the numeric keypad).  Includes a knob.<\/li>\n<\/ul>\n<p>But there is some order in the numbering madness: For the K series and K Pro series, the <strong><em>odd numbered<\/em><\/strong> models are <strong><em>low profile<\/em><\/strong> \/ slim (e.g., K5 Pro), whereas the <em><strong>even numbered<\/strong><\/em> models are <em><strong>normal profile<\/strong><\/em> (e.g., K10 Pro).<\/p>\n<p>But at least the Keychron V5, being fully programmable, enables providing workarounds.<\/p>\n<h3 id=\"Missing_PgUp_and_PgDn_keys\">Missing PgUp\/PgDn keys<\/h3>\n<p>PgUp and PgDn are very commonly used and must be available as dedicated keys. Having to use a modifier key is not acceptable. <\/p>\n<p>I already had most keys on the numeric keypad part used for macro keys, but as a workaround\/compromise, I used these:<\/p>\n<ul>\n<li>Numeric keypad &#8216;3&#8217;: PgUp<\/li>\n<li>Numeric keypad &#8216;.&#8217;: PgDn<\/li>\n<\/ul>\n<p>This was first prototyped by key assignments in Via and then later put into QMK proper by changing the keymap.<\/p>\n<p>A further compromise is moving the lesser-used macros to the <em>Fn<\/em> layer. But it is not ideal. The whole point of macros is to save unnecessary keypresses, in particular modifier keys for the shorter key sequences.<\/p>\n<h3>Missing context menu key<\/h3>\n<p>To the right of the space bar, there is the extra <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fn_key\"><em>Fn<\/em> key<\/a>, but as there are only three keys, the context menu key is missing. This is also heavily used. Other keyboards with an <em>Fn<\/em> key has four keys and the right <a href=\"https:\/\/en.wikipedia.org\/wiki\/Windows_key\">Windows key<\/a> can be used as the context menu key instead.<\/p>\n<p>As a compromise, I repurposed the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Num_Lock\">Num Lock<\/a> key on the numeric keypad as the context menu key. I don&#8217;t use the numbers on the numeric keypad (I repurpose it as a <a href=\"https:\/\/keyboardsexpert.com\/macropad-mechanical-keyboard-faqs\/\">macro pad<\/a>), but a workaround for the now missing Num Lock is to use the Num Lock key on some other keyboard, e.g. a cheap wireless separate numeric keypad. Or an old (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Keyboard_technology#Dome-switch_keyboard\">rubber dome<\/a>) keyboard. For the former, it can be used as dedicated numeric keypad (though the keys may not be that great or the ones with mechanical switches are extremely expensive).<\/p>\n<h2 id=\"default_RGB_lighting\">Blues setting up the default RGB lighting configuration in QMK<\/h3>\n<p>The factory RGB lighting defaults are very irritating: An animation. Like all other keyboards, the factory default RGB lighting settings ought to be a static \/ steady lighting mode with some acceptable colour, like green, blue, or white.<\/p>\n<h3 id=\"Manually_changing_the_RGB_lighting_settings\">Manually changing the RGB lighting settings<\/h3>\n<p>Setting mode, colour, and brightness to get <strong><em>a steady green of not too high brightness<\/em><\/strong>:<\/p>\n<ol>\n<li>18 times <em>Fn<\/em> + <em>Q<\/em> to get to a static mode (it is 10 times in the original version of the firmware). There are 22 lighting modes (the official version 1.1 (2023-05) of the firmware) in total (13 in the original version of the firmware). See <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/19\/keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard#LightingModes\">Appendix C<\/a> for details.<\/li>\n<li>10 times <em>Fn<\/em> + <em>E<\/em> (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Hue\">hue<\/a>) for a green colour. The saturation can be changed with <em>Fn<\/em> + <em>R<\/em> \/ <em>F<\/em> (lower value is towards white).<\/li>\n<li>Change brightness by <em>Fn<\/em> + knob (or <em>Fn<\/em> + <em>W<\/em>\/<em>S<\/em>)<\/li>\n<\/ol>\n<h3 id=\"default_RGB_settings\">Changing the default settings in QMK<\/h3>\n<p>Changing the QMK firmware to use the proper RGB lighting settings is the only long-term solution. Having to set them every time the firmware is updated, is too cumbersome.<\/p>\n<p>However, this <strong><em>does not work<\/em><\/strong> by following the official documentation (overriding <em>eeconfig_init_kb()<\/em> and making the appropriate calls to change the (persistent) settings). It seems <strong><em>enabling Via (at compile time) interferes<\/em><\/strong>: Any (or most) changes to RGB settings seems to be overwritten. That is, using <em>eeconfig_init_kb()<\/em> does not have any effect (but it is actually called (see appendix B)).<\/p>\n<h3 id=\"Via_interference_workaround\">The fix<\/h3>\n<p>It is probably due to some bug in QMK (when Via support is enabled), but I found a workaround that works: Defer changing the RGB settings to function <em>keyboard_post_init_user()<\/em>. This function is called once per power-up, but use a custom (persistent) setting to set a flag in function <em>eeconfig_init_kb()<\/em> (so changing the RGB settings is only executed right after flashing, at the first power-up). Using this fix, these four calls enables the default settings of RGB lighting to be with a dim steady green colour:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\r\n        rgblight_mode(0);\r\n\r\n        \/\/ &lt;https:\/\/docs.qmk.fm\/features\/rgb_matrix#rgb-matrix-effects&gt;\r\n        rgblight_sethsv_noeeprom(85, 255, 60);\r\n\r\n        \/\/ Enable RGB lighting by default\r\n        rgblight_toggle();\r\n        rgb_matrix_toggle();\r\n<\/pre>\n<p>Or maybe it is confusing two QMK features, &#8220;<a href=\"https:\/\/docs.qmk.fm\/features\/rgblight#rgb-lighting\">RGB lighting<\/a>&#8221; and &#8220;<a href=\"https:\/\/docs.qmk.fm\/features\/rgb_matrix\">RGB matrix<\/a>&#8221; (lighting)??? Should we use <a href=\"https:\/\/docs.qmk.fm\/features\/rgb_matrix#api-rgb-matrix-sethsv-noeeprom\">rgb_matrix_sethsv_noeeprom()<\/a> instead? Or was it renamed in QMK in the meantime (e.g., split out between the features)?<\/p>\n<p>This is described in detail in Appendix B, incl. some techniques for debugging at startup time (where it seems the output of the <em>printf<\/em> function is not possible to capture). <\/p>\n<h2>Cancelling macros in progress<\/h3>\n<p>QMK, and thus this keyboard, does not come with a mechanism to cancel macros in progress, but with a sufficient amount of programming, <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/07\/31\/the-basis-for-a-way-to-cancel-qmk-macros-in-progress\/\">it is possible<\/a>. Though only for custom macros; it is probably practically infeasible for Via macros.<\/p>\n<h2 id=\"firmware_source\">Appendix A: Detailed information about the Keychron V5 keyboard<\/h2>\n<h3>Documentation<\/h3>\n<ul>\n<li><a href=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0059\/0630\/1017\/files\/Keychron_V5_Knob_Version_Keyboard_User_Manual.pdf?v=1666256337\">Manual<\/a> (PDF. 17 MB)<\/li>\n<li><a href=\"https:\/\/www.keychron.com\/pages\/keychron-v5-user-guide\">List of user guides<\/a><\/li>\n<li><a href=\"https:\/\/www.keychron.com\/products\/keychron-v5-qmk-custom-mechanical-keyboard-iso-layout-collection\">Product page<\/a><\/li>\n<\/ul>\n<h3>Switches<\/h3>\n<p><a href=\"https:\/\/www.keychron.com\/products\/keychron-k-pro-switch\">Keychron K Pro<\/a>, for example, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cherry_(keyboards)#Cherry_MX_switches_in_consumer_keyboards\">brown<\/a>. Pre-lubed. Hot-swappable. MX stem compatible.<\/p>\n<p><a href=\"https:\/\/www.keychron.com\/products\/cherry-switch-set?variant=40136562999385\">The PCB accepts 5-pin Cherry MX switches<\/a>: <em>&#8220;The Cherry MX switches are fully compatible with our Keychron keyboard mechanical (hot-swappable) versions&#8221;<\/em><\/p>\n<p><strong><em>Disclaimer<\/em><\/strong>: The information about compatible switches has not been confirmed. Buy at your own risk!<\/p>\n<p>Some compatible switches: <em><a href=\"https:\/\/www.gateron.co\/blogs\/news\/what-s-the-best-gateron-linear-switch-for-mechanical-keyboards\">Gateron G Pro 2.0<\/a><\/em> (lubed), <em>Gateron Phantom<\/em> (not lubed), and <em>Gateron Ink V2<\/em>. For example, <a href=\"https:\/\/www.proshop.dk\/Tastatur\/Keychron-Switch-set-Gateron-G-Pro-20-Black-Switch-set-110pcs-Key-Switches\/3143483\">Gateron G Pro 2.0 Black<\/a> (linear. 60 g), <a href=\"https:\/\/www.proshop.dk\/Tastatur\/Keychron-Switch-set-Gateron-Ink-V2-Yellow-Switch-set-110pcs-Key-Switches\/3143492\">Gateron G Pro 2.0 Yellow<\/a> (linear. 60 g), and <a href=\"https:\/\/www.proshop.dk\/Tastatur\/Keychron-Switch-set-Gateron-Phantom-Yellow-Switch-set-110pcs-Key-Switches\/3143512\">Gateron Phantom Yellow<\/a> (linear. 50 g).<\/p>\n<p>May or may not be somewhat compatible (the RGB light may not be compatible): <a href=\"https:\/\/www.proshop.dk\/Tastatur\/Keychron-Switch-set-Cherry-MX-Silver-Switch-set-110pcs-Key-Switches\/3143502\">Cherry MX Silver<\/a> (linear. 45 g). <\/p>\n<p>Note that the LEDs are mounted on the PCB and are <a href=\"https:\/\/www.reddit.com\/r\/MechanicalKeyboards\/comments\/dtygu1\/eli5_whats_the_point_of_southfacing_leds_on\/\">south-facing<\/a>.<\/p>\n<h3>Keycaps<\/h3>\n<p>Material: Unknown. The product page says <a href=\"https:\/\/en.wikipedia.org\/wiki\/Acrylonitrile_butadiene_styrene\">ABS<\/a> and some resellers claim it is <a href=\"https:\/\/en.wikipedia.org\/wiki\/Keycap#Materials\">PBT<\/a>.<\/p>\n<h3>Other features<\/h3>\n<p>Has a volume knob. Holding the <strong><em>Fn<\/em><\/strong> key, while using it, changes the brightness of the RGB light. It can be repurposed for other things, using QMK.<\/p>\n<p>Mass: 1341 &#8211; 1348 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gram\">g<\/a> (1.3 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Kilogram\">kg<\/a>)<\/p>\n<p><!-  Later:\nDimensions: XX cm x XX cm x <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/1eabd3y\/comment\/leltrdn\/\">2.9 cm<\/a><br \/>\n&#8211;><\/p>\n<h3>USB<\/h3>\n<p><a href=\"https:\/\/www.oshwa.org\/2013\/11\/19\/new-faq-on-usb-vendor-id-and-product-id\/\">Vendor ID<\/a>: 0x3434 (hexadecimal)<\/p>\n<p><a href=\"https:\/\/www.oshwa.org\/2013\/11\/19\/new-faq-on-usb-vendor-id-and-product-id\/\">Product ID<\/a>: 0x0353 (hexadecimal)<\/p>\n<p><!--\n    The USB product ID for Keychron V6 is 0x0363.  \n\n    The USB vendor ID and product ID for Corsair Corsair K95 RGB is 0x1B1C and 0x1B11, respectively.\n\n    The USB vendor ID and product ID for Corsair K70 RGB Pro is 0x1B1C and 0x1BB3, respectively.\n\n    The USB vendor ID and product ID for Ducky Shine 7 is 0x04D9 and 0x0348, respectively.\n\n    The USB vendor ID and product ID for Altar Anthur (model# 103008) is 0x0E6A and 0x02C0, respectively.\n\n    The USB vendor ID and product ID for CK550 V2 is 0x2516 and 0x0145, respectively.\n\n\n\n--><\/p>\n<h3>Firmware<\/h3>\n<p><a href=\"https:\/\/www.keychron.com\/blogs\/archived\/how-to-factory-reset-or-flash-your-qmk-via-enabled-keychron-v5-keyboard\">Official firmware<\/a> (despite the misleading title. See near <em>&#8220;Download the V5 firmware&#8221;<\/em>). The latest is firmware version 1.1 (2023-05-01).<\/p>\n<p><a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/tree\/master\/keyboards\/keychron\/v5\">Source code<\/a> (<em>qmk_firmware\/keyboards\/keychron\/v5<\/em>). In the official QMK repository, and in that repository, in Git branch <em>&#8220;master&#8221;<\/em> (the default).<\/p>\n<h3 id=\"Microcontroller\">Microcontroller<\/h3>\n<p>STM32L432 (<a href=\"https:\/\/www.keychron.com\/products\/keychron-v5-qmk-custom-mechanical-keyboard?variant=40293230674009\">source<\/a> (near &#8220;Cortex&#8221;)). <a href=\"https:\/\/www.st.com\/resource\/en\/datasheet\/stm32l432kc.pdf\">Datasheet<\/a>. <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/18j8w71\/comment\/kdkm7zk\/\">Allegedly<\/a>, it is <a href=\"https:\/\/www.digikey.com\/en\/products\/detail\/stmicroelectronics\/STM32L432KBU6\/6132748\">STM32L432KBU6<\/a> (<a href=\"https:\/\/www.st.com\/en\/microcontrollers-microprocessors\/stm32l432kb.html\">ST datasheet<\/a>).<\/p>\n<p>128 KB <a href=\"https:\/\/en.wikipedia.org\/wiki\/Flash_memory\">flash memory<\/a>. 64 KB RAM.<\/p>\n<p>There isn&#8217;t any <a href=\"https:\/\/en.wikipedia.org\/wiki\/EEPROM\">EEPROM<\/a> memory (for storing persistent settings, like the Via configuration, incl. the macro definitions) on chip. It may or may not use a serial external EEPROM chip (using <a href=\"https:\/\/en.wikipedia.org\/wiki\/I%C2%B2C\">I\u00b2C<\/a> to communicate), but QMK probably <a href=\"https:\/\/pmortensen.eu\/world2\/2023\/07\/10\/via-macros-on-mechanical-keyboards-with-qmk-are-less-crippled-than-expected\/\">emulates EEPROM in flash memory<\/a>.<\/p>\n<h3 id=\"RGB_light_detailed_information\">RGB light<\/h3>\n<p>RGB chip: <a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/keyboards\/keychron\/v5\/config.h#L29\">Probably<\/a> <a href=\"https:\/\/www.reddit.com\/r\/Keychron\/comments\/1dk4s03\/comment\/l9h51e8\/\">SNLED27351<\/a> AKA CKLED2001 (<a href=\"https:\/\/www.sonix.com.tw\/download\/file?10fee7402fbc414c9eab2611756e26e0\">datasheet<\/a>, though it may be an ephemeral link, and thus a broken link &#8211; <em>&#8220;SNLED27351_V1.4_EN.pdf&#8217;. &#8220;SNLED2730 Series. SNLED2735F, SNLED27351J, SNLED27352J, SNLED2734X, and SNLED27341J&#8221;<\/em>). SN is probably for <a href=\"https:\/\/www.sonix.com.tw\/article-en-915-10794\">Sonix<\/a> (a <a href=\"https:\/\/en.wiktionary.org\/wiki\/Taiwanese#Adjective\">Taiwanese<\/a> company). <a href=\"https:\/\/www.sonix.com.tw\/article-en-4678-39401\">An overview for the SNLED27351<\/a> (for example, <em>&#8220;256 levels of brightness adjustment&#8221;<\/em>, thus 24-bit colour isn&#8217;t prevented by the hardware). <\/p>\n<h2>Appendix B: Debugging the RGB lighting settings blues, likely caused by Via<\/h2>\n<p>Main debugging technique: As <a href=\"https:\/\/en.wikipedia.org\/wiki\/Debugging#Techniques\">print debugging<\/a> doesn&#8217;t appear to be working at startup time (at least not without having physical access to the microcontroller&#8217;s serial port I\/O pins), this can be used instead:<\/p>\n<p>A (calibrated) blocking busy wait (three nested <em>for<\/em> loops, each with less than a 65535 loop count) is used to get out the required information. We use the fact that the RGB lights come on after the startup has completed. If RGB lights are not on (but they are with the default firmware), we can instead tap a key very fast and time when it starts registering (presumably at the end of the startup period). <\/p>\n<p>Or in other words, we insert delays of known length into functions to deduce whether they are actually called or not (e.g., depending on whether it is the very first power-up after flashing or subsequent power-ups). The two functions <em>eeconfig_init_kb()<\/em> and <em>keyboard_post_init_user<\/em> are call-back functions (called by QMK) that we don&#8217;t have control over. <em>eeconfig_init_kb()<\/em> is supposed to be called only once, right after flashing and <em>keyboard_post_init_user<\/em> is supposed to be called for every power-up (both right after flashing and subsequent power-ups).<\/p>\n<p>For instance, if we insert a delay of 31 seconds in <em>eeconfig_init_kb()<\/em> and 7 seconds in <em>keyboard_post_init_user<\/em>, we expect the first startup to last 31 + 7 = 38 seconds and subsequent startups 7 seconds.<\/p>\n<p>This can also be used to verify that <em>eeconfig_init_kb()<\/em> is only called once after flashing; in all subsequent power-ups, QMK is only supposed to call <em>keyboard_post_init_user()<\/em>, not <em>eeconfig_init_kb()<\/em>.<\/p>\n<p>Strangeness observed: <em>eeconfig_init_kb()<\/em> seems to be called two times, based on an observed startup time after flashing of 31 + 31 + 7 = 69 seconds instead of the expected 38 seconds (depending on the calls it contained)! This behaviour may or may not also depend on whether Via is enabled at compile time.<\/p>\n<h2 id=\"LightingModes\">Appendix C: List of lighting modes<\/h2>\n<p>Note: There are 22 RGB lighting modes in the newer versions of the firmware. The firmware in the purchased unit may only have 13 lighting modes (9 less), because it uses an older version of the firmware or is configured differently at compile time. This is only the default set; there are currently <a href=\"https:\/\/docs.qmk.fm\/features\/rgb_matrix#rgb-matrix-effects\">51 different ones<\/a> to choose from.<\/p>\n<p>Note: Some models\/variants or firmware versions might have 23 modes instead of 22, with an extra mode, &#8220;None&#8221; (before &#8220;Solid colour&#8221;. With RGB light <strong><em>off<\/em><\/strong>). <!-- We are not sure if the order is the same or not: \"(note that the order is different in that list)\" --><\/p>\n<p>For <strong><em>normal use<\/em><\/strong> of the keyboard (past the demo phase), only RGB lighting mode <strong><em>&#8220;Solid&nbsp;colour&#8221;<\/em><\/strong> is needed.<\/p>\n<ol>\n\t<!-- \n\n<li>None                               <!xx  1. xx>  <\/li>\n\n  NOTE: Does not seem to be included in later versions of the firmware, at least not compiled from the official source.  --><\/p>\n<li><strong>Solid colour<\/strong>      <!--  2. -->  <\/li>\n<li>Breathing                          <!--  3. -->  (varying brightness, in the same colour (the current colour))<\/li>\n<li>Band spiral (is rotating)          <!--  4. -->  (in the same colour (the current colour))<\/li>\n<li>Cycle all                          <!--  5. -->  (through 32 colours, the same on all keys)<\/li>\n<li>Cycle left right                   <!--  6. -->  (all 32 colours on different keys, moving\/cycling horizontally)<\/li>\n<li>Cycle up down                      <!--  7. -->  (all 32 colours on different keys, moving\/cycling vertically)<\/li>\n<li>Rainbow moving                     <!--  8. -->  (similar to &#8216;Cycle left right&#8217;, but curved)<\/li>\n<li>Cycle out in                       <!--  9. -->  (similar to &#8216;Cycle left right&#8217;, but two halves with opposite direction of movement)<\/li>\n<li>Cycle out dual                     <!-- 10. -->  <\/li>\n<li>Cycle pinwheel  (is rotating)      <!-- 11. -->  <\/li>\n<li>Cycle spiral    (is rotating)      <!-- 12. -->  <\/li>\n<li>Cycle beacon    (is sort of rotating) <!-- 13. -->  <\/li>\n<li>Rainbow beacon  (is rotating)      <!-- 14. -->  <\/li>\n<li>Jellybean raindrops                <!-- 15. -->  <\/li>\n<li>Pixel rain                         <!-- 16. -->  <\/li>\n<li><strong>Typing heat map<\/strong>    <!-- 17. -->  (is not permanent, so it doesn&#8217;t have any practical value) <\/li>\n<li>Digital rain                       <!-- 18. -->  <\/li>\n<li>Reactive simple (is reactive)      <!-- 19. -->  <\/li>\n<li>Reactive multiwide (is reactive)   <!-- 20. -->  <\/li>\n<li>Reactive multi Nexus (is reactive) <!-- 21. -->  <\/li>\n<li>Splash               (is reactive) <!-- 22. -->  <\/li>\n<li>Solid splash         (is reactive) <!-- 23. -->  <\/li>\n<\/ol>\n<p>Here is <a href=\"https:\/\/www.youtube.com\/watch?v=7f3usatOIKM\">a demo<\/a> of all the 44 different RGB lighting modes (at that time): 1. <em>&#8220;Solid Colour&#8221;<\/em>,  2. <em>&#8220;Alpha+Mods&#8221;<\/em>,  3. <em>&#8220;Gradient (Up\/Down)&#8221;<\/em>,  4. <em>&#8220;Gradient (Left\/Right)&#8221;<\/em>,  5. <em>&#8220;Breathing&#8221;<\/em>,  6. <em>&#8220;Band (Saturation)&#8221;<\/em>,  7. <em>&#8220;Band (Value\/Brightness)&#8221;<\/em>,  8. <em>&#8220;Band Pinwheel (Saturation)&#8221;<\/em>,  9. <em>&#8220;Band Pinwheel (Value\/Brightness)&#8221;<\/em>, 10. <em>&#8220;Band Spiral (Saturation)&#8221;<\/em>, 11. <em>&#8220;Band Spiral (Value\/Brightness)&#8221;<\/em>, 12. <em>&#8220;Cycle All&#8221;<\/em>, 13. <em>&#8220;Cycle Left\/Right&#8221;<\/em>, 14. <em>&#8220;Cycle Up\/Down&#8221;<\/em>, 15. <em>&#8220;Rainbow Moving Chevron&#8221;<\/em>, 16. <em>&#8220;Cycle Out\/In&#8221;<\/em>, 17. <em>&#8220;Cycle Out\/In Dual&#8221;<\/em>, 18. <em>&#8220;Cycle Pinwheel&#8221;<\/em>, 19. <em>&#8220;Cycle Spiral&#8221;<\/em>, 20. <em>&#8220;Dual Beacon&#8221;<\/em>, 21. <em>&#8220;Rainbow Beacon&#8221;<\/em>, 22. <em>&#8220;Rainbow Pinwheels&#8221;<\/em>, 23. <em>&#8220;Raindrops&#8221;<\/em>, 24. <em>&#8220;Jellybean Raindrops&#8221;<\/em>, 25. <em>&#8220;Hue Breathing&#8221;<\/em>, 26. <em>&#8220;Hue Pendulum&#8221;<\/em>, 27. <em>&#8220;Hue Wave&#8221;<\/em>, 28. <em>&#8220;Pixel Rain&#8221;<\/em>, 29. <em>&#8220;Pixel Fractal&#8221;<\/em>, 30. <em>&#8220;Solid Reactive (Simple)&#8221;<\/em>, 31. <em>&#8220;Solid Reactive&#8221;<\/em> (<a href=\"https:\/\/www.youtube.com\/watch?v=7f3usatOIKM&#038;t=4m03s\">04 min 03 secs<\/a>), 32. <em>&#8220;Solid Reactive Wide&#8221;<\/em>, 33. <em>&#8220;Solid Reactive Multiwide&#8221;<\/em> (<a href=\"https:\/\/www.youtube.com\/watch?v=7f3usatOIKM&#038;t=4m19s\">04 min 19 secs<\/a>), 34. <em>&#8220;Solid Reactive Cross&#8221;<\/em>, 35. <em>&#8220;Solid Reactive Multicross&#8221;<\/em>, 36. <em>&#8220;Solid Reactive Nexus&#8221;<\/em> (<a href=\"https:\/\/www.youtube.com\/watch?v=7f3usatOIKM&#038;t=4m45s\">04 min 45 secs<\/a>), 37. <em>&#8220;Splash&#8221;<\/em>, 38. <em>&#8220;Multisplash&#8221;<\/em>, 39. <em>&#8220;Solid Splash&#8221;<\/em>, 40. <em>&#8220;Solid Multisplash&#8221;<\/em>, 41. <em>&#8220;Solid Colour&#8221;<\/em>, 42. <em>&#8220;Alpha+Mods&#8221;<\/em>, 43. <em>&#8220;Gradient (Up\/Down)&#8221;<\/em>, and 44. <em>&#8220;Gradient (Left\/Right)<\/em>.<\/p>\n<p>The first reactive mode is &#8220;Solid Reactive (Simple)&#8221;, at <a href=\"https:\/\/www.youtube.com\/watch?v=7f3usatOIKM&#038;t=3m48s\">03 min 48 secs<\/a>.<\/p>\n<p>Note: <em>31. &#8220;Solid Reactive&#8221;<\/em> has the long-sought-after reactive mode with a <strong><em>background colour different from black (off)<\/em><\/strong>. Presumably, it uses the current static colour as the background colour (like for <em>&#8220;Solid colour&#8221;<\/em>).<\/p>\n<p>There are timestamps for all the modes in the video&#8217;s description.<\/p>\n<p>Note: &#8220;Cycle beacon&#8221; is not in the demo. Or it may be a synonym (or have been renamed).<\/p>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/blob\/master\/docs\/compatible_microcontrollers.md#stmicroelectronics-stm32\">Microcontrollers supported by QMK<\/a><\/li>\n<li><em><a href=\"https:\/\/github.com\/Bastardkb\/bastardkb-qmk\/issues\/35\">eeconfig_init_kb() not called when VIA_ENABLED=yes<\/a><\/em> (GitHub). This is the opposite of our observation of eeconfig_init_kb() being called <strong><em>twice<\/em><\/strong> (with the 2023-06 version of QMK), but it illustrates something is up with eeconfig_init_kb().<\/li>\n<li>  <a href=\"https:\/\/github.com\/qmk\/qmk_firmware\/issues\/21959\">[Bug] EEPROM writes inside <em>via_init_kb()<\/em> are erased #21959<\/a>. It is not known if this is related to <em>eeconfig_init_kb()<\/em> being <strong><em>called twice<\/em><\/strong> when Via is enabled, but at least it lists some functions not mentioned in the QMK documentation (or at least not prominently), <em>via_init_kb()<\/em>. Perhaps some other call back functions should be used when Via is enabled?<\/li>\n<\/ul>\n<p><!--\nAdvantage of Via for prototyping macros. But limitations.\n\nInstructions for using Via.\n\nMouse actions.\n\nVersions of QMK.\n\nFlashing with dfu-util. Procedure. Holding Esc down isn't documented.\n\nMacros for real: QMK. Unlimited.\n--><\/p>\n<p><!--\n\nOld URLs: <https:\/\/docs.qmk.fm\/#\/feature_rgb_matrix?id=rgb-matrix-effects> (new: <https:\/\/docs.qmk.fm\/features\/rgb_matrix#rgb-matrix-effects>)\n\n--><\/p>\n<p><!-- T H E   E N D . . .   Marker for editing in WordPress: pppp --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The short version: The Keychron V5 mechanical keyboard is fully capable of macros, including mouse operations (e.g., right-click). This is enabled by the use of QMK and the length of macros is only limited by the available flash memory in &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"more-link\" href=\"https:\/\/pmortensen.eu\/world2\/2023\/06\/19\/keychron-v5-a-reasonably-priced-fully-macro-capable-qmk-based-mechanical-keyboard\/\"> <span class=\"screen-reader-text\">Keychron V5, a reasonably priced fully macro-capable QMK-based mechanical keyboard<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[28,26,35,38],"tags":[],"_links":{"self":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts\/3821"}],"collection":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/comments?post=3821"}],"version-history":[{"count":378,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts\/3821\/revisions"}],"predecessor-version":[{"id":6199,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/posts\/3821\/revisions\/6199"}],"wp:attachment":[{"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/media?parent=3821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/categories?post=3821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pmortensen.eu\/world2\/wp-json\/wp\/v2\/tags?post=3821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}