summaryrefslogtreecommitdiff
path: root/layouts
diff options
context:
space:
mode:
authorMorton Jonuschat <yabawock@gmail.com>2019-05-14 12:12:29 -0700
committerDrashna Jaelre <drashna@live.com>2019-05-14 12:12:29 -0700
commit7c0f2ae6d1c1d3f168a5919287b6608b092b3dba (patch)
tree27df17fe5de7d7e7dab840828277c77233c05995 /layouts
parent93a97ec6e5a8f193bb96bba1636b7f67cd47d3fc (diff)
[Keymap] Neo2 for ErgoDox on MacOS US QWERTY / ABC Extended keymap (#5862)
This is a Neo2 inspired layout that is meant to be fully usable on MacOS when used with the default US QWERTY/ABC Extended keymap. Neo2 layers 1-4 have been almost fully implemented in hardware. Layers 5 and 6 (greek and mathematical symbols) have been left out for now as most of them aren't available on the default keymaps. Layer toggling for layer 3 on the right hand side utilizes a tap-toggle approach that is a combination of MO & LT macros. This is required to allow sending Y when tapped, @ when tapped while the SHIFT modifier is active and support momentarily toggling the layer while the key is held.
Diffstat (limited to 'layouts')
-rw-r--r--layouts/community/ergodox/osx_neo2/keymap.c694
-rw-r--r--layouts/community/ergodox/osx_neo2/layers.h9
-rw-r--r--layouts/community/ergodox/osx_neo2/readme.md219
-rw-r--r--layouts/community/ergodox/osx_neo2/visualizer.c47
4 files changed, 969 insertions, 0 deletions
diff --git a/layouts/community/ergodox/osx_neo2/keymap.c b/layouts/community/ergodox/osx_neo2/keymap.c
new file mode 100644
index 0000000000..9e379c73f5
--- /dev/null
+++ b/layouts/community/ergodox/osx_neo2/keymap.c
@@ -0,0 +1,694 @@
+#include QMK_KEYBOARD_H
+#include "layers.h"
+#include "version.h"
+
+// Timer to detect tap/hold on NEO_RMOD3 key
+static uint16_t neo3_timer;
+// State bitmap to track which key(s) enabled NEO_3 layer
+static uint8_t neo3_state = 0;
+// State bitmap to track key combo for CAPSLOCK
+static uint8_t capslock_state = 0;
+
+// bitmasks for modifier keys
+#define MOD_MASK_NONE 0
+
+// Used to trigger macros / sequences of keypresses
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE, // can always be here
+ US_OSX_SMALL_UE,
+ US_OSX_SMALL_AE,
+ US_OSX_SMALL_OE,
+ US_OSX_CAPITAL_UE,
+ US_OSX_CAPITAL_AE,
+ US_OSX_CAPITAL_OE,
+ NEO2_LMOD3,
+ NEO2_RMOD3,
+ NEO2_1,
+ NEO2_2,
+ NEO2_3,
+ NEO2_4,
+ NEO2_5,
+ NEO2_6,
+ NEO2_7,
+ NEO2_8,
+ NEO2_9,
+ NEO2_0,
+ NEO2_MINUS,
+ NEO2_UE,
+ NEO2_AE,
+ NEO2_OE,
+ NEO2_COMMA,
+ NEO2_DOT,
+ NEO2_SHARP_S
+};
+
+#define NEO2_LMOD4 TT(NEO_4)
+#define NEO2_RMOD4 NEO2_LMOD4
+
+// NEO_3 special characters
+#define US_OSX_SUPERSCRIPT_1 KC_NO // ¹
+#define US_OSX_SUPERSCRIPT_2 KC_NO // ²
+#define US_OSX_SUPERSCRIPT_3 KC_NO // ³
+#define US_OSX_RSAQUO LALT(LSFT(KC_4)) // ›
+#define US_OSX_LSAQUO LALT(LSFT(KC_3)) // ‹
+#define US_OSX_CENT LALT(KC_4) // ¢
+#define US_OSX_YEN LALT(KC_Y) // ¥
+#define US_OSX_SBQUO LALT(LSFT(KC_0)) // ‚
+#define US_OSX_LEFT_SINGLE_QUOTE LALT(KC_RBRACKET) // ‘
+#define US_OSX_RIGHT_SINGLE_QUOTE LALT(LSFT(KC_RBRACKET)) // ’
+#define US_OSX_ELLIPSIS LALT(KC_SCOLON) // …
+#define US_OSX_UNDERSCORE LSFT(KC_MINUS) // _
+#define US_OSX_LBRACKET KC_LBRACKET // [
+#define US_OSX_RBRACKET KC_RBRACKET // ]
+#define US_OSX_CIRCUMFLEX LSFT(KC_6) // ^
+#define US_OSX_EXCLAMATION LSFT(KC_1) // !
+#define US_OSX_LESSTHAN LSFT(KC_COMMA) // <
+#define US_OSX_GREATERTHAN LSFT(KC_DOT) // >
+#define US_OSX_EQUAL KC_EQUAL // =
+#define US_OSX_AMPERSAND LSFT(KC_7) // &
+#define US_OSX_SMALL_LONG_S KC_NO // ſ
+#define US_OSX_BSLASH KC_BSLASH
+#define US_OSX_SLASH KC_SLASH // /
+#define US_OSX_CLBRACKET LSFT(KC_LBRACKET) // {
+#define US_OSX_CRBRACKET LSFT(KC_RBRACKET) // }
+#define US_OSX_ASTERISK LSFT(KC_8) // *
+#define US_OSX_QUESTIONMARK LSFT(KC_SLASH) // ?
+#define US_OSX_LPARENTHESES LSFT(KC_9) // (
+#define US_OSX_RPARENTHESES LSFT(KC_0) // )
+#define US_OSX_HYPHEN_MINUS KC_MINUS // -
+#define US_OSX_COLON LSFT(KC_SCOLON) // :
+#define US_OSX_AT LSFT(KC_2) // @
+#define US_OSX_HASH LSFT(KC_3) // #
+#define US_OSX_PIPE LSFT(KC_BSLASH) // |
+#define US_OSX_TILDE LSFT(KC_GRAVE) // ~
+#define US_OSX_BACKTICK KC_GRAVE // `
+#define US_OSX_PLUS LSFT(KC_EQUAL) // +
+#define US_OSX_PERCENT LSFT(KC_5) // %
+#define US_OSX_DOUBLE_QUOTE LSFT(KC_QUOTE) // "
+#define US_OSX_SINGLE_QUOTE KC_QUOTE // '
+#define US_OSX_SEMICOLON KC_SCOLON // ;
+
+// NEO_4 special characters
+#define US_OSX_FEMININE_ORDINAL LALT(KC_9) // ª
+#define US_OSX_MASCULINE_ORDINAL LALT(KC_0) // º
+#define US_OSX_NUMERO_SIGN KC_NO // №
+#define US_OSX_MIDDLE_DOT LALT(LSFT(KC_9)) // ·
+#define US_OSX_BRITISH_POUND LALT(KC_3) // £
+#define US_OSX_CURRENCY_SIGN KC_NO // ¤
+#define US_OSX_INV_EXCLAMATION LALT(KC_1) // ¡
+#define US_OSX_INV_QUESTIONMARK LALT(LSFT(KC_SLASH)) // ¿
+#define US_OSX_DOLLAR KC_DOLLAR // $
+#define US_OSX_EM_DASH LALT(LSFT(KC_MINUS)) // —
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* NEO_1: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ---- | 1/° | 2/§ | 3/ | 4/» | 5/« | ESC | | US_1 | 6/$ | 7/€ | 8/„ | 9/“ | 0/” | -/— |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | TAB | X | V | L | C | W | LCTL | | RCTL | K | H | G | F | Q | ß |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | NEO_3 | U | I | A | E | O |------| |------| S | N | R | T | D | Y |
+ * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------|
+ * | LSHIFT | Ü | Ö | Ä | P | Z | | | | B | M | ,/– | ./• | J | RSHIFT |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | ---- | ---- | LCTL | LALT | LGUI | | RGUI | Left | Down | Up | Right|
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | FKEYS| Home | | PgUp | FKEYS|
+ * ,------|------|------| |------+------+------.
+ * | Back-| | End | | PgDn | | |
+ * | space|Delete|------| |------| Enter|Space |
+ * | | | NEO_4| | NEO_4| | |
+ * `--------------------' `--------------------'
+ */
+ [NEO_1] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_NO /* NOOP */, NEO2_1, NEO2_2, NEO2_3, NEO2_4, NEO2_5, KC_ESCAPE,
+ KC_TAB, KC_X, KC_V, KC_L, KC_C, KC_W, KC_LCTRL,
+ NEO2_LMOD3, KC_U, KC_I, KC_A, KC_E, KC_O, /* --- */
+ KC_LSHIFT, NEO2_UE, NEO2_OE, NEO2_AE, KC_P, KC_Z, KC_LALT,
+ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_LCTRL, KC_LALT, KC_LGUI, /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ MO(FKEYS), KC_HOME,
+ /* KC_BSPACE */ /* KC_DELETE */ KC_END,
+ KC_BSPACE, KC_DELETE, NEO2_LMOD4,
+
+ // right hand side - main
+ TO(US_1), NEO2_6, NEO2_7, NEO2_8, NEO2_9, NEO2_0, NEO2_MINUS,
+ KC_RCTRL, KC_K, KC_H, KC_G, KC_F, KC_Q, NEO2_SHARP_S,
+ /* --- */ KC_S, KC_N, KC_R, KC_T, KC_D, NEO2_RMOD3,
+ KC_RALT, KC_B, KC_M, NEO2_COMMA, NEO2_DOT, KC_J, KC_RSHIFT,
+ /* --- */ /* --- */ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
+
+ // right hand side - thumb cluster
+ KC_PGUP, MO(FKEYS), /* --- */
+ KC_PGDOWN, /* --- */ /* --- */
+ NEO2_RMOD4, KC_ENTER, KC_SPACE
+ ),
+
+ /* NEO_3: Symbol layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ---- | ---- | ---- | ---- | › | ‹ | | | | ¢ | ¥ | ‚ | ‘ | ’ | ---- |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | ---- | … | _ | [ | ] | ^ | | | | ! | < | > | = | & | ---- |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | \ | / | { | } | * |------| |------| ? | ( | ) | - | : | @ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | # | $ | | | ~ | ` | | | | + | % | " | ' | ; | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ [NEO_3] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, US_OSX_RSAQUO, US_OSX_LSAQUO, _______,
+ KC_NO /* NOOP */, US_OSX_ELLIPSIS, US_OSX_UNDERSCORE, US_OSX_LBRACKET, US_OSX_RBRACKET, US_OSX_CIRCUMFLEX, _______,
+ _______, US_OSX_BSLASH, US_OSX_SLASH, US_OSX_CLBRACKET, US_OSX_CRBRACKET, US_OSX_ASTERISK, /* --- */
+ _______, US_OSX_HASH, US_OSX_DOLLAR, US_OSX_PIPE, US_OSX_TILDE, US_OSX_BACKTICK, _______,
+ _______, _______, _______, _______, _______, /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ _______, _______,
+ /* --- */ /* --- */ _______,
+ _______, _______, _______,
+
+ // right hand side - main
+ _______, US_OSX_CENT, US_OSX_YEN, US_OSX_SBQUO, US_OSX_LEFT_SINGLE_QUOTE, US_OSX_RIGHT_SINGLE_QUOTE, KC_NO,
+ _______, US_OSX_EXCLAMATION, US_OSX_LESSTHAN, US_OSX_GREATERTHAN, US_OSX_EQUAL, US_OSX_AMPERSAND, US_OSX_SMALL_LONG_S,
+ /* --- */ US_OSX_QUESTIONMARK, US_OSX_LPARENTHESES, US_OSX_RPARENTHESES, US_OSX_HYPHEN_MINUS, US_OSX_COLON, NEO2_RMOD3,
+ _______, US_OSX_PLUS, US_OSX_PERCENT, US_OSX_DOUBLE_QUOTE, US_OSX_SINGLE_QUOTE, US_OSX_SEMICOLON, _______,
+ /* --- */ /* --- */ _______, _______, _______, _______, _______,
+
+ // right hand side - thumb cluster
+ _______, _______, /* --- */
+ _______, /* --- */ /* --- */
+ _______, _______, _______
+ ),
+
+ /* NEO_4: Cursor & Numpad
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ---- | ª | º | ---- | · | £ | | | | ---- | Tab | / | * | - | ---- |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | ---- | PgUp | ⌫ | Up | ⌦ | PgDn | | | | ¡ | 7 | 8 | 9 | + | – |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | Home | Left | Down | Right| End |------| |------| ¿ | 4 | 5 | 6 | , | . |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | Esc | Tab | Ins |Return| ---- | | | | : | 1 | 2 | 3 | ; | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | 0 | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ [NEO_4] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_NO /* NOOP */, US_OSX_FEMININE_ORDINAL, US_OSX_MASCULINE_ORDINAL, KC_NO /* NOOP */, US_OSX_MIDDLE_DOT, US_OSX_BRITISH_POUND, _______,
+ _______, KC_PGUP, KC_BSPACE, KC_UP, KC_DELETE, KC_PGDOWN, _______,
+ _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, /* --- */
+ _______, KC_ESCAPE, KC_TAB, KC_INSERT, KC_ENTER, KC_NO /* NOOP */, _______,
+ _______, _______, _______, _______, _______, /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ _______, _______,
+ /* --- */ /* --- */ _______,
+ _______, _______, _______,
+
+ // right hand side - main
+ _______, US_OSX_CURRENCY_SIGN, KC_TAB, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO /* NOOP */,
+ _______, US_OSX_INV_EXCLAMATION, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, US_OSX_EM_DASH,
+ /* --- */ US_OSX_INV_QUESTIONMARK, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_COMMA, KC_KP_DOT,
+ _______, US_OSX_COLON, KC_KP_1, KC_KP_2, KC_KP_3, US_OSX_SEMICOLON, _______,
+ /* --- */ /* --- */ _______, KC_KP_0, _______, _______, _______,
+
+ // right hand side - thumb cluster
+ _______, _______, /* --- */
+ _______, /* --- */ /* --- */
+ _______, _______, _______
+ ),
+
+ /* NEO_5: Greek
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | ---- | ----| ---- | ---- | ---- |------| |------| ---- | ---- | ---- | ---- | ---- | ---- |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | ---- | ----| ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ [NEO_5] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, /* --- */
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ _______, _______, _______, _______, _______, /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ _______, _______,
+ /* --- */ /* --- */ _______,
+ _______, _______, _______,
+
+ // right hand side - main
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */,
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */,
+ /* --- */ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */,
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ /* --- */ /* --- */ _______, _______, _______, _______, _______,
+
+ // right hand side - thumb cluster
+ _______, _______, /* --- */
+ _______, /* --- */ /* --- */
+ _______, _______, _______
+ ),
+
+ /* NEO_6: Math symbols
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | ---- | ----| ---- | ---- | ---- |------| |------| ---- | ---- | ---- | ---- | ---- | ---- |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | ---- | ----| ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ [NEO_6] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, /* --- */
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ _______, _______, _______, _______, _______, /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ _______, _______,
+ /* --- */ /* --- */ _______,
+ _______, _______, _______,
+
+ // right hand side - main
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */,
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */,
+ /* --- */ KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */,
+ _______, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, KC_NO /* NOOP */, _______,
+ /* --- */ /* --- */ _______, _______, _______, _______, _______,
+
+ // right hand side - thumb cluster
+ _______, _______, /* --- */
+ _______, /* --- */ /* --- */
+ _______, _______, _______
+ ),
+
+ /* US_1: US QWERTY
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | = | 1 | 2 | 3 | 4 | 5 | ESC | | NEO_1| 6 | 7 | 8 | 9 | 0 | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | \ | Q | W | E | R | T | ---- | | [ | Y | U | I | O | P | ] |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ * |--------+------+------+------+------+------| ---- | | ---- |------+------+------+------+------+--------|
+ * | LSHIFT | Z | X | C | V | B | | | | N | M | , | . | / | RSHIFT |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | LGUI | ` | ---- | ---- | FKEYS| | Left | Down | Up | Right| RGUI |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | LCTRL| LALT | | RALT | RCTRL|
+ * ,------|------|------| |------+------+------.
+ * | | | HOME | | PGUP | | |
+ * | BKSP | DEL |------| |------| ENTR | SPCE |
+ * | | | END | | PGDN | | |
+ * `--------------------' `--------------------'
+ */
+ [US_1] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESCAPE,
+ KC_BSLASH, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO /* NOOP */,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, /* --- */
+ KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO /* NOOP */,
+ KC_LGUI, KC_GRAVE, KC_NO, KC_NO, MO(FKEYS), /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ KC_LCTRL, KC_LALT,
+ /* --- */ /* --- */ KC_HOME,
+ KC_BSPACE, KC_DELETE, KC_END,
+
+ // right hand side - main
+ TO(NEO_1), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
+ KC_LBRACKET, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRACKET,
+ /* --- */ KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE,
+ KC_NO /* NOOP */, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT,
+ /* --- */ /* --- */ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_RGUI,
+
+ // right hand side - thumb cluster
+ KC_RALT, KC_RCTRL, /* --- */
+ KC_PGUP, /* --- */ /* --- */
+ KC_PGDOWN, KC_ENTER, KC_SPACE
+ ),
+
+ /* FKEYS: Function keys
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | Prev | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | VolUp |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Play | | | | | | | | | | | | | | VolDn |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Next | | | | | |------| |------| | | | | | Mute |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ [FKEYS] = LAYOUT_ergodox(
+ // left hand side - main
+ KC_MEDIA_REWIND, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
+ KC_MEDIA_PLAY_PAUSE, _______, _______, _______, _______, _______, _______,
+ KC_MEDIA_FAST_FORWARD, _______, _______, _______, _______, _______, /* --- */
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, /* --- */ /* --- */
+
+ // left hand side - thumb cluster
+ /* --- */ _______, _______,
+ /* --- */ /* --- */ _______,
+ _______, _______, _______,
+
+ // right hand side - main
+ KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_AUDIO_VOL_UP,
+ _______, _______, _______, _______, _______, _______, KC_AUDIO_VOL_DOWN,
+ /* --- */ _______, _______, _______, _______, _______, KC_AUDIO_MUTE,
+ _______, _______, _______, _______, _______, _______, _______,
+ /* --- */ /* --- */ _______, _______, _______, _______, _______,
+
+ // right hand side - thumb cluster
+ _______, _______, /* --- */
+ _______, /* --- */ /* --- */
+ _______, _______, _______
+ ),
+};
+
+// Send a key tap with a optional set of modifiers.
+void tap_with_modifiers(uint16_t keycode, uint8_t force_modifiers) {
+ uint8_t active_modifiers = get_mods();
+
+ if ((force_modifiers & MOD_MASK_SHIFT) && !(active_modifiers & MOD_MASK_SHIFT)) register_code(KC_LSFT);
+ if ((force_modifiers & MOD_MASK_CTRL) && !(active_modifiers & MOD_MASK_CTRL)) register_code(KC_LCTRL);
+ if ((force_modifiers & MOD_MASK_ALT) && !(active_modifiers & MOD_MASK_ALT)) register_code(KC_LALT);
+ if ((force_modifiers & MOD_MASK_GUI) && !(active_modifiers & MOD_MASK_GUI)) register_code(KC_LGUI);
+
+ register_code(keycode);
+ unregister_code(keycode);
+
+ if ((force_modifiers & MOD_MASK_SHIFT) && !(active_modifiers & MOD_MASK_SHIFT)) unregister_code(KC_LSFT);
+ if ((force_modifiers & MOD_MASK_CTRL) && !(active_modifiers & MOD_MASK_CTRL)) unregister_code(KC_LCTRL);
+ if ((force_modifiers & MOD_MASK_ALT) && !(active_modifiers & MOD_MASK_ALT)) unregister_code(KC_LALT);
+ if ((force_modifiers & MOD_MASK_GUI) && !(active_modifiers & MOD_MASK_GUI)) unregister_code(KC_LGUI);
+}
+
+// Special remapping for keys with different keycodes/macros when used with shift modifiers.
+bool process_record_user_shifted(uint16_t keycode, keyrecord_t *record) {
+ uint8_t active_modifiers = get_mods();
+ uint8_t shifted = active_modifiers & MOD_MASK_SHIFT;
+
+ // Early return on key release
+ if (!record->event.pressed) {
+ return true;
+ }
+
+ if (shifted) {
+ clear_mods();
+
+ switch (keycode) {
+ case NEO2_1:
+ // degree symbol
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_8) SS_UP(X_LSHIFT) SS_UP(X_LALT));
+ break;
+ case NEO2_2:
+ // section symbol
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_6) SS_UP(X_LALT));
+ break;
+ case NEO2_3:
+ // There is no OSX key combination for the script small l character
+ break;
+ case NEO2_4:
+ // right angled quote
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_BSLASH) SS_UP(X_LSHIFT) SS_UP(X_LALT));
+ break;
+ case NEO2_5:
+ // left angled quote
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_BSLASH) SS_UP(X_LALT));
+ break;
+ case NEO2_6:
+ // dollar sign
+ SEND_STRING(SS_DOWN(X_LSHIFT) SS_TAP(X_4) SS_UP(X_LSHIFT));
+ break;
+ case NEO2_7:
+ // euro sign
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_2) SS_UP(X_LSHIFT) SS_UP(X_LALT));
+ break;
+ case NEO2_8:
+ // low9 double quote
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_W) SS_UP(X_LSHIFT) SS_UP(X_LALT));
+ break;
+ case NEO2_9:
+ // left double quote
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_LBRACKET) SS_UP(X_LALT));
+ break;
+ case NEO2_0:
+ // right double quote
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_LBRACKET) SS_UP(X_LSHIFT) SS_UP(X_LALT));
+ break;
+ case NEO2_MINUS:
+ // em dash
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_MINUS) SS_UP(X_LSHIFT) SS_UP(X_LALT));
+ break;
+ case NEO2_COMMA:
+ // en dash
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_MINUS) SS_UP(X_LALT));
+ break;
+ case NEO2_DOT:
+ // bullet
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_8) SS_UP(X_LALT));
+ break;
+ case NEO2_SHARP_S:
+ // german sharp s
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_S) SS_UP(X_LALT));
+ break;
+ case NEO2_UE:
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_U) SS_UP(X_U) SS_UP(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_U) SS_UP(X_LSHIFT));
+ break;
+ case NEO2_OE:
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_U) SS_UP(X_U) SS_UP(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_O) SS_UP(X_LSHIFT));
+ break;
+ case NEO2_AE:
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_U) SS_UP(X_U) SS_UP(X_LALT) SS_DOWN(X_LSHIFT) SS_TAP(X_A) SS_UP(X_LSHIFT));
+ break;
+ default:
+ set_mods(active_modifiers);
+ return true;
+ }
+
+ set_mods(active_modifiers);
+ return false;
+ } else {
+ switch (keycode) {
+ case NEO2_1:
+ SEND_STRING(SS_TAP(X_1));
+ break;
+ case NEO2_2:
+ SEND_STRING(SS_TAP(X_2));
+ break;
+ case NEO2_3:
+ SEND_STRING(SS_TAP(X_3));
+ break;
+ case NEO2_4:
+ SEND_STRING(SS_TAP(X_4));
+ break;
+ case NEO2_5:
+ SEND_STRING(SS_TAP(X_5));
+ break;
+ case NEO2_6:
+ SEND_STRING(SS_TAP(X_6));
+ break;
+ case NEO2_7:
+ SEND_STRING(SS_TAP(X_7));
+ break;
+ case NEO2_8:
+ SEND_STRING(SS_TAP(X_8));
+ break;
+ case NEO2_9:
+ SEND_STRING(SS_TAP(X_9));
+ break;
+ case NEO2_0:
+ SEND_STRING(SS_TAP(X_0));
+ break;
+ case NEO2_MINUS:
+ SEND_STRING(SS_TAP(X_MINUS));
+ break;
+ case NEO2_COMMA:
+ SEND_STRING(SS_TAP(X_COMMA));
+ break;
+ case NEO2_DOT:
+ SEND_STRING(SS_TAP(X_DOT));
+ break;
+ case NEO2_SHARP_S:
+ // german sharp s
+ SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_S) SS_UP(X_LALT));
+ break;
+ case NEO2_UE:
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_U) SS_UP(X_U) SS_UP(X_LALT) SS_TAP(X_U));
+ break;
+ case NEO2_OE:
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_U) SS_UP(X_U) SS_UP(X_LALT) SS_TAP(X_O));
+ break;
+ case NEO2_AE:
+ SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_U) SS_UP(X_U) SS_UP(X_LALT) SS_TAP(X_A));
+ break;
+ default:
+ return true;
+ }
+
+ return false;
+ }
+}
+
+// Runs for each key down or up event.
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_LSHIFT:
+ if (record->event.pressed) {
+ capslock_state |= (MOD_BIT(KC_LSHIFT));
+ } else {
+ capslock_state &= ~(MOD_BIT(KC_LSHIFT));
+ }
+ break;
+ case KC_RSHIFT:
+ if (record->event.pressed) {
+ capslock_state |= MOD_BIT(KC_RSHIFT);
+ } else {
+ capslock_state &= ~(MOD_BIT(KC_RSHIFT));
+ }
+ break;
+ case NEO2_LMOD3:
+ if (record->event.pressed) {
+ layer_on(NEO_3);
+ neo3_state |= (1 << 1);
+ } else {
+ // Turn off NEO_3 layer unless it's enabled through NEO2_RMOD3 as well.
+ if ((neo3_state & ~(1 << 1)) == 0) {
+ layer_off(NEO_3);
+ }
+ neo3_state &= ~(1 << 1);
+ }
+ break;
+ case NEO2_RMOD3:
+ if (record->event.pressed) {
+ neo3_timer = timer_read();
+ neo3_state |= (1 << 2);
+ layer_on(NEO_3);
+ } else {
+ // Turn off NEO_3 layer unless it's enabled through NEO2_LMOD3 as well.
+ if ((neo3_state & ~(1 << 2)) == 0) {
+ layer_off(NEO_3);
+ }
+ neo3_state &= ~(1 << 2);
+
+ // Was the NEO2_RMOD3 key TAPPED?
+ if (timer_elapsed(neo3_timer) <= 150) {
+ if (neo3_state > 0) {
+ // We are still in NEO_3 layer, send keycode and modifiers for @
+ tap_with_modifiers(KC_2, MOD_MASK_SHIFT);
+ return false;
+ } else {
+ // Do the normal key processing, send y
+ tap_with_modifiers(KC_Y, MOD_MASK_NONE);
+ return false;
+ }
+ }
+ }
+ break;
+ }
+
+ if ((capslock_state & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) {
+ // CAPSLOCK is currently active, disable it
+ if (host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK)) {
+ unregister_code(KC_LOCKING_CAPS);
+ } else {
+ register_code(KC_LOCKING_CAPS);
+ }
+ return false;
+ }
+
+ return process_record_user_shifted(keycode, record);
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void){
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ // TODO: Make this relevant to the ErgoDox EZ.
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ default:
+ // none
+ break;
+ }
+};
diff --git a/layouts/community/ergodox/osx_neo2/layers.h b/layouts/community/ergodox/osx_neo2/layers.h
new file mode 100644
index 0000000000..a5e0cba00d
--- /dev/null
+++ b/layouts/community/ergodox/osx_neo2/layers.h
@@ -0,0 +1,9 @@
+enum layers {
+ NEO_1, // layer_0
+ NEO_3, // layer_1
+ NEO_4, // layer_2
+ NEO_5, // layer_3
+ NEO_6, // layer_4
+ US_1, // layer_5
+ FKEYS // layer_6
+}; \ No newline at end of file
diff --git a/layouts/community/ergodox/osx_neo2/readme.md b/layouts/community/ergodox/osx_neo2/readme.md
new file mode 100644
index 0000000000..cab4dfe709
--- /dev/null
+++ b/layouts/community/ergodox/osx_neo2/readme.md
@@ -0,0 +1,219 @@
+# Neo 2 for ErgoDox on QWERTY
+
+# Description
+
+The Neo layout is an optimized German keyboard layout developed by the
+Neo Users Group, supporting many Latin-based alphabets. The positions
+of the letters are not only optimized for German letter frequency,
+but also for typical groups of two or three letters. English is
+considered a primary target as well.
+
+The design tries to enforce the alternating usage of both hands to
+increase typing speed and incorporates ideas from de-ergo and other
+ergonomic layouts. High frequency keys are placed in the home row.
+The current layout Neo 2.0 has unique features making it suited for
+many target groups such as programmers, mathematicians, scientists or
+LaTeX authors.
+
+Neo is grouped into six layers, each dedicated to a special purpose.
+
+# Layers
+
+At the core this is a Neo 2.0 layout adjusted for the Ergodox Infinity.
+The keymap is laid out expecting a macOs using the US QWERTY or ABC
+Extended layout.
+
+[Layer 1](#layer-1) Lowercase, upppercase and typographical characters
+
+[Layer 2](#layer-2) Special characters for programming
+
+[Layer 3](#layer-3) WASD-like movement keys and number block
+
+[Layer 4](#layer-4) Greek characters
+
+[Layer 5](#layer-5) Mathematical symbols and Greek uppercase characters
+
+[Layer 6](#layer-6) Ergodox Infinity US QWERTY layout
+
+[Layer 7](#layer-7) Function keys
+
+## Legend
+
+ * Keys marked with `----` are dead keys.
+ * Blank keys are transparent and fall through to lower levels.
+
+## Layer 1
+
+This layer implements NEO layers 1 and 2.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ---- | 1/° | 2/§ | 3/ | 4/» | 5/« | ESC | | US_1 | 6/$ | 7/€ | 8/„ | 9/“ | 0/” | -/— |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| TAB | X | V | L | C | W | LCTL | | RCTL | K | H | G | F | Q | ß |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| NEO_3 | U | I | A | E | O |------| |------| S | N | R | T | D | Y |
+|--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------|
+| LSHIFT | Ü | Ö | Ä | P | Z | | | | B | M | ,/– | ./• | J | RSHIFT |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | ---- | ---- | LCTL | LALT | LGUI | | RGUI | Left | Down | Up | Right|
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | FKEYS| Home | | PgUp | FKEYS|
+ ,------|------|------| |------+------+------.
+ | Back-| | End | | PgDn | | |
+ | space|Delete|------| |------| Enter|Space |
+ | | | NEO_4| | NEO_4| | |
+ `--------------------' `--------------------'
+```
+
+## Layer 2
+
+This layer implements NEO layer 3.
+
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ---- | ---- | ---- | ---- | › | ‹ | | | | ¢ | ¥ | ‚ | ‘ | ’ | ---- |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| ---- | … | _ | [ | ] | ^ | | | | ! | < | > | = | & | ---- |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | \ | / | { | } | * |------| |------| ? | ( | ) | - | : | @ |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | # | $ | | | ~ | ` | | | | + | % | " | ' | ; | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
+
+## Layer 3
+
+This layer implements NEO layer 4.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ---- | ª | º | ---- | · | £ | | | | ---- | Tab | / | * | - | ---- |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| ---- | PgUp | ⌫ | Up | ⌦ | PgDn | | | | ¡ | 7 | 8 | 9 | + | – |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | Home | Left | Down | Right| End |------| |------| ¿ | 4 | 5 | 6 | , | . |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | Esc | Tab | Ins |Return| ---- | | | | : | 1 | 2 | 3 | ; | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | 0 | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
+
+## Layer 4
+
+This layer is currently empty/reserved for NEO layer 5.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | ---- | ----| ---- | ---- | ---- |------| |------| ---- | ---- | ---- | ---- | ---- | ---- |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | ---- | ----| ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
+
+## Layer 5
+
+This layer is currently empty/reserved for NEO layer 6.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | ---- |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | ---- | ----| ---- | ---- | ---- |------| |------| ---- | ---- | ---- | ---- | ---- | ---- |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | ---- | ----| ---- | ---- | ---- | | | | ---- | ---- | ---- | ---- | ---- | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
+
+## Layer 6
+
+A bare bones implementation of the default Ergodox Infinity layout.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| = | 1 | 2 | 3 | 4 | 5 | ESC | | NEO_1| 6 | 7 | 8 | 9 | 0 | - |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| \ | Q | W | E | R | T | ---- | | [ | Y | U | I | O | P | ] |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+|--------+------+------+------+------+------| ---- | | ---- |------+------+------+------+------+--------|
+| LSHIFT | Z | X | V | B | M | | | | N | M | , | . | / | RSHIFT |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | LGUI | ` | ---- | ---- | FKEYS| | Left | Down | Up | Right| RGUI |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | LCTRL| LALT | | RALT | RCTRL|
+ ,------|------|------| |------+------+------.
+ | | | HOME | | PGUP | | |
+ | BKSP | DEL |------| |------| ENTR | SPCE |
+ | | | END | | PGDN | | |
+ `--------------------' `--------------------'
+```
+
+## Layer 7
+
+This layer implements function and multimedia keys.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| Prev | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | VolUp |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| Play | | | | | | | | | | | | | | VolDn |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| Next | | | | | |------| |------| | | | | | Mute |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | | | | | | | | | | | | | | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
diff --git a/layouts/community/ergodox/osx_neo2/visualizer.c b/layouts/community/ergodox/osx_neo2/visualizer.c
new file mode 100644
index 0000000000..653201bb8a
--- /dev/null
+++ b/layouts/community/ergodox/osx_neo2/visualizer.c
@@ -0,0 +1,47 @@
+#include "layers.h"
+#include "simple_visualizer.h"
+#include "util.h"
+
+static void get_visualizer_layer_and_color(visualizer_state_t *state) {
+ uint8_t layer = biton32(state->status.layer);
+
+ // Go from highest to lowest layer to get the right text/color combination.
+ switch (layer) {
+ // #AEB2F4 / hsv(65.71%, 28.69%, 95.69%)
+ case FKEYS:
+ // #F4AEDC / hsv(89.05%, 28.69%, 95.69%)
+ state->layer_text = "FUNCTION KEYS";
+ state->target_lcd_color = LCD_COLOR(228, 73, 245);
+ break;
+ case US_1:
+ // #F4B993 / hsv(6.53%, 39.75%, 95.69%)
+ state->layer_text = "QWERTY";
+ state->target_lcd_color = LCD_COLOR(17, 102, 245);
+ break;
+ case NEO_6:
+ // #F4E393 / hsv(13.75%, 39.75%, 95.69%)
+ state->layer_text = "NEO: 6";
+ state->target_lcd_color = LCD_COLOR(35, 102, 245);
+ break;
+ case NEO_5:
+ // #C6F493 / hsv(24.57%, 39.75%, 95.69%)
+ state->layer_text = "NEO: 5";
+ state->target_lcd_color = LCD_COLOR(63, 102, 245);
+ break;
+ case NEO_4:
+ // #8EEBC9 / hsv(43.91%, 39.57%, 92.16%)
+ state->layer_text = "NEO: 4";
+ state->target_lcd_color = LCD_COLOR(112, 101, 189);
+ break;
+ case NEO_3:
+ // #93D2F4 / hsv(55.84%, 39.75%, 95.69%)
+ state->layer_text = "NEO: 3";
+ state->target_lcd_color = LCD_COLOR(143, 102, 245);
+ break;
+ default:
+ // #EEEEEE / hsv(0%, 0%, 93%)
+ state->layer_text = "NEO: 1";
+ state->target_lcd_color = LCD_COLOR(0, 0, 255);
+ break;
+ }
+}