Compare commits

...

39 Commits

Author SHA1 Message Date
Jens Kadenbach
1f9a63b6ec Add audax_osx Planck keymap for macOS software neo2
Some checks failed
Automatic Approve / automatic_approve (push) Has been cancelled
Update API Data / api_data (push) Has been cancelled
CI Builds / CI Build (default) (push) Has been cancelled
CI Builds / CI Build (via) (push) Has been cancelled
CLI CI / test (push) Has been cancelled
Update develop after master merge / develop_update (push) Has been cancelled
Lint Format / lint (push) Has been cancelled
Regenerate Files / regen (push) Has been cancelled
Unit Tests / test (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
Modern rewrite of the old planck/keymaps/audax (which used the removed fn_actions/action_get_macro API) as the Planck counterpart of the ergodox audax_osx layout. The base layer and Mod3 send positional NE_* scancodes that the OS neo2 layout translates; numbers, function keys and the cursor block stay on firmware layers (_RS/_LW) so they auto-repeat. Mod3 is held on '#', the right Mod3 key taps the neo2 sharp-s, and '@' is Mod3 + y. Built and verified for planck/rev4.
2026-07-21 10:49:01 +02:00
Jens Kadenbach
85ef39b09d Add audax_osx ErgoDox layout for macOS software neo2
Some checks failed
Automatic Approve / automatic_approve (push) Has been cancelled
Update API Data / api_data (push) Has been cancelled
CI Builds / CI Build (default) (push) Has been cancelled
CI Builds / CI Build (via) (push) Has been cancelled
CLI CI / test (push) Has been cancelled
Update develop after master merge / develop_update (push) Has been cancelled
Lint Format / lint (push) Has been cancelled
Regenerate Files / regen (push) Has been cancelled
Unit Tests / test (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
neo2 for macOS via the installed software neo2 keyboard layout instead of firmware emulation. The base layer and Mod3 send positional NE_* scancodes that the OS neo2 layout translates; Mod4 (cursor and numpad) is a firmware layer so its keys auto-repeat. Keeps the audax_osx_neo2 key arrangement, home-row mods, macOS shortcuts and media/function layer. The right Mod3 key taps to the neo2 sharp-s; a dedicated right-hand Mod4 key and the Enter thumb both reach the Mod4 layer.
2026-07-20 18:05:50 +02:00
Jens Kadenbach
ed89b195de fo
Some checks failed
Automatic Approve / automatic_approve (push) Has been cancelled
Update API Data / api_data (push) Has been cancelled
CI Builds / CI Build (default) (push) Has been cancelled
CI Builds / CI Build (via) (push) Has been cancelled
CLI CI / test (push) Has been cancelled
Update develop after master merge / develop_update (push) Has been cancelled
Lint Format / lint (push) Has been cancelled
Regenerate Files / regen (push) Has been cancelled
Unit Tests / test (push) Has been cancelled
2026-07-20 16:29:25 +02:00
Jens Kadenbach
39aae9ff1a Better shortcuts 2023-07-17 20:57:07 +02:00
Jens Kadenbach
6e4553fd6c Modified ergodox osx neo2 layout for me 2023-07-17 20:01:20 +02:00
Jens Kadenbach
9da08e457a Merge branch 'qmk:master' into master 2023-07-17 18:00:20 +02:00
tan-t
fa0b4511dd [Keyboard] add mothwing (#19342)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2023-07-14 00:22:38 -07:00
dependabot[bot]
28d5cd1696 Bump JamesIves/github-pages-deploy-action from 4.4.2 to 4.4.3 (#21518)
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.4.2 to 4.4.3.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.4.2...v4.4.3)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-13 00:14:23 +01:00
Alabahuy
037e47800d Fix jaykeeb indicator state and pins (#21466) 2023-07-12 09:18:12 -06:00
takashicompany
c83ff03a40 [Keyboard] Add minidivide (#19870)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2023-07-12 09:17:04 -06:00
spbgzh
83c81826e3 [Keyboard] Add new nemui65 (#21304)
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2023-07-11 19:28:36 -06:00
drewpyun
7f9653c1c8 [Keyboard] add rocketkeyboards mercury65 (#20811)
Co-authored-by: jack <0x6a73@protonmail.com>
2023-07-11 08:51:48 -07:00
Jens Kadenbach
bafb547bda Merge branch 'qmk:master' into master 2022-02-22 15:14:30 +01:00
Jens Kadenbach
09336608b0 toggle layer _UP with ENT to compatibility with IDEA 2021-03-23 10:44:17 +01:00
Jens Kadenbach
a0571297b9 re-implement macros 2021-03-23 10:03:30 +01:00
Jens Kadenbach
7a7e5e6427 Merge remote-tracking branch 'upstream/master' 2021-03-22 21:33:28 +01:00
audax
cc45563d13 pgup and pgdn in planck first layer 2016-06-21 14:07:09 +00:00
Jens Kadenbach
08673ba71b IDE navigation keys 2016-05-23 09:59:39 +02:00
audax
e3d38d6b78 additional NEO_SS 2016-05-22 12:43:16 +00:00
audax
5761971659 new stuff 2016-05-21 19:57:11 +00:00
audax
6f63ed3707 update planck 2016-05-07 12:06:20 +00:00
audax
252ccc25e9 update ergodox 2016-04-24 11:14:31 +00:00
audax
4daeeaca06 fixed _RS layer 2016-04-17 21:58:56 +00:00
audax
32c0a30b3c removed backspace from top right 2016-04-16 08:56:25 +00:00
audax
8effc8315a no neo_l1 on neo_y 2016-04-16 08:37:28 +00:00
audax
486a6175e6 moved keymaps 2016-04-16 08:36:56 +00:00
audax
582440b96e Merge remote-tracking branch 'upstream/master' 2016-04-16 08:08:38 +00:00
Jens Kadenbach
3b0a2c0bc2 Fill _LT with stuff 2016-04-08 23:55:19 +02:00
Jens Kadenbach
d97ef58e3c Duplicate @ to a macro for windows 2016-04-08 23:35:51 +02:00
Jens Kadenbach
f155959cc8 Moved modifier 2016-04-08 12:48:40 +02:00
Jens Kadenbach
4356804f56 Tab as _UP mod and KC_INS 2016-04-07 23:52:34 +02:00
Jens Kadenbach
fbb58a78b8 Removed mods from home row 2016-03-30 20:18:59 +02:00
Jens Kadenbach
24796ee545 Update ergodox 2016-03-17 17:57:33 +01:00
Jens Kadenbach
6b4d8d1bf2 new variant of softneo2 for ergodox 2016-03-16 22:29:28 +01:00
Jens Kadenbach
4474f8f191 LGUI instead of LCTL 2016-02-29 13:14:06 +01:00
Jens Kadenbach
55d6de83c4 Removed neo layer 4 2016-02-28 15:08:44 +01:00
Jens Kadenbach
66778ae6ae Shift+Insert as rightmost key in the bottom row 2016-02-28 09:43:52 +01:00
Jens Kadenbach
614f8cc9ca Better soft-neo2 layout
* NEO_Y is a tap-layer NEO_L1
* Enter and space are tap actions with ctr and gui
* Removed qwertz layer
* fixed mising KC_TRNS
* Left KC_LGUI includes KC_SLSFT
* TAB is a tap action with MEH-mods
* moved PGUP/DN
* RESET on base layer (I don't use the key anyway
2016-02-28 02:08:21 +01:00
Jens Kadenbach
9b35205b01 neo2 soft layout 2016-01-18 22:06:56 +01:00
46 changed files with 2830 additions and 4 deletions

View File

@@ -37,7 +37,7 @@ jobs:
qmk --verbose generate-docs
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4.4.2
uses: JamesIves/github-pages-deploy-action@v4.4.3
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master

View File

@@ -0,0 +1,99 @@
{
"keyboard_name": "mercury65",
"maintainer": "Drewkeys",
"manufacturer": "RocketKeyboards",
"processor": "atmega32u4",
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"url": "https://www.rocketkeyboards.com/collections/mercury65/products/gb-mercury65-keyboard",
"usb": {
"vid": "0xDE43",
"pid": "0x1034",
"device_version": "0.0.1"
},
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["B0", "B1", "B2", "B3", "B7", "D1", "D2", "D3", "D7", "B4", "B5", "B6", "C6", "C7", "F7", "F6", "F5"],
"rows": ["D5", "D4", "D6", "D0", "E6"]
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "label":"`", "x":0, "y":0},
{"matrix": [0, 1], "label":"!", "x":1, "y":0},
{"matrix": [0, 2], "label":"@", "x":2, "y":0},
{"matrix": [0, 3], "label":"#", "x":3, "y":0},
{"matrix": [0, 4], "label":"$", "x":4, "y":0},
{"matrix": [0, 5], "label":"%", "x":5, "y":0},
{"matrix": [0, 6], "label":"^", "x":6, "y":0},
{"matrix": [0, 7], "label":"&", "x":7, "y":0},
{"matrix": [0, 8], "label":"*", "x":8, "y":0},
{"matrix": [0, 9], "label":"(", "x":9, "y":0},
{"matrix": [0, 10], "label":")", "x":10, "y":0},
{"matrix": [0, 11], "label":"_", "x":11, "y":0},
{"matrix": [0, 12], "label":"+", "x":12, "y":0},
{"matrix": [0, 13], "label":"Del", "x":13, "y":0},
{"matrix": [0, 14], "label":"Bsp", "x":14, "y":0},
{"matrix": [1, 0], "label":"Tab", "x":0, "y":1, "w":1.5},
{"matrix": [1, 2], "label":"Q", "x":1.5, "y":1},
{"matrix": [1, 3], "label":"W", "x":2.5, "y":1},
{"matrix": [1, 4], "label":"E", "x":3.5, "y":1},
{"matrix": [1, 5], "label":"R", "x":4.5, "y":1},
{"matrix": [1, 6], "label":"T", "x":5.5, "y":1},
{"matrix": [1, 7], "label":"Y", "x":6.5, "y":1},
{"matrix": [1, 8], "label":"U", "x":7.5, "y":1},
{"matrix": [1, 9], "label":"I", "x":8.5, "y":1},
{"matrix": [1, 10], "label":"O", "x":9.5, "y":1},
{"matrix": [1, 11], "label":"P", "x":10.5, "y":1},
{"matrix": [1, 12], "label":"{", "x":11.5, "y":1},
{"matrix": [1, 13], "label":"}", "x":12.5, "y":1},
{"matrix": [1, 14], "label":"|", "x":13.5, "y":1, "w":1.5},
{"matrix": [1, 16], "label":"PgUp", "x":15.5, "y":1},
{"matrix": [2, 0], "label":"Caps Lock", "x":0, "y":2, "w":1.75},
{"matrix": [2, 2], "label":"A", "x":1.75, "y":2},
{"matrix": [2, 3], "label":"S", "x":2.75, "y":2},
{"matrix": [2, 4], "label":"D", "x":3.75, "y":2},
{"matrix": [2, 5], "label":"F", "x":4.75, "y":2},
{"matrix": [2, 6], "label":"G", "x":5.75, "y":2},
{"matrix": [2, 7], "label":"H", "x":6.75, "y":2},
{"matrix": [2, 8], "label":"J", "x":7.75, "y":2},
{"matrix": [2, 9], "label":"K", "x":8.75, "y":2},
{"matrix": [2, 10], "label":"L", "x":9.75, "y":2},
{"matrix": [2, 11], "label":":", "x":10.75, "y":2},
{"matrix": [2, 12], "label":"@", "x":11.75, "y":2},
{"matrix": [2, 13], "label":"ISO", "x":12.75, "y":2},
{"matrix": [2, 14], "label":"Enter", "x":13.75, "y":2, "w":1.25},
{"matrix": [2, 16], "label":"Home", "x":15.5, "y":2},
{"matrix": [3, 0], "label":"Shift", "x":0, "y":3, "w":1.25},
{"matrix": [3, 1], "label":"\\", "x":1.25, "y":3},
{"matrix": [3, 2], "label":"Z", "x":2.25, "y":3},
{"matrix": [3, 3], "label":"X", "x":3.25, "y":3},
{"matrix": [3, 4], "label":"C", "x":4.25, "y":3},
{"matrix": [3, 5], "label":"V", "x":5.25, "y":3},
{"matrix": [3, 6], "label":"B", "x":6.25, "y":3},
{"matrix": [3, 7], "label":"N", "x":7.25, "y":3},
{"matrix": [3, 8], "label":"M", "x":8.25, "y":3},
{"matrix": [3, 9], "label":"<", "x":9.25, "y":3},
{"matrix": [3, 10], "label":">", "x":10.25, "y":3},
{"matrix": [3, 11], "label":"?", "x":11.25, "y":3},
{"matrix": [3, 13], "label":"Shift", "x":12.25, "y":3, "w":1.75},
{"matrix": [3, 14], "label":"End", "x":15.5, "y":3},
{"matrix": [3, 16], "label":"\u2191", "x":14.25, "y":3.25},
{"matrix": [4, 0], "label":"Ctrl", "x":0, "y":4, "w":1.25},
{"matrix": [4, 1], "label":"Win", "x":1.25, "y":4, "w":1.25},
{"matrix": [4, 2], "label":"Alt", "x":2.5, "y":4, "w":1.25},
{"matrix": [4, 6], "x":3.75, "y":4, "w":6.25},
{"matrix": [4, 10], "label":"AltGr", "x":10, "y":4, "w":1.25},
{"matrix": [4, 11], "label":"Win", "x":11.25, "y":4, "w":1.25},
{"matrix": [4, 13], "label":"\u2190", "x":13.25, "y":4.25},
{"matrix": [4, 14], "label":"\u2193", "x":14.25, "y":4.25},
{"matrix": [4, 15], "label":"\u2192", "x":15.25, "y":4.25}]
}
}
}

View File

@@ -0,0 +1,45 @@
/* Copyright 2023 Drewkeys
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_names {
_BASE,
_FN
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base https://i.imgur.com/viQdtbB.png */
[_BASE] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP,
KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
),
[_FN] = LAYOUT(
QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS, KC_BSPC,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,44 @@
/* Copyright 2023 Drewkeys
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_names {
_BASE,
_FN1
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base https://i.imgur.com/viQdtbB.png */
[_BASE] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP,
KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
),
[_FN1] = LAYOUT(
QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS, KC_BSPC,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@@ -0,0 +1,23 @@
# Mercury65
![Mercury65](https://i.imgur.com/rjfARj3h.jpeg)
*65% Form Factor with a Separated Arrow Cluster used for Mercury65*
* Keyboard Maintainer: [Drewkeys](https://github.com/drewpyun)
* Hardware Supported: Made specifically for Mercury65, 65% hotswap supported
* Hardware Availability: https://www.rocketkeyboards.com/collections/mercury65/products/gb-mercury65-keyboard
Make example for this keyboard (after setting up your build environment):
make drewkeys/mercury65:default
Flashing example for this keyboard:
make drewkeys/mercury65:default:flash
## Bootloader
Resetting Board: Press the button on the PCB next to the spacebar to soft reset the board to reflash (bootloader mode).
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View File

@@ -0,0 +1 @@
# This file intentionally left blank

View File

@@ -15,7 +15,7 @@
},
"indicators": {
"caps_lock": "GP17",
"on_state": 1
"on_state": 0
},
"rgblight": {
"led_count": 2,

View File

@@ -18,11 +18,11 @@
"rows": ["GP11", "GP12", "GP13", "GP1", "GP16"]
},
"indicators": {
"caps_lock": "GP3",
"caps_lock": "GP14",
"on_state": 0
},
"ws2812": {
"pin": "GP14",
"pin": "GP3",
"driver": "vendor"
},
"rgblight": {

View File

@@ -0,0 +1,78 @@
{
"keyboard_name": "mothwing",
"manufacturer": "Luana co.ltd.",
"url": "",
"maintainer": "tan-t",
"usb": {
"vid": "0x4D77",
"pid": "0x0001",
"device_version": "0.0.1"
},
"matrix_pins": {
"cols": ["F4", "F5", "F6", "F7", "B1", "B3"],
"rows": ["D4", "C6", "D7", "E6"]
},
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
"soft_serial_pin": "D2"
},
"development_board": "promicro",
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 1.18},
{"matrix": [0, 1], "x": 1, "y": 1.03},
{"matrix": [0, 2], "x": 2, "y": 0.35},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0.05},
{"matrix": [0, 5], "x": 5, "y": 0.1},
{"matrix": [4, 5], "x": 11.5, "y": 0.1},
{"matrix": [4, 4], "x": 12.5, "y": 0.05},
{"matrix": [4, 3], "x": 13.5, "y": 0},
{"matrix": [4, 2], "x": 14.5, "y": 0.35},
{"matrix": [4, 1], "x": 15.5, "y": 1.08},
{"matrix": [4, 0], "x": 16.5, "y": 1.18},
{"matrix": [1, 0], "x": 0, "y": 2.18},
{"matrix": [1, 1], "x": 1, "y": 2.03},
{"matrix": [1, 2], "x": 2, "y": 1.35},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1.05},
{"matrix": [1, 5], "x": 5, "y": 1.1},
{"matrix": [5, 5], "x": 11.5, "y": 1.1},
{"matrix": [5, 4], "x": 12.5, "y": 1.05},
{"matrix": [5, 3], "x": 13.5, "y": 1},
{"matrix": [5, 2], "x": 14.5, "y": 1.35},
{"matrix": [5, 1], "x": 15.5, "y": 2.03},
{"matrix": [5, 0], "x": 16.5, "y": 2.18},
{"matrix": [2, 0], "x": 0, "y": 3.18},
{"matrix": [2, 1], "x": 1, "y": 3.03},
{"matrix": [2, 2], "x": 2, "y": 2.35},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2.05},
{"matrix": [2, 5], "x": 5, "y": 2.1},
{"matrix": [6, 5], "x": 11.5, "y": 2.1},
{"matrix": [6, 4], "x": 12.5, "y": 2.05},
{"matrix": [6, 3], "x": 13.5, "y": 2},
{"matrix": [6, 2], "x": 14.5, "y": 2.35},
{"matrix": [6, 1], "x": 15.5, "y": 3.03},
{"matrix": [6, 0], "x": 16.5, "y": 3.18},
{"matrix": [3, 2], "x": 4, "y": 3.05},
{"matrix": [3, 3], "x": 5, "y": 3.1},
{"matrix": [3, 4], "x": 6, "y": 3.2, "w": 1.25},
{"matrix": [3, 5], "x": 7.25, "y": 3.5},
{"matrix": [7, 5], "x": 9.25, "y": 3.5},
{"matrix": [7, 4], "x": 10.25, "y": 3.2, "w": 1.25},
{"matrix": [7, 3], "x": 11.5, "y": 3.1},
{"matrix": [7, 2], "x": 12.5, "y": 3.05}
]
}
}
}

View File

@@ -0,0 +1,72 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 Jack Humbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_number {
_QWERTY,
_RAISE,
_LOWER,
};
#define KC_L_SPC LT(_LOWER, KC_SPC) // lower
#define KC_R_ENT LT(_RAISE, KC_ENT) // raise
#define KC_G_JA LGUI_T(KC_LNG1) // cmd or win
#define KC_G_EN LGUI_T(KC_LNG2) // cmd or win
#define KC_C_BS LCTL_T(KC_BSPC) // ctrl
#define KC_A_DEL ALT_T(KC_DEL) // alt
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
//,--------+--------+---------+--------+---------+--------. ,--------+---------+--------+---------+--------+--------.
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT,
//`--------+--------+---------+--------+---------+--------/ \--------+---------+--------+---------+--------+--------'
KC_A_DEL, KC_G_EN, KC_L_SPC, KC_C_BS, KC_C_BS, KC_R_ENT, KC_G_JA, KC_A_DEL
// `----------+--------+---------+--------' `--------+---------+--------+---------'
),
[_RAISE] = LAYOUT(
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
_______, KC_BSLS, KC_CIRC, KC_EXLM, KC_AMPR, KC_PIPE, KC_AT , KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LPRN, KC_HASH, KC_DLR , KC_DQT , KC_QUOT, KC_TILD, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_GRV , KC_RPRN,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, KC_LCBR, KC_LBRC, KC_RBRC, KC_RCBR, _______, _______, _______, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
_______, _______, _______, _______, _______, _______, _______, QK_BOOT
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
[_LOWER] = LAYOUT(
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______, KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, _______, KC_COMM, KC_DOT , KC_SLSH, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
QK_BOOT , _______, _______, _______, _______, _______, _______, _______
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
};

View File

@@ -0,0 +1,72 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 Jack Humbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layer_number {
_QWERTY,
_RAISE,
_LOWER
};
#define KC_L_SPC LT(_LOWER, KC_SPC) // lower
#define KC_R_ENT LT(_RAISE, KC_ENT) // raise
#define KC_G_JA LGUI_T(KC_LNG1) // cmd or win
#define KC_G_EN LGUI_T(KC_LNG2) // cmd or win
#define KC_C_BS LCTL_T(KC_BSPC) // ctrl
#define KC_A_DEL ALT_T(KC_DEL) // alt
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
//,--------+--------+---------+--------+---------+--------. ,--------+---------+--------+---------+--------+--------.
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT,
//`--------+--------+---------+--------+---------+--------/ \--------+---------+--------+---------+--------+--------'
KC_A_DEL, KC_G_EN, KC_L_SPC, KC_C_BS, KC_C_BS, KC_R_ENT, KC_G_JA, KC_A_DEL
// `----------+--------+---------+--------' `--------+---------+--------+---------'
),
[_RAISE] = LAYOUT(
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
_______, KC_BSLS, KC_CIRC, KC_EXLM, KC_AMPR, KC_PIPE, KC_AT , KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LPRN, KC_HASH, KC_DLR , KC_DQT , KC_QUOT, KC_TILD, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_GRV , KC_RPRN,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, KC_LCBR, KC_LBRC, KC_RBRC, KC_RCBR, _______, _______, _______, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
_______, _______, _______, _______, _______, _______, _______, QK_BOOT
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
[_LOWER] = LAYOUT(
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______, KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, _______, KC_COMM, KC_DOT , KC_SLSH, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
QK_BOOT , _______, _______, _______, _______, _______, _______, _______
// `--------+--------+--------+--------' `--------+--------+--------+--------'
)
};

View File

@@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@@ -0,0 +1,23 @@
# MOTHWING
A split keyboard with 3x6 vertically staggered keys and 4 thumb keys.
* Keyboard Maintainer: [tan-t](https://github.com/tan-t)
* Hardware Supported: MOTHWING PCB
* Hardware Availability: currently unavailable. merch will be open around August 2023.
Make example for this keyboard (after setting up your build environment):
make mothwing:default
Flashing example for this keyboard:
make mothwing:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader by:
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

View File

@@ -0,0 +1,100 @@
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
// this is the style you want to emulate.
#include "planck.h"
#include "backlight.h"
#include "keymap_extras/keymap_neo2.h"
#include "keymap_extras/keymap_german.h"
#include "keymap_common.h"
#include "timer.h"
#include "action.h"
#include "action_util.h"
// Max duration that counts as a tap (ms)
#ifndef TAPPING_TERM
#define TAPPING_TERM 200
#endif
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _NE 0
#define _RS 1
#define _LW 2
#define NEO_L1_Y 1
#define M_AT 1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_NE] = { /* Neo 2 Soft */
{KC_TAB, NEO_X, NEO_V, NEO_L, NEO_C, NEO_W, NEO_K, NEO_H, NEO_G, NEO_F, NEO_Q, NEO_Y},
{NEO_L1_L, NEO_U, NEO_I, NEO_A, NEO_E, NEO_O, NEO_S, NEO_N, NEO_R, NEO_T, NEO_D, NEO_L1_R},
{KC_LSFT, NEO_UE, NEO_OE, NEO_AE, NEO_P, NEO_Z, NEO_B, NEO_M, KC_COMM, KC_DOT, NEO_J, SFT_T(KC_ESC)},
{KC_LGUI, KC_LALT, KC_PGUP, KC_PGDN, MO(_LW), KC_SPC, KC_ENT, KC_LCTL, KC_LALT, KC_DEL, KC_BSPC, MO(_RS)}
},
[_RS] = { /* RAISE */
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_NE), KC_MNXT, KC_MPRV, RESET, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_VOLD, KC_VOLU, KC_TRNS}
},
[_LW] = { /* LOWER */
{KC_TRNS, KC_PGUP, KC_DEL, KC_UP, KC_BSPC, KC_PGDN, KC_0, KC_1, KC_2, KC_3, NEO_SS, M(M_AT)},
{KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN,KC_RIGHT, KC_END, KC_GRV, KC_4, KC_5, KC_6, LALT(KC_TAB), KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_PGDN, KC_TRNS, KC_7, KC_8, KC_9, LGUI(S(NEO_Q)), KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_INS)}
}
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_TAP_TOGGLE(_RS),
[1] = ACTION_FUNCTION_TAP(NEO_L1_Y)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
backlight_step();
} else {
unregister_code(KC_RSFT);
}
break;
case M_AT: // @
if (record->event.pressed) {
register_code(NEO_L1_L);
return MACRO(DOWN(NEO_Y), END);
} else {
unregister_code(NEO_L1_L);
return MACRO(UP(NEO_Y), END);
}
break;
}
return MACRO_NONE;
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch (id) {
case NEO_L1_Y:
if (record->event.pressed) {
register_code(NEO_L1_R);
} else {
unregister_code(NEO_L1_R);
if (record->tap.count != 0) {
add_key(NEO_Y);
send_keyboard_report();
del_key(NEO_Y);
unregister_code(NEO_Y);
send_keyboard_report();
}
}
break;
}
}

View File

@@ -0,0 +1 @@
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)

View File

@@ -0,0 +1,5 @@
#pragma once
// Tap/hold window for RSFT_T(KC_ESC) and the right Mod3 tap-for-y key.
#undef TAPPING_TERM
#define TAPPING_TERM 200

View File

@@ -0,0 +1,130 @@
#include QMK_KEYBOARD_H
#include "keymap_extras/keymap_neo2.h"
/*
* audax_osx (Planck) - neo2 for macOS via the *software* neo2 keyboard layout.
*
* Planck counterpart of the ergodox `audax_osx` layout, and a modernised
* rewrite of the old `planck/keymaps/audax` (which used the long-removed
* fn_actions / action_get_macro API and no longer builds).
*
* The base layer and Mod3 send positional NE_* scancodes; the OS neo2 layout
* (neo2-layout-osx .keylayout) produces the characters. Numbers, function keys
* and the cursor block live on firmware layers (_RS / _LW) with real keycodes,
* so they auto-repeat. See layouts/community/ergodox/audax_osx/readme.md for
* the macOS / Karabiner setup.
*
* Mod3 (layer 3, symbols) is held on the '#' key (NE_L3R / KC_NUHS) on both
* Mod3 positions - macOS intercepts CapsLock, so the canonical neo2 Mod3-left
* (NE_L3L) is not used. The right Mod3 key taps to ss (neo2 sharp-s); '@' is
* Mod3 + y.
*/
enum planck_layers {
_NE, // neo2 base (positional scancodes)
_RS, // raise: numbers, function and media keys
_LW // lower: cursor block, numbers, ss and shortcuts
};
enum custom_keycodes {
NEO_L3R_SS = SAFE_RANGE, // right Mod3: hold = Mod3 ('#'), tap = ss (sharp-s)
NEO_AT // @ (neo2 Mod3 + y)
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* _NE: neo2 base
* ,-----------------------------------------------------------------------------------.
* | Tab | X | V | L | C | W | K | H | G | F | Q | Y |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | Mod3 | U | I | A | E | O | S | N | R | T | D |Mod3/ß |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | Shift| Ü | Ö | Ä | P | Z | B | M | , | . | J |Sft/Esc|
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | GUI | Alt | PgUp | PgDn |Lower | Space| Enter| Ctrl | Alt | Del | Bksp |Raise |
* `-----------------------------------------------------------------------------------'
*/
[_NE] = LAYOUT_planck_grid(
KC_TAB, NE_X, NE_V, NE_L, NE_C, NE_W, NE_K, NE_H, NE_G, NE_F, NE_Q, NE_Y,
NE_L3R, NE_U, NE_I, NE_A, NE_E, NE_O, NE_S, NE_N, NE_R, NE_T, NE_D, NEO_L3R_SS,
KC_LSFT, NE_UDIA, NE_ODIA, NE_ADIA, NE_P, NE_Z, NE_B, NE_M, NE_COMM, NE_DOT, NE_J, RSFT_T(KC_ESC),
KC_LGUI, KC_LALT, KC_PGUP, KC_PGDN, MO(_LW), KC_SPC, KC_ENT, KC_LCTL, KC_LALT, KC_DEL, KC_BSPC, MO(_RS)
),
/* _RS: raise - numbers, function keys, media
* ,-----------------------------------------------------------------------------------.
* | ^ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | | F7 | F8 | F9 | F10 | F11 | F12 | ->NE | Next | Prev | Boot | |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | | | | | | | | Play | Vol- | Vol+ | |
* `-----------------------------------------------------------------------------------'
*/
[_RS] = LAYOUT_planck_grid(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_NE), KC_MNXT, KC_MPRV, QK_BOOT, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLD, KC_VOLU, _______
),
/* _LW: lower - cursor block (left), numbers (right), ss, shortcuts
* ,-----------------------------------------------------------------------------------.
* | | PgUp | Del | Up | Bksp | PgDn | 0 | 1 | 2 | 3 | ß | @ |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | | Home | Left | Down | Right| End | ^ | 4 | 5 | 6 |A(Tab)| |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | | | | | | PgDn | | 7 | 8 | 9 |G(S(Q))| |
* |------+------+------+------+------+------+------+------+------+------+------+-------|
* | | | | | | | | | | |S(Ins) |
* `-----------------------------------------------------------------------------------'
*/
[_LW] = LAYOUT_planck_grid(
_______, KC_PGUP, KC_DEL, KC_UP, KC_BSPC, KC_PGDN, KC_0, KC_1, KC_2, KC_3, NE_SS, NEO_AT,
_______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_GRV, KC_4, KC_5, KC_6, LALT(KC_TAB), _______,
_______, _______, _______, _______, _______, KC_PGDN, _______, KC_7, KC_8, KC_9, LGUI(S(NE_Q)), _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, S(KC_INS)
)
};
// Tap/hold state for the right Mod3 key (tap = ss, hold = Mod3 / '#').
static bool l3r_held = false;
static bool l3r_used = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case NEO_L3R_SS:
if (record->event.pressed) {
register_code(NE_L3R); // '#' -> neo2 Mod3 while held
l3r_held = true;
l3r_used = false;
} else {
unregister_code(NE_L3R);
l3r_held = false;
if (!l3r_used) {
tap_code(NE_SS); // pure tap -> ss (neo2 sharp-s)
}
}
return false;
case NEO_AT:
// @ = neo2 Mod3 ('#') + y, held together so it repeats while pressed.
if (record->event.pressed) {
register_code(NE_L3R);
register_code(NE_Y);
} else {
unregister_code(NE_Y);
unregister_code(NE_L3R);
}
return false;
default:
// A separate key pressed while Mod3 is held means it is being used as a
// modifier, so the release must not emit the tap ('y').
if (record->event.pressed && l3r_held) {
l3r_used = true;
}
break;
}
return true;
}

View File

@@ -0,0 +1,46 @@
# audax_osx (Planck) - neo2 for macOS via the software neo2 layout
Planck counterpart of the ergodox `audax_osx` layout, and a modern rewrite of
the old `planck/keymaps/audax` (which used the long-removed `fn_actions` /
`action_get_macro` API and no longer builds).
Like the ergodox layout, it expects the **software neo2 keyboard layout** to be
installed on the Mac (see the full setup in
`layouts/community/ergodox/audax_osx/readme.md`):
- Install [neo2-layout-osx](https://github.com/jgosmann/neo2-layout-osx) and
select it as the active input source.
- The base layer and Mod3 send positional `NE_*` scancodes; the OS neo2 layout
produces the characters.
## Layers
- **`_NE`** - neo2 base. Left/right Mod3 keys both hold `#` (`NE_L3R` /
`KC_NUHS`); macOS intercepts CapsLock, so the canonical Mod3-left (`NE_L3L`)
is not used. The right Mod3 key **taps to `ß`**; `@` (on `_LW`) is Mod3 + y.
- **`_RS`** (hold bottom-right) - number row, F-keys, media, `QK_BOOT`, and
`DF(_NE)` to reset the default layer.
- **`_LW`** (hold bottom-left) - cursor block on the left, numbers on the right,
`ß`, `@`, and a few macOS shortcuts. These are firmware keycodes, so the
cursor keys and numbers auto-repeat when held.
## Building and flashing
Built for a Massdrop/OLKB Planck **rev4** (atmega32u4, mini-USB, USB device
version 0.0.4, `atmel-dfu` bootloader):
```
qmk flash -kb planck/rev4 -km audax_osx
```
Put the board in the bootloader when prompted (physical RESET button on the
PCB; after this layout is flashed, `QK_BOOT` also lives on the `_RS` layer). The
keymap is revision-independent - substitute another target (`rev5`, `rev6`,
`rev6_drop`, ...) if you use a different Planck.
## Notes
- The right Mod3 tap emits `ß` (matching the ergodox `audax_osx`). The original
Planck `audax` tapped `y` here; `ß` was chosen instead since `y` already sits
on the base layer's top-right.
- The old `keyboards/planck/keymaps/audax` is left untouched.

View File

@@ -0,0 +1 @@
BOOTMAGIC_ENABLE = no

View File

@@ -0,0 +1,105 @@
{
"manufacturer": "takashicompany",
"keyboard_name": "miniDivide",
"maintainer": "takashicompany",
"build": {
"lto": true
},
"development_board": "promicro",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"oled": true,
"rgblight": true
},
"matrix_pins": {
"cols": ["D4", "C6", "D7", "E6", "B4"],
"rows": ["F4", "F5", "F6", "F7"]
},
"pin_compatible": "promicro",
"rgblight": {
"animations": {
"alternating": true,
"breathing": true,
"christmas": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
"rgb_test": true,
"snake": true,
"static_gradient": true,
"twinkle": true
},
"led_count": 10,
"sleep": true,
"split_count": [5, 5]
},
"split": {
"enabled": true,
"matrix_pins": {
"right": {
"cols": ["B4", "E6", "D7", "C6", "D4"],
"rows": ["F4", "F5", "F6", "F7"]
}
},
"soft_serial_pin": "D2"
},
"url": "",
"usb": {
"device_version": "0.0.1",
"pid": "0x0037",
"vid": "0x7463"
},
"ws2812": {
"pin": "D3"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0.42},
{"matrix": [0, 1], "x": 0.84, "y": 0.21},
{"matrix": [0, 2], "x": 1.68, "y": 0},
{"matrix": [0, 3], "x": 2.52, "y": 0.21},
{"matrix": [0, 4], "x": 3.36, "y": 0.42},
{"matrix": [4, 0], "x": 6.3, "y": 0.42},
{"matrix": [4, 1], "x": 7.14, "y": 0.21},
{"matrix": [4, 2], "x": 7.98, "y": 0},
{"matrix": [4, 3], "x": 8.82, "y": 0.21},
{"matrix": [4, 4], "x": 9.66, "y": 0.42},
{"matrix": [1, 0], "x": 0, "y": 1.26},
{"matrix": [1, 1], "x": 0.84, "y": 1.05},
{"matrix": [1, 2], "x": 1.68, "y": 0.84},
{"matrix": [1, 3], "x": 2.52, "y": 1.05},
{"matrix": [1, 4], "x": 3.36, "y": 1.26},
{"matrix": [5, 0], "x": 6.3, "y": 1.26},
{"matrix": [5, 1], "x": 7.14, "y": 1.05},
{"matrix": [5, 2], "x": 7.98, "y": 0.84},
{"matrix": [5, 3], "x": 8.82, "y": 1.05},
{"matrix": [5, 4], "x": 9.66, "y": 1.26},
{"matrix": [2, 0], "x": 0, "y": 2.1},
{"matrix": [2, 1], "x": 0.84, "y": 1.89},
{"matrix": [2, 2], "x": 1.68, "y": 1.68},
{"matrix": [2, 3], "x": 2.52, "y": 1.89},
{"matrix": [2, 4], "x": 3.36, "y": 2.1},
{"matrix": [6, 0], "x": 6.3, "y": 2.1},
{"matrix": [6, 1], "x": 7.14, "y": 1.89},
{"matrix": [6, 2], "x": 7.98, "y": 1.68},
{"matrix": [6, 3], "x": 8.82, "y": 1.89},
{"matrix": [6, 4], "x": 9.66, "y": 2.1},
{"matrix": [3, 1], "x": 1.68, "y": 3.15},
{"matrix": [3, 2], "x": 2.52, "y": 3.15},
{"matrix": [3, 3], "x": 3.36, "y": 3.15},
{"matrix": [3, 4], "x": 4.2, "y": 3.15},
{"matrix": [7, 0], "x": 5.46, "y": 3.15},
{"matrix": [7, 1], "x": 6.3, "y": 3.15},
{"matrix": [7, 2], "x": 7.14, "y": 3.15},
{"matrix": [7, 3], "x": 7.98, "y": 3.15}
]
}
}
}

View File

@@ -0,0 +1,70 @@
// Copyright 2023 takashicompany (@takashicompany)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT,
LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC,
KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RGUI, KC_RCTL
),
[1] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
LCTL_T(KC_EQL), KC_LBRC, KC_SLSH, KC_MINS, KC_INT1, KC_SCLN, KC_QUOT, KC_RBRC, KC_NUHS, KC_INT3,
LSFT_T(KC_PLUS), KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[2] = LAYOUT(
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, LGUI(KC_INT3),
KC_PLUS, KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3),
KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[3] = LAYOUT(
LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT,
LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC,
KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(5, KC_SPC), LT(4, KC_LNG1), KC_RGUI, KC_RCTL
),
[4] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
KC_CIRC, KC_AT, KC_SLSH, KC_MINS, KC_UNDS, KC_SCLN, KC_COLN, KC_LBRC, KC_RBRC, KC_INT3,
LT(5, KC_TILD), KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[5] = LAYOUT(
KC_EXLM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_BSLS,
KC_TILD, KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE,
KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[6] = LAYOUT(
KC_ESC, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO,
KC_LCTL, KC_TRNS, KC_QUES, KC_EXLM, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,
KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[7] = LAYOUT(
KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_NO, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(8), MO(9),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[8] = LAYOUT(
RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_NO, KC_NO, DF(0), DF(3),
RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
RGB_M_K, RGB_M_X, RGB_M_G, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};

View File

@@ -0,0 +1,5 @@
// Copyright 2022 takashicompany (@takashicompany)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define DYNAMIC_KEYMAP_LAYER_COUNT 10

View File

@@ -0,0 +1,70 @@
// Copyright 2023 takashicompany (@takashicompany)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT,
LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC,
KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RGUI, KC_RCTL
),
[1] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
LCTL_T(KC_EQL), KC_LBRC, KC_SLSH, KC_MINS, KC_INT1, KC_SCLN, KC_QUOT, KC_RBRC, KC_NUHS, KC_INT3,
LSFT_T(KC_PLUS), KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[2] = LAYOUT(
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, LGUI(KC_INT3),
KC_PLUS, KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3),
KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[3] = LAYOUT(
LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT,
LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC,
KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(5, KC_SPC), LT(4, KC_LNG1), KC_RGUI, KC_RCTL
),
[4] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
KC_CIRC, KC_AT, KC_SLSH, KC_MINS, KC_UNDS, KC_SCLN, KC_COLN, KC_LBRC, KC_RBRC, KC_INT3,
LT(5, KC_TILD), KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[5] = LAYOUT(
KC_EXLM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_BSLS,
KC_TILD, KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE,
KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[6] = LAYOUT(
KC_ESC, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO,
KC_LCTL, KC_TRNS, KC_QUES, KC_EXLM, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,
KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[7] = LAYOUT(
KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_NO, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(8), MO(9),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[8] = LAYOUT(
RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_NO, KC_NO, DF(0), DF(3),
RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
RGB_M_K, RGB_M_X, RGB_M_G, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};

View File

@@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@@ -0,0 +1,48 @@
// Copyright 2023 takashicompany (@takashicompany)
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
#ifdef OLED_ENABLE
oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
return OLED_ROTATION_270;
}
//Variable that stores the number of times the key was pressed
static uint16_t press_count = 0;
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
// Increment the counter when a key is pressed
if (record->event.pressed) {
press_count++;
}
return process_record_user(keycode, record);
}
bool oled_task_kb(void) {
if (!oled_task_user()) { return false; }
oled_write_ln_P(PSTR("mini"), false);
oled_write_ln_P(PSTR("Divide"), false);
oled_set_cursor(0, 5);
oled_write_ln_P(PSTR("Layer"), false);
oled_write_ln(get_u8_str(get_highest_layer(layer_state), ' '), false);
oled_write_ln_P(PSTR(" "), false);
oled_write_ln_P(PSTR(" "), false);
oled_write_ln_P(PSTR("Count"), false);
oled_write_ln(get_u16_str(press_count, ' '), false);
return false;
}
#endif

View File

@@ -0,0 +1,43 @@
# miniDivide
![miniDivide](https://i.imgur.com/x91x9yjh.jpg)
miniDivide is a split keyboard with 0.8u (16mm) key pitch.
The size of a single key is 80% of that of a conventional keyboard key.
Although the key size is more compact than usual, it has the advantage of requiring minimal finger movement.
The number of keys is 19 keys for one hand and 38 keys for two hands.
It is small and thin, making it easy to carry around.
The option to mount a coin cell battery on the PCB is available so that the BLE Micro Pro can be installed.
OLED can also be mounted.
miniDivideは0.8u(16mm)キーピッチの分割型のキーボードです。
一つのキーの大きさが従来のキーボードのキーと比較すると80%のサイズとなっています。
通常よりコンパクトなキーサイズですが、指の動きが最小限で済むという強みがあります。
キー数は片手で19キー、両手で38キーとなります。
小さく、薄いので持ち運びにも便利です。
またBLE Micro Proを搭載できるよう、コイン電池をPCBに搭載するオプションが可能です。
OLEDも搭載できます。
* Keyboard Maintainer: [takashicompany](https://github.com/takashicompany)
* Hardware Supported: PCB, Pro Micro
* Hardware Availability: https://github.com/takashicompany/minidivide
Make example for this keyboard (after setting up your build environment):
make takashicompany/minidivide:default
Flashing example for this keyboard:
make takashicompany/minidivide:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@@ -0,0 +1 @@
# This file intentionally left blank

View File

@@ -0,0 +1,24 @@
/* Copyright 2023 wuque
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

View File

@@ -0,0 +1,128 @@
{
"keyboard_name": "nemui65",
"manufacturer": "wuque",
"maintainer": "spbgzh",
"usb": {
"vid": "0x807C",
"pid": "0x0005",
"device_version": "0.0.1"
},
"matrix_pins": {
"cols": ["C7", "D5", "B5", "B4", "D7", "D6", "D4", "D3", "D2", "D1", "D0", "B7", "B2", "B3", "F7"],
"rows": ["F1", "F0", "C6", "B6", "F5"]
},
"features": {
"bootmagic": true,
"command": false,
"console": false
"extrakey": true,
"mousekey": true,
"nkro": true
"rbglight": true
},
"diode_direction": "COL2ROW",
"indicators": {
"caps_lock": "F6",
"on_state": 0
},
"ws2812": {
"pin": "F4"
},
"rgblight": {
"animations": {
"alternating": true,
"breathing": true,
"christmas": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
"rgb_test": true,
"snake": true,
"static_gradient": true,
"twinkle": true
},
"max_brightness": 200,
"led_count": 1,
"saturation_steps": 8,
"brightness_steps": 8,
"sleep": true
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu",
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [1, 14], "x": 15, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [2, 14], "x": 15, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [3, 14], "x": 15, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25},
{"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [4, 12], "x": 13, "y": 4},
{"matrix": [4, 13], "x": 14, "y": 4},
{"matrix": [4, 14], "x": 15, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,34 @@
/* Copyright 2023 wuque
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT,
_______, _______, _______, _______, _______, _______, _______, _______, _______
),
};

View File

@@ -0,0 +1,34 @@
/* Copyright 2023 wuque
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT,
_______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,2 @@
VIA_ENABLE = yes
LTO_ENABLE = yes

View File

@@ -0,0 +1,27 @@
# Nmui65
More Info at [Nemui65](https://mechsandco.com/products/nemui65)
* Keyboard Maintainer: [spbgzh](https://github.com/spbgzh)
* Hardware Supported: Nemui65
* Hardware Availability: [Nemui65](https://mechsandco.com/products/nemui65)
Make example for this keyboard (after setting up your build environment):
make wuque/nemui65:default
Flashing example for this keyboard:
make wuque/nemui65:default:flash
## Bootloader
Enter the bootloader using one of the following methods:
* Tap the Reset switch mounted on the PCB
* In the case of the default keymap, use the key combination Fn + Delete
* Hold the Esc key while connecting the USB cable (also erases persistent settings)
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View File

@@ -0,0 +1 @@
# This file intentionally left blank

View File

@@ -0,0 +1,162 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "led.h"
#include "debug.h"
#include "timer.h"
#include "keymap_extras/keymap_neo2.h"
#include "keymap_extras/keymap_german.h"
// Layer names
#define BASE 0 // default layer
#define _GA 1
#define _UP 2
#define MDIA 3 // media keys
// Max duration that counts as a tap (ms)
#ifndef TAPPING_TERM
#define TAPPING_TERM 200
#endif
enum custom_keycodes {
NEO_L2_ENT = SAFE_RANGE,
NEO_L1_SS,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_CIRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MPLY,
KC_TAB, NEO_X, NEO_V, NEO_L, NEO_C, NEO_W, MO(MDIA),
KC_CAPS, NEO_U, NEO_I, NEO_A, NEO_E, NEO_O,
KC_LSFT, CTL_T(NEO_UE), ALT_T(NEO_OE), GUI_T(NEO_AE), NEO_P, NEO_Z, MO(_UP),
MT(_GA, KC_HOME), KC_PGDN, KC_PGUP, KC_END, KC_LGUI,
LALT(KC_TAB),KC_LALT,
LSFT(KC_INS),
KC_SPC,KC_BSPC,KC_INS,
// right hand
KC_MNXT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(_GA), NEO_K, NEO_H, NEO_G, NEO_F, NEO_Q, NEO_Y,
NEO_S, NEO_N, NEO_R, NEO_T, NEO_D, NEO_L1_SS,
MEH_T(KC_NO),NEO_B, NEO_M, KC_COMM, KC_DOT, MT(MOD_LGUI|MOD_LCTL, NEO_J), SFT_T(KC_ESC),
CTL_T(KC_LEFT), KC_DOWN, KC_UP, KC_RGHT, KC_LALT,
LALT(KC_LEFT),LALT(KC_RGHT),
LCTL(KC_TAB),
LCTL(LALT(KC_TAB)),KC_TAB, NEO_L2_ENT
),
[_GA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
KC_TRNS, NEO_U, NEO_I, KC_TRNS, KC_TRNS,KC_TRNS,
KC_TRNS, NEO_UE, NEO_OE, NEO_AE, KC_TRNS, KC_TRNS, KC_F5,
KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
KC_F1, KC_F2,
KC_F3,
KC_TRNS, KC_TRNS, KC_F4,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
[_UP] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_DEL, KC_PGDN, KC_UP, KC_PGUP, KC_BSPC, KC_TRNS,
KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT,KC_END,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_DEL, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_TRNS,
KC_TRNS, KC_0, KC_1, KC_2, KC_3, KC_TRNS, NEO_SS,
KC_COMM, KC_4, KC_5, KC_6, KC_TRNS, KC_TRNS,
KC_TRNS, KC_DOT, KC_7, KC_8, KC_9, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS,
KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5,
KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS,
KC_TRNS, KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2,
KC_TRNS, RESET,
KC_TRNS,
KC_BTN1, KC_BTN2, KC_TRNS,
// right hand
KC_TRNS, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11,
KC_TRNS, KC_TRNS, KC_WHOM, KC_WREF, KC_WFWD, KC_TRNS, KC_F12,
KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,
KC_TRNS, KC_WSCH, KC_WBAK, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_WBAK, KC_WFWD
),
};
bool is_ent_pressed = false;
bool tapped_while_ent = false;
bool is_ss_pressed = false;
bool tapped_while_ss = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case NEO_L2_ENT:
if (record->event.pressed) {
register_code(NEO_L2_R);
is_ent_pressed = true;
layer_on(_UP);
} else {
unregister_code(NEO_L2_R);
layer_off(_UP);
is_ent_pressed = false;
if (!tapped_while_ent) {
tap_code(KC_ENT);
}
tapped_while_ent = false;
}
return true;
case NEO_L1_SS:
if (record->event.pressed) {
register_code(NEO_L1_R);
is_ss_pressed = true;
} else {
unregister_code(NEO_L1_R);
is_ss_pressed = false;
if (!tapped_while_ss) {
tap_code(NEO_SS);
}
tapped_while_ss = false;
}
return true;
case KC_BSPC:
if (record->event.pressed) {
if (is_ent_pressed) {
return false;
}
} else {
if (is_ent_pressed) {
tap_code(KC_DEL);
return false;
}
}
}
if (record->event.pressed && is_ent_pressed) {
tapped_while_ent = true;
}
if (record->event.pressed && is_ss_pressed) {
tapped_while_ss = true;
}
return true;
};

View File

@@ -0,0 +1 @@
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)

View File

@@ -0,0 +1,6 @@
#pragma once
// Tap/hold window for the home-row mods (LCTL_T/LALT_T/LGUI_T) and the
// RALT_T(KC_ENT) Mod4 key.
#undef TAPPING_TERM
#define TAPPING_TERM 200

View File

@@ -0,0 +1,259 @@
#include QMK_KEYBOARD_H
#include "layers.h"
#include "keymap_extras/keymap_neo2.h"
/*
* audax_osx - neo2 for macOS via the *software* neo2 keyboard layout.
*
* Unlike the sibling `audax_osx_neo2` layout (which emulates neo2 in firmware
* on top of a US/ABC-Extended macOS layout), this layout expects the neo2
* layout to be installed on the Mac itself:
*
* - neo2-layout-osx (.keylayout / .bundle) provides base, shift and Mod3.
*
* The base/Mod3 keys send *positional* scancodes (the NE_* aliases from
* keymap_extras/keymap_neo2.h); the OS neo2 layout produces those characters.
* See readme.md for the macOS/Karabiner setup.
*
* ---------------------------------------------------------------------------
* neo2 layer switching:
*
* Mod3 (layer 3, symbols): held on both Mod3 keys, which send '#' (NE_L3R /
* KC_NUHS); the OS neo2 .keylayout turns '#' into Mod3. The canonical
* neo2 Mod3-left is CapsLock, but macOS intercepts CapsLock, so it does
* NOT act as Mod3 unless Karabiner remaps caps_lock -> '#'. Sending '#'
* from both keys works out of the box.
*
* Mod4 (layer 4, cursor + numpad): provided as a FIRMWARE layer (NEO_4),
* held via the right-thumb Enter key (NEO_ENT_M4). Kept in firmware -
* not the OS neo2 Mod4 - so the cursor keys auto-repeat when held, like
* the Linux `audax` layout. Mod4 special characters (ordinals, GBP, ...)
* are omitted; add them to NEO_4 if you need them.
* ---------------------------------------------------------------------------
*/
// Custom keycodes.
enum custom_keycodes {
// Right Mod3 key: hold = Mod3 (sends NE_L3R / '#'), tap = ss (neo2 native).
NEO_L3R_SS = SAFE_RANGE,
// Right-thumb Enter: tap = Enter, hold = the firmware Mod4 layer (NEO_4).
NEO_ENT_M4
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* NEO_1: neo2 base layer (positional scancodes)
*
* The character legend below is what the *OS neo2 layout* produces for each
* key; the firmware only sends the matching physical scancode.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | 1/° | 2/§ | 3/ | 4/» | 5/« | MPLY | | MNXT | 6/$ | 7/€ | 8/„ | 9/“ | 0/” | -/— |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TAB | X | V | L | C | W | FKEYS| | RCTL | K | H | G | F | Q | Y |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Mod3-L | CTL/U| ALT/I| GUI/A| E | O |------| |------| S | N | R | T | D | #/ß M3R|
* |--------+------+------+------+------+------| LALT | | MOD4 |------+------+------+------+------+--------|
* | LSHIFT | Ü | Ö | Ä | P | Z | | | | B | M | , | . | J | SFT/ESC|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Home | PGUP | PGDN | End | S(G(a)) | Left | Down | Up | Right| RGUI |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |G(TAB)|G(S(T))| |A(G(Lft))|A(G(Rgt))|
* ,------|------|------| |------+------+------.
* | | | Ins | |A(G(Home))| MO | |
* | Space|Bksp |------| |------|FKEYS | Enter|
* | | | LCTL | | | |/Mod4 |
* `--------------------' `--------------------'
*/
[NEO_1] = LAYOUT_ergodox(
// left hand side - main
KC_ESC, NE_1, NE_2, NE_3, NE_4, NE_5, KC_MPLY,
KC_TAB, NE_X, NE_V, NE_L, NE_C, NE_W, MO(FKEYS),
NE_L3R, LCTL_T(NE_U), LALT_T(NE_I), LGUI_T(NE_A), NE_E, NE_O, /* --- */ // Mod3-left: send '#' like Mod3-right (macOS intercepts CapsLock, so NE_L3L is unreliable)
KC_LSFT, NE_UDIA, NE_ODIA, NE_ADIA, NE_P, NE_Z, KC_LALT,
KC_HOME, KC_PGUP, KC_PGDN, KC_END, LSFT(LGUI(NE_A)), /* --- */ /* --- */
// left hand side - thumb cluster
/* --- */ LGUI(KC_TAB), LGUI(LSFT(KC_TAB)),
/* KC_SPACE */ /* KC_BSPC */ KC_INS,
KC_SPACE, KC_BSPC, KC_LCTL,
// right hand side - main
KC_MNXT, NE_6, NE_7, NE_8, NE_9, NE_0, NE_MINS,
KC_RCTL, NE_K, NE_H, NE_G, NE_F, NE_Q, NE_Y,
/* --- */ NE_S, NE_N, NE_R, NE_T, NE_D, NEO_L3R_SS,
MO(NEO_4), NE_B, NE_M, NE_COMM, NE_DOT, NE_J, RSFT_T(KC_ESC),
/* --- */ /* --- */ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_RGUI,
// right hand side - thumb cluster
LALT(LGUI(KC_LEFT)), LALT(LGUI(KC_RIGHT)), /* --- */
LALT(LGUI(KC_HOME)), /* --- */ /* --- */
MO(FKEYS), KC_SPACE, NEO_ENT_M4
),
/* NEO_4: Mod4 - cursor block (left) + numpad (right)
*
* Firmware layer with real keycodes so the cursor keys auto-repeat when held.
* Held via the right-thumb Enter key. neo2 Mod4 special characters (ordinals,
* GBP, inverted !/?, ...) are omitted as KC_NO.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ---- | ---- | ---- | ---- | ---- | ---- | | | | ---- | Tab | / | * | - | ---- |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | PgUp | Bsp | Up | Del | PgDn | | | | ---- | 7 | 8 | 9 | + | ---- |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Home | Left | Down | Right| End |------| |------| ---- | 4 | 5 | 6 | , | . |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Esc | Tab | Ins |Return| ---- | | | | ---- | 1 | 2 | 3 | ---- | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | 0 | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | Del |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[NEO_4] = LAYOUT_ergodox(
// left hand side - main
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______,
_______, KC_PGUP, KC_BSPC, KC_UP, KC_DELETE, KC_PGDN, _______,
_______, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, /* --- */
_______, KC_ESCAPE, KC_TAB, KC_INSERT, KC_ENTER, KC_NO, _______,
_______, _______, _______, _______, _______, /* --- */ /* --- */
// left hand side - thumb cluster
/* --- */ _______, _______,
/* --- */ /* --- */ _______,
_______, KC_DEL, _______,
// right hand side - main
_______, KC_NO, KC_TAB, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO,
_______, KC_NO, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_NO,
/* --- */ KC_NO, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_COMMA, KC_KP_DOT,
_______, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_NO, _______,
/* --- */ /* --- */ _______, KC_KP_0, _______, _______, _______,
// right hand side - thumb cluster
_______, _______, /* --- */
_______, /* --- */ /* --- */
_______, _______, _______
),
/* FKEYS: Function and media keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Prev | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Play | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Next | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | |VolDn | Mute | VolUp |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[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_DOWN, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP,
/* --- */ /* --- */ _______, _______, _______, _______, _______,
// right hand side - thumb cluster
_______, _______, /* --- */
_______, /* --- */ /* --- */
_______, _______, _______
),
};
// Tracks the tap/hold state of the right Mod3 key so it can send ss on a tap
// while acting as the neo2 Mod3 modifier on a hold.
static bool l3r_held = false;
static bool l3r_used_as_mod3 = false;
// Tracks the tap/hold state of the right-thumb Enter/Mod4 key: a pure tap emits
// Enter, a hold turns on the NEO_4 (Mod4) layer.
static bool ent_held = false;
static bool ent_used = false;
// Runs for each key down or up event.
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case NEO_L3R_SS:
if (record->event.pressed) {
// Engage neo2 Mod3 (the '#' / non-US-# scancode) for as long as held.
register_code(NE_L3R);
l3r_held = true;
l3r_used_as_mod3 = false;
} else {
unregister_code(NE_L3R);
l3r_held = false;
// Nothing else was pressed while held -> it was a tap: send ss.
if (!l3r_used_as_mod3) {
tap_code(NE_SS);
}
}
return false;
case NEO_ENT_M4:
if (record->event.pressed) {
// Hold = neo2 Mod4 as a firmware layer, so its cursor keys auto-repeat.
// (Enter+Backspace = Delete too: NEO_4 maps that thumb key to KC_DEL.)
layer_on(NEO_4);
ent_held = true;
ent_used = false;
} else {
layer_off(NEO_4);
ent_held = false;
// Nothing else was pressed while held -> it was a tap: send Enter.
if (!ent_used) {
tap_code(KC_ENT);
}
}
return false;
default:
break;
}
// A separate keypress while a hold-key is held means that key is acting as a
// modifier/layer, so its own release must not emit its tap code.
if (record->event.pressed) {
if (l3r_held) {
l3r_used_as_mod3 = true;
}
if (ent_held) {
ent_used = true;
}
}
return true;
}
// Runs constantly in the background, in a loop. Lights an LED on the FKEYS layer.
void matrix_scan_user(void) {
uint8_t layer = get_highest_layer(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
if (layer == FKEYS) {
ergodox_right_led_1_on();
}
}

View File

@@ -0,0 +1,10 @@
#pragma once
// Software-neo2 layout: the OS-side neo2 keyboard layout owns the base layer,
// shift and Mod3 (layer 3). Mod4 (layer 4) is kept as a firmware layer so its
// cursor keys auto-repeat when held.
enum layers {
NEO_1, // layer 0: neo2 base (positional scancodes)
NEO_4, // layer 1: neo2 Mod4 - cursor + numpad (firmware, real keycodes)
FKEYS // layer 2: media and function keys (not part of neo2)
};

View File

@@ -0,0 +1,86 @@
# audax_osx - neo2 for macOS via the software neo2 layout + Karabiner-Elements
This is a neo2 ErgoDox layout for macOS that relies on the **software** neo2
keyboard layout installed on the Mac, rather than emulating neo2 in firmware.
It is the software-neo2 counterpart of the sibling `audax_osx_neo2` layout. The
key arrangement, thumb clusters, home-row mods and macOS shortcuts are the same;
the difference is who produces the neo2 characters:
| | `audax_osx_neo2` (old) | `audax_osx` (this) |
| --- | --- | --- |
| macOS input source | US / ABC Extended | **neo2** (installed on the Mac) |
| neo2 letters | faked in firmware | produced by the OS |
| umlauts, ß, €, „ … | Option dead-key macros in firmware | produced by the OS |
| layer 3 (symbols) | firmware layer | produced by the OS |
| layer 4 (cursor/numpad) | firmware layer | firmware layer (so its keys auto-repeat) |
| firmware sends | US scancodes + macros | **positional neo2 scancodes** (`NE_*`) |
Base layer, shift and Mod3 live in the OS neo2 layout, so the firmware stays
small: a neo2 base layer, a Mod4 cursor/numpad layer, a media/function layer,
and two small custom keys.
## Required macOS setup
1. Install the neo2 macOS keyboard layout (`.keylayout` / `.bundle`):
<https://github.com/jgosmann/neo2-layout-osx>
and select it as the active input source. It provides the base layer, shift
and **Mod3**.
2. Optional: install [Karabiner-Elements](https://karabiner-elements.pqrs.org/)
and import <https://github.com/jgosmann/Karabiner-Elements-Neo> only if you
want the OS-side neo2 **layer 6** (math symbols). Mod4 (cursor/numpad) is
handled by the firmware in this layout, so Karabiner is not required for it.
References: [Neo auf dem Apple Macintosh einrichten](https://old-wiki.neo-layout.org/neowiki/wiki/Neo%20auf%20dem%20Apple%20Macintosh%20einrichten).
## Layer switching
**Mod3 (layer 3, symbols)** is handled by the OS neo2 `.keylayout`. Both Mod3
keys send `#` (`KC_NUHS`), which the `.keylayout` treats as Mod3.
| Role | Keycode | Sends | Notes |
| --- | --- | --- | --- |
| Mod3-left | `NE_L3R` | `#` (`KC_NUHS`) | held = Mod3 |
| Mod3-right | `NEO_L3R_SS` | `#` (`KC_NUHS`) | held = Mod3, **tap = ß** |
**Why both Mod3 keys send `#`:** the canonical neo2 Mod3-left is CapsLock, but
macOS intercepts CapsLock and it does not register as a live Mod3 modifier
unless Karabiner explicitly remaps `caps_lock` to the `#` key. Sending `#` from
both keys makes the left Mod3 work out of the box. If you prefer true CapsLock
semantics, add that Karabiner remap and use `NE_L3L` for the left Mod3 key.
**Mod4 (layer 4, cursor + numpad)** is a firmware layer (`NEO_4`), held via the
right-thumb Enter key. It is kept in firmware - not the OS neo2 Mod4 - so the
cursor keys auto-repeat when held, matching the Linux `audax` layout. The neo2
Mod4 special characters are omitted; add them to `NEO_4` in `keymap.c` if wanted.
**Layer 6** (Mod3+Mod4 math symbols) is not available, because Mod4 is not an OS
modifier in this layout. Enable it through Karabiner if you need it.
## Behaviour worth knowing
- **Right Mod3 key (tap = ß):** in neo2 the right-hand Mod3 key is a pure
modifier. To keep the muscle memory from `audax_osx_neo2`, tapping it alone
sends `ß` (neo2's native `NE_SS` position); holding it acts as Mod3
(`NEO_L3R_SS` in `keymap.c`).
- **Enter thumb key (tap = Enter, hold = Mod4, +Backspace = Delete):** the
right-thumb Enter is the custom `NEO_ENT_M4` key. A tap types Enter; a hold
turns on the `NEO_4` firmware layer (cursor + numpad, all auto-repeating). On
that layer the Backspace thumb key is `KC_DEL`, so holding Enter and pressing
Backspace produces Delete - the Enter+Backspace convenience from the Linux
`audax` layout.
- **Dedicated Mod4 key:** the right inner bottom key (row 4, the big 1.5u key by
the thumb cluster) is `MO(NEO_4)` - a real momentary Mod4. Hold it with the
right hand and work the cursor block on the left. The Enter thumb is a second
Mod4 (on hold). Left Option remains on the left outer Alt key.
- **Home-row mods:** left home row is `LCTL_T`/`LALT_T`/`LGUI_T` on `U`/`I`/`A`.
- **`FKEYS` layer** (media + F-keys) is firmware-only; it is not part of neo2 and
lights the first right-hand LED while active.
## Building
```
qmk compile -kb ergodox_ez -km audax_osx
```
(Use the appropriate ErgoDox keyboard target for your board.)

View File

@@ -0,0 +1,7 @@
#pragma once
#undef TAPPING_TERM
#define TAPPING_TERM 200
#undef TAPPING_TOGGLE
#define TAPPING_TOGGLE 2

View File

@@ -0,0 +1,732 @@
#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
// Bit 1 = LMOD state
// Bit 2 = RMOD state
// Bit 3 = Seen other keypress
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_RBRC) //
#define US_OSX_RIGHT_SINGLE_QUOTE LALT(LSFT(KC_RBRC)) //
#define US_OSX_ELLIPSIS LALT(KC_SCLN) // …
#define US_OSX_UNDERSCORE LSFT(KC_MINUS) // _
#define US_OSX_LBRACKET KC_LBRC // [
#define US_OSX_RBRACKET KC_RBRC // ]
#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_BACKSLASH
#define US_OSX_SLASH KC_SLASH // /
#define US_OSX_CLBRACKET LSFT(KC_LBRC) // {
#define US_OSX_CRBRACKET LSFT(KC_RBRC) // }
#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_SCLN) // :
#define US_OSX_AT LSFT(KC_2) // @
#define US_OSX_HASH LSFT(KC_3) // #
#define US_OSX_PIPE LSFT(KC_BACKSLASH) // |
#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_SCLN // ;
// 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
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | 1/° | 2/§ | 3/ | 4/» | 5/« | MPLAY| | MNEXT| 6/$ | 7/€ | 8/„ | 9/“ | 0/” | -/— |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TAB | X | V | L | C | W | FKEYS| | RCTL | K | H | G | F | Q | Y |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | NEO_3 | CTL/U| ALT/I| LGU/A| E | O |------| |------| S | N | R | T | D | ß |
* |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------|
* | LSHIFT | Ü | Ö | Ä | P | Z | | | | B | M | ,/ | ./• | J | SFT/ESC|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Home | PGUP | PGDN | END | SFT(GUI(A)) | Left | Down | Up | Right| RGUI |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |G(TAB)|G(S(T))| |A(G(Lft))|A(G(Rgt))|
* ,------|------|------| |------+------+------.
* | | | Ins | |A(G(Home))|NEO_4/| |
* | Space|Delete|------| |------| Enter|Space |
* | | | LCTL | | FKEYS| | |
* `--------------------' `--------------------'
*/
[NEO_1] = LAYOUT_ergodox(
// left hand side - main
KC_ESC, NEO2_1, NEO2_2, NEO2_3, NEO2_4, NEO2_5, KC_MPLY,
KC_TAB, KC_X, KC_V, KC_L, KC_C, KC_W, MO(FKEYS),
NEO2_LMOD3, LCTL_T(KC_U), LALT_T(KC_I), LGUI_T(KC_A), KC_E, KC_O, /* --- */
KC_LSFT, NEO2_UE, NEO2_OE, NEO2_AE, KC_P, KC_Z, KC_LALT,
KC_HOME, KC_PGUP, KC_PGDN, KC_END, LSFT(LGUI(KC_A)), /* --- */ /* --- */
// left hand side - thumb cluster
/* --- */ LGUI(KC_TAB), LGUI(LSFT(KC_TAB)),
/* KC_SPACE */ /* KC_BSPC */ KC_INS,
KC_SPACE, KC_BSPC, KC_LCTL,
// right hand side - main
KC_MNXT, NEO2_6, NEO2_7, NEO2_8, NEO2_9, NEO2_0, NEO2_MINUS,
KC_RCTL, KC_K, KC_H, KC_G, KC_F, KC_Q, KC_Y,
/* --- */ KC_S, KC_N, KC_R, KC_T, KC_D, NEO2_RMOD3,
KC_RALT, KC_B, KC_M, NEO2_COMMA, NEO2_DOT, KC_J, RSFT_T(KC_ESCAPE),
/* --- */ /* --- */ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_RGUI,
// right hand side - thumb cluster
LALT(LGUI(KC_LEFT)), LALT(LGUI(KC_RIGHT)), /* --- */
LALT(LGUI(KC_HOME)), /* --- */ /* --- */
MO(FKEYS), KC_SPACE, LT(NEO_4, KC_ENTER)
),
/* 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 | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | DEL |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[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_BSPC, KC_UP, KC_DELETE, KC_PGDN, _______,
_______, 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
/* --- */ _______, _______,
/* --- */ /* --- */ _______,
_______, KC_DEL, _______,
// 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_BSLS, 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_LSFT, 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_LCTL, KC_LALT,
/* --- */ /* --- */ KC_HOME,
KC_BSPC, KC_DELETE, KC_END,
// right hand side - main
TO(NEO_1), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
KC_LBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
/* --- */ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE,
KC_NO /* NOOP */, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT,
/* --- */ /* --- */ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_RGUI,
// right hand side - thumb cluster
KC_RALT, KC_RCTL, /* --- */
KC_PGUP, /* --- */ /* --- */
KC_PGDN, KC_ENTER, KC_SPACE
),
/* FKEYS: Function keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Prev | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Play | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Next | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | |VolDn | Mute | VolUp |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[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_DOWN, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP,
/* --- */ /* --- */ _______, _______, _______, _______, _______,
// 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_LCTL);
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_LCTL);
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;
uint8_t command = active_modifiers & MOD_MASK_GUI;
// Early return on key release
if (!record->event.pressed) {
return true;
}
if (shifted) {
clear_mods();
switch (keycode) {
case NEO2_1:
// degree symbol
tap_code16(S(A(KC_8)));
break;
case NEO2_2:
// section symbol
tap_code16(A(KC_6));
break;
case NEO2_3:
if (command) {
tap_code16(S(G(KC_3)));
} else {
// There is no OSX key combination for the script small l character
}
break;
case NEO2_4:
if (command) {
tap_code16(S(G(KC_4)));
} else {
tap_code16(S(A(KC_BACKSLASH)));
}
break;
case NEO2_5:
if (command) {
tap_code16(S(G(KC_5)));
} else {
// left angled quote
tap_code16(A(KC_BACKSLASH));
}
break;
case NEO2_6:
// dollar sign
tap_code16(S(KC_4));
break;
case NEO2_7:
// euro sign
tap_code16(S(A(KC_2)));
break;
case NEO2_8:
// low9 double quote
tap_code16(S(A(KC_W)));
break;
case NEO2_9:
// left double quote
tap_code16(A(KC_LEFT_BRACKET));
break;
case NEO2_0:
// right double quote
tap_code16(S(A(KC_LEFT_BRACKET)));
break;
case NEO2_MINUS:
// em dash
tap_code16(S(A(KC_MINUS)));
break;
case NEO2_COMMA:
// en dash
tap_code16(A(KC_MINUS));
break;
case NEO2_DOT:
// bullet
tap_code16(A(KC_8));
break;
case NEO2_SHARP_S:
// german sharp s
tap_code16(S(KC_S));
break;
case NEO2_UE:
tap_code16(A(KC_U));
tap_code16(S(KC_U));
break;
case NEO2_OE:
tap_code16(A(KC_U));
tap_code16(S(KC_O));
break;
case NEO2_AE:
tap_code16(A(KC_U));
tap_code16(S(KC_A));
break;
default:
set_mods(active_modifiers);
return true;
}
set_mods(active_modifiers);
return false;
} else {
switch (keycode) {
case NEO2_1:
tap_code(KC_1);
break;
case NEO2_2:
tap_code(KC_2);
break;
case NEO2_3:
tap_code(KC_3);
break;
case NEO2_4:
tap_code(KC_4);
break;
case NEO2_5:
tap_code(KC_5);
break;
case NEO2_6:
tap_code(KC_6);
break;
case NEO2_7:
tap_code(KC_7);
break;
case NEO2_8:
tap_code(KC_8);
break;
case NEO2_9:
tap_code(KC_9);
break;
case NEO2_0:
tap_code(KC_0);
break;
case NEO2_MINUS:
tap_code(KC_MINUS);
break;
case NEO2_COMMA:
tap_code(KC_COMMA);
break;
case NEO2_DOT:
tap_code(KC_DOT);
break;
case NEO2_SHARP_S:
// german sharp s
tap_code16(A(KC_S));
break;
case NEO2_UE:
tap_code16(A(KC_U));
tap_code(KC_U);
break;
case NEO2_OE:
tap_code16(A(KC_U));
tap_code(KC_O);
break;
case NEO2_AE:
tap_code16(A(KC_U));
tap_code(KC_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) {
uint8_t active_modifiers = get_mods();
uint8_t shifted = active_modifiers & MOD_MASK_SHIFT;
switch (keycode) {
case KC_LSFT:
if (record->event.pressed) {
capslock_state |= (MOD_BIT(KC_LSFT));
} else {
capslock_state &= ~(MOD_BIT(KC_LSFT));
}
break;
case KC_RIGHT_SHIFT:
if (record->event.pressed) {
capslock_state |= MOD_BIT(KC_RSFT);
} else {
capslock_state &= ~(MOD_BIT(KC_RSFT));
}
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 << 2)) == 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);
// Reset tap detection state
neo3_state &= ~(1 << 3);
layer_on(NEO_3);
} else {
// Turn off NEO_3 layer unless it's enabled through NEO2_LMOD3 as well.
if ((neo3_state & (1 << 1)) == 0) {
layer_off(NEO_3);
}
neo3_state &= ~(1 << 2);
// Was the NEO2_RMOD3 key TAPPED?
if (timer_elapsed(neo3_timer) <= TAPPING_TERM) {
if ((neo3_state & ~(1 << 3)) > 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 ß
if ((neo3_state & (1 << 3)) == 0) {
// german sharp s
if (shifted) {
tap_code16(S(KC_S));
} else {
tap_code16(A(KC_S));
}
}
return false;
}
}
}
break;
default:
if (record->event.pressed && neo3_state > 0) {
// Track that we've seen a separate keypress event
neo3_state |= (1 << 3);
}
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_LOCK);
} else {
register_code(KC_LOCKING_CAPS_LOCK);
}
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 = get_highest_layer(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;
}
};

View File

@@ -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
};

View File

@@ -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/« | MPLY | | MNEXT| 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 |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | | | | | | | | | | | | | | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | | | | | | | | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | | |
,------|------|------| |------+------+------.
| | | | | | | |
| | |------| |------| | |
| | | | | | | |
`--------------------' `--------------------'
```