1
0
Fork 0

Creates a layouts/ folder for keymaps shared between keyboards (#1609)

* include variables and .h files as pp directives

* start layout compilation

* split ergodoxes up

* don't compile all layouts for everything

* might seg fault

* reset layouts variable

* actually reset layouts

* include rules.mk instead

* remove includes from rules.mk

* update variable setting

* load visualizer from path

* adds some more examples

* adds more layouts

* more boards added

* more boards added

* adds documentation for layouts

* use lowercase names for LAYOUT_

* add layout.json files for each layout

* add community folder, default keymaps for layouts

* touch-up default layouts

* touch-up layouts, some keyboard rules.mk

* update documentation for layouts

* fix up serial/i2c switches
This commit is contained in:
Jack Humbert 2017-08-23 22:29:07 -04:00 committed by GitHub
parent 7260fc3eef
commit d2ff66a985
451 changed files with 1651 additions and 1477 deletions

View file

@ -0,0 +1,5 @@
[{a:7},"","","","","","","","","","","","","",{w:2},""],
[{w:1.5},"","","","","","","","","","","","","",{w:1.5},""],
[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
[{w:2.25},"","","","","","","","","","","",{w:2.75},""],
[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"",{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:1.25},""]

View file

@ -0,0 +1,3 @@
# 60_ansi
LAYOUT_60_ansi

View file

@ -0,0 +1,5 @@
[{a:7},"","","","","","","","","","","","","",{w:2},""],
[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},""],
[{w:1.75},"","","","","","","","","","","","",""],
[{w:1.25},"","","","","","","","","","","","",{w:2.75},""],
[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"",{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:1.25},""]

View file

@ -0,0 +1,3 @@
# 60_iso
LAYOUT_60_iso

View file

@ -0,0 +1,22 @@
Unxmaal's GH60 Layout
=====================
* Mostly stolen from /u/robotmaxtron
##Quantum MK Firmware
For the full Quantum feature list, see the parent readme.md.
* Standard Mac ANSI layout
* Spacebar acts as space when tapped, Fn when held
* Menu acts as menu when tapped, Fn2 when held
* Layer1:
* Top row = `~, F1-F12, Del
* JKIL = arrow cluster
* Layer2:
* Top row = media controls
* JKIL = PgDn/Up/Home/Insert
* Backspace = Reset
### Additional Credits
Keymap has been based on various keymaps available from the QMK Repo for the GH60-SATAN and KC60 keyboards.
![wiring](https://i.imgur.com/8b8T1fQ.jpg)

View file

@ -0,0 +1,32 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
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/>.
*/
#ifndef KEYMAP_CONFIG_H
#define KEYMAP_CONFIG_H
#include QMK_KEYBOARD_CONFIG_H
#ifndef RGB_DI_PIN
#define RGB_DI_PIN F4
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 8 // Number of LEDs
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif
#endif

View file

@ -0,0 +1,230 @@
#include QMK_KEYBOARD_H
#include "action_layer.h"
#define _BL 0
#define _AL 1
#define _FL 2
#define _UL 3
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* ANSI Base, Mac style
* ,-----------------------------------------------------------------------------.
* |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| = | Backsp |
* |-----------------------------------------------------------------------------|
* |Tab | Q | W | E | R | T | Y | U | I| O| P| [| ]| \|
* |-----------------------------------------------------------------------------|
* |Caps/Fn | A| S| D| F| G| H| J| K| L| ;| '| Enter |
* |-----------------------------------------------------------------------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift |
* |-----------------------------------------------------------------------------|
* |Fn|Alt |Gui | Space(tapped), Fn(held) |Gui |Alt |Menu(tapped, Fn2(held)|Ctrl|
* `-----------------------------------------------------------------------------'
*/
[_BL] = LAYOUT_60_iso(
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_LCTL,KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT,KC_NO,KC_ENT, \
KC_LSFT,KC_NO,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_NO,KC_RSFT, \
MO(1),KC_LALT,KC_LGUI, LT(1,KC_SPACE), KC_NO, KC_RGUI, KC_RALT, LT(2,KC_MENU), KC_RCTL),
/*
* Pok3r style arrow cluster
* ,-----------------------------------------------------------.
* |`~ | F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12|DEL |
* |-----------------------------------------------------------|
* | | | | | | | | |Up| | | | | |
* |-----------------------------------------------------------|
* | | | | | | | |Left|Down|Right| | | |
* |-----------------------------------------------------------|
* | | | | | | | | | | | | |
* |-----------------------------------------------------------|
* | | | | | | | | |
* `-----------------------------------------------------------'
*/
[_AL] = LAYOUT_60_iso(
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,KC_DELETE, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP,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_LEFT,KC_DOWN,KC_RGHT,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),
/*
* Secondary function layer
* ,-------------------------------------------------------------.
* | | | | | | | | RW|Play|FF| Mute| Vol Down | Vol up |Reset |
* |-------------------------------------------------------------|
* | | | | | | | | | |PgUp| | | | |
* |-------------------------------------------------------------|
* | | | | | | | |Home|PgDown|End| | | |
* |-------------------------------------------------------------|
* | | | | | | | | | | | | |
* |-------------------------------------------------------------|
* | | | | | | | | |
* `-------------------------------------------------------------'
*/
[_FL] = LAYOUT_60_iso(
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MPRV,KC_MPLY,KC_MNXT,KC_MUTE,KC_VOLD,KC_VOLU,RESET, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PGUP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_TRNS,KC_HOME,KC_PGDN,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_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
/*
* Locking layer for controlling the underglow.
* NOTE: currently unused.
*
* ,-----------------------------------------------------------.
* | | | | | | | | | | | | | | |
* |-----------------------------------------------------------|
* | | | | | | | | | | | | | | |
* |-----------------------------------------------------------|
* | |On|Mode| | | | | | | | | | |
* |-----------------------------------------------------------|
* | | |Hue+|Hue-|Sat+|Sat-|Val+|Val-| | | | |
* |-----------------------------------------------------------|
* | | | | | | | | |
* `-----------------------------------------------------------'
*/
[_UL] = LAYOUT_60_iso(
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,F(4),F(5),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,F(6),F(7),F(8),F(9),F(10),F(11),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),
};
enum function_id {
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL,
SHIFT_ESC,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(2), // Momentary Fn overlay
[1] = ACTION_LAYER_TOGGLE(1), // Toggle Arrow Layer overlay
[2] = ACTION_LAYER_TAP_KEY(2, KC_CAPS), // Tap to toggle caps lock and hold to activate function layer
[3] = ACTION_LAYER_TOGGLE(3), // Toggle Underglow Layer overlay
[4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
[5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
[6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[7] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[8] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[9] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[10] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[11] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
[12] = ACTION_FUNCTION(SHIFT_ESC),
[13] = ACTION_LAYER_TAP_KEY(1, KC_SPACE),
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
void matrix_scan_user(void) {
// Layer LED indicators
// ESC led on when in function layer, WASD cluster leds enabled when on arrow cluster
#ifdef KEYBOARD_gh60
uint32_t layer = layer_state;
if (layer & (1<<1)) {
gh60_wasd_leds_on();
} else {
gh60_wasd_leds_off();
}
if (layer & (1<<2)) {
gh60_esc_led_on();
} else {
gh60_esc_led_off();
}
#endif
};
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch (id) {
case RGBLED_TOGGLE:
//led operations
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
static uint8_t shift_esc_shift_mask;
// Shift + ESC = ~
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
}
};

View file

@ -0,0 +1 @@
RGBLIGHT_ENABLE = yes # Enable RGB Underglow

View file

@ -0,0 +1,128 @@
## Layout
### Keymap 0: Basic layer
```
,--------------------------------------------------. ,--------------------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 | = | | L1 | 6 | 7 | 8 | 9 | 0 | - |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| TAB | Q | W | E | R | T | L2 | | L2 | Y | U | I | O | P | \ |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| Esc | A | S | D |LT 3,F| G |------| |------| H | J | K | L |; / : | ' |
|--------+------+------+------+------+------| L1 | |TT(3) |------+------+------+------+------+--------|
| LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|LCTRL | F4 | F5 | LGUI | LALT | | Left | Down | Up | Right| RGUI |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| Copy | Paste| | Alt |Ctrl/Esc|
,------|------|------| |------+--------+------.
| | | PgUp | | PgDn | | |
| Bcksp|OSL(2)|------| |------| Ent |Space |
| | | Del | |OSL(2)| | |
`--------------------' `----------------------'
```
* Double-click `;` to get a `:`
* Press-and-hold `f` to go to the movement layer
### Keymap 1: Code Layer
```
,--------------------------------------------------. ,--------------------------------------------------.
| | | | | | | | | | | | | | | |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | | | | | | F10 | | F11 | | | | | | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | | | | | |------| |------| | | | | | |
|--------+------+------+------+------+------| L2 | | |------+------+------+------+------+--------|
| | | | | | | | | | | | | | | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | | | | F12 |GoToIm| FAR | | |
`----------------------------------' `----------------------------------'
,-------------. ,---------------.
|Format|Build | | Test | DTest |
,------|------|------| |------+--------+------.
| | |Refact| |Sort U| | |
| | |------| |------| | |
| | | | | | | |
`--------------------' `----------------------'
```
* Build - Visualt Studio Build Solution. Sends `CTRL + SHFT + B`
* DTest - Visual Studio Debug Test. Sends `CTRL + R, CTRL + T`
* FAR - Visual Studio Find All References. Sends `CTRL + K, R`
* Format - Visual Studio Format. Sends `CTRL + K, CTRL + D`
* GoToIm - Visual Studio Go To Implementation. Sends `CTRL + F12`
* Refact - Visual Studio Refactor. Sends `CTRL + R, R`
* Sort U - Visual Studio Sort Usings. Sends `CTRL + R, CTRL + G`
* Test - Visual Studio Run Test. Sends `CTRL + R, T`
### Keymap 2: Symbol Layer
```
,---------------------------------------------------. ,--------------------------------------------------.
|Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
|---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
| | ! | @ | ( | ) | | | | | | Up | 7 | 8 | 9 | * | F12 |
|---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | # | $ | { | } | ` |------| |------| Down | 4 | 5 | 6 | + | |
|---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
`---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| EPRM | | | | | | 0 | 0 | . | = | |
`-----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | Caps | | | |
,------|------|------| |------+------+------.
| | |APscr | | | | |
| | |------| |------| | |
| | | PScr | | | | |
`--------------------' `--------------------'
```
* APscr - Take a printscreen of the current app. Sends `Alt + Print Screen`
### Keymap 3: Media and Mouse Keys
```
,--------------------------------------------------. ,--------------------------------------------------.
| | | | | | | | | | | | | | | |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | | | MsUp | | | | | | | | | | | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | |MsLeft|MsDown|MsRght| |------| |------| | | | | | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | | | | | | | | | | | | | | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | Lclk | Rclk | | | | | | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| Back+| Back-| | Vol+ | |
,------|------|------| |------+------+------.
| | |BL_TOG| | Vol- | | |
| | |------| |------| PL/PS| Next |
| | | | | Back | | |
`--------------------' `--------------------'
```
### Keymap 4: Movement
```
,--------------------------------------------------. ,--------------------------------------------------.
| | | | | | | | | | | | | | | |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| |KOpen |KType | | | | | | | Copy | | | | Paste| |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| |DLeft |DRight| LCTL | | |------| |------| Left | Down | Up | Right| | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| |SFT_TB| Tab | | | | | | | | | | | | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | | | | | | | | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | Home | End |
,------|------|------| |------+------+------.
| | | | | | | |
| | LSFT |------| |------| | |
| | | | | | | |
`--------------------' `--------------------'
```
* DLeft - Move to the left Desktop. Sends `Ctrl + Win + Left Arrow`
* DRight - Move to the right Desktop. Sends `Ctrl + Win + Right Arrow`
* KOpen - Opens KeePass. Sends `Ctrl + Alt + k`
* KType - Autotypes KeePass password. Sends `Ctrl + Alt + a`
* SFT_TB - Sends `CTRL + TAB`.

View file

@ -0,0 +1,11 @@
#ifndef CONFIG_H_
#define CONFIG_H_
#include QMK_KEYBOARD_CONFIG_H
#undef TAPPING_TERM
#define TAPPING_TERM 150
#define PERMISSIVE_HOLD
#endif

View file

@ -0,0 +1,381 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
#define CODE 1 // code layer
#define SYMB 2 // symbols
#define MDIA 3 // media keys
#define MOVE 4 // movement layer
enum custom_keycodes {
PLACEHOLDER = SAFE_RANGE, // can always be here
EPRM,
VRSN,
};
enum custom_macros {
VERSION,
EEPROM,
// Windows macros
DLEFT,
DRIGHT,
PSCREEN_APP,
LSFT_TAB,
// VS Macros
REFACTOR,
TEST,
DEBUG_TEST,
FORMAT,
BUILD,
GO_TO_IMPL,
FIND_ALL_REF,
REMOVE_SORT_USINGS,
// KeePass macros
KEEPASS_OPEN,
KEEPASS_TYPE,
};
// NOTE: Cells marked with ACCESS must remain transparent, they're the keys that actually get to that layer
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | = | | L1 | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TAB | Q | W | E | R | T | L2 | | L2 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Esc | A | S | D |LT 3,F| G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| L1 | |MO(3) |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LCTRL | F4 | F5 | LGUI | LALT | | Left | Down | Up | Right| RGUI |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Copy | Paste| | Alt | Lock |
* ,------|------|------| |------+--------+------.
* | | | PgUp | | PgDn | | |
* | Bcksp|OSL(2)|------| |------| Ent |Space |
* | | | Del | | RCtrl| | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
KC_ESC, KC_A, KC_S, KC_D, LT(MOVE, KC_F),KC_G,
OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, TG(CODE),
OSM(MOD_LCTL), KC_F4, KC_F5, KC_LGUI,KC_LALT,
LCTL(KC_C),LCTL(KC_V),
KC_PGUP,
KC_BSPC,OSL(SYMB), KC_DEL,
// right hand
TG(CODE), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
MO(MDIA), KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), OSM(MOD_RSFT),
KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, KC_RGUI,
KC_RALT, KC_LOCK,
KC_PGDN,
KC_RCTL, KC_ENT, KC_SPC
),
/* Keymap 1: Code Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | |ACCESS| | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | F10 | | F11 | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| L2 | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | F12 |GoToIm| FAR | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* |Format|Build | | Test | DTest |
* ,------|------|------| |------+--------+------.
* | | |Refact| |Sort U| | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[CODE] = LAYOUT_ergodox( // layer 1 : code
// left 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_F10,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG(SYMB),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
M(FORMAT),M(BUILD),
M(REFACTOR),
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, 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_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_F12, M(GO_TO_IMPL),M(FIND_ALL_REF),KC_TRNS, KC_TRNS,
M(TEST), M(DEBUG_TEST),
M(REMOVE_SORT_USINGS),
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Symbol Layer
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | ! | @ | ( | ) | | |ACCESS| |ACCESS| Up | 7 | 8 | 9 | * | F12 |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | { | } | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |---------+------+------+------+------+------|ACCESS| | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | EPRM | | | | | | 0 | 0 | . | = | |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | Caps | | | |
* ,------|------|------| |------+------+------.
* | | |APScr | | | | |
* | |ACCESS|------| |------| | |
* | | | PScr | |ACCESS| | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LPRN,KC_RPRN,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LCBR,KC_RCBR,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_CAPS,
M(PSCREEN_APP),
KC_TRNS,KC_TRNS,KC_PSCR,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_0, KC_0, KC_DOT, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 3: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | |
* |--------+------+------+------+------+------| | |ACCESS|------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Back+| Back-| | Vol+ | |
* ,------|------|------| |------+------+------.
* | | |BackTg| | Vol- | | |
* | | |------| |------| PL/PS| Next |
* | | | | | Back | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
BL_INC, BL_DEC,
BL_TOGG,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_VOLU, KC_TRNS,
KC_VOLD,
KC_MPRV, KC_MPLY, KC_MNXT
),
/* Keymap 4: Movement
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | |KOpen |KType | | | | | | | Copy | | | | Paste| |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |DLeft |DRight|LCTRL |ACCESS| |------| |------| Left | Down | Up | Right| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |SFT_TB| TAB | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | Home | End |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | |LSHIFT|------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MOVE] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(KEEPASS_OPEN),M(KEEPASS_TYPE),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(DLEFT), M(DRIGHT), KC_LCTL, KC_TRNS, KC_TRNS,
KC_TRNS, M(LSFT_TAB), KC_TAB, 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_LSFT, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, LCTL(KC_C),KC_TRNS, KC_TRNS, KC_TRNS, LCTL(KC_V),KC_TRNS,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,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_HOME, KC_END,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
)
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case VERSION:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
case EEPROM:
if (record->event.pressed) { // For resetting EEPROM
eeconfig_init();
}
break;
case DLEFT:
if (record->event.pressed) { // Windows move desktop left
return MACRO(D(LCTL), D(LGUI), T(LEFT), U(LGUI), U(LCTL), END);
}
break;
case DRIGHT:
if (record->event.pressed) { // Windows move desktop right
return MACRO(D(LCTL), D(LGUI), T(RIGHT), U(LGUI), U(LCTL), END);
}
break;
case PSCREEN_APP:
if (record->event.pressed) {
return MACRO(D(LALT), T(PSCR), U(LALT), END);
}
break;
case LSFT_TAB:
if (record->event.pressed) {
return MACRO(D(LSFT), T(TAB), U(LSFT), END);
}
case REFACTOR:
if (record->event.pressed) { // VS Refactor CTRL+R, R
return MACRO(D(LCTL), T(R), U(LCTL), T(R), END);
}
break;
case TEST:
if (record->event.pressed) { // VS Run Tests CTRL+R, T
return MACRO(D(LCTL), T(R), U(LCTL), T(T), END);
}
break;
case DEBUG_TEST:
if (record->event.pressed) { // VS Debug Tests CTRL+R, CTRL+T
return MACRO(D(LCTL), T(R), T(T), U(LCTL), END);
}
break;
case FORMAT:
if (record->event.pressed) { // VS Format Document, CTRL+K, CTRL+D
return MACRO(D(LCTL), T(K), T(D), U(LCTL), END);
}
break;
case BUILD:
if (record->event.pressed) { // VS Build. Sends CTRL+SHFT+B
return MACRO(D(LCTL), D(LSFT), T(B), U(LSFT), U(LCTL), END);
}
break;
case GO_TO_IMPL:
if (record->event.pressed) { // VS Go To Implementation. Sends CTRL+F12
return MACRO(D(LCTL), T(F12), U(LCTL), END);
}
break;
case FIND_ALL_REF:
if (record->event.pressed) { // VS Find All References. Sends CTRL+K, R
return MACRO(D(LCTL), T(K), U(LCTL), T(R), END);
}
break;
case REMOVE_SORT_USINGS:
if (record->event.pressed) {
return MACRO(D(LCTL), T(R), T(G), U(LCTL), END);
}
break;
case KEEPASS_OPEN:
if (record->event.pressed) { // Keepass open application
return MACRO(D(LCTL), D(LALT), T(K), U(LALT), U(LCTL), END);
}
break;
case KEEPASS_TYPE:
if (record->event.pressed) { // Keepass autotype
return MACRO(D(LCTL), D(LALT), T(A), U(LALT), U(LCTL), END);
}
break;
}
return MACRO_NONE;
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// dynamically generate these.
case EPRM:
if (record->event.pressed) {
eeconfig_init();
}
return false;
break;
case VRSN:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
}
return true;
}
// 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) {
ergodox_board_led_on();
ergodox_led_all_on();
};

View file

@ -0,0 +1,8 @@
LCD_BACKLIGHT_ENABLE = yes
LCD_ENABLE = yes
BACKLIGHT_ENABLE = yes
NKRO_ENABLE = yes
KEY_LOCK_ENABLE = yes

View file

@ -0,0 +1,33 @@
/*
Note: this is a modified copy of ../default/visualizer.c, originally licensed GPL.
*/
#include "simple_visualizer.h"
// This function should be implemented by the keymap visualizer
// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing
// that the simple_visualizer assumes that you are updating
// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is
// stopped. This can be done by either double buffering it or by using constant strings
static void get_visualizer_layer_and_color(visualizer_state_t* state) {
uint8_t saturation = 60;
if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
saturation = 255;
}
if (state->status.layer & 0x10) {
state->target_lcd_color = LCD_COLOR(140, 100, 60);
state->layer_text = "Movement";
} else if (state->status.layer & 0x8) {
state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF);
state->layer_text = "Media";
} else if (state->status.layer & 0x4) {
state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF);
state->layer_text = "Symbol";
} else if (state->status.layer & 0x2) {
state->target_lcd_color = LCD_COLOR(216, 90, 0xFF);
state->layer_text = "Code";
} else {
state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF);
state->layer_text = "Default";
}
}

View file

@ -0,0 +1,387 @@
[
{
"name": "Beginner's Keymap for Ergodox-EZ",
"author": "Anand Babu Periasamy"
},
[
{
"x": 3.5
},
"#\n3\n\n\nF3",
{
"x": 10.5
},
")\n0\n\n\nF10"
],
[
{
"y": -0.875,
"x": 2.5
},
"@\n2\n\n\nF2",
{
"x": 1
},
"$\n4\n\n\nF4",
{
"x": 8.5
},
"(\n9\n\n\nF9",
{
"x": 1
},
"_\n-\n\n\nF11"
],
[
{
"y": -0.875,
"x": 5.5
},
"%\n5\n\n\nF5",
"^\n6\n\n\nF6",
{
"x": 4.5
},
"&\n7\n\n\nF7",
"*\n8\n\n\nF8"
],
[
{
"y": -0.875,
"w": 1.5
},
"~\n`\n\n\nEsc",
"!\n1\n\n\nF1",
{
"x": 14.5
},
"+\n=\n\n\nF12",
{
"a": 7,
"w": 1.5
},
"Backspace\n\n\n\nBackspace"
],
[
{
"y": -0.375,
"x": 3.5
},
"E\n\n\n\n<i class=\"fa fa-caret-up\" aria-hidden=\"true\"></i>",
{
"x": 10.5
},
"I"
],
[
{
"y": -0.8799999999999999,
"x": 2.5
},
"W"
],
[
{
"y": -0.9950000000000001,
"x": 4.5,
"a": 4
},
"R",
{
"x": 8.5,
"a": 7
},
"U",
{
"x": 1
},
"O"
],
[
{
"y": -0.875,
"x": 5.5
},
"T",
{
"h": 1.5
},
"<i class=\"fa fa-chevron-circle-left\" aria-hidden=\"true\"></i>",
{
"x": 4.5,
"h": 1.5
},
"<i class=\"fa fa-chevron-circle-right\" aria-hidden=\"true\"></i>",
"Y"
],
[
{
"y": -0.875,
"a": 6,
"w": 1.5
},
"Tab",
{
"a": 7
},
"Q",
{
"x": 14.5
},
"P",
{
"a": 4,
"w": 1.5
},
"|\n\\"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 7
},
"D\n\n\n\n<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>",
{
"x": 10.5
},
"K"
],
[
{
"y": -0.875,
"x": 2.5
},
"S\n\n\n\n<i class=\"fa fa-caret-left\" aria-hidden=\"true\"></i>",
{
"x": 1,
"c": "#c4bcbc"
},
"F\n\n\n\n<i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i>",
{
"x": 8.5
},
"J",
{
"x": 1,
"c": "#cccccc"
},
"L"
],
[
{
"y": -0.875,
"x": 5.5
},
"G",
{
"x": 6.5
},
"H"
],
[
{
"y": -0.875,
"a": 4,
"fa": [
0,
0,
0,
2
],
"w": 1.5
},
"\n\n\nCtrl\n\n\nCaps",
{
"a": 7
},
"A",
{
"x": 14.5,
"a": 4
},
":\n;",
{
"a": 7,
"w": 1.5
},
"Enter"
],
[
{
"y": -0.625,
"x": 6.5,
"h": 1.5
},
"PgDn",
{
"x": 4.5,
"h": 1.5
},
"PgUp"
],
[
{
"y": -0.75,
"x": 3.5
},
"C\n\n\n\n<i class=\"fa fa-hand-o-up\" aria-hidden=\"true\"></i>",
{
"x": 10.5,
"a": 4
},
"<\n,"
],
[
{
"y": -0.875,
"x": 2.5,
"a": 7
},
"X\n\n\n\n<i class=\"fa fa-hand-o-left\" aria-hidden=\"true\"></i>",
{
"x": 1
},
"V\n\n\n\n<i class=\"fa fa-hand-o-right\" aria-hidden=\"true\"></i>",
{
"x": 8.5
},
"M",
{
"x": 1,
"a": 4
},
">\n."
],
[
{
"y": -0.875,
"x": 5.5,
"a": 7
},
"B",
{
"x": 6.5
},
"N"
],
[
{
"y": -0.875,
"w": 1.5
},
"Shift",
"Z",
{
"x": 14.5,
"a": 4
},
"?\n/",
{
"w": 1.5
},
"\"\n'"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 7
},
"Alt\n\n\n\n<i class=\"fa fa-search-minus\" aria-hidden=\"true\"></i>",
{
"x": 10.5
},
"<i class=\"fa fa-long-arrow-down\" aria-hidden=\"true\"></i>\n\n\n\n<i class='fa fa-volume-down'></i>"
],
[
{
"y": -0.875,
"x": 2.5
},
"<i class='fa fa-linux'></i>\n\n\n\n<i class=\"fa fa-search\" aria-hidden=\"true\"></i>",
{
"x": 1
},
"Alt\n\n\n\n<i class=\"fa fa-search-plus\" aria-hidden=\"true\"></i>",
{
"x": 8.5
},
"<i class=\"fa fa-long-arrow-left\" aria-hidden=\"true\"></i>\n\n\n\n<i class=\"fa fa-undo\" aria-hidden=\"true\"></i>",
{
"x": 1
},
"<i class=\"fa fa-long-arrow-up\" aria-hidden=\"true\"></i>\n\n\n\n<i class='fa fa-volume-up'></i>"
],
[
{
"y": -0.75,
"x": 0.5
},
"Ctrl\n\n\n\n<i class='fa fa-download'></i>",
"Esc",
{
"x": 14.5
},
"<i class=\"fa fa-long-arrow-right\" aria-hidden=\"true\"></i>\n\n\n\n<i class='fa fa-volume-off'></i>",
"Fn"
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1
},
"<i class=\"fa fa-clone\" aria-hidden=\"true\"></i>",
"("
],
[
{
"h": 2
},
"Space",
{
"h": 2
},
"Del",
"["
],
[
{
"x": 2
},
"{"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3
},
")",
"<i class=\"fa fa-paste\" aria-hidden=\"true\"></i>"
],
[
{
"x": -3
},
"]",
{
"h": 2
},
"Enter",
{
"h": 2
},
"<i class=\"fa fa-chevron-left\" aria-hidden=\"true\"></i>"
],
[
{
"x": -3
},
"}"
]
]

View file

@ -0,0 +1,155 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define FN1 1 // media layer
#define CAPS_CTL CTL_T(KC_CAPS) // Caps on tap, Ctrl on hold.
#define COPY LCTL(KC_V) // C-c Copy
#define PASTE LCTL(KC_V) // C-v Paste
#define ZM_NRM LCTL(KC_0) // C-0 Zoom Normal
#define ZM_OUT LCTL(KC_MINS) // C-- Zoom Out
#define ZM_IN LCTL(KC_PLUS) // C-+ Zoom In
#define EM_UNDO LCTL(KC_UNDS) // C-_ Emacs Undo
#define _MOB 1 // Mobile#
#define _CUS1 2 // Custom macro 1
#define _CUS2 3 // Custom macro 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BSpace |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | Fwd | | Back | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |Caps/Ctl| A | S | D | F | G |------| |------| H | J | K | L | ; | Enter |
* |--------+------+------+------+------+------| PgDn | | PgUp |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | ' |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Ctrl | Esc | LGui | Alt | Alt | | Left | Dn | Up | Right| Fn |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Copy | ( | | ) | Paste|
* ,------|------+------| |------+------+------.
* | | | [ | | ] | | |
* |Space | Del |------| |------| Enter|BSpace|
* | | | { | | } | | |
* `--------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// Left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_WBAK,
CAPS_CTL, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGDN,
KC_LCTL, KC_ESC, KC_LGUI, KC_LALT, KC_LALT,
COPY, KC_LCBR,
KC_LPRN,
KC_SPC, KC_DEL, KC_LBRC,
// Right hand
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_WFWD, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
KC_PGUP, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(FN1),
KC_RCBR, PASTE,
KC_RPRN,
KC_RBRC, KC_ENT, KC_BSPC),
/* Keymap 1: Fn Keys, media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | BSpace |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | LClk | MClk | RClk | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Teensy| | ZmNrm| ZmOut| ZmIn | | Undo |VolDn |VolUp | Mute | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------+------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// FN1 Layer
[FN1] = LAYOUT_ergodox(
// Left hand
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN3, KC_BTN2, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, ZM_NRM, ZM_OUT, ZM_IN,
KC_TRNS, KC_TRNS,
KC_TRNS,
RESET, KC_TRNS, KC_TRNS,
// Right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC,
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_MPLY,
KC_TRNS, M(_MOB), KC_TRNS, M(_CUS1),M(_CUS2),KC_TRNS, KC_TRNS,
EM_UNDO, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case _MOB: // Your mobile# here.
return MACRODOWN(T(1), T(2), T(3), T(MINS),
T(1), T(2), T(3), T(MINS),
T(1), T(2), T(3), T(4),
END);
case _CUS1: // Your custom macro 1
return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(SPC), END);
case _CUS2: // Your custom macro 2
return MACRODOWN(T(L), T(S), T(SPC), T(MINS), T(L), T(ENT), END);
};
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,21 @@
# Beginner's keymap for Ergodox-EZ
Beginner's keymap emulates standard QWERTY keyboard for beginners. Once you get comfortable with the Ergodox-EZ, you may fork this keymap and customize it for your own needs or find a suitable one from the community contributed keymaps.
![Beginner's Keymap](https://i.imgur.com/dAIocc8.png)
#### Pros
* Easier to switch between regular keyboards and Ergodox-EZ.
* Easy on beginners. It has everything you need for your day to day usage.
#### Cons
* Keys are not ergonomically placed to take full advantage of Ergodox-EZ. Take a look at this [Default Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox/keymaps/default/readme.md)
* While multiple layers are possible, beginner's keymap only uses one additional layer for mouse, function and volume keys.
#### Notes
* Ideally number key [6] should have started from the right-hand side of the keyboard. Doing so breaks the familiar QWERTY layout.
* Quote key ['] should have been placed between [:] and [Enter]. Due to lack of key space, it is placed below [Enter].
* Double [Alt] keys are placed adjacent to each other for convenience.
* [CapsLock] also acts as [Ctrl] key when you press and hold. It is convenient for GNU Emacs users.
* Additional bracket keys are placed in the center of the keyboard for programmer's convenience.

View file

@ -0,0 +1,7 @@
# Having a file like this allows you to override Makefile definitions
# for your own particular keymap
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
COMMAND_ENABLE = no # Commands for debug and configuration

View file

@ -0,0 +1,183 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A/L2 | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LS/PO |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RS/PC |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Backsp|------| |------| Tab |Enter |
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
KC_BSPC, LT(MDIA, KC_A), KC_S, KC_D, KC_F, KC_G,
KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSPC,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| left | down | up | down | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | Lclk | Rclk |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_BTN1, KC_BTN2, KC_TRNS,
// 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_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,11 @@
# ErgoDox EZ Absenth Configuration
## Changelog
* Sept. 14, 2016 (V0.2):
* Added Space Cadet to Left and Right Shift. Pressing Left shift with no other key adds an "(" and pressing Right shift with no other key adds an ")"
* Sept. 8, 2016 (V0.1):
* Made A key double as MEDIA Layer change when you hold it. Added mouse buttons to the large thumb buttons on the left side on the Media Layer. Added vi/vim style arrow keys on HJKL on media layer.
![Absenth](https://i.imgur.com/D1enl2x.jpg)

View file

@ -0,0 +1,6 @@
#include QMK_KEYBOARD_CONFIG_H
#undef TAPPING_TERM
#define TAPPING_TERM 300 //At 500 some bad logic takes hold
#define PREVENT_STUCK_MODIFIERS
#define IGNORE_MOD_TAP_INTERRUPT

View file

@ -0,0 +1,174 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
#define FLOCK 1 // symbols arrows and F keys on F held down
#define JLOCK 2 // same as Flock but with fall thru J and mapped to J held down
#define CAPLOCK 3 //caps on until space / enter / esc
#define SFLOCK 11 // symbols arrows and F keys on F held down
#define SJLOCK 12 // same as Flock but with fall thru J and mapped to J held down
#define _______ KC_TRNS
#define XXXXXXX KC_NO
// Sends macro when key is tapped, presses mod when key is held
#define tap_mod_macro(record, mod, macro) ( ((record)->event.pressed) ? \
( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? MACRO(D(mod), END) : MACRO_NONE ) : \
( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : MACRO(U(mod), END) ) )
#define tap_mod_shift(record, mod, macro) ( ((record)->event.pressed) ? \
( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? MACRO(D(mod), END) : MACRO_NONE ) : \
( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (MACRO( D(LSFT), T(LBRC), U(LSFT), END)) : MACRO(U(mod), END) ) )
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layout
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Q | W | E | R | T | | | | Y | U | I | O | P | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | A | S | D | F | G |------| |------| H | J | K | L |; | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Z | X | C | V | B | | | | N | M | , | . | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+--------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `----------------------'
*/
[BASE] = LAYOUT_ergodox(
// left hand
GUI_T(KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS,
_______, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TAB,
_______, SFT_T(KC_A), ALT_T(KC_S), CTL_T(KC_D), F(FLOCK), GUI_T(KC_G),
_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BSPC,
_______, _______, _______, _______ ,_______,
_______, _______,
_______,
KC_SPC, _______, _______ ,
// right hand
KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
KC_TAB, KC_Y, KC_U, KC_I, KC_O, KC_P, _______,
GUI_T(KC_H), F(JLOCK), CTL_T(KC_K), ALT_T(KC_L), SFT_T(KC_SCLN), _______,
KC_DELETE, KC_N, KC_M, KC_COMM,KC_DOT, KC_QUOT, _______,
_______, _______,_______,_______, _______,
_______, _______,
_______,
_______,_______, KC_ENT
),
[FLOCK] = LAYOUT_ergodox(
// left hand
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
XXXXXXX,KC_LBRC,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,
XXXXXXX,S(KC_LBRC),XXXXXXX, XXXXXXX,_______,XXXXXXX,
XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,TO(CAPLOCK),XXXXXXX,
XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,
XXXXXXX,XXXXXXX,
XXXXXXX,
KC_ESC,XXXXXXX,XXXXXXX,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX,
XXXXXXX, XXXXXXX, KC_HOME, KC_PGUP, XXXXXXX, KC_RBRC, XXXXXXX,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, S(KC_RBRC), XXXXXXX,
XXXXXXX, XXXXXXX, KC_END, KC_PGDOWN, KC_QUES, KC_SLSH, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX,
XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX
),
[JLOCK] = LAYOUT_ergodox(
// left hand
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
XXXXXXX,KC_LBRC,KC_GRV, KC_TILD,XXXXXXX,XXXXXXX,XXXXXXX,
XXXXXXX,S(KC_LBRC),XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,
XXXXXXX,KC_BSLS,KC_PIPE,XXXXXXX,XXXXXXX,TO(CAPLOCK),XXXXXXX,
XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,
XXXXXXX,XXXXXXX,
XXXXXXX,
KC_ESC,XXXXXXX,XXXXXXX,
// right hand
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RBRC, XXXXXXX,
XXXXXXX, _______, XXXXXXX, XXXXXXX, S(KC_RBRC), XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX,
XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX
),
[CAPLOCK] = LAYOUT_ergodox(
// left hand
TO(BASE), _______, _______, _______, _______, _______, _______,
_______, S(KC_Q), S(KC_W), S(KC_E), S(KC_R), S(KC_T), _______,
// _______, SFT_T(S(KC_A)), ALT_T(KC_S), CTL_T(KC_D), F(FLOCK), GUI_T(KC_G),
_______, S(KC_A), S(KC_S), S(KC_D), S(KC_F), S(KC_G),
_______, S(KC_Z), S(KC_X), S(KC_C), S(KC_V), S(KC_B), _______,
_______, _______, _______, _______ ,_______,
_______, _______,
_______,
TO(BASE), _______, _______ ,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, S(KC_Y), S(KC_U), S(KC_I), S(KC_O), S(KC_P), _______,
S(KC_H), S(KC_J), S(KC_K), S(KC_L), S(KC_SCLN), _______,
_______, S(KC_N), S(KC_M), S(KC_COMM),S(KC_DOT), S(KC_QUOT), _______,
_______, _______,_______,_______, _______,
_______, _______,
_______,
_______,_______, TO(BASE)
)
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_KEY(FLOCK,KC_F),
[2] = ACTION_LAYER_TAP_KEY(JLOCK,KC_J),
[11] = ACTION_LAYER_TAP_KEY(FLOCK,LSFT(KC_F)),
[12] = ACTION_LAYER_TAP_KEY(JLOCK,LSFT(KC_J))
};
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) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
break;
case 2:
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,3 @@
# Adam's ErgoDox
Currently only really uses keys available on Let's Split, for ease of switching

View file

@ -0,0 +1,185 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "keymap_german.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Del | K | . | O | , | Y | L1 | | L1 | V | G | C | L | ß | Z |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | H | A | E | I | U |------| |------| D | T | R | N | S | F |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |X/Ctrl| Q | Ä | Ü | Ö | | | | B | P | W | M | J | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Enter |------| |------| Tab |RShift|
* | | | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
KC_DELT, DE_K, DE_DOT, DE_O, DE_COMM,DE_Y, TG(SYMB),
KC_BSPC, DE_H, DE_A, DE_E, DE_I, DE_U,
KC_LSFT, CTL_T(DE_X), DE_Q, DE_AE, DE_UE, DE_OE, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_ENT ,KC_END,
// right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), DE_V, DE_G, DE_C, DE_L, DE_SS, DE_Z,
DE_D, DE_T, DE_R, DE_N, LT(MDIA, DE_S), GUI_T(KC_F),
MEH_T(KC_NO),KC_B, KC_P, KC_W, KC_M, CTL_T(KC_J), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_TAB, KC_RSFT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,7 @@
# Basic implementation for k.o,y variant of the adnw layout
adnw is a layout optimised for usage with german and english language
k.o,y is a variant of this layout
http://www.adnw.de/index.php?n=Main.SeitlicheNachbaranschl%C3%A4ge
The os must use the de_DE layout

View file

@ -0,0 +1,12 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include QMK_KEYBOARD_CONFIG_H
/* using UK layout for space-cadet-shift */
#define LSPO_KEY KC_9
#define RSPC_KEY KC_0
#define LEADER_TIMEOUT 800 // leader key sequence timeout in millis
#endif

View file

@ -0,0 +1,661 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#include <stdarg.h>
/* use UK keymap */
#define UK_HASH KC_NONUS_HASH
#define UK_BSLS KC_NONUS_BSLASH
#define UK_PIPE LSFT(UK_BSLS)
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define NUMB 2 // numbers and hex
#define CRSR 3 // cursor keys
#define MOUS 4 // mouse keys
#define KEYW 5 // keyword macros
#define EMAC 6 // emacs
// my macros
#define UM_ECET M(0) // { }
#define UM_0x M(1)
#define UM_PUB M(2)
#define UM_PRO M(3)
#define UM_PRV M(4)
#define UM_CLS M(5)
#define UM_STR M(6)
#define UM_RET M(7)
#define UM_INC M(8)
#define UM_OBJ M(9)
#define UM_GITLOG M(10)
#define UM_GOODM M(11)
#define UM_NAMESP M(12)
#define UM_EMTR M(14) // emacs toggle read-only
#define UM_EMWR M(15) // emacs write buffer (save)
#define UM_EMUN M(16) // emacs undo
#define UM_EMRE M(17) // emacs redo
#define UM_EMPB M(18) // emacs previous buffer
#define UM_EMNB M(19) // emacs next buffer
#define UM_GOODN M(20)
#define UM_ECETS M(22) // { };
#define UM_TMPL M(23)
#define UM_TYPN M(24)
#define UM_CONT M(25)
#define UM_BREAK M(26)
#define UM_CONST M(27)
#define UM_SMILY M(28)
#define UM_SADF M(29)
#define UM_SCARF M(30)
#define UM_DECAF M(31)
#define UM_OPER M(32)
#define UM_NULP M(33)
#define UM_EXTR M(34)
#define UM_VIRT M(35)
#define UM_EMFB M(36) // emacs font bigger
#define UM_EMFS M(37) // emacs font smaller
#define UM_VOLAT M(38)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Base layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | SfLt | | SfRt | 6 | 7 | 8 | 9 | 0 | BkSp |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | Del |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Caps/L2| A | S | D | F | G |------| |------| H | J | K | L | ; |Enter/L2|
* |--------+------+------+------+------+------| L6 | | L6 |------+------+------+------+------+--------|
* | LSft/( | Z | X | C | V/L3 | B/L4 | | | | N/L4 | M/L3 | , | . | / | RSft/) |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Ctrl/[| Alt/]| # | Left |Right | | Up | Down | - | Alt/[|Ctrl/]|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | L2 | lead | | lead | Ins |
* ,------|------|------| |------+------+------.
* | Space| BkSp | Home | | PgUp | Enter|Space |
* | / | / |------| |------| / | / |
* | Ctrl | Alt |End/L5| |PDn/L5| Alt | Ctrl |
* `--------------------' `--------------------'
*/
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LSFT(KC_LEFT),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MO(SYMB),
LT(NUMB, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSPO, KC_Z, KC_X, KC_C, LT(CRSR, KC_V), LT(MOUS, KC_B), MO(EMAC),
CTL_T(KC_LBRC), ALT_T(KC_RBRC), UK_HASH, KC_LEFT, KC_RGHT,
TG(NUMB), KC_LEAD,
KC_HOME,
CTL_T(KC_SPC), ALT_T(KC_BSPC), LT(KEYW, KC_END),
// right hand
LSFT(KC_RGHT), KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
MO(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DELT,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(NUMB, KC_ENT),
MO(EMAC), LT(MOUS, KC_N), LT(CRSR, KC_M), KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
KC_UP, KC_DOWN, KC_MINS, ALT_T(KC_LBRC), CTL_T(KC_RBRC),
KC_LEAD, KC_INS,
KC_PGUP,
LT(KEYW, KC_PGDN), ALT_T(KC_ENT), CTL_T(KC_SPC)
),
/* Keymap 1: Symbol Layer with F keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ## | F1 | F2 | F3 | F4 | F5 | ## | | ## | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | ## | ! | " | £ | $ | % | ## | | ## | - | + | = | @ | ~ | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ## | ^ | & | * | _ | # |------| |------| { | } | ; | ' | # | ## |
* |--------+------+------+------+------+------| ## | | ## |------+------+------+------+------+--------|
* | ## | \ | | | ` | - | / | | | | [ | ] | < | > | ? | ## |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ## | ## | ## | ## | ## | | ## | ## | ## | ## | ## |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | ## | ## | | ## | ## |
* ,------|------|------| |------+------+------.
* | | | ## | | ## | | |
* | ## | ## |------| |------| ## | ## |
* | | | ## | | ## | | |
* `--------------------' `--------------------'
*/
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS, KC_EXLM, LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), KC_TRNS,
KC_TRNS, LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_MINS), UK_HASH,
KC_TRNS, UK_BSLS, UK_PIPE, KC_GRV, KC_MINS, KC_SLSH, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_MINS, KC_PLUS, KC_EQL, LSFT(KC_QUOT), LSFT(UK_HASH), KC_F12,
KC_LCBR, KC_RCBR, KC_SCLN, KC_QUOT, UK_HASH, KC_TRNS,
KC_TRNS, KC_LBRC, KC_RBRC, LSFT(KC_COMM), LSFT(KC_DOT), LSFT(KC_SLSH), KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Numerics and hex
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* | ## | A | B | C | D | E | F | | A | B | C | D | E | F | ## |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | ## | * | 7 | 8 | 9 | * | 0x | | 0x | * | 7 | 8 | 9 | * | ## |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ## | / | 4 | 5 | 6 | / |------| |------| / | 4 | 5 | 6 | / | ## |
* |---------+------+------+------+------+------| ## | | ## |------+------+------+------+------+--------|
* | ## | - | 1 | 2 | 3 | - | | | | - | 1 | 2 | 3 | - | ## |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | = | + | 0 | , | . | | 0 | , | . | + | = |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | ## | ## | | ## | ## |
* ,------|------|------| |------+------+------.
* | | | ## | | ## | | |
* | ## | ## |------| |------| ## | ## |
* | | | ## | | ## | | |
* `--------------------' `--------------------'
*/
[NUMB] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F,
KC_TRNS, KC_ASTR, KC_7, KC_8, KC_9, KC_ASTR, UM_0x,
KC_TRNS, KC_SLSH, KC_4, KC_5, KC_6, KC_SLSH,
KC_TRNS, KC_MINS, KC_1, KC_2, KC_3, KC_MINS, KC_TRNS,
KC_EQL, KC_PLUS, KC_0, KC_COMM, KC_DOT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_TRNS,
UM_0x, KC_ASTR, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS,
KC_SLSH, KC_4, KC_5, KC_6, KC_SLSH, KC_TRNS,
KC_TRNS, KC_MINS, KC_1, KC_2, KC_3, KC_MINS, KC_TRNS,
KC_0, KC_COMM, KC_DOT, KC_PLUS, KC_EQL,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 3: Cursor movement
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | Home | | Up | | PgUp | | | | PgUp | | Up | | Home | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | End | Left | Down | Right| PgDn |------| |------| PgDn | Left | Down | Right| End | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ## | Up | | Down | ## | | | | | | ## | Down | | Up | ## |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Left | Down | Right| | | | | | Left | Down | Right|
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | ## | ## |------| |------| ## | ## |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[CRSR] = LAYOUT_ergodox(
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_HOME, KC_NO, KC_UP, KC_NO, KC_PGUP, KC_NO,
KC_NO, KC_END, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN,
KC_TRNS, KC_UP, KC_NO, KC_DOWN, KC_TRNS, KC_NO, KC_NO,
KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_TRNS, KC_TRNS, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_PGUP, KC_NO, KC_UP, KC_NO, KC_HOME, KC_NO,
KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_NO,
KC_NO, KC_NO, KC_TRNS, KC_DOWN, KC_NO, KC_UP, KC_TRNS,
KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_TRNS, KC_TRNS
),
/* Keymap 4: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | Lclk | MsUp | Rclk | | | | | | Lclk | MsUp | Rclk | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| |MsLeft|MsDown|MsRght| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Lclk | MsUp | Rclk |MsDown| | ## | | | | ## | |MsDown| Lclk | MsUp | Rclk |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |MsLeft|MsDown|MsRight | | | | |MsLeft|MsDown|MsRght|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[MOUS] = LAYOUT_ergodox(
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, KC_NO,
KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO,
KC_BTN1, KC_MS_U, KC_BTN2, KC_MS_D, KC_NO, KC_TRNS, KC_NO,
KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, KC_NO,
KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO,
KC_NO, KC_TRNS, KC_NO, KC_MS_D, KC_BTN1, KC_MS_U, KC_BTN2,
KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO
),
/* Keymap 5: Keywords
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* | | | | scarf| sadf | smily| | | | decaf| | | | | |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | const| volat| oper | ret | tmpl | | | | typen| cont | prv | pro | pub | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | str | obj | | gitl |------| |------| | | | nulp | | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | extr | cls | virt | break| | | |namesp| goodm| goodn| | | |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | inc | | | | | | | | |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | ecet | ecets|
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | ## | | ## | | |
* `--------------------' `--------------------'
*/
[KEYW] = LAYOUT_ergodox(
// left hand
KC_NO, KC_NO, KC_NO, UM_SCARF, UM_SADF, UM_SMILY, KC_NO,
KC_NO, UM_CONST, UM_VOLAT, UM_OPER, UM_RET, UM_TMPL, KC_NO,
KC_NO, KC_NO, UM_STR, UM_OBJ, KC_NO, UM_GITLOG,
KC_NO, KC_NO, UM_EXTR, UM_CLS, UM_VIRT, UM_BREAK, KC_NO,
KC_NO, KC_NO, UM_INC, KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_TRNS,
// right hand
KC_NO, UM_DECAF, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, UM_TYPN, UM_CONT, UM_PRV, UM_PRO, UM_PUB, KC_NO,
KC_NO, KC_NO, KC_NO, UM_NULP, KC_NO, KC_NO,
KC_NO, UM_NAMESP, UM_GOODM, UM_GOODN, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
UM_ECET, UM_ECETS,
KC_NO,
KC_TRNS, KC_NO, KC_NO
),
/* Keymap 6: emacs
*
* ,---------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | empb | | emnb | emfs | emfb | | | | |
* |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | emtr | | | | | | | | emun | emre | w-up | | | |
* |---------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | emwr | | | |------| |------| |w-left|w-down|w-rght| | |
* |---------+------+------+------+------+------| ## | | ## |------+------+------+------+------+--------|
* | | | | | | | | | | | |w-down| | | |
* `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[EMAC] = LAYOUT_ergodox(
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, UM_EMPB,
KC_NO, UM_EMTR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, UM_EMWR, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO,
// right hand
UM_EMNB, UM_EMFS, UM_EMFB, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, UM_EMUN, UM_EMRE, LSFT(KC_UP), KC_NO, KC_NO, KC_NO,
KC_NO, LSFT(KC_LEFT), LSFT(KC_DOWN), LSFT(KC_RGHT), KC_NO, KC_NO,
KC_TRNS, KC_NO, KC_NO, LSFT(KC_DOWN), KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO
),
};
enum next_key_down_up {
NK_DOWN_UP,
NK_DOWN,
NK_UP // a bit of a hack, this works as long as NK_UP < KC_A
};
void send_keystrokes(uint8_t key, ...)
{
va_list vl;
va_start(vl, key);
enum next_key_down_up nkdu = NK_DOWN_UP;
while (key != KC_NO) {
if (key < KC_A) {
nkdu = key;
} else {
switch (nkdu) {
case NK_DOWN_UP:
register_code(key);
case NK_UP:
unregister_code(key);
break;
case NK_DOWN:
register_code(key);
}
nkdu = NK_DOWN_UP;
}
key = va_arg(vl, int);
}
va_end(vl);
}
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) {
return MACRO(T(ENT), D(LSFT), T(LBRC), U(LSFT), T(ENT),
D(LSFT), T(RBRC), U(LSFT), T(UP),
T(TAB), END);
}
break;
case 1:
if (record->event.pressed) {
return MACRO(T(0), T(X), END);
}
break;
case 2:
if (record->event.pressed) {
SEND_STRING("public");
}
break;
case 3:
if (record->event.pressed) {
SEND_STRING("protected");
}
break;
case 4:
if (record->event.pressed) {
SEND_STRING("private");
}
break;
case 5: // class
if (record->event.pressed) {
return MACRO(T(C), T(L), T(A), T(S), T(S), T(ENT),
D(LSFT), T(LBRC), U(LSFT), T(ENT),
T(P), T(U), T(B), T(L), T(I), T(C),
D(LSFT), T(SCLN), U(LSFT), T(ENT), T(ENT),
T(P), T(R), T(I), T(V), T(A), T(T), T(E),
D(LSFT), T(SCLN), U(LSFT), T(ENT),
D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(ENT),
T(UP), T(UP), T(UP), T(UP), T(UP), T(UP), T(UP),
T(END), T(SPC), END);
}
break;
case 6: // struct
if (record->event.pressed) {
return MACRO(T(S), T(T), T(R), T(U), T(C), T(T), T(ENT),
D(LSFT), T(LBRC), U(LSFT), T(ENT),
D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(ENT),
T(UP), T(UP), T(UP), T(UP),
T(END), T(SPC), END);
}
break;
case 7:
if (record->event.pressed) {
SEND_STRING("return");
}
break;
case 8: // #include
if (record->event.pressed) {
return MACRO(T(NONUS_HASH), T(I), T(N), T(C), T(L), T(U), T(D), T(E), END);
}
break;
case 9:
if (record->event.pressed) {
SEND_STRING("objdump -CT -x -d");
}
break;
case 10:
if (record->event.pressed) {
SEND_STRING("git log --oneline --graph --decorate=short");
}
break;
case 11:
if (record->event.pressed) {
SEND_STRING("good morning");
}
break;
case 12:
if (record->event.pressed) {
SEND_STRING("namespace");
}
break;
case 14: // emacs toggle read-only
if (record->event.pressed) {
return MACRO(D(LCTL), T(X), T(Q), U(LCTL), END);
}
break;
case 15: // emacs write buffer
if (record->event.pressed) {
return MACRO(D(LCTL), T(X), T(S), U(LCTL), END);
}
break;
case 16: // emacs undo
if (record->event.pressed) {
return MACRO(D(LCTL), D(LSFT), T(MINS), U(LSFT), U(LCTL), END);
}
break;
case 17: // emacs redo
if (record->event.pressed) {
return MACRO(D(LALT), D(LSFT), T(MINS), U(LSFT), U(LALT), END);
}
break;
case 18: // emacs previous buffer
if (record->event.pressed) {
return MACRO(D(LCTL), T(X), U(LCTL), T(LEFT), END);
}
break;
case 19: // emacs next buffer
if (record->event.pressed) {
return MACRO(D(LCTL), T(X), U(LCTL), T(RGHT), END);
}
break;
case 20:
if (record->event.pressed) {
SEND_STRING("good night");
}
break;
case 22: // { };
if (record->event.pressed) {
return MACRO(T(ENT), D(LSFT), T(LBRC), U(LSFT), T(ENT),
D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(UP),
T(TAB), END);
}
break;
case 23:
if (record->event.pressed) {
SEND_STRING("template");
}
break;
case 24:
if (record->event.pressed) {
SEND_STRING("typename");
}
break;
case 25:
if (record->event.pressed) {
SEND_STRING("continue");
return MACRO(T(SCLN), END);
}
break;
case 26:
if (record->event.pressed) {
SEND_STRING("break");
return MACRO(T(SCLN), END);
}
break;
case 27:
if (record->event.pressed) {
SEND_STRING("const");
}
break;
case 28:
if (record->event.pressed) {
SEND_STRING(":-)");
}
break;
case 29:
if (record->event.pressed) {
SEND_STRING(":-(");
}
break;
case 30: // dazed
if (record->event.pressed) {
send_keystrokes(NK_DOWN, KC_LSFT, KC_8, KC_MINS, KC_8, NK_UP, KC_LSFT, KC_NO);
}
break;
case 31: // decaf
if (record->event.pressed) {
send_keystrokes(NK_DOWN, KC_LSFT, KC_C, KC_9, KC_MINS, KC_0, NK_UP, KC_LSFT, KC_NO);
}
break;
case 32:
if (record->event.pressed) {
SEND_STRING("operator");
}
break;
case 33:
if (record->event.pressed) {
SEND_STRING("nullptr");
}
break;
case 34:
if (record->event.pressed) {
SEND_STRING("extern");
}
break;
case 35:
if (record->event.pressed) {
SEND_STRING("virtual");
}
break;
case 36: // emacs font smaller
if (record->event.pressed) {
return MACRO(D(LCTL), T(X), T(EQL), U(LCTL), END);
}
break;
case 37: // emacs font bigger
if (record->event.pressed) {
return MACRO(D(LCTL), T(X), T(MINS), U(LCTL), END);
}
break;
case 38:
if (record->event.pressed) {
SEND_STRING("volatile");
}
break;
}
return MACRO_NONE;
}
LEADER_EXTERNS();
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_TWO_KEYS(KC_G, KC_A) {
SEND_STRING("git add .");
}
SEQ_TWO_KEYS(KC_G, KC_D) {
SEND_STRING("git diff");
}
SEQ_THREE_KEYS(KC_G, KC_D, KC_S) {
SEND_STRING("git diff --staged");
}
SEQ_TWO_KEYS(KC_G, KC_L) {
SEND_STRING("git log");
}
SEQ_THREE_KEYS(KC_G, KC_L, KC_O) {
SEND_STRING("git log --oneline");
}
SEQ_TWO_KEYS(KC_G, KC_F) {
SEND_STRING("git fetch");
}
SEQ_TWO_KEYS(KC_G, KC_O) {
SEND_STRING("git checkout");
}
SEQ_TWO_KEYS(KC_G, KC_P) {
SEND_STRING("git pull");
}
SEQ_TWO_KEYS(KC_G, KC_S) {
SEND_STRING("git status");
}
SEQ_TWO_KEYS(KC_G, KC_C) {
SEND_STRING("git commit -m ''");
send_keystrokes(KC_LEFT, KC_NO);
}
SEQ_THREE_KEYS(KC_G, KC_C, KC_A) {
SEND_STRING("git commit --amend");
}
SEQ_TWO_KEYS(KC_C, KC_C) {
SEND_STRING("const_cast<>");
send_keystrokes(KC_LEFT, KC_NO);
}
SEQ_TWO_KEYS(KC_C, KC_D) {
SEND_STRING("dynamic_cast<>");
send_keystrokes(KC_LEFT, KC_NO);
}
SEQ_TWO_KEYS(KC_C, KC_R) {
SEND_STRING("reinterpret_cast<>");
send_keystrokes(KC_LEFT, KC_NO);
}
SEQ_TWO_KEYS(KC_C, KC_S) {
SEND_STRING("static_cast<>");
send_keystrokes(KC_LEFT, KC_NO);
}
SEQ_ONE_KEY(KC_SLSH) {
send_keystrokes(KC_SLSH, NK_DOWN, KC_LSFT, KC_8, KC_8, NK_UP, KC_LSFT, KC_ENT,
NK_DOWN, KC_LSFT, KC_8, NK_UP, KC_LSFT, KC_ENT,
NK_DOWN, KC_LSFT, KC_8, NK_UP, KC_LSFT, KC_SLSH, KC_UP, KC_END, KC_SPC,
KC_NO);
}
}
}

View file

@ -0,0 +1,188 @@
# ErgoDox EZ Configuration for typing like a boss.
This layout has 7 layers:
0. Base layers
1. Symbols and F-keys
2. Number pad (with hexadecimal)
3. Cursor keys
4. Mouse movement and clicks
5. Keyword macros
6. Emacs
There are also some leader keys defined for frequently used commands (git etc).
## The layers
Double hashes (`##`) indicate transparent keys (`KC_TRNS`) and blanks indicate no key (`KC_NO`).
### 0. Base layer
```
,--------------------------------------------------. ,--------------------------------------------------.
| ESC | 1 | 2 | 3 | 4 | 5 | SfLt | | SfRt | 6 | 7 | 8 | 9 | 0 | BkSp |
|--------|------|------|------|------|-------------| |------|------|------|------|------|------|--------|
| Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | Del |
|--------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| Caps/L2| A | S | D | F | G |------| |------| H | J | K | L | ; |Enter/L2|
|--------|------|------|------|------|------| L6 | | L6 |------|------|------|------|------|--------|
| LSft/( | Z | X | C | V/L3 | B/L4 | | | | N/L4 | M/L3 | , | . | / | RSft/) |
`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
|Ctrl/[| Alt/]| # | Left |Right | | Up | Down | - | Alt/[|Ctrl/]|
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| L2 | lead | | lead | Ins |
,------|------|------| |------|------|------.
| Space| BkSp | Home | | PgUp | Enter|Space |
| / | / |------| |------| / | / |
| Ctrl | Alt |End/L5| |PDn/L5| Alt | Ctrl |
`--------------------' `--------------------'
```
Space Cadet shift is enabled. Ctrl and Alt doubles up as normal keys when tapped.
SfLt and SfRt sends Shift + left and Shift + Right respectively - for use with emacs with `windmove-default-keybindings`.
Caps and Enter may be held down to activate layer 2 (hexadecimal number pad).
Please see `matrix_scan_user` function in `keymap.c` for list of commands available via `lead` key.
### 1. Symbols and F-keys
```
,--------------------------------------------------. ,--------------------------------------------------.
| ## | F1 | F2 | F3 | F4 | F5 | ## | | ## | F6 | F7 | F8 | F9 | F10 | F11 |
|--------|------|------|------|------|------|------| |------|------|------|------|------|------|--------|
| ## | ! | " | £ | $ | % | ## | | ## | - | + | = | @ | ~ | F12 |
|--------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| ## | ^ | & | * | _ | # |------| |------| { | } | ; | ' | # | ## |
|--------|------|------|------|------|------| ## | | ## |------|------|------|------|------|--------|
| ## | \ | | | ` | - | / | | | | [ | ] | < | > | ? | ## |
`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
| ## | ## | ## | ## | ## | | ## | ## | ## | ## | ## |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| ## | ## | | ## | ## |
,------|------|------| |------|------|------.
| | | ## | | ## | | |
| ## | ## |------| |------| ## | ## |
| | | ## | | ## | | |
`--------------------' `--------------------'
```
### 2. Number pad (with hexadecimal)
```
,---------------------------------------------------. ,--------------------------------------------------.
| ## | A | B | C | D | E | F | | A | B | C | D | E | F | ## |
|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------|
| ## | * | 7 | 8 | 9 | * | 0x | | 0x | * | 7 | 8 | 9 | * | ## |
|---------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| ## | / | 4 | 5 | 6 | / |------| |------| / | 4 | 5 | 6 | / | ## |
|---------|------|------|------|------|------| ## | | ## |------|------|------|------|------|--------|
| ## | - | 1 | 2 | 3 | - | | | | - | 1 | 2 | 3 | - | ## |
`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
| = | + | 0 | , | . | | 0 | , | . | + | = |
`-----------------------------------' `----------------------------------'
,-------------. ,-------------.
| ## | ## | | ## | ## |
,------|------|------| |------|------|------.
| | | ## | | ## | | |
| ## | ## |------| |------| ## | ## |
| | | ## | | ## | | |
`--------------------' `--------------------'
```
### 3. Cursor keys
```
,---------------------------------------------------. ,--------------------------------------------------.
| | | | | | | | | | | | | | | |
|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------|
| | Home | | Up | | PgUp | | | | PgUp | | Up | | Home | |
|---------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| | End | Left | Down | Right| PgDn |------| |------| PgDn | Left | Down | Right| End | |
|---------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| ## | Up | | Down | ## | | | | | | ## | Down | | Up | ## |
`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
| Left | Down | Right| | | | | | Left | Down | Right|
`-----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | | |
,------|------|------| |------|------|------.
| | | | | | | |
| ## | ## |------| |------| ## | ## |
| | | | | | | |
`--------------------' `--------------------'
```
### 4. Mouse movement and clicks
```
,--------------------------------------------------. ,--------------------------------------------------.
| | | | | | | | | | | | | | | |
|--------|------|------|------|------|-------------| |------|------|------|------|------|------|--------|
| | | Lclk | MsUp | Rclk | | | | | | Lclk | MsUp | Rclk | | |
|--------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| | |MsLeft|MsDown|MsRght| |------| |------| |MsLeft|MsDown|MsRght| | |
|--------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| Lclk | MsUp | Rclk |MsDown| | ## | | | | ## | |MsDown| Lclk | MsUp | Rclk |
`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
|MsLeft|MsDown|MsRight | | | | |MsLeft|MsDown|MsRght|
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | | |
,------|------|------| |------|------|------.
| | | | | | | |
| | |------| |------| | |
| | | | | | | |
`--------------------' `--------------------'
```
### 5. Keyword macros
```
,---------------------------------------------------. ,--------------------------------------------------.
| | | | scarf| sadf | smily| | | | decaf| | | | | |
|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------|
| | const| volat| oper | ret | tmpl | | | | typen| cont | prv | pro | pub | |
|---------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| | | str | obj | | gitl |------| |------| | | | nulp | | |
|---------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| | | extr | cls | virt | break| | | |namesp| goodm| goodn| | | |
`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
| | | inc | | | | | | | | |
`-----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | ecet | ecets|
,------|------|------| |------|------|------.
| | | | | | | |
| | |------| |------| | |
| | | ## | | ## | | |
`--------------------' `--------------------'
```
Please see `keymap.c` for the keywords/commands.
Some are const, volatile, operator, return, template, typename, continue, private,
protected, public, struct, class, extern, virtual, break, namespace.
Also a git log command I use a lot (`git log --oneline --graph --decorate=short` (I know git can be configured but that is boring)).
### 6. Emacs
```
,---------------------------------------------------. ,--------------------------------------------------.
| | | | | | | empb | | emnb | emfs | emfb | | | | |
|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------|
| | emtr | | | | | | | | emun | emre | w-up | | | |
|---------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| | | emwr | | | |------| |------| |w-left|w-down|w-rght| | |
|---------|------|------|------|------|------| ## | | ## |------|------|------|------|------|--------|
| | | | | | | | | | | |w-down| | | |
`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
| | | | | | | | | | | |
`-----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | | |
,------|------|------| |------|------|------.
| | | | | | | |
| | |------| |------| | |
| | | | | | | |
`--------------------' `--------------------'
```
Some emacs shortcuts like toggle read/write mode (emtr), write file (emwr), previous-buffer (empb),
next-buffer (emnb), smaller font(emfs), larger font (emfb), undo (emun), redo (emre) and switching between windows in a frame.

View file

@ -0,0 +1,3 @@
COMMAND_ENABLE = no # Commands for debug and configuration

View file

@ -0,0 +1,238 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
#define UNIC 3 // unicode entry layer
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | 1! | 2@ | 3# | 4$ | 5% | 6^ | | 7& | 8* | 9( | 0) | -_ | += | BkSp |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | { | | } | Y | U | I | O | P | |\ |
* |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
* | Win | A | S | D | F | G |------| |------| H | J | K | L | :; | '" |
* |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
* | LShift |Z/Alt | X | C | V | B | | | | N | M | , | . | Alt | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LCtrl | COPY | PASTE| Left | Right| | Down | Up |Hyper | `~ | RCtrl |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* Hyper = Ctrl+Super+Alt+Shift | ~L3 | F5 | | F2 | ~L2 |
* ,------|------|------| |------+------+------.
* | | | PgUp | | Ins | | |
* | Enter| BkSp |------| |------| ~L1 |Space |
* | | | PgDn | | Del | | |
* `--------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, ALT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_HOME,
KC_LCTRL, LCTL(KC_C), LCTL(KC_V), KC_LEFT,KC_RGHT,
KC_FN3, KC_F5,
KC_PGUP,
KC_ENT,KC_BSPC,KC_PGDN,
// right hand
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
KC_END, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
KC_DOWN,KC_UP, ALL_T(KC_NO),KC_GRV, KC_RCTRL,
KC_F2, KC_FN2,
KC_INS,
KC_DELT,KC_FN1, KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |PrintScr|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | £ | | | | | | . | 0 | = |Alt+F4|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* THERE! | | | | | |
* ,------|------|------| |------+------+------.
* CAD = Ctrl + Alt + Delete | | | | | | | |
* | | |------| |------| | |
* | | | | | CAD | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,M(3),KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, LALT(KC_F4),
KC_TRNS, KC_TRNS,
KC_TRNS,
LCTL(LALT(KC_DEL)), KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | TEENSY | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolDn |VolUp | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
/* Keymap 3: Unicode Entry
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Alt | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | + | + | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Alt | | | E | | | | | | | 7 | 8 | 9 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Alt | A | | D | F | |------| |------| | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Alt | | | C | | B | | | | | 1 | 2 | 3 | + | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Alt | Alt | Alt | | | | 0 | 0 | 0 | + | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* WINDOWS ONLY SETUP!! | ~L3 | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | Alt | Alt |------| |------| Alt | Alt |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[UNIC] = LAYOUT_ergodox( // layer 3 : Unicode Entry
// left hand
KC_LALT, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6,
KC_LALT, KC_TRNS, KC_TRNS, KC_E, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LALT, KC_A, KC_TRNS, KC_D, KC_F, KC_TRNS,
KC_LALT, KC_TRNS, KC_TRNS, KC_C, KC_TRNS, KC_B, KC_TRNS,
KC_LALT, KC_LALT, KC_LALT, KC_TRNS,KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_LALT,KC_LALT, KC_TRNS,
// right hand
KC_P7, KC_P8, KC_P9, KC_P0, KC_PPLS,KC_PPLS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_TRNS,
KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_TRNS,
KC_P0, KC_P0, KC_P0, KC_PPLS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS,KC_LALT, KC_LALT
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
[2] = ACTION_LAYER_TAP_TOGGLE(MDIA), // FN2 - Momentary Layer 2 (Media)
[3] = ACTION_LAYER_TAP_TOGGLE(UNIC) // FN3 - Momentary Layer 3 (Unicode entry)
};
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);
} else {
unregister_code(KC_RSFT);
}
case 3: // this would trigger when you hit a key mapped as M(3)
if (record->event.pressed) {
return MACRO( I(255), D(LALT), T(P1), T(P5), T(P6), U(LALT), END );
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_3_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,179 @@
Englishman in New York
===========================
:microphone: :tea:
About
------
After using the massdrop configurator to get the basics, I wanted to add a
little extra to my ergodox. Notably the Hyper hotkey, the press and hold,
and a way to have my beloved £ :pound: symbol available<sup>[1](#unicode)</sup>. Why not switch to a GB
layout? Well the computers I use are US keymap'd and I can't always change
that. Plus I've got used to 2/@ and 3/# and moving to the ergodox was hard
enough. :sweat_smile:
I started from the default and edited from there as I needed. It's somewhat
similar to a regular layout, particularly R1 and shift/controls. I ended up
with a few keys that were blank, so I'm testing out some shortcuts. Alt+F4 for
quitting things in Windows, is one example, but I felt it was better placed on
the 1st layer - in case of fat fingers.
Layout
-------
![Layout](https://i.imgur.com/4bDwHLS.jpg "Isn't it lovely")
### Base Layer
```
,--------------------------------------------------. ,--------------------------------------------------.
| ESC | 1! | 2@ | 3# | 4$ | 5% | 6^ | | 7& | 8* | 9( | 0) | -_ | += | BkSp |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| Tab | Q | W | E | R | T | { | | } | Y | U | I | O | P | |\ |
|--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
| Win | A | S | D | F | G |------| |------| H | J | K | L | :; | '" |
|--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
| LShift |Z/Alt | X | C | V | B | | | | N | M | , | . | Alt | RShift |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|LCtrl | COPY | PASTE| Left | Right| | Down | Up |Hyper | `~ | RCtrl |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
Hyper = Ctrl+Super+Alt+Shift | ~L3 | F5 | | F2 | ~L2 |
,------|------|------| |------+------+------.
| | | PgUp | | Ins | | |
| Enter| BkSp |------| |------| ~L1 |Space |
| | | PgDn | | Del | | |
`--------------------' `--------------------'
```
### Symbol Layer
```
,--------------------------------------------------. ,--------------------------------------------------.
| | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |PrintScr|
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | £ | | | | | | . | 0 | = |Alt+F4|
`----------------------------------' `----------------------------------'
↑ ,-------------. ,-------------.
THERE! | | | | | |
,------|------|------| |------+------+------.
CAD = Ctrl + Alt + Delete | | | | | | | |
| | |------| |------| | |
| | | | | CAD | | |
`--------------------' `--------------------'
```
### Media Layer
Not touched this, not used either.
```
,--------------------------------------------------. ,--------------------------------------------------.
| TEENSY | | | | | | | | | | | | | | |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | | | MsUp | | | | | | | | | | | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | | | | | | | | | | | Prev | Next | | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | Lclk | Rclk | |VolDn |VolUp | Mute | | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | | |
,------|------|------| |------+------+------.
| | | | | | |Brwser|
| | |------| |------| |Back |
| | | | | | | |
`--------------------' `--------------------'
```
### Unicode Layer
Used to enter/test unicode input on Windows. All numbers are numpad keys.
```
,--------------------------------------------------. ,--------------------------------------------------.
| Alt | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | + | + | |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| Alt | | | E | | | | | | | 7 | 8 | 9 | + | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| Alt | A | | D | F | |------| |------| | 4 | 5 | 6 | + | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| Alt | | | C | | B | | | | | 1 | 2 | 3 | + | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| Alt | Alt | Alt | | | | 0 | 0 | 0 | + | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
WINDOWS ONLY SETUP!! | ~L3 | | | | |
,------|------|------| |------+------+------.
| | | | | | | |
| Alt | Alt |------| |------| Alt | Alt |
| | | | | | | |
`--------------------' `--------------------'
```
Usage
------
~L1 / L2 / L3 will momentarily switch to a layer if held and another key is pressed.
If pressed and released will remain on layer until pressed again.
### Unicode
This layout is for Windows only. To enter a character Press and Hold Alt, type + and hex code then release Alt.
Changelog
-----------
### [0.2.1] - 2016-04-05
* Changed £ to alt code in Windows. Windows sucks at unicode.
### [0.2.0] - 2016-03-27
* Added unicode layer
* Moved Copy/Paste to left hand side
* Switched Enter and Space (again)
* Added L3 (unicode layer) toggle
* Removed Press and Hold for Alt on right hand size (/)
* Swapped Volume Up/Down to match arrows
* Tried fixing £ macro
* Removed * in the matrix function things (upstream change)
### [0.1.1] - 2016-03-23
* Changed £ input to a macro
### [0.1.0] - 2016-03-22
After actually using the keyboard, I've made some changes:
* Swapped Enter and Space
* Moved backspace to thumb keys (top right still remains)
* Added Ctrl+Alt+Delete
* Added Teensy Reset on 2nd layer
* Switched Up and Down
* Changed copy/paste to be Ctrl+c and Ctrl+v as KC_COPY/PASTE didn't work (in Windows)
* Moved ~L2 to replace +L1 after learning how the function works (notes above)
* Hopefully fixed GBP symbol (unicode enabled in MakeFile)
### [0.0.1] - 2016-03-21
First version
Issues
-------
Space for feedback and notes for future improvements
----
<sup><a name="unicode">1</a></sup>: For Windows only, and you have to edit the [registry](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input).

View file

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 3 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/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

View file

@ -0,0 +1,189 @@
<!-- -*- mode: markdown; fill-column: 8192 -*- -->
## v1.10
*2016-12-28*
### Miscellaneous
* `µ` can now be entered with UCIS.
* `™` can now be entered with UCIS.
### Tools
* `tools/hid-commands` can now find Banshee, and prefers it over Kodi.
* `tools/hid-commands` can now find Chrome too, not juts Chromium.
## v1.9
*2016-10-16*
### Overall changes
* `F12` was replaced by an `Fx` key, that activate the **Media** layer as a one-shot layer, and also `Alt` as a one-shot modifier.
### Base layer changes
* The `Media Stop` key is now a tap-dance key, and resets the device for programming on the fourth tap.
### Miscellaneous
* `π` can now be entered with UCIS.
* `🐁` can now be entered with UCIS.
### Tools
* The `tools/layer-notify` tool was removed, it was an example, which I don't use.
#### `tools/hid-commands`
* Now looks at the `DISABLE_APPSEL_START` environment value, and does not display an AppSel notification if it is non-empty.
* Will attempt to re-program the keyboard when receiving a `reflash` command.
* No longer tries to select Emacs 24 on `APPSEL_EMACS`, rather, it goes for any Emacs.
* The `APPSEL_MUSIC` command now includes Kodi in the list too, as the last choice.
## v1.8
*2016-10-03*
### ADORE
* Major rearrangements were made, to reduce pinky use, and to balance out the hand usage.
### Tools
* The `hid-commands` tool will now display a notification when the **AppSel** layer is triggered.
* The `log-to-heatmap.py` tool now treats the innermost keys on the bottom row as thumb keys, as far as statistics are concerned.
### Miscellaneous
* Fixed the **Steno** toggle key.
## v1.7
*2016-09-18*
### Overall changes
* The number row has been completely rearranged on both the **Base** and the **ADORE** layers.
* The number/function key behavior was changed: function keys are now on the **Media**.
* The `:`/`;` and `-`/`_` keys were put back to their thumb position on the bottom row, on both the **Base** and **ADORE** layers.
* The bottom large keys on the inner side of each half now function as [tmux](http://tmux.github.io/) keys: the left to send the prefix, the right to send the `display-panes` key. The left also doubles as a GNU screen prefix key, and sends `C-a` when double tapped.
* A number of functions, such as the **AppSel** layer, now require the `hid-commands` tool to be running, with the output of `hid_listen` being piped to it.
### ADORE
* `Y` and `X` have been swapped again.
### Media/Navigation layer
* The function keys are now on this layer.
* Mouse keys have been removed.
* Media start/stop/prev/next have been removed.
* `Print screen` has been removed.
* There is only one screen lock key now.
### Heatmap
* Fixed a few issues in the finger-stats calculation.
* The tool now also timestamps and saves all input lines to a logfile, which it loads on start, allowing one to continue the collection after upgrading the tool.
* The heatmap tool will now colorize the stats by default.
* The periodic stats are now printed in a more compact format.
### Tools
* Added a new tool, `tools/layer-notify` that listens to layer change events on the HID console, and pops up a notification on layer changes.
* Another new tool, `tools/text-to-log.py` has been added that converts arbitrary text to a keylogger output, which can be fed to the heatmap generator.
* A number of features have been moved to the `tools/hid-commands` utility. These generally are OS dependent, and are easier to implement on the software side.
## v1.6
*2016-08-24*
### Base layer changes
* The parentheses & bracket keys have been merged: tapping them results in `[` or `{` (if it was shifted), double tapping leads to `(`.
* The `:;` and `-_` keys are now available on the base layer, on their **ADORE** location, too, just below `[{(`/`]})`.
* The `Apps` key has been replaced by `F12`.
* The `-`/`_` is no longer a tap-dance key.
### ADORE layer changes
* Adjustments were made to the **ADORE** layer, to separate some inconvenient combinations.
### Miscellaneous changes
* `LEAD u` now starts the symbolic unicode input system, instead of the OS-one.
* The mouse acceleration keys on the **Navigation/Media** layer have been turned into toggles: tap them once to turn them on, until tapped again. Tapping an accelerator button will turn all the others off.
* When the **ARROW** layer is on, the *red* and *blue* LEDs light up now.
### Heatmap
* The built-in keylogger has been greatly enhanced, it now outputs the pressed state, and the layer (Dvorak or ADORE). As such, the `ADORE_AUTOLOG` option has been removed, instead there is `AUTOLOG_ENABLE` now, which when enabled, makes the keylogger start when the keyboard boots. It defaults to off.
* The heatmap generator received a lot of updates.
## v1.5
*2016-08-12*
* The **1HAND** layer has been removed.
* A `Delete` key is now available on the right thumb cluster.
* The **ADORE** layer received a major update, see the layout image above.
* It is now possible to enable automatic logging for the **ADORE** layer, by setting the `ADORE_AUTOLOG` makefile variable to `yes` when compiling the keymap. It is off by default.
* The `~` key and the `Media Next/Prev` key have been swapped on the **Base** layer.
* On the **ARROW** layer, `Backspace` has been replaced by `Enter`.
* There is some experimental support for entering Unicode symbols.
## v1.4
*2016-07-29*
* When toggling the key logging on or off, the LEDs will do a little dance.
* The keylogger is now optional, but enabled by default. Use `KEYLOGGER_ENABLE=no` on the `make` command line to disable it.
* The `TAB`/`ARRW` key was turned into a tap-dance key, allowing one to toggle the **ARROW** layer on by double-tapping, and as such, avoid the need to hold the key.
* The `-`/`_` key was turned into a tap-dance key too.
* There is now a way to travel time with the keyboard, toggle the feature on by hitting `LEAD t`.
## v1.3
*2016-07-06*
* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a *heatmap* out of the logs.
* The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the **Base** layer for an image that shows where arrows are.
* The **experimental** layer has been redone, and is now called **ADORE**, and as such, can be enabled by `LEAD a` now.
* Switching between Dvorak and ADORE is now persisted into EEPROM, and survives a reboot.
## v1.2
*2016-06-22*
* The forced NKRO mode can be easily toggled off at compile-time, to make the firmware compatible with certain operating systems.
* The `:;` key has changed behaviour: to access the `;` symbol, the key needs to be double-tapped, instead of shifted.
* The `=` and `\` keys were swapped, `=` moved to the home row, on both the **Base** and the **experimental** layers.
* The arrow and navigation keys were redone, they are now more accessible, but the navigation keys require an extra tap to access.
* The **Emacs** layer is gone, replaced by a simplified **navigation and media** layer.
* `LEAD v` types the firmware version, and the keymap version.
* On the **experimental** layer, the `L` and `Q`, and the `K` and `G` keys were swapped.
* The **Steno** layer gained a few more `#` and `*` keys, to make it easier on my fingers.
## v1.1
*2016-06-14*
* The keyboard starts in NKRO mode, bootmagic and other things are disabled.
* A **Steno** layer was added, to be used with Plover.
* An **experimental** layer was added, something halfway between Dvorak and Capewell-Dvorak. A work in progress.
* `LEAD y` types `\o/`.
* Some keys on the **Base** layer have been moved around:
- `?` moved to the left pinky, left of `Q`.
- `=` shifted one row down, but `F11` stayed where it was.
- `-` on the left half was replaced by `Tab`.
- `Tab`'s original position is taken by a `Media Next`/`Media Prev` key.
- `:` now inputs `;` when shifted.
* `ESC` cancels the **Hungarian** layer too, not just modifiers.
## v1.0
*2016-05-26*
Initial version.

View file

@ -0,0 +1,27 @@
#ifndef CONFIG_ALGERNON_H
#define CONFIG_ALGERNON_H
#include QMK_KEYBOARD_CONFIG_H
#undef MOUSEKEY_TIME_TO_MAX
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_TIME_TO_MAX 1
#define MOUSEKEY_MAX_SPEED 2
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#undef MOUSEKEY_WHEEL_DELAY
#define MOUSEKEY_WHEEL_DELAY 0
#define ONESHOT_TAP_TOGGLE 2
#define ONESHOT_TIMEOUT 3000
#undef LOCKING_SUPPORT_ENABLE
#undef LOCKING_RESYNC_ENABLE
#undef LEADER_TIMEOUT
#define LEADER_TIMEOUT 1000
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,149 @@
<!-- -*- mode: markdown; fill-column: 8192 -*- -->
algernon's layout
=======================
This is an unconventional layout for the [ErgoDox EZ][ez]. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox].
[ez]: https://ergodox-ez.com/
[blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/
Some of the things in the layout only work when one uses [Spacemacs][spacemacs] and [GNOME][gnome] under Linux. Your mileage may vary.
[spacemacs]: http://spacemacs.org/
[gnome]: https://www.gnome.org/
## Table of Contents
* [Layouts](#layouts)
- [Base layer](#base-layer)
- [ADORE layer](#adore-layer)
- [Steno layer](#steno-layer)
- [LED states](#led-states)
* [Tools](#tools)
- [Heatmap](#heatmap)
- [Layer notification](#layer-notification)
* [Special features](#special-features)
- [Unicode Symbol Input](#unicode-symbol-input)
* [Building](#building)
- [Using on Windows](#using-on-windows)
* [Changelog](https://github.com/algernon/ergodox-layout/blob/master/NEWS.md#readme)
* [License](#license)
# Layouts
## Base layer
[![Base layer](https://i.imgur.com/q1MDvq4.png)](http://www.keyboard-layout-editor.com/#/gists/28f7eb305fdbff943613e1dc7aa9e82b)
At its core, this is a Dvorak layout, with some minor changes. The more interesting parts are how certain keys behave:
* The number row is the same as in the [ADORE](#adore-layer) layer. The function keys are on the **Media** layer.
* The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they are considered active for the next key press only. When double tapped, they toggle on, until a third, single tap sometime later. When held, they act as expected. My usual pattern is that I use these for the next keypress only, so this behaviour is perfect. If I need them held, I'll just double-tap.
* The `GUI` key is special, because when I double-tap it, it sends `GUI + w`, which pops up an application selector. It also switches to a one-shot layer, where the number row on the left half turns into app selector macros, for the most common things I usually want to switch to. Otherwise it behaves as on a normal layout.
* The `ESC` key also doubles as a one-shot cancel key: if tapped while any of the one-shot modifiers are in-flight (as in, single-tapped, and not expired yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if active. Otherwise it sends the usual keycode.
* The **Media** and **Hun** layer keys are one-shot, the **STENO** key is a toggle.
* The **Fx** key is one-shot, and activates the **Media** layer, along with a one-shot `Alt`.
* When holding the `Tab`/**Arrow** key, the arrow layer activates while the key is held. Tapping the key produces the normal, `Tab` key. Double-tapping it toggles the **Arrow** layer on until a third tap.
* Tapping the `:` key once yields `:`, tapping it twice yields `;`.
* Tapping the `[{(`/`)}]` keys once yields `[` (or `{` when shifted), tapping them twice yields `(`.
* The **Lead** key allows me to type in a sequence of keys, and trigger some actions:
- `LEAD l` uses the unicode input method to enter a `λ`.
- `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯`
- `LEAD y` types `\o/`.
- `LEAD w m` maximises the currently focused window.
- `LEAD a` makes the [ADORE layer](#adore-layer) the default.
- `LEAD v` prints the firmware version, the keyboard and the keymap.
- `LEAD d` toggles logging keypress positions to the HID console.
- `LEAD t` toggles time travel. Figuring out the current `date` is left as an exercise to the reader.
- `LEAD u` enters the [Unicode symbol input](#unicode-symbol-input) mode.
The symbols on the front in the image above have the same color as the key that activates them, with the exception of the **Arrow** layer, which is just black on the front.
## ADORE layer
[![ADORE layer](https://i.imgur.com/r3LnQAA.png)](http://www.keyboard-layout-editor.com/#/gists/45681a17453d235925b6028dd83bf12a)
My experimental layout, that I keep tweaking. No full description here, because things are very much in flux.
Note that the **HUN** layer does not work well with ADORE: it still has the same layout as on the [Base](#base-layer) layer. This will remain until ADORE becomes the default.
## Steno layer
[![Steno layer for Plover](https://i.imgur.com/PgifhBF.png)](http://www.keyboard-layout-editor.com/#/gists/401ef9a84369e47c57f9aedcf0a0d667)
This is to be used with [Plover](http://www.openstenoproject.org/plover/), nothing really fancy here. The **STENO** key toggles the layer on and off, and sends the toggle command to Plover too.
## LED states
The primary purpose of the LEDs is to show the modifier status, a secondary, to show which layer is active. Each modifier, `Shift`, `Alt` and `Control` each have their designated LEDs: the *red*, *green* and *blue*, respectively. When a modifier is in a one-shot state, the respective LED will turn on with a dimmer light. If the modifier is toggled on, the brightness of the LED turns full.
For the layers, the following rules apply:
* When the [ADORE layer](#adore-layer) is toggled on, LEDs will light up from left to right in a sequence, then turn off. When the layer is toggled off, the LEDs light up and turn off in the other direction. No LEDs are on while the layer is active.
* When the **Hungarian** layer is active, the *green* and *blue* LEDs are on.
* When the **Media** layer is active, the *red* and *green* ones are on.
* When the **ARROW** layer is active, the *red* and *blue* ones are on.
* For the [Steno layer](#steno-layer), all LEDs will be turned on.
Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers use a stronger one, and modifiers override any layer preferences. For example, when on the one-handed layer, with the left side active (*red* light blinking), if `Shift` is on, the *red* light will be constantly on.
# Special features
## Unicode Symbol Input
Once in the Unicode Symbol Input mode, one is able to type in symbol names, press `Enter` or `Space`, and get the Unicode symbol itself back. When in the mode, a capital `U` is printed first. Once the sequence is finished, all of it is erased by sending enough `Backspace` taps, and the firmware starts the OS-specific unicode input sequence. Then, it looks up the symbol name, and enters the associated code. If it is not found, it will just replay the pressed keycodes.
For the list of supported symbols, please see the source.
This is an experimental feature, and may or may not work reliably.
# Tools
## Heatmap
When the keypress logging functionality is enabled (by `LEAD d`), the keyboard will output a line every time a key is pressed, containing the position of the key in the matrix. This allows one to collect this information, and build analytics over it, such as a heat map, including dead keys too.
Included with the firmware is a small tool that can parse these logs, and create a heatmap that one can import into [KLE][kle]. To use it, either pipe the output of `hid_listen` into it, or pipe it an already saved log, and it will save the results into files in an output directory (given on the command-line). See the output of `tools/log-to-heatmap.py --help` for more information.
[kle]: http://www.keyboard-layout-editor.com/
The generated heatmap looks somewhat like this:
![Heatmap](https://i.imgur.com/tly9XSy.png)
## Layer notification
There is a very small tool in `tools/layer-notify`, that listens to the HID console, looking for layer change events, and pops up a notification for every detected change. It is a very simple tool, mainly serving as an example.
# Building
To make my workflow easier, this layout is maintained in [its own repository][algernon:ez-layout]. To build it, you will need the [QMK][qmk] firmware checked out, and this repo either checked out to something like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this:
[algernon:ez-layout]: https://github.com/algernon/ergodox-layout
[qmk]: https://github.com/qmk/qmk_firmware
```
$ git clone https://github.com/qmk/qmk_firmware.git
$ cd qmk_firmware
$ git clone https://github.com/algernon/ergodox-layout.git \
keyboards/ergodox/keymaps/algernon-master
$ make keyboard=ergodox keymap=algernon-master
```
From time to time, updates may be submitted back to the QMK repository. If you are reading it there, you can build the firmware like any other firmware included with it (assuming you are in the root directory of the firmware):
```
$ make keyboard=ergodox keymap=algernon
```
## Using on Windows
The keymap default to forcing NKRO, which seems to upset Windows, and except the modifiers, none of them work. If you experience this problem, recompile the firmware with `FORCE_NKRO=no` added to the `make` command line.
# License
The layout, being a derivative of the original TMK firmware which is under the GPL-2+, this layout is under the GPL as well, but GPL-3+, rather than the older version.
![nav-n-media-layer.png](https://i.imgur.com/AReX8C9.png)
![hun-layer.png](https://i.imgur.com/uPGBl9J.png)

View file

@ -0,0 +1,43 @@
BOOTMAGIC_ENABLE=no
COMMAND_ENABLE=no
SLEEP_LED_ENABLE=no
FORCE_NKRO = yes
DEBUG_ENABLE = no
CONSOLE_ENABLE = no
TAP_DANCE_ENABLE = yes
KEYLOGGER_ENABLE = yes
UCIS_ENABLE = yes
MOUSEKEY_ENABLE = no
AUTOLOG_ENABLE = no
ifeq (${FORCE_NKRO},yes)
OPT_DEFS += -DFORCE_NKRO
endif
ifeq (${AUTOLOG_ENABLE},yes)
KEYLOGGER_ENABLE = yes
OPT_DEFS += -DAUTOLOG_ENABLE
endif
ifeq (${KEYLOGGER_ENABLE},yes)
OPT_DEFS += -DKEYLOGGER_ENABLE
CONSOLE_ENABLE = yes
endif
OPT_DEFS += -DUSER_PRINT
LAYOUT_ergodox_VERSION = $(shell \
if [ -d "${LAYOUT_ergodox_PATH}/.git" ]; then \
cd "${LAYOUT_ergodox_PATH}" && git describe --abbrev=6 --dirty --always --tags --match 'v*' 2>/dev/null; \
else echo QMK; fi)
LAYOUT_ergodox_BRANCH = $(shell \
if [ -d "${LAYOUT_ergodox_PATH}/.git" ]; then \
cd "${LAYOUT_ergodox_PATH}"; \
fi; \
git rev-parse --abbrev-ref HEAD 2>/dev/null)
OPT_DEFS += -DLAYOUT_ergodox_VERSION=\"$(LAYOUT_ergodox_VERSION)\\\#$(LAYOUT_ergodox_BRANCH)\"

View file

@ -0,0 +1,486 @@
[
{
"backcolor": "#ffffff",
"name": "ErgoDox - algernon's layout: Heatmap",
"author": "Gergely Nagy <kbd@gergo.csillger.hu>",
"notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
"switchMount": "cherry",
"switchBrand": "gateron",
"switchType": "KS-3-Tea",
"pcb": true,
"css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
},
[
{
"x": 3.5,
"fa": [
0,
0,
2
]
},
"*\n5\nF5",
{
"x": 10.5,
"a": 4,
"fa": [
0,
0,
2
]
},
"#\n4\nF4"
],
[
{
"y": -0.875,
"x": 2.5
},
"@\n7\nF7",
{
"x": 1
},
"^\n3\nF3",
{
"x": 8.5
},
"!\n2\nF2",
{
"x": 1
},
"&\n6\nF6"
],
[
{
"y": -0.875,
"x": 5.5
},
"$\n1\nF1",
{
"a": 7,
"f": 3
},
"F11",
{
"x": 4.5,
"f": 3
},
"Fx",
{
"a": 4,
"f": 3,
"fa": [
0,
0,
2
]
},
"%\n0\nF10"
],
[
{
"y": -0.875,
"f": 9,
"a": 6,
"w": 1.5
},
"\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
{
"f": 3,
"a": 4,
"fa": [
0,
0,
2
]
},
" \n9\nF9",
{
"x": 14.5
},
" \n8\nF8",
{
"a": 7,
"w": 1.5
},
"STENO"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 6
},
"C",
{
"x": 10.5
},
"L"
],
[
{
"y": -0.875,
"x": 2.5,
"a": 6
},
"W",
{
"x": 1,
"a": 6
},
"H",
{
"x": 8.5
},
"G",
{
"x": 1
},
"P"
],
[
{
"y": -0.875,
"x": 5.5
},
"F",
{
"a": 4,
"fa": [0, 0, 0],
"h": 1.5
},
"{\n(\n[",
{
"x": 4.5,
"h": 1.5
},
"}\n)\n]",
{
"a": 6
},
"M"
],
[
{
"y": -0.875,
"f": 3,
"a": 4,
"w": 1.5
},
"\n\n|\n\\",
{
"a": 6,
"f": 3
},
"X",
{
"x": 14.5,
"a": 4
},
"/\n?",
{
"a": 4,
"w": 1.5
},
"~\n`"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 6
},
"E",
{
"x": 10.5
},
"T"
],
[
{
"y": -0.875,
"x": 2.5
},
"O",
{
"x": 1,
"n": true
},
"I",
{
"x": 8.5,
"n": true
},
"R",
{
"x": 1
},
"N"
],
[
{
"y": -0.875,
"x": 5.5
},
"U",
{
"x": 6.5
},
"D"
],
[
{
"y": -0.875,
"fa": [
6
],
"w": 1.5
},
"<i class='fa fa-arrows'></i>\n\nTab",
{
"f": 3
},
"A",
{
"x": 14.5,
"f": 3
},
"S",
{
"a": 4,
"fa": [
0,
0,
0,
0,
0,
0,
0,
6
],
"w": 1.5
},
"+\n="
],
[
{
"y": -0.625,
"x": 6.5,
"a": 7,
"f": 9,
"h": 1.5
},
"<i class='fa fa-columns'></i>",
{
"x": 4.5,
"h": 1.5
},
"<i class='fa fa-table'></i>"
],
[
{
"y": -0.75,
"x": 3.5,
"a": 4,
"f": 3
},
"\"\n'",
{
"x": 10.5,
"a": 6,
"f": 3
},
"V"
],
[
{
"y": -0.875,
"x": 2.5,
"a": 6
},
"Q",
{
"x": 1,
"a": 4
},
"<\n,",
{
"x": 8.5,
"a": 6
},
"K",
{
"x": 1
},
"Y"
],
[
{
"y": -0.875,
"x": 5.5,
"a": 4
},
">\n.",
{
"x": 6.5,
"a": 6
},
"B"
],
[
{
"y": -0.875,
"f": 9,
"w": 1.5,
"g": true
},
"",
{
"a": 6,
"f": 3,
"g": false
},
"Z",
{
"x": 14.5
},
"J",
{
"f": 9,
"g": true,
"w": 1.5,
"a": 4
},
""
],
[
{
"y": -0.375,
"x": 3.5,
"g": true,
"a": 7,
"f": 3
},
"",
{
"x": 10.5
},
""
],
[
{
"y": -0.875,
"x": 2.5
},
"",
{
"x": 1,
"g": false,
"a": 5
},
";\n:",
{
"x": 8.5
},
"_\n-",
{
"x": 1,
"g": true,
"a": 7
},
""
],
[
{
"y": -0.75,
"x": 0.5
},
"",
{},
"",
{
"x": 14.5
},
"",
{},
""
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1,
"g": false
},
"Alt",
{
"a": 4,
"fa": [
0,
0,
0,
9
]
},
"\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
],
[
{
"a": 7,
"f": 9,
"h": 2
},
"<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
{
"h": 2
},
"<i class='fa fa-angle-double-up'></i>",
{
"f": 3
},
"Ctrl"
],
[
{
"x": 2
},
"ESC"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3,
"f": 2
},
"MEDIA",
{},
"DEL"
],
[
{
"x": -3
},
"HUN",
{
"f": 9,
"h": 2
},
"<i class='kb kb-Return-2'></i>",
{
"f": 3,
"h": 2
},
"SPC"
],
[
{
"x": -3,
"f": 2
},
"LEAD"
]
]

View file

@ -0,0 +1,477 @@
[
{
"backcolor": "#ffffff",
"name": "ErgoDox - algernon's layout: Heatmap",
"author": "Gergely Nagy <kbd@gergo.csillger.hu>",
"notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
"switchMount": "cherry",
"switchBrand": "gateron",
"switchType": "KS-3-Tea",
"pcb": true,
"css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
},
[
{
"x": 3.5,
"fa": [
0,
0,
2
]
},
"*\n5\nF5",
{
"x": 10.5,
"a": 4,
"fa": [
0,
0,
2
]
},
"#\n4\nF4"
],
[
{
"y": -0.875,
"x": 2.5
},
"@\n7\nF7",
{
"x": 1
},
"^\n3\nF3",
{
"x": 8.5
},
"!\n2\nF2",
{
"x": 1
},
"&\n6\nF6"
],
[
{
"y": -0.875,
"x": 5.5
},
"$\n1\nF1",
{
"a": 7,
"f": 3
},
"F11",
{
"x": 4.5,
"f": 3
},
"Fx",
{
"a": 4,
"f": 3,
"fa": [
0,
0,
2
]
},
"%\n0\nF10"
],
[
{
"y": -0.875,
"f": 6,
"a": 6,
"w": 1.5
},
"<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
{
"f": 3,
"a": 4,
"fa": [
0,
0,
2
]
},
" \n9\nF9",
{
"x": 14.5
},
" \n8\nF8",
{
"a": 7,
"w": 1.5
},
"STENO"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 4
},
">\n.",
{
"x": 10.5,
"a": 6
},
"C"
],
[
{
"y": -0.875,
"x": 2.5,
"a": 4
},
"<\n,",
{
"x": 1,
"a": 6
},
"P",
{
"x": 8.5
},
"G",
{
"x": 1
},
"R"
],
[
{
"y": -0.875,
"x": 5.5
},
"Y",
{
"a": 4,
"h": 1.5
},
"{\n(\n[",
{
"x": 4.5,
"h": 1.5
},
"}\n)\n]",
{
"a": 6
},
"F"
],
[
{
"y": -0.875,
"f": 3,
"a": 4,
"w": 1.5
},
"\n\n~\n`",
{
"a": 4,
"f": 3
},
"\"\n'",
{
"x": 14.5,
"a": 6
},
"L",
{
"a": 4,
"w": 1.5
},
"|\n\\"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 6
},
"E",
{
"x": 10.5
},
"T"
],
[
{
"y": -0.875,
"x": 2.5
},
"O",
{
"x": 1,
"n": true
},
"U",
{
"x": 8.5,
"n": true
},
"H",
{
"x": 1
},
"N"
],
[
{
"y": -0.875,
"x": 5.5
},
"I",
{
"x": 6.5
},
"D"
],
[
{
"y": -0.875,
"fa": [
6
],
"w": 1.5
},
"<i class='fa fa-arrows'></i>\n\nTab",
{
"f": 3
},
"A",
{
"x": 14.5,
"f": 3
},
"S",
{
"a": 4,
"fa": [
0,
0,
0,
0,
0,
0,
0,
6
],
"w": 1.5
},
"+\n="
],
[
{
"y": -0.625,
"x": 6.5,
"a": 7,
"f": 9,
"h": 1.5
},
"<i class='fa fa-columns'></i>",
{
"x": 4.5,
"h": 1.5
},
"<i class='fa fa-table'></i>"
],
[
{
"y": -0.75,
"x": 3.5,
"f": 3,
"a": 6
},
"J",
{
"x": 10.5
},
"W"
],
[
{
"y": -0.875,
"x": 2.5
},
"Q",
{
"x": 1
},
"K",
{
"x": 8.5
},
"M",
{
"x": 1
},
"V"
],
[
{
"y": -0.875,
"x": 5.5
},
"X",
{
"x": 6.5
},
"B"
],
[
{
"y": -0.875,
"f": 9,
"w": 1.5
},
"\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
{
"a": 4,
"f": 3
},
"?\n/",
{
"x": 14.5,
"a": 6
},
"Z",
{
"f": 9,
"w": 1.5
},
"<i class='kb kb-Multimedia-Stop'></i>"
],
[
{
"y": -0.375,
"x": 3.5,
"g": true,
"a": 7,
"f": 3
},
"",
{
"x": 10.5
},
""
],
[
{
"y": -0.875,
"x": 2.5
},
"",
{
"x": 1,
"g": false,
"a": 5
},
";\n:",
{
"x": 8.5
},
"_\n-",
{
"x": 1,
"g": true,
"a": 7
},
""
],
[
{
"y": -0.75,
"x": 0.5
},
"",
{},
"",
{
"x": 14.5
},
"",
{},
""
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1,
"g": false
},
"Alt",
{
"a": 4,
"fa": [
0,
0,
0,
9
]
},
"\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
],
[
{
"a": 7,
"f": 9,
"h": 2
},
"<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
{
"h": 2
},
"<i class='fa fa-angle-double-up'></i>",
{
"f": 3
},
"Ctrl"
],
[
{
"x": 2
},
"ESC"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3,
"f": 2
},
"MEDIA",
{},
"DEL"
],
[
{
"x": -3
},
"LEAD",
{
"f": 9,
"h": 2
},
"<i class='kb kb-Return-2'></i>",
{
"f": 3,
"h": 2
},
"SPC"
],
[
{
"x": -3,
"f": 2
},
"HUN"
]
]

View file

@ -0,0 +1,80 @@
#!/bin/bash
set -e
LAST_APPSEL_START=0
cmd_wm () {
WIN="$(xdotool getactivewindow)"
wmctrl -i -r ${WIN} -b remove,maximized_vert,maximized_horz
xdotool windowsize ${WIN} 100% 100%
wmctrl -i -r ${WIN} -b add,maximized_vert,maximized_horz
}
_cmd_appsel () {
wmctrl -x -a $1 || true
xdotool key Escape
}
cmd_appsel_music () {
wmctrl -x -a rhythmbox || wmctrl -x -a spotify || \
wmctrl -x -a banshee || wmctrl -x -a kodi || true
xdotool key Escape
}
cmd_appsel_slack () {
_cmd_appsel slack
}
cmd_appsel_emacs () {
_cmd_appsel emacs
}
cmd_appsel_term () {
_cmd_appsel gnome-terminal
}
cmd_appsel_chrome () {
_cmd_appsel chrom
}
cmd_appsel_start () {
if [ ! -z "${DISABLE_APPSEL_START}" ]; then
return
fi
APPSEL_START=$(date +%s)
if [ $APPSEL_START -lt $(expr $LAST_APPSEL_START + 10) ]; then
return
fi
LAST_APPSEL_START=$APPSEL_START
notify-send -t 1000 "Please select an application!" -c device -u low \
-i /usr/share/icons/Adwaita/24x24/devices/video-display.png
}
cmd_reflash () {
teensy_loader_cli -v -w ~/src/ext/qmk_firmware/algernon.hex --mcu atmega32u4 || true
}
cmd_help () {
cat <<EOF
Use the source, Luke!
EOF
}
while read l; do
case "$l" in
"CMD:"*)
;;
*)
continue
;;
esac
cmd="$(echo $l | cut -d: -f2-)"
echo "Got command: ${cmd}"
if type cmd_${cmd} >/dev/null 2>&1; then
cmd_${cmd}
fi
done

View file

@ -0,0 +1,344 @@
#! /usr/bin/env python3
import json
import os
import sys
import re
import argparse
import time
from math import floor
from os.path import dirname
from subprocess import Popen, PIPE, STDOUT
from blessings import Terminal
class Heatmap(object):
coords = [
[
# Row 0
[ 4, 0], [ 4, 2], [ 2, 0], [ 1, 0], [ 2, 2], [ 3, 0], [ 3, 2],
[ 3, 4], [ 3, 6], [ 2, 4], [ 1, 2], [ 2, 6], [ 4, 4], [ 4, 6],
],
[
# Row 1
[ 8, 0], [ 8, 2], [ 6, 0], [ 5, 0], [ 6, 2], [ 7, 0], [ 7, 2],
[ 7, 4], [ 7, 6], [ 6, 4], [ 5, 2], [ 6, 6], [ 8, 4], [ 8, 6],
],
[
# Row 2
[12, 0], [12, 2], [10, 0], [ 9, 0], [10, 2], [11, 0], [ ],
[ ], [11, 2], [10, 4], [ 9, 2], [10, 6], [12, 4], [12, 6],
],
[
# Row 3
[17, 0], [17, 2], [15, 0], [14, 0], [15, 2], [16, 0], [13, 0],
[13, 2], [16, 2], [15, 4], [14, 2], [15, 6], [17, 4], [17, 6],
],
[
# Row 4
[20, 0], [20, 2], [19, 0], [18, 0], [19, 2], [], [], [], [],
[19, 4], [18, 2], [19, 6], [20, 4], [20, 6], [], [], [], []
],
[
# Row 5
[ ], [23, 0], [22, 2], [22, 0], [22, 4], [21, 0], [21, 2],
[24, 0], [24, 2], [25, 0], [25, 4], [25, 2], [26, 0], [ ],
],
]
def set_attr_at(self, block, n, attr, fn, val):
blk = self.heatmap[block][n]
if attr in blk:
blk[attr] = fn(blk[attr], val)
else:
blk[attr] = fn(None, val)
def coord(self, col, row):
return self.coords[row][col]
@staticmethod
def set_attr(orig, new):
return new
def set_bg(self, coords, color):
(block, n) = coords
self.set_attr_at(block, n, "c", self.set_attr, color)
#self.set_attr_at(block, n, "g", self.set_attr, False)
def set_tap_info(self, coords, count, cap):
(block, n) = coords
def _set_tap_info(o, _count, _cap):
ns = 4 - o.count ("\n")
return o + "\n" * ns + "%.02f%%" % (float(_count) / float(_cap) * 100)
if not cap:
cap = 1
self.heatmap[block][n + 1] = _set_tap_info (self.heatmap[block][n + 1], count, cap)
@staticmethod
def heatmap_color (v):
colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]]
fb = 0
if v <= 0:
idx1, idx2 = 0, 0
elif v >= 1:
idx1, idx2 = len(colors) - 1, len(colors) - 1
else:
val = v * (len(colors) - 1)
idx1 = int(floor(val))
idx2 = idx1 + 1
fb = val - float(idx1)
r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0]
g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1]
b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2]
r, g, b = [x * 255 for x in (r, g, b)]
return "#%02x%02x%02x" % (int(r), int(g), int(b))
def __init__(self, layout):
self.log = {}
self.total = 0
self.max_cnt = 0
self.layout = layout
def update_log(self, coords):
(c, r) = coords
if not (c, r) in self.log:
self.log[(c, r)] = 0
self.log[(c, r)] = self.log[(c, r)] + 1
self.total = self.total + 1
if self.max_cnt < self.log[(c, r)]:
self.max_cnt = self.log[(c, r)]
def get_heatmap(self):
with open("%s/heatmap-layout.%s.json" % (dirname(sys.argv[0]), self.layout), "r") as f:
self.heatmap = json.load (f)
## Reset colors
for row in self.coords:
for coord in row:
if coord != []:
self.set_bg (coord, "#d9dae0")
for (c, r) in self.log:
coords = self.coord(c, r)
b, n = coords
cap = self.max_cnt
if cap == 0:
cap = 1
v = float(self.log[(c, r)]) / cap
self.set_bg (coords, self.heatmap_color (v))
self.set_tap_info (coords, self.log[(c, r)], self.total)
return self.heatmap
def get_stats(self):
usage = [
# left hand
[0, 0, 0, 0, 0],
# right hand
[0, 0, 0, 0, 0]
]
finger_map = [0, 0, 1, 2, 3, 3, 3, 1, 1, 1, 2, 3, 4, 4]
for (c, r) in self.log:
if r == 5: # thumb cluster
if c <= 6: # left side
usage[0][4] = usage[0][4] + self.log[(c, r)]
else:
usage[1][0] = usage[1][0] + self.log[(c, r)]
elif r == 4 and (c == 4 or c == 9): # bottom row thumb keys
if c <= 6: # left side
usage[0][4] = usage[0][4] + self.log[(c, r)]
else:
usage[1][0] = usage[1][0] + self.log[(c, r)]
else:
fc = c
hand = 0
if fc >= 7:
hand = 1
fm = finger_map[fc]
usage[hand][fm] = usage[hand][fm] + self.log[(c, r)]
hand_usage = [0, 0]
for f in usage[0]:
hand_usage[0] = hand_usage[0] + f
for f in usage[1]:
hand_usage[1] = hand_usage[1] + f
total = self.total
if total == 0:
total = 1
stats = {
"total-keys": total,
"hands": {
"left": {
"usage": round(float(hand_usage[0]) / total * 100, 2),
"fingers": {
"pinky": 0,
"ring": 0,
"middle": 0,
"index": 0,
"thumb": 0,
}
},
"right": {
"usage": round(float(hand_usage[1]) / total * 100, 2),
"fingers": {
"thumb": 0,
"index": 0,
"middle": 0,
"ring": 0,
"pinky": 0,
}
},
}
}
hmap = ['left', 'right']
fmap = ['pinky', 'ring', 'middle', 'index', 'thumb',
'thumb', 'index', 'middle', 'ring', 'pinky']
for hand_idx in range(len(usage)):
hand = usage[hand_idx]
for finger_idx in range(len(hand)):
stats['hands'][hmap[hand_idx]]['fingers'][fmap[finger_idx + hand_idx * 5]] = round(float(hand[finger_idx]) / total * 100, 2)
return stats
def dump_all(out_dir, heatmaps):
stats = {}
t = Terminal()
t.clear()
sys.stdout.write("\x1b[2J\x1b[H")
print ('{t.underline}{outdir}{t.normal}\n'.format(t=t, outdir=out_dir))
keys = list(heatmaps.keys())
keys.sort()
for layer in keys:
if len(heatmaps[layer].log) == 0:
continue
with open ("%s/%s.json" % (out_dir, layer), "w") as f:
json.dump(heatmaps[layer].get_heatmap(), f)
stats[layer] = heatmaps[layer].get_stats()
left = stats[layer]['hands']['left']
right = stats[layer]['hands']['right']
print ('{t.bold}{layer}{t.normal} ({total:,} taps):'.format(t=t, layer=layer,
total=int(stats[layer]['total-keys'] / 2)))
print (('{t.underline} | ' + \
'left ({l[usage]:6.2f}%) | ' + \
'right ({r[usage]:6.2f}%) |{t.normal}').format(t=t, l=left, r=right))
print ((' {t.bright_magenta}pinky{t.white} | {left[pinky]:6.2f}% | {right[pinky]:6.2f}% |\n' + \
' {t.bright_cyan}ring{t.white} | {left[ring]:6.2f}% | {right[ring]:6.2f}% |\n' + \
' {t.bright_blue}middle{t.white} | {left[middle]:6.2f}% | {right[middle]:6.2f}% |\n' + \
' {t.bright_green}index{t.white} | {left[index]:6.2f}% | {right[index]:6.2f}% |\n' + \
' {t.bright_red}thumb{t.white} | {left[thumb]:6.2f}% | {right[thumb]:6.2f}% |\n' + \
'').format(left=left['fingers'], right=right['fingers'], t=t))
def process_line(line, heatmaps, opts, stamped_log = None):
m = re.search ('KL: col=(\d+), row=(\d+), pressed=(\d+), layer=(.*)', line)
if not m:
return False
if stamped_log is not None:
if line.startswith("KL:"):
print ("%10.10f %s" % (time.time(), line),
file = stamped_log, end = '')
else:
print (line,
file = stamped_log, end = '')
stamped_log.flush()
(c, r, l) = (int(m.group (2)), int(m.group (1)), m.group (4))
if (c, r) not in opts.allowed_keys:
return False
heatmaps[l].update_log ((c, r))
return True
def setup_allowed_keys(opts):
if len(opts.only_key):
incmap={}
for v in opts.only_key:
m = re.search ('(\d+),(\d+)', v)
if not m:
continue
(c, r) = (int(m.group(1)), int(m.group(2)))
incmap[(c, r)] = True
else:
incmap={}
for r in range(0, 6):
for c in range(0, 14):
incmap[(c, r)] = True
for v in opts.ignore_key:
m = re.search ('(\d+),(\d+)', v)
if not m:
continue
(c, r) = (int(m.group(1)), int(m.group(2)))
del(incmap[(c, r)])
return incmap
def main(opts):
heatmaps = {"Dvorak": Heatmap("Dvorak"),
"ADORE": Heatmap("ADORE")
}
cnt = 0
out_dir = opts.outdir
if not os.path.exists(out_dir):
os.makedirs(out_dir)
opts.allowed_keys = setup_allowed_keys(opts)
if not opts.one_shot:
try:
with open("%s/stamped-log" % out_dir, "r") as f:
while True:
line = f.readline()
if not line:
break
if not process_line(line, heatmaps, opts):
continue
except:
pass
stamped_log = open ("%s/stamped-log" % (out_dir), "a+")
else:
stamped_log = None
while True:
line = sys.stdin.readline()
if not line:
break
if not process_line(line, heatmaps, opts, stamped_log):
continue
cnt = cnt + 1
if opts.dump_interval != -1 and cnt >= opts.dump_interval and not opts.one_shot:
cnt = 0
dump_all(out_dir, heatmaps)
dump_all (out_dir, heatmaps)
if __name__ == "__main__":
parser = argparse.ArgumentParser (description = "keylog to heatmap processor")
parser.add_argument ('outdir', action = 'store',
help = 'Output directory')
parser.add_argument ('--dump-interval', dest = 'dump_interval', action = 'store', type = int,
default = 100, help = 'Dump stats and heatmap at every Nth event, -1 for dumping at EOF only')
parser.add_argument ('--ignore-key', dest = 'ignore_key', action = 'append', type = str,
default = [], help = 'Ignore the key at position (x, y)')
parser.add_argument ('--only-key', dest = 'only_key', action = 'append', type = str,
default = [], help = 'Only include key at position (x, y)')
parser.add_argument ('--one-shot', dest = 'one_shot', action = 'store_true',
help = 'Do not load previous data, and do not update it, either.')
args = parser.parse_args()
if len(args.ignore_key) and len(args.only_key):
print ("--ignore-key and --only-key are mutually exclusive, please only use one of them!",
file = sys.stderr)
sys.exit(1)
main(args)

View file

@ -0,0 +1,107 @@
#!/usr/bin/env python3
import os
import sys
charmap = {
'9': [[1, 0]],
'7': [[2, 0]], '@': [[2, 5], [2, 0]],
'5': [[3, 0]], '*': [[2, 5], [3, 0]],
'3': [[4, 0]], '^': [[2, 5], [4, 0]],
'1': [[5, 0]], '$': [[2, 5], [5, 0]],
'0': [[8, 0]], '%': [[2, 5], [8, 0]],
'2': [[9, 0]], '!': [[2, 5], [9, 0]],
'4': [[10, 0]], '#': [[2, 5], [10, 0]],
'6': [[11, 0]], '&': [[2, 5], [11, 0]],
'8': [[12, 0]],
'\\': [[0, 1]], '|': [[2, 5], [0, 1]],
'x': [[1, 1]], 'X': [[2, 5], [1, 1]],
'w': [[2, 1]], 'W': [[2, 5], [2, 1]],
'c': [[3, 1]], 'C': [[2, 5], [3, 1]],
'h': [[4, 1]], 'H': [[2, 5], [4, 1]],
'f': [[5, 1]], 'F': [[2, 5], [5, 1]],
'[': [[6, 1]], '{': [[2, 5], [6, 1]], '(': [[6, 1], [6, 1]],
']': [[7, 1]], '}': [[2, 5], [7, 1]], ')': [[7, 1], [7, 1]],
'm': [[8, 1]], 'M': [[2, 5], [8, 1]],
'g': [[9, 1]], 'G': [[2, 5], [9, 1]],
'l': [[10, 1]], 'L': [[2, 5], [10, 1]],
'p': [[11, 1]], 'P': [[2, 5], [11, 1]],
'/': [[12, 1]], '?': [[2, 5], [12, 1]],
'`': [[13, 1]], '~': [[2, 5], [13, 1]],
'\t': [[0, 2]],
'a': [[1, 2]], 'A': [[2, 5], [1, 2]],
'o': [[2, 2]], 'O': [[2, 5], [2, 2]],
'e': [[3, 2]], 'E': [[2, 5], [3, 2]],
'i': [[4, 2]], 'I': [[2, 5], [4, 2]],
'u': [[5, 2]], 'U': [[2, 5], [5, 2]],
'd': [[8, 2]], 'D': [[2, 5], [8, 2]],
'r': [[9, 2]], 'R': [[2, 5], [9, 2]],
't': [[10, 2]], 'T': [[2, 5], [10, 2]],
'n': [[11, 2]], 'N': [[2, 5], [11, 2]],
's': [[12, 2]], 'S': [[2, 5], [12, 2]],
'=': [[13, 2]], '+': [[2, 5], [13, 2]],
'z': [[1, 3]], 'Z': [[2, 5], [1, 3]],
'q': [[2, 3]], 'Q': [[2, 5], [2, 3]],
'\'': [[3, 3]], '"': [[2, 5], [3, 3]],
',': [[4, 3]], '<': [[2, 5], [4, 3]],
'.': [[5, 3]], '>': [[2, 5], [5, 3]],
'b': [[8, 3]], 'B': [[2, 5], [8, 3]],
'k': [[9, 3]], 'K': [[2, 5], [9, 3]],
'v': [[10, 3]], 'V': [[2, 5], [10, 3]],
'y': [[11, 3]], 'Y': [[2, 5], [11, 3]],
'j': [[12, 3]], 'J': [[2, 5], [12, 3]],
':': [[4, 4]], ';': [[4, 4], [4, 4]],
'-': [[9, 4]], '_': [[2, 5], [9, 4]],
' ': [[10, 5]],
'\n': [[11, 5]],
## Layered things
# Hungarian
'á': [[9, 5], [1, 2]], 'Á': [[2, 5], [9, 5], [1, 2]],
'ó': [[9, 5], [2, 2]], 'Ó': [[2, 5], [9, 5], [2, 2]],
'ő': [[9, 5], [2, 1]], 'Ő': [[2, 5], [9, 5], [2, 1]],
'ö': [[9, 5], [2, 3]], 'Ö': [[2, 5], [9, 5], [2, 3]],
'é': [[9, 5], [3, 2]], 'É': [[2, 5], [9, 5], [3, 2]],
'ú': [[9, 5], [4, 2]], 'Ú': [[2, 5], [9, 5], [4, 2]],
'ű': [[9, 5], [4, 1]], 'Ű': [[2, 5], [9, 5], [4, 1]],
'ü': [[9, 5], [4, 3]], 'Ü': [[2, 5], [9, 5], [4, 3]],
'í': [[9, 5], [5, 2]], 'Í': [[2, 5], [9, 5], [5, 2]],
}
def lookup_char(layer, ch):
if ch in charmap:
return charmap[ch]
return None
def process_char(layer, ch, out=sys.stdout):
keys = lookup_char(layer, ch)
if not keys:
print ("Unknown char: %s" % ch, file=sys.stderr)
else:
for (c, r) in keys:
print ("KL: col=%d, row=%d, pressed=1, layer=%s" % (r, c, layer), file=out)
print ("KL: col=%d, row=%d, pressed=0, layer=%s" % (r, c, layer), file=out)
def process_file(fn, layer, out=sys.stdout):
with open(fn, "r") as f:
ch = f.read(1)
while ch:
process_char(layer, ch, out)
ch = f.read(1)
if sys.argv[1] == '-':
out='/dev/stdin'
else:
out=sys.argv[1]
if len(sys.argv) >= 2:
layer = 'ADORE'
else:
layer = sys.argv[2]
process_file(out, layer = layer)

View file

@ -0,0 +1,12 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include QMK_KEYBOARD_CONFIG_H
#define FORCE_NKRO
#define PREVENT_STUCK_MODIFIERS
#undef TAPPING_TERM
#undef IGNORE_MOD_TAP_INTERRUPT
#endif

View file

@ -0,0 +1,107 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define ETC 2 // etc
enum macro_id {
TEENSY,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT_ergodox(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_PGUP,
CTL_T(KC_ESC), LT(ETC,KC_A), KC_S, KC_E, KC_T, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGDN,
KC_GRV, KC_DEL, KC_DEL, KC_LALT, GUI_T(KC_TAB),
KC_NO, KC_NO,
KC_NO,
LT(SYMB,KC_BSPC), CTL_T(KC_ESC), KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_VOLU, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_BSLS,
KC_Y, KC_N, KC_I, KC_O, KC_H, KC_QUOT,
KC_VOLD, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
GUI_T(KC_TAB), KC_LEFT, KC_DOWN, KC_UP, LCAG_T(KC_RGHT),
KC_NO, KC_NO,
KC_NO,
KC_NO, SFT_T(KC_ENT), LT(SYMB,KC_SPC)
),
[SYMB] = LAYOUT_ergodox(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS,
KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_BSLS,
KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_ASTR, KC_TRNS,
KC_TILD, KC_AMPR, KC_AMPR, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_EQL, KC_7, KC_8, KC_9, KC_PLUS, KC_NO,
KC_MINS, KC_4, KC_5, KC_6, KC_QUOT, KC_NO,
KC_TRNS, KC_UNDS, KC_1, KC_2, KC_3, KC_DQUO, KC_TRNS,
KC_0, KC_NO, KC_DOT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
[ETC] = LAYOUT_ergodox(
RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_TRNS,
KC_TRNS, LT(ETC,KC_A), KC_NO, KC_NO, KC_NO, KC_PGDN,
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL, KC_TRNS,
KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_VOLU, KC_F7, KC_F8, KC_F9, KC_HOME, KC_NO,
KC_VOLD, KC_F4, KC_F5, KC_F6, KC_END, KC_NO,
KC_TRNS, KC_MUTE, KC_F1, KC_F2, KC_F3, KC_INS, KC_TRNS,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch(id) {
case TEENSY:
break;
}
return MACRO_NONE;
};
void matrix_init_user(void) {
};
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
break;
}
};

View file

@ -0,0 +1,15 @@
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ # nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

View file

@ -0,0 +1,187 @@
// Netable differences vs. the default firmware for the ErgoDox EZ:
// 1. The Cmd key is now on the right side, making Cmd+Space easier.
// 2. The media keys work on OSX (But not on Windows).
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | '" | | '" | 6 | 7 | 8 | 9 | 0 | BkSp |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | ~L1 | | ~L1 | Y | U | I | O | P | - |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |Ctrl/Esc| A | S | D | F | G |------| |------| H | J | K | L |; / L2| / |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| Alt |AltShf| Left | Right| | Up | Down | [ | ] | L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Esc |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | ( | | { | | |
* | Space| LGui |------| |------| RGui |Enter |
* | | | ) | | } | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_QUOT,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_FN1,
CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_LALT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_LPRN,
KC_SPC,KC_LGUI,KC_RPRN,
// right hand
KC_QUOT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_FN1, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),KC_BSLS,
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, TG(1),
KC_ESC, CTL_T(KC_ESC),
KC_LCBR,
KC_RCBR,KC_RGUI, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2016 Kaleb Elwert
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,79 @@
# Belak's Ergodox Layout
This has been based off of [emacs\_osx\_dk](https://github.com/jackhumbert/qmk_firmware/tree/master/keyboards/ergodox/keymaps/emacs_osx_dk)
from the main qmk repo. However, I've taken some of the ideas for the thumbs
from [dvorak\_emacs](https://github.com/jackhumbert/qmk_firmware/tree/master/keyboards/ergodox/keymaps/dvorak_emacs)
and tweaked it a bit based on the keycaps I have.
This keyboard is intended for use in emacs (one of the main reasons for easy
access to modifiers) but it could be useful in other instances as well.
The main repo is used as a testbed, so sometimes the layout may be in a strange
state. The qmk version should be relatively stable.
## Instructions
This is currently being used on a regular ergodox, but it should work fine on
the infinity as well. Though, you may have to modify the commands to build and
flash the firmware to match the separate halves as defined in the infinity
documentation.
If you are using this keymap in the qmk repo, you should be able to just run
`make ergodox-belak-teensy`. If you're using this externally (I sometimes make
changes before syncing them to qmk), use the following instructions:
1. Clone the main qmk repo
2. Clone this to `$QMK/keyboards/ergodox/keymaps/belak-external`
3. Run `make ergodox-belak-external-teensy` from the root of the qmk repo.
## Changelog
Fifth Revision
* Change layer keys to tap-dance keys which cycle through additional layers
* Add a few emoji keys (in preparation for an emoji layer)
Fourth Revision
* Remove media layer
* Add a layer which swaps control and gui on the thumb keys.
* Add some basic code to save settings to the eeprom
* Save the state of the keys swapped in the thumb in the eeprom
Third Revision
* Add numpad layer and remove numpad from symbols layer
* Disable media layer
* Add arrow keys on ijkl to the symbols layer
* Replace ALT on held enter and held delete with GUI (for better OSX
compatibility, as there's already an ALT key relatively close)
* Replace keys above enter and delete with temporary layer switch buttons not
matching the other layer switch for that hand.
* Reindent and space out most of the layer definitions
Second Revision
* Clean up definitions to make differences between layers easier to see
* Remove old LCD code
* Add new LCD code based on fredizzimo's branch
First Revision
* Reverse grave and escape
Initial Version
* Copy from emacs\_osx\_dk
* "Fix" right alt
* Change thumb keys to match default layout (backspace, delete, enter, space)
* Add modifiers to thumb keys (ctrl to backspace and space, alt to delete and
enter)
* Replace the RAlt below the brackets with LGui and RGui
* Remove LCtrl and RCtrl from the keys above shift
* Add browser forward, and move browser back
* "Fix" the order of volume keys
## Repository
The original code for this is kept at https://github.com/belak/ergodox-layout and
is synced to qmk every few main revisions.

View file

@ -0,0 +1,368 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "eeconfig.h"
#include "eeprom.h"
#define LAYER_ON(pos) ((layer_state) & (1<<(pos)))
#define _______ KC_TRNS
#define EECONFIG_BELAK_MAGIC (uint16_t)0xBE42
// NOTE: This is just a number that's a bit beyond the end of what's already
// defined. As there is no other define we can base this on, it may need to be
// changed in the future. The initial value here is used as a placeholder with a
// magic word, similar to the normal eeconfig. Note that all the storage being
// used needs to fit inside the 32 bytes of the Ergodox Infinity.
#define EECONFIG_BELAK (uint16_t *)16
// The correct way to do this would be how the normal eeconfig handles it and
// use a bitfield. However, the eeprom has a ton of space which isn't being
// used so I don't really care and have a separate byte for every setting.
#define EECONFIG_BELAK_SWAP_GUI_CTRL (uint8_t *)18
static uint8_t swap_gui_ctrl = 0;
static uint8_t td_led_override = 0;
enum belak_keycodes {
// Function codes
BEL_F0 = SAFE_RANGE,
BEL_F1,
E_SHRUG,
E_TFLIP,
E_TSET,
};
inline void tap(uint16_t keycode) {
register_code(keycode);
unregister_code(keycode);
};
// TODO: Add LED support to the tap dance by using the advanced macro
#define LTOGGLE TD(TD_LAYER_TOGGLE)
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define NUMP 2 // numpad
#define SWPH 3 // swap gui/ctrl on the hands
enum belak_td {
TD_LAYER_TOGGLE = 0,
};
void belak_td_each(qk_tap_dance_state_t *state, void *user_data);
void belak_td_finished(qk_tap_dance_state_t *state, void *user_data);
void belak_td_reset(qk_tap_dance_state_t *state, void *user_data);
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LAYER_TOGGLE] = ACTION_TAP_DANCE_FN_ADVANCED(belak_td_each, belak_td_finished, belak_td_reset),
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | L1 | | L2 | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | - |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | \ | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| LGui | | RGui |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Layers| LCtrl| Left | Right| LAlt | | RAlt | Up | Down | RCtrl|Layers|
* `----------------------------------' `----------------------------------'
* ,-------------. ,--------------.
* | ~L2 | Ins | | Grv | ~L1 |
* ,-------|------|------| |------+-------+-------.
* | Back | | Home | | PgUp | | |
* | Space | Del |------| |------| Enter | Space |
* | | | End | | PgDn | | |
* `---------------------' `----------------------'
*/
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, TG(SYMB),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
CTL_T(KC_BSLS), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI,
LTOGGLE, KC_LCTRL, KC_LEFT,KC_RGHT,KC_LALT,
MO(NUMP),KC_INS,
KC_HOME,
CTL_T(KC_BSPC),GUI_T(KC_DEL),KC_END,
// right hand
TG(NUMP), KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_RGUI, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
KC_RALT,KC_UP, KC_DOWN,KC_RCTRL, LTOGGLE,
KC_GRV, MO(SYMB),
KC_PGUP,
KC_PGDN, GUI_T(KC_ENT), CTL_T(KC_SPC)
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | | Up | | | F12 |
* |--------+------+------+------+------+------| TFLIP| | TSET |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | Left | Down | Rght | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | SHRUG| | | & | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LClear| | | | | | | | | |LClear|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | TOGL | | | | TOGL |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[SYMB] = LAYOUT_ergodox(
// left hand
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, E_TFLIP,
_______, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, E_TSET,
_______, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV,
_______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, E_SHRUG,
BEL_F1, _______, _______, _______, _______,
BEL_F0, _______,
_______,
_______, _______, _______,
// right hand
_______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_UP, _______, KC_UP, _______, _______, KC_F12,
KC_DOWN, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
_______, KC_AMPR, _______, _______, _______, _______, _______,
_______, _______, _______, _______, BEL_F1,
_______, BEL_F0,
_______,
_______, _______, _______
),
/* Keymap 2: Numpad Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | 7 | 8 | 9 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LClear| | | | | | 0 | 0 | . | = |LClear|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | TOGL | | | | TOGL |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[NUMP] = LAYOUT_ergodox(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
BEL_F1, _______, _______, _______, _______,
BEL_F0, _______,
_______,
_______, _______, _______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, KC_7, KC_8, KC_9, KC_ASTR, _______,
_______, KC_4, KC_5, KC_6, KC_PLUS, _______,
_______, _______, KC_1, KC_2, KC_3, KC_BSLS, _______,
KC_0, KC_0, KC_DOT, KC_EQL, BEL_F1,
_______, BEL_F0,
_______,
_______, _______, _______
),
/* Keymap 3: Swap control and gui on the thumb */
[SWPH] = LAYOUT_ergodox(
// left hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
GUI_T(KC_BSPC), CTL_T(KC_DEL), _______,
// right hand
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
_______, CTL_T(KC_ENT), GUI_T(KC_SPC)
),
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
// If our magic word wasn't set properly, we need to zero out the settings.
if (eeprom_read_word(EECONFIG_BELAK) != EECONFIG_BELAK_MAGIC) {
eeprom_update_word(EECONFIG_BELAK, EECONFIG_BELAK_MAGIC);
eeprom_update_byte(EECONFIG_BELAK_SWAP_GUI_CTRL, 0);
}
if (eeprom_read_byte(EECONFIG_BELAK_SWAP_GUI_CTRL)) {
layer_on(SWPH);
swap_gui_ctrl = 1;
}
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (td_led_override) {
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// Layer 1 and 2 are both overlay layers, so they could both be on. This
// means we can't use the lazy check of checking for the first significant
// bit.
if (LAYER_ON(SYMB)) {
ergodox_right_led_1_on();
}
if (LAYER_ON(NUMP)) {
ergodox_right_led_2_on();
}
}
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case BEL_F0:
if(record->event.pressed){
swap_gui_ctrl = !swap_gui_ctrl;
eeprom_update_byte(EECONFIG_BELAK_SWAP_GUI_CTRL, swap_gui_ctrl);
if (swap_gui_ctrl) {
layer_on(SWPH);
} else {
layer_off(SWPH);
}
return false;
}
break;
case BEL_F1:
if(record->event.pressed){
layer_off(SYMB);
layer_off(NUMP);
return false;
}
break;
case E_SHRUG: // ¯\_(ツ)_/¯
if (record->event.pressed) {
process_unicode((0x00AF|QK_UNICODE), record); // Hand
tap(KC_BSLS); // Arm
register_code(KC_RSFT);
tap(KC_UNDS); // Arm
tap(KC_LPRN); // Head
unregister_code(KC_RSFT);
process_unicode((0x30C4|QK_UNICODE), record); // Face
register_code(KC_RSFT);
tap(KC_RPRN); // Head
tap(KC_UNDS); // Arm
unregister_code(KC_RSFT);
tap(KC_SLSH); // Arm
process_unicode((0x00AF|QK_UNICODE), record); // Hand
}
return false;
break;
case E_TFLIP: // (╯°□°)╯ ︵ ┻━┻
if (record->event.pressed) {
register_code(KC_RSFT);
tap(KC_9);
unregister_code(KC_RSFT);
process_unicode((0x256F|QK_UNICODE), record); // Arm
process_unicode((0x00B0|QK_UNICODE), record); // Eye
process_unicode((0x25A1|QK_UNICODE), record); // Mouth
process_unicode((0x00B0|QK_UNICODE), record); // Eye
register_code(KC_RSFT);
tap(KC_0);
unregister_code(KC_RSFT);
process_unicode((0x256F|QK_UNICODE), record); // Arm
tap(KC_SPC);
process_unicode((0x0361|QK_UNICODE), record); // Flippy
tap(KC_SPC);
process_unicode((0x253B|QK_UNICODE), record); // Table
process_unicode((0x2501|QK_UNICODE), record); // Table
process_unicode((0x253B|QK_UNICODE), record); // Table
}
return false;
break;
case E_TSET: // ┬──┬ ( ゜-゜ノ)
if (record->event.pressed) {
process_unicode((0x252C|QK_UNICODE), record); // Table
process_unicode((0x2500|QK_UNICODE), record); // Table
process_unicode((0x2500|QK_UNICODE), record); // Table
process_unicode((0x252C|QK_UNICODE), record); // Table
tap(KC_SPC);
process_unicode((0x30CE|QK_UNICODE), record); // Arm
register_code(KC_RSFT);
tap(KC_9);
unregister_code(KC_RSFT);
tap(KC_SPC);
process_unicode((0x309C|QK_UNICODE), record); // Eye
tap(KC_MINS);
process_unicode((0x309C|QK_UNICODE), record); // Eye
process_unicode((0x30CE|QK_UNICODE), record); // Arm
register_code(KC_RSFT);
tap(KC_0);
unregister_code(KC_RSFT);
}
return false;
break;
}
return true;
}
void belak_td_each(qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
td_led_override = 1;
break;
case 2:
td_led_override = 2;
break;
default:
reset_tap_dance(state);
}
}
void belak_td_finished(qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
layer_on(SYMB);
break;
case 2:
layer_on(NUMP);
break;
}
td_led_override = 0;
}
void belak_td_reset(qk_tap_dance_state_t *state, void *user_data) {
td_led_override = 0;
}

View file

@ -0,0 +1,4 @@
TAP_DANCE_ENABLE=yes
UNICODE_ENABLE=yes

View file

@ -0,0 +1,49 @@
/*
Copyright 2017 Fred Sundvik
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/>.
*/
// Currently we are assuming that both the backlight and LCD are enabled
// But it's entirely possible to write a custom visualizer that use only
// one of them
#ifndef LCD_BACKLIGHT_ENABLE
#error This visualizer needs that LCD backlight is enabled
#endif
#ifndef LCD_ENABLE
#error This visualizer needs that LCD is enabled
#endif
#include "simple_visualizer.h"
static void get_visualizer_layer_and_color(visualizer_state_t* state) {
uint8_t saturation = 60;
if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
saturation = 255;
}
if (state->status.layer & 0x4) {
state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF);
state->layer_text = "Media";
}
else if (state->status.layer & 0x2) {
state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF);
state->layer_text = "Symbols";
}
else {
state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF);
state->layer_text = "Base";
}
}

View file

@ -0,0 +1,368 @@
#include QMK_KEYBOARD_H
#include "keymap_bepo.h"
#include "keymap_french.h"
// keymaps
#define BEPO 0 // default layer, for bepo compatible systems
#define QW_B 1 // bepo to qwerty base compat layer, for qwerty systems
#define QW_A 2 // bepo with altgr key to qwerty compat layer
#define QW_S 3 // bepo with shift key to qwerty compat layer
#define AZ_B 4 // bepo to azerty base compat layer, for azerty systems
#define AZ_A 5 // bepo with altgr key to azerty compat layer
#define AZ_S 6 // bepo with shift key to azerty compat layer
#define FNAV 7 // function / navigation / mouse layer
#define NUMK 8 // numeric keypad layer
// macros
#define KP_00 0 // keypad "double 0"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: default layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | " | < | > | ( | ) |Delete| |ScroLo| @ | + | - | / | * | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | % | B |E_ACUT| P | O |E_GRAV|Backsp| |CapsLo| ^ | V | D | L | J | Z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | W | A | U | I | E | , |------| |------| C | T | S | R | N | M |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | E_CIRC |A_GRAV| Y | X | . | K | | | | ' | Q | G | H | F | C_CEDIL|
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | Space|LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[BEPO] = LAYOUT_ergodox(
// Left hand
BP_DOLLAR, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, KC_DEL,
BP_PERCENT, BP_B, BP_E_ACUTE, BP_P, BP_O, BP_E_GRAVE, KC_BSPC,
BP_W, BP_A, BP_U, BP_I, BP_E, BP_COMMA,
BP_ECRC, BP_A_GRAVE, BP_Y, BP_X, BP_DOT, BP_K, KC_TAB,
KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT,
DF(BEPO), DF(QW_B),
MO(NUMK),
KC_SPC, KC_LSHIFT, MO(FNAV),
// Right hand
KC_SLCK, BP_AT, BP_PLUS, BP_MINUS, BP_SLASH, BP_ASTR, BP_EQUAL,
KC_CAPSLOCK, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z,
BP_C, BP_T, BP_S, BP_R, BP_N, BP_M,
KC_NUMLOCK, BP_APOS, BP_Q, BP_G, BP_H, BP_F, BP_CCED,
BP_ALGR, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE,
DF(AZ_B), DF(BEPO),
MO(NUMK),
MO(FNAV), KC_RSHIFT, KC_ENTER),
/* Keymap 1: bepo to qwerty base compat layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | " | < | > | ( | ) |Delete| |ScroLo| @ | + | - | / | * | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | % | b | e | p | o | e |Backsp| |CapsLo| ^ | v | d | l | j | z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | w | a | u | i | e | , |------| |------| c | t | s | r | n | m |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | e | a | y | x | . | k | | | | ' | q | g | h | f | c |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | Space|LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[QW_B] = LAYOUT_ergodox(
// Left hand
KC_DOLLAR, S(KC_QUOT), S(KC_COMM), S(KC_DOT), KC_LPRN, KC_RPRN, KC_DEL,
KC_PERCENT, KC_B, KC_E, KC_P, KC_O, KC_E, KC_BSPC,
KC_W, KC_A, KC_U, KC_I, KC_E, KC_COMMA,
KC_E, KC_A, KC_Y, KC_X, KC_DOT, KC_K, KC_TAB,
KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_SPC, MO(QW_S), KC_TRNS,
// Right hand
KC_SLCK, KC_AT, KC_PLUS, KC_MINUS, KC_SLASH, KC_ASTR, KC_EQUAL,
KC_CAPSLOCK, KC_CIRC, KC_V, KC_D, KC_L, KC_J, KC_Z,
KC_C, KC_T, KC_S, KC_R, KC_N, KC_M,
KC_NUMLOCK, KC_QUOT, KC_Q, KC_G, KC_H, KC_F, KC_C,
MO(QW_A), KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, MO(QW_S), KC_ENTER),
/* Keymap 2: bepo with altgr key to qwerty compat layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | " | < | > | [ | ] |Delete| |ScroLo| @ | + | - | / | * | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | % | | | e | & | o | e |Backsp| |CapsLo| ^ | v | d | l | j | z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | w | a | u | i | | , |------| |------| c | t | s | r | n | m |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | e | \ | { | } | . | ~ | | | | ' | q | g | h | f | c |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | _ |LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[QW_A] = LAYOUT_ergodox(
// Left hand
KC_DOLLAR, S(KC_QUOT), S(KC_COMM), S(KC_DOT), KC_LBRC, KC_RBRC, KC_DEL,
KC_PERCENT, KC_PIPE, KC_E, KC_AMPR, KC_O, KC_E, KC_BSPC,
KC_W, KC_A, KC_U, KC_I, RALT(KC_5), KC_COMMA,
KC_E, KC_BSLASH, KC_LCBR, KC_RCBR, KC_DOT, KC_TILDE, KC_TAB,
KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_UNDS, MO(QW_S), KC_TRNS,
// Right hand
KC_SLCK, KC_AT, KC_PLUS, KC_MINUS, KC_SLASH, KC_ASTR, KC_EQUAL,
KC_CAPSLOCK, KC_CIRC, KC_V, KC_D, KC_L, KC_J, KC_Z,
KC_C, KC_T, KC_S, KC_R, KC_N, KC_M,
KC_NUMLOCK, KC_QUOT, KC_Q, KC_G, KC_H, KC_F, KC_C,
KC_TRNS, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, MO(QW_S), KC_ENTER),
/* Keymap 3: bepo with shift key to qwerty compat layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | # | 1 | 2 | 3 | 4 | 5 |Delete| |ScroLo| 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | ` | B | E | P | O | E |Backsp| |CapsLo| ! | V | D | L | J | Z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | W | A | U | I | E | ; |------| |------| C | T | S | R | N | M |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | E | A | Y | X | : | K | | | | ? | Q | G | H | F | C |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | Space|LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[QW_S] = LAYOUT_ergodox(
// Left hand
KC_HASH, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
KC_GRV, S(KC_B), S(KC_E), S(KC_P), S(KC_O), S(KC_E), KC_TRNS,
S(KC_W), S(KC_A), S(KC_U), S(KC_I), S(KC_E), KC_SCOLON,
S(KC_E), S(KC_A), S(KC_Y), S(KC_X), KC_COLON, S(KC_K), S(KC_TAB),
S(KC_ESC), S(KC_INS), S(KC_LGUI), S(KC_LCTL), S(KC_LALT),
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// Right hand
KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_TRNS, KC_EXLM, S(KC_V), S(KC_D), S(KC_L), S(KC_J), S(KC_Z),
S(KC_C), S(KC_T), S(KC_S), S(KC_R), S(KC_N), S(KC_M),
KC_TRNS, S(KC_SLASH), S(KC_Q), S(KC_G), S(KC_H), S(KC_F), S(KC_C),
S(KC_RALT), S(KC_RCTL), S(KC_RGUI), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
/* Keymap 4: bepo to azerty base compat layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | " | < | > | ( | ) |Delete| |ScroLo| @ | + | - | / | * | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | % | b |e_acut| p | o |e_grav|Backsp| |CapsLo| ^ | v | d | l | j | z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | w | a | u | i | e | , |------| |------| c | t | s | r | n | m |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | e |a_grav| y | x | . | k | | | | ' | q | g | h | f | c_cedil|
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | Space|LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[AZ_B] = LAYOUT_ergodox(
// Left hand
FR_DLR, FR_QUOT, FR_LESS, FR_GRTR, FR_LPRN, FR_RPRN, KC_DEL,
FR_PERC, KC_B, FR_EACU, KC_P, KC_O, FR_EGRV, KC_BSPC,
FR_W, FR_A, KC_U, KC_I, KC_E, FR_COMM,
KC_E, FR_AGRV, KC_Y, KC_X, FR_DOT, KC_K, KC_TAB,
KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_SPC, MO(AZ_S), KC_TRNS,
// Right hand
KC_SLCK, FR_AT, FR_PLUS, FR_MINS, FR_SLSH, FR_ASTR, FR_EQL,
KC_CAPSLOCK, KC_LBRC, KC_V, KC_D, KC_L, KC_J, FR_Z,
KC_C, KC_T, KC_S, KC_R, KC_N, FR_M,
KC_NUMLOCK, FR_APOS, FR_Q, KC_G, KC_H, KC_F, FR_CCED,
MO(AZ_A), KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, MO(AZ_S), KC_ENTER),
/* Keymap 5: bepo with altgr key to azerty compat layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | " | < | > | [ | ] |Delete| |ScroLo| @ | + | - | / | * | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | % | | | e | & | o | e |Backsp| |CapsLo| ^ | v | d | l | j | z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | w | a |u_grav| trem | | , |------| |------| c | t | s | r | n | m |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | / | \ | { | } | . | ~ | | | | ' | q | g | h | f | c |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | _ |LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[AZ_A] = LAYOUT_ergodox(
// Left hand
FR_DLR, FR_QUOT, FR_LESS, FR_GRTR, FR_LBRC, FR_RBRC, KC_DEL,
FR_PERC, FR_PIPE, FR_EACU, FR_AMP, KC_O, FR_EGRV, KC_BSPC,
FR_W, FR_A, FR_UGRV, S(KC_LBRC), FR_EURO, FR_COMM,
FR_SLSH, FR_BSLS, FR_LCBR, FR_RCBR, FR_DOT, FR_TILD, KC_TAB,
KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT,
KC_TRNS, KC_TRNS,
KC_TRNS,
FR_UNDS, MO(AZ_S), KC_TRNS,
// Right hand
KC_SLCK, FR_AT, FR_PLUS, FR_MINS, FR_SLSH, FR_ASTR, FR_EQL,
KC_CAPSLOCK, KC_LBRC, KC_V, KC_D, KC_L, KC_J, FR_Z,
KC_C, KC_T, KC_S, KC_R, KC_N, FR_M,
KC_NUMLOCK, FR_APOS, FR_Q, KC_G, KC_H, KC_F, FR_CCED,
KC_TRNS, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, MO(AZ_S), KC_ENTER),
/* Keymap 6: bepo with shift key to azerty compat layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | # | 1 | 2 | 3 | 4 | 5 |Delete| |ScroLo| 6 | 7 | 8 | 9 | 0 | ° |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | ` | B | E | P | O | E |Backsp| |CapsLo| ! | V | D | L | J | Z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | W | A | U | I | E | ; |------| |------| C | T | S | R | N | M |
* |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------|
* | E | A | Y | X | : | K | | | | ? | Q | G | H | F | C |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | Space|LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[AZ_S] = LAYOUT_ergodox(
// Left hand
FR_HASH, FR_1, FR_2, FR_3, FR_4, FR_5, KC_TRNS,
FR_GRV, S(KC_B), S(KC_E), S(KC_P), S(KC_O), S(KC_E), KC_TRNS,
S(FR_W), S(FR_A), S(KC_U), S(KC_I), S(KC_E), FR_SCLN,
S(KC_E), S(FR_A), S(KC_Y), S(KC_X), FR_COLN, S(KC_K), S(KC_TAB),
S(KC_ESC), S(KC_INS), S(KC_LGUI), S(KC_LCTL), S(KC_LALT),
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// Right hand
KC_TRNS, FR_6, FR_7, FR_8, FR_9, FR_0, FR_OVRR,
KC_TRNS, FR_EXLM, S(KC_V), S(KC_D), S(KC_L), S(KC_J), S(FR_Z),
S(KC_C), S(KC_T), S(KC_S), S(KC_R), S(KC_N), S(FR_M),
KC_TRNS, FR_QUES, S(FR_Q), S(KC_G), S(KC_H), S(KC_F), S(KC_C),
S(KC_RALT), S(KC_RCTL), S(KC_RGUI), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
/* Keymap 7: function / navigation / mouse layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 |VolMut| | | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Next |LClick| Up |RClick| WhUp |VolDwn| | | PgUp | Home | Up | End | F11 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Prev | Left | Down | Right|WhDown|------| |------| PgDn | Left | Down | Right| F12 | |
* |--------+------+------+------+------+------| VolUp| | |------+------+------+------+------+--------|
* | | Undo | Cut | Copy | Paste| | | | | | | | | | |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* | | | | | | | | | | | | | | | | | |
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[FNAV] = LAYOUT_ergodox(
// Left hand
KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MUTE,
KC_NO, KC_MS_BTN5, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_MS_WH_UP, KC_VOLU,
KC_NO, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN,
KC_NO, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_NO, KC_VOLD,
KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_NO, KC_TRNS, KC_TRNS,
// Right hand
KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO,
KC_NO, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_F11, KC_NO,
KC_PGDOWN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_F12, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_NO),
/* Keymap 8: numeric keypad layer, sends keypad codes
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | NumLo| / | * | - | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | 7 | 8 | 9 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | 1 | 2 | 3 | Enter| |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* | | | | | | | | | | | | | 0 | 00 | . | Enter| |
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[NUMK] = LAYOUT_ergodox(
// Left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_NO, KC_TRNS, KC_TRNS,
// Right hand
KC_NO, KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO,
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_PLUS, KC_NO,
KC_NO, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_NO,
KC_KP_0, M(KP_00), KC_KP_COMMA, KC_KP_ENTER, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_NO)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
// keypad "double 0"
case KP_00:
if (record->event.pressed) {
return MACRO( T(KP_0), D(KP_0), END );
} else {
return MACRO( U(KP_0), END );
}
break;
}
return MACRO_NONE;
};

View file

@ -0,0 +1,36 @@
![bepo.png](https://i.imgur.com/TnO8ApW.png)
# BEPO keymap for the ErgoDox
This keymap has been made for the BEPO layout (http://bepo.fr), which is an ergonomic french keyboard layout based on Dvorak rules. As it's made for french people, the following of this readme will be in french.
# Disposition BÉPO pour l'ErgoDox
Cette keymap a été pensée pour la disposition BÉPO (http://bepo.fr), qui est une disposition de clavier francophone, ergonomique et libre, élaborée selon la méthode Dvorak. L'adaptation de cette disposition à l'ErgoDox a été réalisée en conservant les points forts du clavier TypeMatrix 2030 (très répandu dans la communauté bépo, avec un excellent rapport ergonomie / prix) voir en réglant certains de ses défauts (3 colonnes pour l'auriculaire droit et touche "Ê") et en apportant son lot de nouveautés (compatibilité avec les systèmes azerty et qwerty).
Particularités
--------------
Touches de repos des pouces : "espace" à gauche et "entrée" à droite.
Placement des touches de combinaison ("Shift", "Alt", "Ctrl"...) adapté aux pouces, et permettant de conserver chaque doigt pour les rangées de lettres auxquelles ils sont assignés sans avoir à changer la touche de combinaison de côté (exemple : "A" majuscule puis "M" majuscule avec les auriculaires et un seul appui d'une touche "Shift").
Les touches "Alt" et "Alt Gr" sont accessibles avec les pouces sur la rangée du bas comme sur la TypeMatrix 2030, avec une symétrie gauche / droite.
Les touches "Ctrl" sont placées sur la même ligne que les touche "Alt" et "Alt Gr" comme sur un clavier clasique, elles sont accessibles aux pouces sur la rangée du bas (moins éloigné que le groupe de touches de pouces pour des petites mains).
Les touches "Backspace" et "Delete" sont placées comme sur la TypeMatrix 2030, du côté gauche uniquement (pour laisser celles de la main droite servir de {caps,num,scroll}lock puisqu'elles ont des LED).
La touche "Tab" est placée comme sur la TypeMatrix 2020.
Meilleure symétrie et accessibilité que la TypeMatrix 2030 : les touches "W" et "%" ont dû être déplacées du côté gauche en raison du nombre de touches de l'ErgoDox, mais l'auriculaire droit ne gère maintenant que deux colonnes de touches au lieu de trois. La touche "Ê" redevient accessible sur la même rangée que les autres lettres, comme sur un clavier classique en disposition bépo. Les lettres, chiffres et symboles sont tous regroupés sur 4 lignes et 6 colonnes pour chaque main, et la première rangée de lettres à la main gauche conserve une identité visuelle "BÉPO".
Touche de fonction permettant de saisir les touches F1 à F12, les touches F1 à F10 sont placées de façon logique par rapport aux chiffres 1 à 0. Cette même touche permet l'accès aux touches directionnelles sans déplacer la main droite et d'effectuer des actions souris avec uniquement la main gauche. Les touches "Home" et "End" sont placées de la même façon que sur une TypeMatrix 2030 par rapport aux touches directionnelles. Les touches "Page Up" et "Page Down" sont également accessibles facilement sans déplacer la main droite. Les fonctions "VolUp" et "VolDown" sont placées comme sur la TypeMatrix 2030, avec la fonction "Mute" juste au dessus. Les fonctions "Undo", "Cut", "Copy" et "Paste" sont placées côte à côte comme elles le seraient sur un clavier QWERTY en combinaison avec la touche "Ctrl" (à l'emplacement des lettres "Z", "X", "C" et "V"). Par rapport au layout "SpaceFN", l'utilisation d'une touche de fonction dédiée au pouce permet de ne pas ajouter de latence, et la touche espace reste compatible avec les jeux (action au moment de l'appui et possibilité d'appui long).
Touche de fonction permettant l'accès au pavé numérique comme sur la TypeMatrix 2030, mais sans avoir à déplacer la main droite : avec les doigts sur la rangée de repos, possibilité de saisir les chiffres "4", "5" et "6" comme sur un pavé numérique classique. Le double "0" de la TypeMatrix a été conservé, et gagne une possibilité de répétition en simples "0".
Touche permettant de basculer en mode BEPO sur un système configuré pour un clavier QWERTY. Cette compatibilité n'est pas parfaite (pas encore de gestion des accents mais ça devrait être faisable avec une disposition en qwerty international, et les combinaisons de touches ne sont pas toutes supportées puisque le clavier traduit déjà certaines touches en combinaisons) mais reste pratique pour une saisie de texte occasionnelle et pour des accès BIOS ou console en QWERTY.
Touche permettant de basculer en mode BEPO sur un système configuré pour un clavier AZERTY. Cette compatibilité n'est pas parfaite (pas de gestion des caractères non présents sur le clavier AZERTY, et les combinaisons de touches ne sont pas toutes supportées puisque le clavier traduit déjà certaines touches en combinaisons) mais reste pratique pour une saisie de texte occasionnelle et pour faire du bureau à distance vers un système Windows sans BEPO.
> Olivier Smedts <olivier@gid0.org>

View file

@ -0,0 +1,7 @@
# Having a file like this allows you to override Makefile definitions
# for your own particular keymap
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
COMMAND_ENABLE = no # Commands for debug and configuration

View file

@ -0,0 +1,527 @@
/* TypeMatrix-2030-like keymap */
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "action_util.h"
#include "led.h"
#include "keymap_extras/keymap_bepo.h"
#include "keymap_extras/keymap_canadian_multilingual.h"
enum layers {
LR_BASE, // default layer
LR_CSA, // BÉPO over Canadian Multilingual (CSA)
LR_CSA_SFT, // shifted BÉPO over CSA
LR_CSA_AGR, // altgr-ed BÉPO over CSA
LR_CSA_AGR_SFT, // altgr-shifted BÉPO over CSA
LR_NUMR, // numeric layer
LR_FN, // fn layer
};
#define IS_CA_MULT_ENABLED() (layer_state & (1 << LR_CSA))
enum macros {
// Characters that do not exist in CSA and must be implemented based on unicode support
// Note: these are intentionally declared first to be used as indexes in spec_chars below
UC_NDSH, //
UC_MDSH, // —
UC_ELPS, // …
END_UC, // indicates the last unicode character macro
// other macros
M_CSA_SFT, // toggle shift on CSA
M_CSA_AGR_SFT, // toggle shift on LR_CSA_AGR (goes to LR_CSA_AGR_SFT)
M_CSA_SFT_AGR, // toggle AltGr on LR_CSA_SFT (goes to LR_CSA_AGR_SFT)
// macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT
M_1,
M_2,
M_3,
M_4,
M_5,
M_6,
M_7,
M_8,
M_9,
M_0,
M_DEGR,
M_SCLN,
M_GRV,
M_NBSP,
// macros for characters that don't have a simple key combination in LR_CA_MULT_ALTGR
M_CRC,
// other layer macros
M_DBL0, // double 0
M_FNLR, // fn layer
M_NMAL, // num+alt
};
#define CSA(name) M(M_CSA_##name) // calls a CSA macro
const uint16_t unicode_chars[] = {
[UC_NDSH] = L'',
[UC_MDSH] = L'',
[UC_ELPS] = L'',
};
/* shortcut for unicode character macros */
#define MUC(name) M(UC_##name) // calls a unicode macro
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | " | « | » | ( | ) | Del | | Del | @ | + | - | / | * | W |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | B | É | P | O | È |Backsp| |Backsp| ^ | V | D | L | J | Z |
* |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------|
* | = | A | U | I | E | , |------| |------| C | T | S | R | N | M |
* |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------|
* | LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LCtrl | fn | LGui |numAlt| LAlt | |Alt Gr| % | App | Ç | RCtrl|
* `----------------------------------' `----------------------------------'
* ,--------------. ,-------------.
* | Esc | num | | Left |Right |
* ,------+-------+------| |------+------+------.
* | | | PgUp | | Up | | |
* |Space | Home |------| |------| End |Space |
* | | | PgDn | | Down | | |
* `---------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[LR_BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT,
KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC,
BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM,
KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT,
KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), KC_LALT,
KC_ESC, TG(LR_NUMR),
KC_PGUP,
KC_SPC, KC_HOME, KC_PGDN,
// right hand
KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, BP_W,
KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z,
BP_C, BP_T, BP_S, BP_R, BP_N, BP_M,
KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, KC_RSFT,
BP_ALGR, BP_PERC, KC_APP, BP_CCED, KC_RCTL,
KC_LEFT, KC_RGHT,
KC_UP,
KC_DOWN, KC_END, KC_SPC
),
/**
* Same as default but for use with Canadian Multilingual on OS side
*/
[LR_CSA] = LAYOUT_ergodox(
// left hand
KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_TRNS,
KC_TRNS, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_TRNS,
KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM,
CSA(SFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W,
KC_TRNS, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z,
KC_C, KC_T, KC_S, KC_R, KC_N, KC_M,
KC_TRNS, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, CSA(SFT),
MO(LR_CSA_AGR), KC_PERC, KC_TRNS, CSA_CCED, KC_LCTL, // RCTL has a special behaviour in CSA so use LCTL
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Shifted BÉPO over Canadian Multilingual
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | # | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | ! | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ° | | | | | ; |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | : | | | | | ? | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | ` | | | |
* `----------------------------------' `-----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[LR_CSA_SFT] = LAYOUT_ergodox(
// left hand
KC_HASH, M(M_1), M(M_2), M(M_3), M(M_4), M(M_5), KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
M(M_DEGR),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(M_SCLN),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_COLN, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
M(M_NBSP), KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS,
KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, CSA_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
CSA(SFT_AGR), M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, M(M_NBSP)
),
/* AltGr-ed BÉPO over Canadian Multilingual
* "////" indicates that the key is disabled (unsupported bépo character)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | < | > | [ | ] | | | | ^ | ± | //// | ÷ | × | dead ˘ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | |dead '| & | œ |dead `| | | | ¡ |dead ˇ| ð | //// | ij | ////// |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ////// | æ | ù |dead "| € | ̛’ |------| |------| © | þ | ß | ® |dead ~| dead ¯ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | \ | { | } | | ~ | | | | ¿ |dead °| μ | //// |dead ˛| |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | //// | |dead ¸| |
* `----------------------------------' `-----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | _ | |------| |------| | _ |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[LR_CSA_AGR] = LAYOUT_ergodox(
// left hand
MUC(NDSH), MUC(MDSH), CSA_LESS, CSA_GRTR, CSA_LBRC, CSA_RBRC, KC_TRNS,
KC_TRNS, CSA_PIPE, CSA_DACT, KC_AMPR, CSA_OE, CSA_DGRV, KC_TRNS,
KC_NO, CSA_AE, CSA_UGRV, CSA_DTRM, CSA_EURO, CSA_RQOT,
CSA(AGR_SFT), CSA_BSLS, CSA_LCBR, CSA_RCBR, MUC(ELPS), CSA_TILD, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_UNDS, CSA(AGR_SFT), KC_TRNS,
// right hand
KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, CSA_DVSN, CSA_TIMS, CSA_DBRV,
KC_TRNS, CSA_IXLM, CSA_DCAR, CSA_ETH, KC_NO, CSA_IJ, KC_NO,
CSA_CPRT, CSA_THRN, CSA_SRPS, CSA_RTM, CSA_DTLD, CSA_DMCR,
KC_TRNS, CSA_IQST, CSA_DRNG, CSA_MU, KC_NO, CSA_DOGO, CSA(AGR_SFT),
KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, CSA(AGR_SFT), KC_UNDS
),
/* AltGr-shifted BÉPO over Canadian Multilingual
* "////" indicates that the key is disabled (unsupported bépo character or unused in bépo)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | //// | “ | ” | //// | //// | | | | //// | ¬ | ¼ | ½ | ¾ | ////// |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ¦ | ˝ | § | Œ | ` | | | | //// | //// | Ð | //// | IJ | ////// |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ////// | Æ | Ù |dead-˙| //// | //// |------| |------| //// | Þ | ẞ | ™ | //// | º |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | //// | | | //// | //// | | | | //// | //// | //// | //// | ª | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[LR_CSA_AGR_SFT] = LAYOUT_ergodox(
// left hand
CSA_PARG, KC_NO, CSA_LDQT, CSA_RDQT, KC_NO, KC_NO, KC_TRNS,
KC_TRNS, CSA_BPIP, CSA_DDCT, CSA_SECT, S(CSA_OE), M(M_GRV), KC_TRNS,
KC_NO, S(CSA_AE), S(CSA_UGRV), CSA_DDTA, KC_NO, KC_NO,
CSA(AGR_SFT), KC_NO, CSA_LQOT, CSA_RQOT, KC_NO, KC_NO, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, CSA(AGR_SFT), KC_TRNS,
// right hand
KC_TRNS, KC_NO, CSA_NEGT, CSA_1QRT, CSA_1HLF, CSA_3QRT, KC_NO,
KC_TRNS, KC_NO, KC_NO, S(CSA_ETH), KC_NO, S(CSA_IJ), KC_NO,
KC_NO, S(CSA_THRN), S(CSA_SRPS), CSA_TM, KC_NO, CSA_ORDO,
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, CSA_ORDA, CSA(AGR_SFT),
CSA(SFT_AGR), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, CSA(AGR_SFT), KC_TRNS
),
/* Numeric Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | 0 | 00 | . |Etr/Ctl|
* `----------------------------------' `-----------------------------------'
* ,-------------. ,-------------.
* | | | |n.lock|c.lock|
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[LR_NUMR] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS,
KC_TRNS, KC_F11, KC_F12, 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,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS,
KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_TRNS, KC_P0, M(M_DBL0),KC_PDOT, CTL_T(KC_PENT),
KC_NLCK, KC_CAPS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* fn layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* |~CA-mult| | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | |VolUp | | | | | | | | Pause |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | RESET | | | Calc | Mail |Browsr|------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | App | cut | copy |paste | Mute |VolDn | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | Next | | | | |
* | Mute | play |------| |------| | |
* | | | Prev | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[LR_FN] = LAYOUT_ergodox(
TG(LR_CSA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM,
KC_TRNS, KC_APP, S(KC_DELT), LCTL(KC_INS),S(KC_INS), KC_MUTE, KC_VOLD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_MPRV,
KC_MUTE, KC_MPLY, KC_MNXT,
// right hand
KC_INS, KC_EJCT, KC_PWR, KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS,
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
),
};
const uint16_t PROGMEM fn_actions[] = {
};
void hold_shift(void) {
register_code(KC_LSHIFT);
}
void release_shift(void) {
unregister_code(KC_LSHIFT);
}
uint16_t hextokeycode(int hex) {
if (hex == 0x0) {
return KC_P0;
} else if (hex < 0xA) {
return KC_P1 + (hex - 0x1);
} else {
return KC_A + (hex - 0xA);
}
}
void send_unicode(uint16_t unicode)
{
// For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
// Implemented for Windows:
// Pressing ALT followed by + followed by the unicode code point in hex.
// Requires registry key HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad set to String 1
register_code(KC_LALT);
register_code(KC_PPLS);
unregister_code(KC_PPLS);
for (int i = 12; i >= 0; i -= 4) {
register_code(hextokeycode((unicode >> i) & 0xF));
unregister_code(hextokeycode((unicode >> i) & 0xF));
}
unregister_code(KC_LALT);
}
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 ... END_UC:
if (record->event.pressed) {
send_unicode(unicode_chars[id]);
}
break;
case M_CSA_SFT:
// BÉPO over CSA: toggle shift layer
layer_invert(LR_CSA_SFT);
if (record->event.pressed) {
hold_shift();
} else {
release_shift();
}
break;
case M_CSA_SFT_AGR:
// BÉPO over CSA: from shift layer, momentary altgr+shift layer
layer_invert(LR_CSA_AGR);
layer_invert(LR_CSA_AGR_SFT);
if (record->event.pressed) {
// shift not needed for LR_CSA_AGR_SFT
release_shift();
} else {
// back to shift layer
hold_shift();
}
break;
case M_CSA_AGR_SFT:
// BÉPO over CSA: from altgr layer, momentary altgr+shift layer
layer_invert(LR_CSA_SFT);
layer_invert(LR_CSA_AGR_SFT);
break;
case M_1 ... M_0:
case M_DEGR:
case M_SCLN:
case M_GRV:
case M_NBSP:
// macros of the shift layer that require to release shift
if (record->event.pressed) {
release_shift();
switch (id) {
case M_1 ... M_0:
register_code(KC_1 + (id - M_1));
break;
case M_DEGR:
return MACRO(DOWN(CSA_ALTGR), D(SCLN), END);
case M_SCLN:
return MACRO(D(SCLN), END);
case M_GRV:
return MACRO(I(75), DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END);
case M_NBSP:
// use weak mod such that pressing another key will not be affected
add_weak_mods(MOD_BIT(CSA_ALTGR));
return MACRO(D(SPACE), END);
}
} else {
hold_shift();
switch (id) {
case M_1 ... M_0:
unregister_code(KC_1 + (id - M_1));
break;
case M_DEGR:
return MACRO(UP(CSA_ALTGR), U(SCLN), END);
case M_SCLN:
return MACRO(U(SCLN), END);
case M_NBSP:
del_weak_mods(MOD_BIT(CSA_ALTGR));
return MACRO(U(SPACE), END);
}
}
break;
case M_CRC:
if (record->event.pressed) {
return MACRO(I(75), TYPE(CSA_DCRC), T(SPACE), END);
}
break;
case M_DBL0:
if (record->event.pressed) {
return MACRO( I(25), T(P0), T(P0), END );
}
break;
case M_FNLR:
layer_invert(LR_NUMR);
layer_invert(LR_FN);
break;
case M_NMAL:
layer_invert(LR_NUMR);
if (record->event.pressed) {
register_code(KC_LALT);
} else {
unregister_code(KC_LALT);
}
break;
}
return MACRO_NONE;
};
// 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) {
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
// led 1: numeric layer
if (layer_state & (1 << LR_NUMR)) {
ergodox_right_led_1_on();
}
// led 2: BÉPO over Canadian Multilingual
if (IS_CA_MULT_ENABLED()) {
ergodox_right_led_2_on();
}
// led 3: caps lock
if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
ergodox_right_led_3_on();
}
};

View file

@ -0,0 +1,162 @@
# BÉPO Keymap with firmware-remapping for software CSA layout
This is a keymap intended to be used with the [BÉPO layout](http://bepo.fr), a French ergonomic layout designed by following Dvorak's principles.
The particularity of this keymap is that it supports using the [Canadian Multilingual Standard layout](https://en.wikipedia.org/wiki/QWERTY#Canadian_Multilingual_Standard) (also known as _ACNOR keyboard_ or _CSA keyboard_, see also the [French page](https://fr.wikipedia.org/wiki/QWERTY#Clavier_canadien_multilingue_standard) which contains more details) on the OS side, by enabling the _CSA_ layer. This is especially useful for operating systems that natively provide CSA, but not BÉPO, like Windows. The CSA layout was chosen because it is probably the standard layout that provides the best character set coverage.
This keymap is based on the [tm2030](../tm2030/) keymap, whose goal was to have a [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) inspired layout for the ErgoDox EZ.
As this keyboard is intended for French people, the rest of this page will be in French.
# Keymap BÉPO avec support en firmware pour utilisation avec la disposition CSA en software
Cette keymap a été conçue pour être utilisée avec la [disposition BÉPO](http://bepo.fr), la disposition francophone, ergonomique et libre basée sure les principes de Dvorak.
La particularité de cette keymap est qu'elle supporte l'utilisation du [clavier canadien multilingue standard](https://fr.wikipedia.org/wiki/QWERTY#Clavier_canadien_multilingue_standard) (aussi appelé _clavier ACNOR_ ou _clavier CSA_) du côté du système d'exploitation, en activant la couche _CSA_. Ceci s'avère particulièrement utile pour les systèmes d'exploitations qui fournissent nativement le CSA, mais pas le BÉPO, comme Windows. Le clavier CSA a été choisi comme base car c'est probablement la disposition standard qui fournit la meilleure couverture en termes de caractères disponibles.
Cette keymap est basée sur la keymap [tm2030](../tm2030/), dont le but est de fournir une disposition inspirée du [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) pour l'ErgoDox EZ.
## Couche de base
C'est la couche par défaut, proche du TypeMatrix, avec les différences suivantes:
- La ligne du haut (les touches `F`) et la colonne de droite sont retirées, les touches correspondantes étant déplacées ailleurs.
- Les touches situés en bas à gauche sont redisposées dans cet ordre: `Ctrl`, `fn`, `Gui`, `num+Alt`, `Alt`
- Les touches `shuffle` (`Alt+Tab`) et `desktop` ne sont pas supportés
- `W` est déplacé à la place de `=`
- `=` est déplacé sous `Tab` (au lieu d'avoir un grand `Shift`)
- `%` et `Ç` sont déplacés à la place de `Home` et `End` respectivement
- Les flèches ainsi que `PgUp`/`PgDown`/`Home`/`End` sont déplacées sur les pouces
À noter que pour `W` et `Ç`, le but a été de ne pas les déplacer trop par rapport à la disposition BÉPO _standard_, afin de pouvoir repasser facilement sur un TypeMatrix ou un clavier traditionnel.
```
,--------------------------------------------------. ,--------------------------------------------------.
| $ | " | « | » | ( | ) | Del | | Del | @ | + | - | / | * | W |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| Tab | B | É | P | O | È |Backsp| |Backsp| ^ | V | D | L | J | Z |
|--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------|
| = | A | U | I | E | , |------| |------| C | T | S | R | N | M |
|--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------|
| LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|LCtrl | fn | LGui |numAlt| LAlt | |Alt Gr| % | App | Ç | RCtrl|
`----------------------------------' `----------------------------------'
,--------------. ,-------------.
| Esc | num | | Left |Right |
,------+-------+------| |------+------+------.
| | | PgUp | | Up | | |
|Space | Home |------| |------| End |Space |
| | | PgDn | | Down | | |
`---------------------' `--------------------'
```
### Changer de couche
- Utilisez `num` pour activer/désactiver [la couche numérique](#couche-numérique)
- Maintenez `fn` pour activer temporairement [les couches numériques et Fn](#couche-fn)
- Maintenez `numAlt` pour activer temporairement la couche numérique combinée avec `Alt` (facilite l'utilisation des raccourcis tels que `Alt`+`F4`)
### Diodes
Les diodes de l'ErgoDox EZ (côté droit) sont utilisées de la façon suivante :
- diode de gauche (rouge) : indique l'activation de [la couche numérique](#couche-numérique)
- diode du milieu (verte) : indique l'activation du [mode CSA](#couche-csa)
- diode de droite (bleue) : indique le verrouillage majuscules
## Couche CSA
La couche _CSA_ est la même que la couche de base, pour une utilisation avec un clavier Canadien Multilingue configuré dans le système d'exploitation.
Pour l'activer, appuyez sur `fn`+`$`. La [diode](#diodes) verte indique que la couche CSA est activée.
### Limitations
Seuls les caractères présents dans le clavier CSA sont parfaitement supportés. De manière générale, il s'agit des caractères suivants :
- toute la couche de base
- tous les caractères accessibles en `Shift`
- tous les caractères de la main gauche accessibles en `AltGr` à l'exception du `≠`
- environ la moitié des caractères de la main droite accessibles en `AltGr` et la moitié des caractères accessibles en `AltGr`+`Shift` (consultez [le fichier source](keymap.c) pour voir les caractères supportés)
En particulier, les caractères suivants sont émulés via le support Unicode (Windows seulement):
- le tiret cadratin (tiret long) : —
- le tiret demi-cadratin (demi tiret) :
- les points de suspension : …
L'implémentation actuelle ne fonctionne pas dans toutes les applications, en particulier les applications MS Office.
Il est probable que l'utilisation de la couche CSA ne fonctionne pas correctement dans certains jeux vidéos.
Cette fonctionnalité a été conçue et testée essentiellment pour Windows (7).
### Détails techniques
Techniquement, la couche CSA est en réalité composée de 4 couches servant à émuler la couche de base, les appuis sur `Shift` ou `Alt` et la combinaison des deux.
Le changement de couches se fait par des macros afin d'activer ou désactiver plusieurs couches et la touche `Shift` en même temps.
Certains caractères sont également implémentés par des macros, notamment ceux de la couche `Shift` qui n'ont pas besoin de cette touche en CSA, comme les chiffres.
Les caractères Unicode se basent sur une implémentation spécifique et non celle fournie dans QMK — il faudrait sans doute migrer le code. Notez la façon dont ces caractères sont déclarés tels quels dans [le code source](keymap.c) (tableau `unicode_char`).
## Couche numérique
Couche numérique proche du TM lorsqu'on active `num`, avec les différences suivantes :
- Le clavier numérique est déplacés de 1 vers le haut et vers la droite.
- Les flèches sont décalées de 1 vers la gauche.
- Fournit l'accès aux touches `F1` à `F12`, `caps-lock` et `num-lock`.
La couche numérique est indiquée par la [diode](#diodes) de gauche (rouge). Caps-lock est indiqué par la diode de droite (bleue).
La touche `numAlt` de [la couche de base](#couche-de-base) permet d'activer la couche numérique et la touche `Alt` simultanément, afin de faciliter les raccourcis claviers comme `Alt`+`F4`.
```
,--------------------------------------------------. ,--------------------------------------------------.
| | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | | | | | 0 | 00 | . |Etr/Ctl|
`----------------------------------' `-----------------------------------'
,-------------. ,-------------.
| | | |n.lock|c.lock|
,------|------|------| |------+------+------.
| | | | | | | |
| | |------| |------| | |
| | | | | | | |
`--------------------' `--------------------'
```
## Couche Fn
Activée simultanément avec la couche numérique lorsque l'on maintient la touche `fn`. Comme sur le TM, elle fournit l'accès aux fonctionnalités suivantes :
- `couper`, `copier` et `coller` — attention: ne pas utiliser dans l'explorateur de fichiers.
- monter/baisser/couper le volume — seulement accessible en main gauche, contrairement au TM.
- piste précédente/suivante
- calculatrice, e-mail et page d'accueil du navigateur web
- `insert`, `power`, `sleep`, `wake`, `print screen`, `scroll-lock` et `pause`
- ~CSA: (dés)activation de [la couche CSA](#couche-csa) sur `$`
- RESET: rechargement du firmware avec Teensy-Loader (pour les développeurs)
```
,--------------------------------------------------. ,--------------------------------------------------.
| ~CSA | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | | | | | |VolUp | | | | | | | | Pause |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| RESET | | | Calc | Mail |Browsr|------| |------| | | | | | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | App | cut | copy |paste | Mute |VolDn | | | | | | | | |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | | | | | | | | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| | | | | |
,------|------|------| |------+------+------.
| | | Next | | | | |
| Mute | play |------| |------| | |
| | | Prev | | | | |
`--------------------' `--------------------'
```

View file

@ -0,0 +1,226 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
enum custom_keycodes {
PLACEHOLDER = SAFE_RANGE, // can always be here
EPRM,
VRSN,
RGB_SLD
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------------. ,--------------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | Cmd,Shft,[ | | Cmd,Shft,] | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------------| |------------+------+------+------+------+------+--------|
* | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |BkSp/Cmd| A | S | D | F | G |------------| |------------| H | J | K | L |; / L2|' / Cmd |
* |--------+------+------+------+------+------| Hyper | | Meh |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
* `--------+------+------+------+------+-------------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Ctrl/Esc|PgUp| | App | LGui |
* ,------|------|------| |------+--------+------.
* | | | PgDn | | Home | | |
* | Space|Backsp|------| |------| Tab |Enter |
* | |ace | Esc | | Alt | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, M(2),
KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
GUI_T(KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
CTL_T(KC_ESC),KC_PGUP,
KC_PGDN,
KC_SPC,KC_BSPC, KC_ESC,
// right hand
M(3), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_LALT,KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | <- | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, M(1), KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
// KC_COMM, KC_MINS
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
case 1:
if (record->event.pressed) { // For resetting EEPROM
eeconfig_init();
}
break;
}
return MACRO_NONE;
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// dynamically generate these.
case EPRM:
if (record->event.pressed) {
eeconfig_init();
}
return false;
break;
case VRSN:
if (record->event.pressed) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
case RGB_SLD:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_mode(1);
#endif
}
return false;
break;
}
return true;
}
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,320 @@
#include QMK_KEYBOARD_H
#include "action_layer.h"
#include "led.h"
#include "keymap_extras/keymap_neo2.h"
// Layer names
#define BASE 0 // default layer
#define PMQ 1 // poor mans QWERTZ
#define PMN 2 // poor mans Neo
#define FMU 3 // FMU layer
#define NHL 4 // Neos software layer 4 rebuilt in Hardware
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: default
*
* TAB 1 2 3 4 5 ` ´ 6 7 8 9 0 BKSPC
*
* Y X V L C W HOM END K H G F Q ß
* E
* Mod3 U I A E O S N R T D Mod3
* TL2 TL3
* LSHFT Ü Ö Ä P Z B M , . J Shift
*
* CTL ALT MO1 Win Mod4 Mod4 Win MO1 ALT CTL
*
*
*
*
* SPC RTN RTN SPC
* HYP MEH
*
*/
[BASE] = LAYOUT_ergodox(
// left hand
KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, NEO_GRV,
NEO_Y, NEO_X, NEO_V, NEO_L, NEO_C, NEO_W, KC_HOME,
NEO_L1_L, NEO_U, NEO_I, NEO_A, NEO_E, NEO_O,
KC_LSFT, NEO_UE, NEO_OE, NEO_AE, NEO_P, NEO_Z, TG(PMQ),
KC_LCTL, KC_LALT,MO(FMU),KC_LGUI,NEO_L2_L,
KC_LEFT, KC_UP,
KC_MINS,
KC_SPC, KC_ENT, ALL_T(KC_NO),
// right hand
NEO_ACUT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_END, NEO_K, NEO_H, NEO_G, NEO_F, NEO_Q, NEO_SS,
NEO_S, NEO_N, NEO_R, NEO_T, NEO_D, NEO_L1_R,
TG(PMN), NEO_B, NEO_M, KC_COMM,KC_DOT, NEO_J, KC_RSFT,
NEO_L2_R,KC_RGUI,MO(FMU),KC_LALT,KC_RCTL,
KC_DOWN, KC_RGHT,
KC_MINS,
MEH_T(KC_NO),KC_ENT,KC_SPC
),
/* Layer 1: poor mans QWERTZ
* based on kaimis layout
*
* TAB 1 2 3 4 5 ` ´ 6 7 8 9 0 BKSPC
*
* C P T F K L HOM END B A S G V Y
* E
* Mod3 D H Ö O I U - Z E X Mod3
* (TL2) (TL3)
* LSHFT Ä Q R W N J M , . Shift
*
* CTL ALT MO1 Win MO4 M04 Win MO1 ALT CTL
*
*
*
*
* SPC RTN RTN SPC
* HYP MEH
*
*/
[PMQ] = LAYOUT_ergodox(
// left hand
KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL,
DE_C, DE_P, DE_T, DE_F, DE_K, DE_L, KC_HOME,
NEO_L1_L, DE_D, DE_H, DE_OE, DE_O, DE_I,
KC_LSFT, DE_AE, DE_Q, DE_R, DE_W, DE_N, KC_TRNS,
KC_LCTL, KC_LALT,MO(FMU),KC_LGUI,MO(NHL),
KC_LEFT, KC_UP,
KC_MINS,
KC_SPC, KC_ENT, ALL_T(KC_NO),
// right hand
DE_ACUT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_END, DE_B, DE_A, DE_S, DE_G, DE_V, DE_Y,
DE_U, DE_MINS,DE_Z, DE_E, DE_X, NEO_L1_R,
KC_TRNS, DE_J, DE_M, DE_COMM,DE_DOT, DE_SS, KC_RSFT,
MO(NHL),KC_RGUI,MO(FMU),KC_LALT,KC_RCTL,
KC_DOWN, KC_RGHT,
KC_MINS,
MEH_T(KC_NO),KC_ENT,KC_SPC
),
/* Layer 2: poor mans Neo
* based on kaimis layout
*
* TAB 1 2 3 4 5 ` ´ 6 7 8 9 0 BKSPC
*
* Y X V L C W HOM END K H G F Q ß
* E
* Mod3 U I A E O S N R T D Mod3
* (TL2) (TL3)
* LSHFT Ü Ö Ä P Z B M , . J Shift
*
* CTL ALT MO1 Win MO4 M04 Win MO1 ALT CTL
*
*
*
*
* SPC RTN RTN SPC
* HYP MEH
*
*/
[PMN] = LAYOUT_ergodox(
KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL,
DE_Y, DE_X, DE_V, DE_L, DE_C, DE_W, KC_HOME,
KC_NO, DE_U, DE_I, DE_A, DE_E, DE_O,
KC_LSFT, DE_UE, DE_OE, DE_AE, DE_P, DE_Z, KC_TRNS,
KC_LCTL, KC_LALT,MO(FMU),KC_LGUI,MO(NHL),
KC_LEFT, KC_UP,
KC_MINS,
KC_SPC, KC_ENT, ALL_T(KC_NO),
// right hand
DE_ACUT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_END, DE_K, DE_H, DE_G, DE_F, DE_Q, DE_SS,
DE_S, DE_N, DE_R, DE_T, DE_D, KC_NO,
KC_TRNS, DE_B, DE_M, KC_COMM,KC_DOT, DE_J, KC_RSFT,
MO(NHL),KC_RGUI,MO(FMU),KC_LALT,KC_RCTL,
KC_DOWN, KC_RGHT,
KC_MINS,
MEH_T(KC_NO),KC_ENT,KC_SPC
),
/* Layer 3: F-keys, Mouse and Unicode
*
* F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12
*
*
*
*
* (TL2) (TL3)
*
*
* (MO1) (MO4) (MO4) (MO1)
*
* Ms Ms Ms Ms
*
* MLC MRC
*
*
*
*/
[FMU] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TRNS, UC(0x250C),UC(0x252C),UC(0x2510),UC(0x2500),UC(0x2502),KC_TRNS,
KC_TRNS, UC(0x251C),UC(0x253C),UC(0x2524),UC(0x3008),UC(0x3009),
KC_TRNS, UC(0x2514),UC(0x2534),UC(0x2518),KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MS_L, KC_MS_U,
KC_BTN1,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
KC_TRNS, UC(0x2194),UC(0x2190),UC(0x2192),UC(0x2191),UC(0x2193),KC_TRNS,
KC_TRNS, UC(0x2713),UC(0x2715),UC(0x2022),UC(0x2236),KC_TRNS,
KC_TRNS, UC(0x21D4),UC(0x21D0),UC(0x21D2),UC(0x21D1),UC(0x21D3),KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MS_D, KC_MS_R,
KC_BTN2,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Layer 4: Neos software layer 4 rebuilt in Hardware
* based on kaimis layout
*
*
*
* PgUp BSpc Del PgDn 7 8 9 +
*
* Home End 4 5 6 , .
* (TL2) (TL3)
* Esc Tab Ins Ret Undo 1 2 3
*
* (MO1) (MO4) (MO4) (MO1)
*
*
*
*
*
*
*
*/
[NHL] = LAYOUT_ergodox(
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_PGUP,KC_BSPC,KC_UP, KC_DELT,KC_PGDN,KC_NO,
KC_NO, KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_END,
KC_NO, KC_ESC, KC_TAB, KC_INS, KC_ENT, KC_UNDO,KC_TRNS,
KC_NO, KC_NO, KC_TRNS,KC_NO, KC_TRNS,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_7, KC_8, KC_9, DE_PLUS,DE_MINS,
KC_NO, KC_4, KC_5, KC_6, KC_COMM,KC_DOT,
KC_TRNS, KC_NO, KC_1, KC_2, KC_3, KC_NO, KC_NO,
KC_TRNS,KC_NO, KC_TRNS,KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_NO, KC_NO, KC_NO
),
};
const uint16_t PROGMEM fn_actions[] = {
[BASE] = ACTION_FUNCTION(BASE),
[PMQ] = ACTION_FUNCTION(PMQ),
[PMN] = ACTION_FUNCTION(PMN),
[FMU] = ACTION_LAYER_TAP_TOGGLE(FMU),
[NHL] = ACTION_LAYER_TAP_TOGGLE(NHL)
};
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);
}
else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
set_unicode_input_mode(UC_LNX);
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void)
{
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case FMU:
ergodox_right_led_1_on();
break;
case PMQ:
ergodox_right_led_2_on();
break;
case PMN:
ergodox_right_led_3_on();
break;
default:
if(host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) {
ergodox_led_all_set(LED_BRIGHTNESS_HI);
ergodox_right_led_1_on();
}
else {
ergodox_board_led_off();
}
break;
}
};
// Override Unicode start method to use NEO_U instead of KC_U
void unicode_input_start (void) {
register_code(KC_LCTL);
register_code(KC_LSFT);
register_code(NEO_U);
unregister_code(NEO_U);
unregister_code(KC_LSFT);
unregister_code(KC_LCTL);
};
// Override method to use NEO_A instead of KC_A
uint16_t hex_to_keycode(uint8_t hex)
{
if(hex == 0x0) {
return KC_0;
}
else if(hex >= 0xA) {
switch(hex) {
case 0xA:
return NEO_A;
case 0xB:
return NEO_B;
case 0xC:
return NEO_C;
case 0xD:
return NEO_D;
case 0xE:
return NEO_E;
case 0xF:
return NEO_F;
default:
return KC_NO;
}
}
return KC_1 + (hex - 0x1);
}

View file

@ -0,0 +1,129 @@
# coderkuns Neo2 layout for the ErgoDox EZ
The idea of this layout is to use it for [Neo2](http://www.neo-layout.org) but also provide layers to use QWERTZ with activated Neo driver and to use (basic) Neo when no driver is available (standard QWERTZ driver is active) (e.g. on other computers, in virtual machines) and to make heavily use of thumb keys.
The main goal of the default layer is to provide a complete symmetric layout with each modifier equally placed for both hands (mirror, of course).
It also features a layer for additional keys like F-keys (F1 F12), some mouse keys and some useful Unicode symbols.
## Build
```
make clean
make coderkun_neo2
```
## Keymap
0. Default layer for Neo2
1. Poor mans QWERTZ
2. Poor mans Neo
3. F-keys, mouse keys und Unicode symbols
4. Neos software layers 4 rebuilt in hardware
### Layer 0: Default layer for Neo2
┌───────┬─────┬─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬───────┐
│ TAB │ 1 │ 2 │ 3 │ 4 │ 5 │ ` │ │ ´ │ 6 │ 7 │ 8 │ 9 │ 0 │ BKSPC │
├───────┼─────┼─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┼─────┼───────┤
│ Y │ X │ V │ L │ C │ W │ HOM │ │ END │ K │ H │ G │ F │ Q │ ß │
├───────┼─────┼─────┼─────╆─────╅─────┤ E │ │ ├─────╆─────╅─────┼─────┼─────┼───────┤
│ Mod3 │ U │ I │ A │ E │ O ├─────┤ ├─────┤ S │ N │ R │ T │ D │ Mod3 │
├───────┼─────┼─────┼─────╄─────╃─────┤ TL2 │ │ TL3 ├─────╄─────╃─────┼─────┼─────┼───────┤
│ LSHFT │ Ü │ Ö │ Ä │ P │ Z │ │ │ │ B │ M │ , │ . │ J │ Shift │
└─┬─────┼─────┼─────┼─────┼─────┼─────┴─────┘ └─────┴─────┼─────┼─────┼─────┼─────┼─────┬─┘
│ CTL │ ALT │ MO1 │ Win │ Mod4│ │ Mod4│ Win │ MO1 │ Alt │ CTL │
└─────┴─────┴─────┴─────┴─────┘ ┌─────┬─────┐ ┌─────┬─────┐ └─────┴─────┴─────┴─────┴─────┘
│ ← │ ↑ │ │ ↓ │ → │
┌─────┼─────┼─────┤ ├─────┼─────┼─────┐
│ │ │ ─ │ │ ─ │ │ │
│ SPC │ RTN ├─────┤ ├─────┤ RTN │ SPC │
│ │ │ HYP │ │ MEH │ │ │
└─────┴─────┴─────┘ └─────┴─────┴─────┘
### Layer 1: Poor mans QWERTZ
┌───────┬─────┬─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬───────┐
│ TAB │ 1 │ 2 │ 3 │ 4 │ 5 │ ` │ │ ´ │ 6 │ 7 │ 8 │ 9 │ 0 │ BKSPC │
├───────┼─────┼─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┼─────┼───────┤
│ C │ P │ T │ F │ K │ L │ HOM │ │ END │ B │ A │ S │ G │ V │ Y │
├───────┼─────┼─────┼─────╆─────╅─────┤ E │ │ ├─────╆─────╅─────┼─────┼─────┼───────┤
│ Mod3 │ D │ H │ Ö │ O │ I ├─────┤ ├─────┤ U │ - │ Z │ E │ X │ Mod3 │
├───────┼─────┼─────┼─────╄─────╃─────┤(TL2)│ │(TL3)├─────╄─────╃─────┼─────┼─────┼───────┤
│ LSHFT │ Ä │ Q │ R │ W │ N │ │ │ │ J │ M │ , │ . │ ẞ │ Shift │
└─┬─────┼─────┼─────┼─────┼─────┼─────┴─────┘ └─────┴─────┼─────┼─────┼─────┼─────┼─────┬─┘
│ CTL │ ALT │ MO1 │ Win │ MO4 │ │ M04 │ Win │ MO1 │ Alt │ CTL │
└─────┴─────┴─────┴─────┴─────┘ ┌─────┬─────┐ ┌─────┬─────┐ └─────┴─────┴─────┴─────┴─────┘
│ ← │ ↑ │ │ ↓ │ → │
┌─────┼─────┼─────┤ ├─────┼─────┼─────┐
│ │ │ ─ │ │ ─ │ │ │
│ SPC │ RTN ├─────┤ ├─────┤ RTN │ SPC │
│ │ │ HYP │ │ MEH │ │ │
└─────┴─────┴─────┘ └─────┴─────┴─────┘
### Layer 2: Poor mans Neo
┌───────┬─────┬─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬───────┐
│ TAB │ 1 │ 2 │ 3 │ 4 │ 5 │ ` │ │ ´ │ 6 │ 7 │ 8 │ 9 │ 0 │ BKSPC │
├───────┼─────┼─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┼─────┼───────┤
│ Y │ X │ V │ L │ C │ W │ HOM │ │ END │ K │ H │ G │ F │ Q │ ß │
├───────┼─────┼─────┼─────╆─────╅─────┤ E │ │ ├─────╆─────╅─────┼─────┼─────┼───────┤
│ Mod3 │ U │ I │ A │ E │ O ├─────┤ ├─────┤ S │ N │ R │ T │ D │ Mod3 │
├───────┼─────┼─────┼─────╄─────╃─────┤(TL2)│ │(TL3)├─────╄─────╃─────┼─────┼─────┼───────┤
│ LSHFT │ Ü │ Ö │ Ä │ P │ Z │ │ │ │ B │ M │ , │ . │ J │ Shift │
└─┬─────┼─────┼─────┼─────┼─────┼─────┴─────┘ └─────┴─────┼─────┼─────┼─────┼─────┼─────┬─┘
│ CTL │ ALT │ MO1 │ Win │ MO4 │ │ M04 │ Win │ MO1 │ Alt │ CTL │
└─────┴─────┴─────┴─────┴─────┘ ┌─────┬─────┐ ┌─────┬─────┐ └─────┴─────┴─────┴─────┴─────┘
│ ← │ ↑ │ │ ↓ │ → │
┌─────┼─────┼─────┤ ├─────┼─────┼─────┐
│ │ │ ─ │ │ ─ │ │ │
│ SPC │ RTN ├─────┤ ├─────┤ RTN │ SPC │
│ │ │ HYP │ │ MEH │ │ │
└─────┴─────┴─────┘ └─────┴─────┴─────┘
### Layer 3: F-keys, mouse keys und Unicode symbols
┌───────┬─────┬─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬───────┐
│ │ F1 │ F2 │ F3 │ F4 │ F5 │ F6 │ │ F7 │ F8 │ F9 │ F10 │ F11 │ F12 │ │
├───────┼─────┼─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┼─────┼───────┤
│ │ ┌ │ ┬ │ ┐ │ ─ │ │ │ │ │ │ ↔ │ ← │ → │ ↑ │ ↓ │ │
├───────┼─────┼─────┼─────╆─────╅─────┤ │ │ ├─────╆─────╅─────┼─────┼─────┼───────┤
│ │ ├ │ ┼ │ ┤ │ 〈 │ 〉 ├─────┤ ├─────┤ │ ✓ │ ✕ │ • │ │ │
├───────┼─────┼─────┼─────╄─────╃─────┤(TL2)│ │(TL3)├─────╄─────╃─────┼─────┼─────┼───────┤
│ │ └ │ ┴ │ ┘ │ │ │ │ │ │ ⇔ │ ⇐ │ ⇒ │ ⇑ │ ⇓ │ │
└─┬─────┼─────┼─────┼─────┼─────┼─────┴─────┘ └─────┴─────┼─────┼─────┼─────┼─────┼─────┬─┘
│ │ │(MO1)│ │(MO4)│ │(MO4)│ │(MO1)│ │ │
└─────┴─────┴─────┴─────┴─────┘ ┌─────┬─────┐ ┌─────┬─────┐ └─────┴─────┴─────┴─────┴─────┘
│ Ms← │ Ms↑ │ │ Ms↓ │ Ms→ │
┌─────┼─────┼─────┤ ├─────┼─────┼─────┐
│ │ │ MLC │ │ MRC │ │ │
│ │ ├─────┤ ├─────┤ │ │
│ │ │ │ │ │ │ │
└─────┴─────┴─────┘ └─────┴─────┴─────┘
### Layer 4: Neos software layers 4 rebuilt in hardware
┌───────┬─────┬─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬───────┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───────┼─────┼─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┼─────┼───────┤
│ │ PgUp│ BSpc│ ↑ │ Del │ PgDn│ │ │ │ │ 7 │ 8 │ 9 │ + │
├───────┼─────┼─────┼─────╆─────╅─────┤ │ │ ├─────╆─────╅─────┼─────┼─────┼───────┤
│ │ Home│ ← │ ↓ │ → │ End ├─────┤ ├─────┤ │ 4 │ 5 │ 6 │ , │ . │
├───────┼─────┼─────┼─────╄─────╃─────┤(TL2)│ │(TL3)├─────╄─────╃─────┼─────┼─────┼───────┤
│ │ Esc │ Tab │ Ins │ Ret │ Undo│ │ │ │ │ 1 │ 2 │ 3 │ │ │
└─┬─────┼─────┼─────┼─────┼─────┼─────┴─────┘ └─────┴─────┼─────┼─────┼─────┼─────┼─────┬─┘
│ │ │(MO1)│ │(MO4)│ │(MO4)│ │(MO1)│ │ │
└─────┴─────┴─────┴─────┴─────┘ ┌─────┬─────┐ ┌─────┬─────┐ └─────┴─────┴─────┴─────┴─────┘
│ │ │ │ │ │
┌─────┼─────┼─────┤ ├─────┼─────┼─────┐
│ │ │ │ │ │ │ │
│ │ ├─────┤ ├─────┤ │ │
│ │ │ │ │ │ │ │
└─────┴─────┴─────┘ └─────┴─────┴─────┘

View file

@ -0,0 +1,3 @@
SLEEP_LED_ENABLE = no
UNICODE_ENABLE = yes
COMMAND_ENABLE = no

View file

@ -0,0 +1,184 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Del | Q | W | F | P | G | L1 | | L1 | J | L | U | Y | ; | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | R | S | T | D |------| |------| H | N | E | I |O / L2| ' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | K | M | , | . |//Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Backsp|------| |------| Tab |Enter |
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
KC_DELT, KC_Q, KC_W, KC_F, KC_P, KC_G, TG(SYMB),
KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS,
KC_H, KC_N, KC_E, KC_I, LT(MDIA, KC_O), KC_QUOT,
MEH_T(KC_NO),KC_K, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,4 @@
# ErgoDox EZ Colemak Configuration
Colemak layout with same layers as default ergodox ez keymap.

View file

@ -0,0 +1,264 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "keymap_norwegian.h"
#define BASE 0 // default layer
#define BASE_MAC 1 // default layer mac
#define NUMB_SYMB 2 // numbers and symbols
#define NUMB_SYMB_MAC 3 // numbers and symbols mac
#define FUNCTION 4 // function keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer PC
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | \ | [ | ] | { | } | * |Mac/PC| | ^ | $ | ( | ) | < | > | @ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | ? | Q | W | F | P | G | " | | ' | J | L | U | Y | Å | Æ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | : | A | R | S | T | D |------| |------| H | N | E | I | O | Ø |
* |--------+------+------+------+------+------| ; | | = |------+------+------+------+------+--------|
* | ! | Z | X | C | V | B | | | | K | M | RIGHT| DOWN | UP | _ |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Func | Lclk | Rclk | TAB |,/CTRL| | LEFT | Esc | ` | # | Num |
* `----------------------------------' `----------------------------------'
* ,-------------. ,--------------.
* | & | | | |Insert| / |
* ,------|------|------| |------+-------+------.
* | | | + | | Del | | |
* | Shift| ./Spc|------| |------| Enter |Space|
* | | |-/Alt | | Bspc | | |
* `--------------------' `---------------------'
*/
[BASE] = LAYOUT_ergodox(
// left hand
NO_BSLS, NO_LBRC, NO_RBRC, NO_LCBR, NO_RCBR, NO_ASTR, TG(1),
NO_QUES, KC_Q, KC_W, KC_F, KC_P, KC_G, NO_QUO2,
NO_COLN, KC_A, KC_R, KC_S, KC_T, KC_D,
KC_EXLM, KC_Z, KC_X, KC_C, KC_V, KC_B, NO_SCLN,
MO(4), KC_BTN1, KC_BTN2, KC_TAB,GUI_T(KC_COMMA),
NO_AMPR, NO_PIPE,
NO_PLUS,
KC_FN1,CTL_T(KC_DOT),ALT_T(NO_MINS),
// right hand
KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
NO_APOS, KC_J, KC_L, KC_U, KC_Y, NO_AA, NO_AE ,
KC_H, KC_N, KC_E, KC_I, KC_O, NO_OSLH,
NO_EQL, KC_K, KC_M, KC_RIGHT, KC_DOWN, KC_UP, NO_UNDS,
KC_LEFT, KC_ESC, KC_FN7, KC_HASH, MO(2),
KC_INSERT, NO_SLSH,
KC_DELT,
KC_BSPC,KC_ENT,KC_SPC
),
/* Keymap 1: Basic layer MACS (Same as pc, except for cmd/ctrl, which are swapped)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | \ | | | { | } | | | | | $ | | | < | > | @ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | ' |------+------+------+------+------+--------|
* | | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Func | | | |,/Ctrl| | | | ` | | Num |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | |./Cmd |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[BASE_MAC] = LAYOUT_ergodox(
NO_BSLS_MAC, KC_TRNS,KC_TRNS, NO_LCBR_MAC,NO_RCBR_MAC, 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, CTL_T(KC_COMMA),
KC_TRNS, NO_PIPE_MAC,
KC_TRNS,
KC_TRNS,GUI_T(KC_DOT) , KC_TRNS,
// right hand
KC_TRNS, NO_DLR_MAC, KC_TRNS,KC_TRNS,KC_FN8, KC_FN9,NO_AT_MAC,
NO_APOS_MAC, 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, NO_GRV_MAC, KC_TRNS, MO(3),
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Number ++ layer pc
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | % | | | | | | ~ | ´ | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | 3 | 2 | 1 | 0 | |------| |------| | 5 | 6 | 7 | 8 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | 4 | | | | | | 9 | END | PGDWN| PGUP | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | HOME | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[NUMB_SYMB] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_PERC, KC_TRNS , KC_TRNS,
KC_TRNS, KC_3 , KC_2 , KC_1 , KC_0 , KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_4, 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,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_FN2, KC_FN6 , KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_5, KC_6, KC_7, KC_8, KC_TRNS,
KC_TRNS, KC_HOME, KC_9, KC_END, KC_PGDN, KC_PGUP, KC_TRNS,
KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 3: Number ++ layer mac. Some keys have to be repeated from the pc symbol layer, since transient keys inherit from the layer we jump from, not the layer above.
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | % | | | | | | ~ | ´ | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | 3 | 2 | 1 | 0 | |------| |------| | 5 | 6 | 7 | 8 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | 4 | | | | | | 9 | END | PGDWN| PGUP | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | HOME | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[NUMB_SYMB_MAC] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_PERC, KC_TRNS , KC_TRNS,
KC_TRNS, KC_3 , KC_2 , KC_1 , KC_0 , KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_4, 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,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_FN2, KC_FN10, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_5, KC_6, KC_7, KC_8, KC_TRNS,
KC_TRNS, KC_HOME, KC_9, KC_END, KC_PGDN, KC_PGUP, KC_TRNS,
KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 4: Function layer mac + pc
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F3 | F2 | F1 | | |------| |------| | F5 | F6 | F7 | F8 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | F4 | | | | | | F9 | F10 | F11 | F12 | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[FUNCTION] = LAYOUT_ergodox(
KC_5, 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_F3 , KC_F2 , KC_F1 , KC_TRNS , KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F4, 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,
// 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_F5, KC_F6, KC_F7, KC_F8, KC_TRNS,
KC_TRNS, NO_TILD, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
)
};
enum macro_id {
TILDE_NO, LESS_NO, GRTR_NO, CIRC_NO, ACUT_NO, GRV_NO, LESS_NO_MAC, GRTR_NO_MAC, ACUT_NO_MAC
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_MODS_ONESHOT(MOD_LSFT), // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
[2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
[3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
[4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
[5] = ACTION_MACRO(CIRC_NO), // Completed ^ character, no space needed.
[6] = ACTION_MACRO(ACUT_NO), // Completed ´ character, no space needed.
[7] = ACTION_MACRO(GRV_NO), // Completed ` character, no space needed.
[8] = ACTION_MACRO(LESS_NO_MAC), // < completed on keypress down, to avoid same button problem when typing <> quickly
[9] = ACTION_MACRO(GRTR_NO_MAC), // > completed on keypress down, to avoid same button problem when typing <> quickly
[10] = ACTION_MACRO(ACUT_NO_MAC), // Completed ´ character, no space needed
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
keyevent_t event = record->event;
switch (id) {
case TILDE_NO:
return (event.pressed ? MACRO( D(RALT), T(RBRC), U(RALT), T(SPC), END ) : MACRO_NONE);
case LESS_NO:
return (event.pressed ? MACRO( T(NUBS), END ) : MACRO_NONE);
case GRTR_NO:
return (event.pressed ? MACRO( D(LSFT), T(NUBS), U(LSFT), END ) : MACRO_NONE);
case CIRC_NO:
return (event.pressed ? MACRO( D(LSFT), T(RBRC), U(LSFT), T(SPC), END ) : MACRO_NONE);
case ACUT_NO:
return (event.pressed ? MACRO( D(RALT), T(EQL), U(RALT), T(SPC), END ) : MACRO_NONE);
case GRV_NO:
return (event.pressed ? MACRO( D(LSFT), T(EQL), T(SPC), U(LSFT), END ) : MACRO_NONE);
case LESS_NO_MAC:
return (event.pressed ? MACRO( T(GRV), END ) : MACRO_NONE);
case GRTR_NO_MAC:
return (event.pressed ? MACRO( D(LSFT), T(GRV), U(LSFT), END ) : MACRO_NONE);
case ACUT_NO_MAC:
return (event.pressed ? MACRO( T(EQL), T(SPC), END ) : MACRO_NONE);
}
return MACRO_NONE;
};

View file

@ -0,0 +1,23 @@
# Norwegian Colemak setup with osx/pc toggle
## Motivation
I wanted a Norwegian Colemak setup that worked in a similar way on both my Mac and PC. I also wanted it to translate from a standard Norwegian keyboard OS setup.
## Overview
The setup is created to be programmer friendly.
- Most of the symbols used in code can be activated without using layers or shift key.
- You can reach the IDE/OS shortcut activators(Ctrl, Win/Cmd, Alt, Shift) with the thumb.
- Navigation is prioritized, arrows are right below the home row.
## PC/Mac toggle
The default setup is for Norwegian keyboard setting(not colemak variants) on a PC(Windows or Linux). Use the Mac/PC toggle button to switch between OSX and PC setup. The settings will be reverted to PC setup each time you restart/connect the keyboard.
## Layers
Numbers and function buttons are on their own layers. The easiest way to switch layers(at least with my hands) in this setup, is to push your hand right below the little finger, on the layer switches. You will then have all your fingers free to type numbers or press function buttons.
## Shift-key
Tap for the next character to be shifted, hold down for regular shift functionality
## Layout
![keyboard-layout](https://i.imgur.com/168aGmR.png)

View file

@ -0,0 +1,256 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
* MEH: Alt+Control+Shift
* HYPER: Alt+Control+Shift+Gui
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` ~ | 1 ! | 2 @ | 3 # | 4 $ | 5 % | 6 ^ | | 7 & | 8 * | 9 ( | 0 ) | - _ | = + | Backsp |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TAB | Q | W | F | P | G |TG(3) | |TG(4) | J | L | U | Y | ; : | ' " |
* |--------+------+------+------+------+------|F-lck | |N-lck |------+------+------+------+------+--------|
* | CAPS | A | R | S | T | D |------| |------| H | N | E | I | O | ENT |
* |--------+------+------+------+------+------| MEH | | MEH |------+------+------+------+------+--------|
* | Shift | Z | X | C | V | B | | | | K | M | , < | . > | UP | Shift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | LCTL | LCTL | LGUI | LALT | LGUI | | RALT | RCTL | LEFT | DOWN | RIGHT|
* `----------------------------------' `----------------------------------'
* ,--------------. ,--------------.
* | Esc | App | | Ins | Del |
* ,------|------|-------| |------+-------+------.
* | | | Home | | PgUp | | |
* | MO(2)| MO(4)|-------| |------| Space |Space |
* |symbol|N-Lock| End | | PgDn | | |
* `---------------------' `---------------------'
*/
[0] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, TG(3),
KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MEH,
KC_LCTL, KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI,
KC_ESC, KC_APP,
KC_HOME,
MO(2), MO(4), KC_END,
// right hand
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
TG(4), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_QUOT,
KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT,
KC_MEH, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT,
KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT,
KC_INS, KC_DEL,
KC_PGUP,
KC_PGDN, KC_SPC, KC_SPC
),
/* Keymap 1: QWERTY layer (games)
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Q | W | E | R | T | | | | Y | U | I | O | P | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | A | S | D | F | G |------| |------| H | J | K | L | ; | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Z | X | C | V | B | | | | N | M | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+--------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `----------------------'
*/
[1] = LAYOUT_ergodox( // layer 1: QWERTY layer (games)
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS,
KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_TRNS,
KC_TRNS, KC_N, KC_M, 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
),
/* Keymap 2: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | + | < | % | # | DF(1)| | | & | [ | ] | \ | : | " |
* |--------+------+------+------+------+------|QWERTY| | |------+------+------+------+------+--------|
* | | ! | - | > | = | @ |------| |------| * | { | } | / | ? | |
* |--------+------+------+------+------+------| DF(0)| | |------+------+------+------+------+--------|
* | | NUBS | NUHS | / | $ | ^ |COLEMAK | | | | ( | ) | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[2] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TRNS, KC_PIPE, KC_PLUS, KC_LT, KC_PERC, KC_HASH, DF(1),
KC_LBRC, KC_EXCLAIM, KC_MINUS, KC_GT, KC_EQUAL, KC_AT,
KC_TRNS, KC_NUBS, KC_NUHS, KC_SLSH, KC_DOLLAR, KC_CIRC, DF(0),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
KC_TRNS, KC_AMPERSAND, KC_LBRC, KC_RBRC, KC_BSLS, KC_COLN, KC_DQT,
KC_ASTERISK, KC_LCBR, KC_RCBR, KC_SLSH, KC_QUES, KC_TRNS,
KC_TRNS, KC_PIPE, KC_LPRN, KC_RPRN, 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
),
/* Keymap 3:
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | HYPR | | HYPR | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------ |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// F-keys
[3] = LAYOUT_ergodox(
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_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_HYPR,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, 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_HYPR, 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
),
/* Keymap 4: Numlock
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | RESET | | | |P-SCRE|S-LOCK|PAUSE | |NLOCK | CALC | = | / | * | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | Vol+ | 7 | 8 | 9 | - | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| Vol- | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | HYPR | | HYPR | Mute | 1 | 2 | 3 |Enter | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | 0 | . | RCTL | RCTL |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------ |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[4] = LAYOUT_ergodox(
RESET, KC_LSFT, KC_LSFT, KC_SYSREQ, KC_PSCR, KC_SLCK, KC_PAUSE,
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_HYPR,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_NLCK, KC_CALC, KC_PEQL, KC_PSLS, KC_PAST, KC_LSFT, KC_TRNS,
KC_TRNS, KC_VOLU, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_TRNS,
KC_VOLD, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS,
KC_HYPR, KC_MUTE, KC_P1, KC_P2, KC_P3, KC_PENT, KC_TRNS,
KC_TRNS, KC_P0, KC_PDOT, KC_RCTL, KC_RCTL,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
static uint8_t state;
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
//reduce LED on time to 1/6th because LEDs are too strong
if (++state < 6) return;
state = 0;
//bit 1: default layer 1 - QWERTY
if (default_layer_state & (1UL << 1)) ergodox_right_led_1_on();
uint8_t layer = biton32(layer_state);
//layer 2 : Symbols (& Fs)
//if (layer == 2) ergodox_right_led_2_on();
//layer 3 : F-lock
if (layer == 3) ergodox_right_led_2_on();
//layer 4 : Num-lock
if (layer == 4) ergodox_right_led_3_on();
};

View file

@ -0,0 +1,23 @@
# ErgoDox EZ colemak_programmer
## Features
* Qwerty and colemak 2 in 1
* Use DF() macro to swap the bottom layer so it behaves literally as collemak or qwerty
* Graphical creator did not allow this so I had to use TO(0) and TO(1) on the picture
* Symbol layer programmers friendly
* Not only symbols are easy to access but common combination are easy too: ->, =>, !=, etc.
* Windows and Mac
* The extra repeated Win key is very handy on Mac
* Numlock
I came to this layout after several iterations. It is not the ultimate best ergonomic layout but it is the best if you switch back and forth between ergodox and laptops.
## Notes
* The Quote and Enter can be swapped
* If you use sculpted key caps try turning the bottom key 180 degrees so it became very comfortable to type with thumb.
Alternatively view the [graphical creator version](http://configure.ergodox-ez.com/keyboard_layouts/kmevwm/edit) but beware it is not the same due to the creator limitations.
![Default](https://i.imgur.com/BCJEoKw.jpg)
![Default](https://i.imgur.com/0P1jBph.jpg)

View file

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

View file

@ -0,0 +1,216 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
//Tap Dance Declarations
enum {
TD_U_LBRC = 0,
TD_I_RBRC,
};
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_U_LBRC] = ACTION_TAP_DANCE_DOUBLE(KC_U, KC_LBRC),
[TD_I_RBRC] = ACTION_TAP_DANCE_DOUBLE(KC_I, KC_RBRC)
};
//Macro Declarations
static uint16_t sunds_timer;
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | _ | x | x | _ | Esc | Hypr | Home | | End | Hypr | [ | ] | `~ | `~ | Bks |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* |Ctrl/Tab| Q | W | E | R | T | Up | | PgUp | Y | U | I | O | P | Ctrl |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Cmd/"' | A | S | D | F | G |------| |------| H | J | K | L | ;: |Cmd/Entr|
* |--------+------+------+------+------+------| Down | | PgDn |------+------+------+------+------+--------|
* | Shft | Z | X | C | V | B | | | | N | M | ,< | .> | /? | Shft |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Alt | x | x | x | Left | |Right | Bks | x | x | Alt |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Teensy| VolUp| | Play | Del |
* ,------|------|------| |------+--------+------.
* | | | VolDn| | Next | | |
* |Sp/~L1| L2 |------| |------| L2 |'"/~L1|
* | | | Mute | | Prev | | |
* `--------------------' `----------------------'
*/
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_UNDS, KC_1, KC_1, KC_UNDS, KC_ESC, ALL_T(KC_NO), KC_HOME,
CTL_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_UP,
M(1), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DOWN,
KC_LALT, KC_1, KC_1, KC_1, KC_LEFT,
RESET, KC_VOLU,
KC_VOLD,
LT(SYMB, KC_SPC), TG(MDIA), KC_MUTE,
// right hand
KC_END, ALL_T(KC_NO), KC_LBRC, KC_RBRC, KC_GRV, KC_GRV, KC_BSPC,
KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCTRL,
KC_H, KC_J, KC_K, KC_L, KC_SCOLON, GUI_T(KC_ENT),
KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_RGHT, KC_BSPC, KC_1, KC_1, KC_RALT,
KC_MPLY, KC_DEL,
KC_MNXT,
KC_MPRV, TG(MDIA), LT(SYMB, KC_QUOT)
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | ^ | [ | ( | { | | | | = | 7 | 8 | 9 | 0 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | & | $ | ] | ) | } |------| |------| + | 4 | 5 | 6 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | \ | @ | # | % | | | | | | - | 1 | 2 | 3 | / | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | 0 | 0 | . | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS, KC_EXLM, KC_CIRC, KC_LBRC, KC_LPRN, KC_LCBR, KC_TRNS,
KC_TRNS, KC_AMPR, KC_DLR, KC_RBRC, KC_RPRN, KC_RCBR,
KC_TRNS, KC_BSLS, KC_AT, KC_HASH, KC_PERC, KC_PIPE, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS,
KC_TRNS, KC_EQL, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_PLUS, KC_4, KC_5, KC_6, KC_ASTR, KC_TRNS,
KC_TRNS, KC_MINS, KC_1, KC_2, KC_3, KC_TRNS, KC_TRNS,
KC_0, KC_0, KC_DOT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* |Version | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | WhDn | WhUp | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | R-Ck | L-Ck | |------| |------| MsLt | MsDn | MsUp | MsRt | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
M(0), 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_BTN2, KC_BTN1, 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,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_WH_U, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, 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_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
break;
case 1:
if (record->event.pressed) {
sunds_timer = timer_read();
register_code (KC_LGUI);
} else {
if (timer_elapsed (sunds_timer) < TAPPING_TERM) {
unregister_code (KC_LGUI);
register_code (KC_LSFT);
register_code (KC_QUOT);
unregister_code (KC_QUOT);
unregister_code (KC_LSFT);
register_code (KC_LGUI);
}
unregister_code (KC_LGUI);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_3_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
if (keyboard_report->mods & MOD_BIT(KC_LSFT)) {
ergodox_right_led_1_on ();
}
};

View file

@ -0,0 +1,4 @@
SUBPROJECT_DEFAULT = ez
TAP_DANCE_ENABLE = yes

View file

@ -0,0 +1,239 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define FKEYS 1 // F keys + macros
#define MACRO_PUBLIC 10
#define MACRO_PRIVATE 11
#define MACRO_STATIC 12
#define MACRO_CONST 13
#define MACRO_VOID 14
#define MACRO_VAR 15
#define MACRO_STRING 16
#define MACRO_INT 17
#define MACRO_FLOAT 18
#define MACRO_BOOL 19
#define MACRO_RETURN 20
#define MACRO_NULL 21
#define MACRO_BREAK 22
#define MACRO_TODO 23
#define MACRO_NEW 24
#define MACRO_PARENTHESE 25
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ( | 1 | 2 | 3 | 4 | 5 | " | | Save | 6 | 7 | 8 | 9 | 0 | [ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | ) | Q | W | E | R | T |Bkspa | | Del | Y | U | I | O | P | ] |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | { | A | S | D | F | G |------| |------| H | J | K | L | _ | Redo |
* |--------+------+------+------+------+------| / | | ; |------+------+------+------+------+--------|
* | } |Z~Alt | X | C | V | B | | | | N | M | ' | ! | ? | Undo |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Tab~CL| < | > | | | & | | = | + | - | * | L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |. ~L1 | , | |Home |End~L1|
* ,------|------|------| |------+------+------.
* | | | Copy | | UP | | |
* | Enter| Space|------| |------| Space|Enter |
* | ~WIN | ~LSFT| Past | | DOWN | ~LSFT| ~WIN |
* `--------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_LPRN, KC_1, KC_2, KC_3, KC_4, KC_5, LSFT(KC_QUOTE),
KC_RPRN, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPACE,
KC_LCBR, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_RCBR, ALT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_SLASH,
CTL_T(KC_TAB), LSFT(KC_COMMA),LSFT(KC_DOT),KC_PIPE,KC_AMPR,
LT(1,KC_DOT), KC_COMM,
LCTL(KC_C),
GUI_T(KC_ENTER),SFT_T(KC_SPACE),LCTL(KC_V),
// right hand
LCTL(KC_S) , KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRACKET,
KC_DELETE, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRACKET,
KC_H, KC_J, KC_K, KC_L, KC_UNDS,LCTL(KC_Y),
KC_SCOLON,KC_N, KC_M, KC_QUOTE ,KC_EXLM , LSFT(KC_SLASH), LCTL(KC_Z),
KC_EQUAL,KC_PLUS , KC_MINUS,KC_ASTR , TG(1),
KC_HOME, LT(1,KC_END),
KC_UP,
KC_DOWN,SFT_T(KC_SPACE), GUI_T(KC_ENTER)
),
/* Keymap 1: F keys + macros
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | F1 | F2 | F3 | F4 | F5 | ` | | Calc | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab |Public|Static|string|int |return| | | |//TODO| | | | | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |Privat|Const |var |float |null |------| |------|new | | | | | |
* |--------+------+------+------+------+------| \ | | ~ |------+------+------+------+------+--------|
* | | | |void |bool |break;| | | |(); | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | WIN | Alt | | | | PgUp | PgDw | Ins | PtSc | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | Cut | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| Left | Right|
* | | | | | | | |
* `--------------------' `--------------------'
*/
// FKEYS + MACROS
[FKEYS] = LAYOUT_ergodox(
// left hand
KC_ESCAPE,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_GRAVE,
KC_TAB,M(MACRO_PUBLIC),M(MACRO_STATIC), M(MACRO_STRING),M(MACRO_INT),M(MACRO_RETURN),KC_TRNS,
KC_TRNS,M(MACRO_PRIVATE),M(MACRO_CONST), M(MACRO_VAR),M(MACRO_FLOAT),M(MACRO_NULL),
KC_TRNS,KC_TRNS,KC_TRNS,M(MACRO_VOID),M(MACRO_BOOL),M(MACRO_BREAK),KC_BSLASH,
KC_TRNS,KC_LGUI,KC_LALT,KC_TRNS,KC_TRNS,
KC_TRNS,LCTL(KC_X),
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_CALCULATOR, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, M(MACRO_TODO), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
M(MACRO_NEW), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TILD, M(MACRO_PARENTHESE), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_PGUP,KC_PGDOWN, KC_INSERT, KC_PSCREEN, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_LEFT, KC_RIGHT
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(FKEYS) // FN1 - Momentary Layer 1
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case MACRO_PUBLIC:
if (record->event.pressed) {
return MACRO( T(P), T(U), T(B), T(L), T(I), T(C), T(SPACE),END);
}
break;
case MACRO_PRIVATE:
if (record->event.pressed) {
return MACRO( T(P), T(R), T(I), T(V), T(A), T(T), T(E), T(SPACE),END);
}
break;
case MACRO_STATIC:
if (record->event.pressed) {
return MACRO( T(S), T(T), T(A), T(T), T(I), T(C), T(SPACE), END);
}
break;
case MACRO_CONST:
if (record->event.pressed) {
return MACRO( T(C), T(O), T(N), T(S), T(T), T(SPACE), END);
}
break;
case MACRO_VOID:
if (record->event.pressed) {
return MACRO( T(V), T(O), T(I), T(D), T(SPACE), END);
}
break;
case MACRO_VAR:
if (record->event.pressed) {
return MACRO( T(V), T(A), T(R), T(SPACE), END);
}
break;
case MACRO_STRING:
if (record->event.pressed) {
return MACRO( T(S), T(T), T(R), T(I), T(N), T(G), T(SPACE), END);
}
break;
case MACRO_BOOL:
if (record->event.pressed) {
return MACRO( T(B), T(O), T(O), T(L), T(SPACE), END);
}
break;
case MACRO_INT:
if (record->event.pressed) {
return MACRO( T(I), T(N), T(T), T(SPACE), END);
}
break;
case MACRO_FLOAT:
if (record->event.pressed) {
return MACRO( T(F), T(L), T(O), T(A),T(T),T(SPACE), END);
}
break;
case MACRO_RETURN:
if (record->event.pressed) {
return MACRO( T(R), T(E), T(T), T(U),T(R),T(N), END);
}
break;
case MACRO_NULL:
if (record->event.pressed) {
return MACRO( T(N), T(U), T(L), T(L), END);
}
case MACRO_BREAK:
if (record->event.pressed) {
return MACRO( T(B), T(R), T(E), T(A), T(K), T(SCOLON), END);
}
break;
case MACRO_TODO:
if (record->event.pressed) {
return MACRO( T(SLASH), T(SLASH), D(LSHIFT) ,T(T), T(O), T(D), T(O),U(LSHIFT), T(SPACE),END);
}
break;
case MACRO_NEW:
if (record->event.pressed) {
return MACRO( T(N), T(E), T(W), T(SPACE), END);
}
break;
case MACRO_PARENTHESE:
if (record->event.pressed) {
return MACRO( D(LSHIFT),T(9), T(0),U(LSHIFT), T(SCOLON), END);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,48 @@
# ErgoDox EZ C# Developer configuration
## Changelog
* Feb 12, 2016 (V1):
* First version commit
* Mar 20, 2016 (V2):
* Removed "Classic QWERTY" layer, inverted GUI and SHIFT on Hold for Space and Enter
## About
This layout was conceived in an attempt to optimise keyboard layout for developers (C# more specifically, but it can work with most of other languages), and limit the keys required to perform the most frequent actions.
I came to the realization that my main tool as a developer, the qwerty keyboard was something that did not evolved at its core in almost 150 years.
There are a lot of reasons to this, and it would be a massive entreprise to change a standard so strongly anchored, but I wanted to give it a try and see how would look an input device dedicated to developers, more specifically a C# developer in my case.
The biggest flaw in standard QWERTY keyboards was that I always needed to perform key combination to access commonly used characters or actions. Think about it a minute, how many times a day do you press a modifier key such as Ctrl or Shift, it's insane and could be so easily optimized to require only one key press.
Then I came across the ErgoDox EZ project, that allowed a full customization of its firmware, and a unique 2 parts design.
![CSharpDev](https://i.imgur.com/PkNqi7V.png)
![CSharpDev](https://i.imgur.com/0IcMgMf.png)
## Layout design principles
* No key combination required for the most common input characters ( (),[],{},<> ... )
* No key combination required for the most common actions (copy/paste/undo/save)
* Regroup characters by usage ( + - * = ...)
* Easy access to the most commonly used characters: ; / " . ,
* Preregistered macro for the most common C# langage instructions: public / private / string / int / float ...
## Why is it specific to C Sharp
I defined the characters priority based on their usage in C# language, most of this characters are also used in other coding languages but it may require some tweaking.
For example there is no direct access to ~ or $ keys which can be very common in some languages.
Note it is also specific to Windows environement as the shortcut used in action keys would not work on Mac Os
## In usage
It was relatively easy to get used to the layout, but it's hard for me to define how easy it was as I was getting used to a blank Ergodox keyboard at the same time.
Still it's extremely satisfying to Save your file with just one easily accessible key or to have one big key to end your code line ( ; )
## Improvements
This layout was shared after a bunch of iterations and only once I was happy with it.
Still there are many way to improve or iterate on this:
* Make it language agnostic
* Check and compile language's keyboard's heatmaps to statistically define keys priority (e.g. https://dzone.com/articles/most-pressed-keys-various )
* QWERTY is still not the most efficient typing layout, I would like to create a Dvorak based similar layout in a near futur
## Issues
One of the issues encountered while creating this layout was that I did not find a way to have a key to send a modifier on hold, and a key combination while pressed (e.g. I can't set a Key to do Save (Ctrl + S) when pressed and Shift modifier when hold )

View file

@ -0,0 +1,199 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define PROG 1 // programming
#define NAVI 2 // navigation
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | | 6 | 7 | 8 | 9 | 0 | - | BkSpce |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | Y | | G | Y | U | I | O | P | Enter |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LCtrl | A | S | D | F | G |------| |------| H | J | K | L | ; | Enter |
* |--------+------+------+------+------+------| H | | B |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |`/Ctrl| \ | | | LAlt | | RAlt | [ | ] | |'/Ctrl|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | PrtS | PrtS | | CtAl | CtAl |
* ,------+------+------| |------+------+------.
* | | | L1 | | L1 | | |
* | Spce | ~L2 +------| |------+ ~L1 | Spce |
* | | | LGui | | RGui | | |
* `--------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y,
KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_H,
CTL_T(KC_GRV),KC_NUBS,KC_NO, KC_NO, KC_LALT,
KC_PSCREEN, KC_PSCREEN,
TO(PROG),
KC_SPC, MO(NAVI), KC_LGUI,
// right hand
KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_BSPC,
KC_G, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENTER,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER,
KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
KC_RALT,KC_LBRC,KC_RBRC,KC_NO, CTL_T(KC_QUOT),
MT(0x5, KC_NO), MT(0x5, KC_NO),
TO(PROG),
KC_RGUI, MO(PROG), KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | K/ | K* | K- | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | ( | ) | | | | | | | K7 | K8 | K9 | K+ | # |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | { | } | ` |------| |------| | K4 | K5 | K6 | K+ | ' |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | | K1 | K2 | K3 | K= | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | K0 | K0 | K. | K= | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | L2 | | L2 | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// PROGRAMMING
[PROG] = LAYOUT_ergodox(
// left hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS,
KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV,
KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
TO(NAVI),
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_NO, KC_PSLS, KC_PAST, KC_PMNS, KC_EQUAL,
KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_NUHS,
KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_QUOT,
KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PENT, KC_TRNS,
KC_P0, KC_P0, KC_PDOT, KC_PENT, KC_TRNS,
KC_TRNS, KC_TRNS,
TO(NAVI),
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Navigation and system keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Home | Up | End | Ins | PgUp | | | | | | Ins | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Left | Down | Rght | Del | PgDn |------| |------| | Back | Del | Fwrd | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Lclk | MsUp | Rclk | | | | | | | Prev | Play | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | MsLt | MsDn | MsRt | | |VolDn | Mute |VolUp | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | L0 | | L0 | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// NAVIGATION
[NAVI] = LAYOUT_ergodox(
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TRNS, KC_HOME, KC_UP, KC_END, KC_INS, KC_PGUP, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_DELT, KC_PGDN,
KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS,
TO(BASE),
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_WBAK, KC_DELT, KC_WFWD, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
TO(BASE),
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
//[1] = ACTION_LAYER_TAP_TOGGLE(PROG), // FN1 - Momentary Layer 1 (Symbols)
//[2] = ACTION_LAYER_TAP_TOGGLE(NAVI) // FN2 - Momentary Layer 2 (Navigation)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// 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) {
/* leds is a static array holding the current brightness of each of the
* three keyboard LEDs. It's 4 long simply to avoid the ugliness of +1s and
* -1s in the code below, and because wasting a byte really doesn't matter
* that much (no, it *doesn't*, stop whinging!). Note that because it's
* static it'll maintain state across invocations of this routine.
*/
static uint8_t leds[4];
uint8_t led;
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
/* Loop over each LED/layer */
for (led = 1; led <= 3; ++led) {
/* If the current layer matches the current LED, increment its
* brightness by 1 up to a maximum of 255. If the current layer doesn't
* match, decrement its brightness by 1 down to a minimum of zero.
*/
leds[led] += (layer == led) ?
(leds[led] < 255 ? 1 : 0):
(leds[led] > 0 ? -1 : 0);
/* Set LED state according to the new brightness */
if (leds[led]) {
ergodox_right_led_on(led);
ergodox_right_led_set(led, leds[led]);
}
else {
ergodox_right_led_off(led);
}
}
};

View file

@ -0,0 +1,38 @@
This keymap is my preferred layout (after a certain amount of experimentation).
The rationale behind the design is as follows:
I grew up typing from a very early age and thus never learned the "correct" way
to touch type (essentially, I'm self-taught). As a, result my fingers don't
tend to stay on the "home keys" and occasionally my right hand wants to type
keys that are on the left of the keyboard, and vice versa.
Hence, despite liking the idea of split keyboards in principle, I've never been
able to get on with them because the split simply doesn't work with my style of
typing. The Ergodox solves this neatly by virtue of having a few extra keys in
the "middle" of the keyboard which I can utilise for deliberate redundancy.
Thus in this keymap there are two "6" keys (one on the left, one on the right)
and likewise Y, H, G, and B are all duplicated to enable one-handed patterns
that I use frequently (e.g. "byobu" with the right hand, "yes" with the left,
etc.).
I occasionally use the numeric pad for data entry, thus this is duplicated
under the natural home position of the right hand in layer 1 (activated by
holding one of the right thumb buttons), while the cursor keys are duplicated
under the classic WASD gaming layout of the left hand in layer 2 (activated by
holding one of the left thumb buttons). Various other useful keys also appear
in these layers (brackets and symbols for coding in layer 1, navigation and
F-keys in layer 2, etc.).
Finally, modifier keys like Ctrl, Shift, and Alt, along with Backspace and
Enter are all in traditional locations in an effort to reuse existing muscle
memory as much as possible (keys like =, #, and ' are in layer 1). The layout
maps are in the comments of keymap_dave.c so I won't bother duplicating them
here.
Oh, and the LEDs are rather pimped ... because I could!
Anyway, although I'm sure this keymap won't be to many people's taste you might
find some interesting ideas in here for your own layouts. Do tweet me
(@waveform80) if you have any questions / suggestions / bugs.
Dave.

View file

@ -0,0 +1,563 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys and navigation
#define UNI 3 // unicode 1
#define UNI2 4 // unicode 2
enum macros {
RUN
};
enum function_ids {
EMOJI,
EMOJI2,
EPRM,
VRSN,
RGB_SLD,
GO_GROUP
};
/* opt can only be 0-15 */
enum emojis {
SHRUG,
YAY,
HUG,
SMILE,
SMILE2,
HMM1,
HMM2,
BEAR1,
BEAR2,
FUU,
EGGY1,
EGGY2,
FACE1,
FACE2,
UHU,
SMRK1
};
enum emojis2 {
SMRK2,
LOVE
};
enum progmem_ids {
EMOJI_SHRUG,
EMOJI_YAY,
EMOJI_HUG,
EMOJI_SMILE,
EMOJI_SMILE2,
EMOJI_HMM1,
EMOJI_HMM2,
EMOJI_BEAR1,
EMOJI_BEAR2,
EMOJI_FUU,
EMOJI_EGGY1,
EMOJI_EGGY2,
EMOJI_FACE1,
EMOJI_FACE2,
EMOJI_UHU,
EMOJI_SMRK1,
EMOJI_SMRK2,
EMOJI_LOVE,
F_EPRM,
F_VRSN,
F_RGB_SLD,
I3_GO_GROUP_10,
I3_GO_GROUP_1,
I3_GO_GROUP_2,
I3_GO_GROUP_3,
I3_GO_GROUP_4,
I3_GO_GROUP_5,
I3_GO_GROUP_6,
I3_GO_GROUP_7,
I3_GO_GROUP_8,
I3_GO_GROUP_9,
};
// TODO: Finish the macros for i3 (Macros should potentially be own function instead to make things easier? some of them at least, f. ex. the ones that use 1-0 keys so we can have a single switch)
// TODO: Do stuff with hyper and meh keys
// TODO: Add macros for lots of stuff. (Lastpass cli, pushbullet cli, other push service cli, linode cli, more?)
// TODO: Make macros for gnu screen and i3wm
// TODO: Need to change hotkeys for lastpass, and potentially make my own keys for them on one of my layers
// TODO: Look into using tap dance
// TODO: Use leader key for stuff. See https://github.com/qmk/qmk_firmware/wiki
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc/L3 | 1 | 2 | 3 | 4 | 5 | 6 | | 6 | 7 | 8 | 9 | 0 | - | =/L3 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab/L1 | Q | W | E | R | T | L1 | | L2 | Y | U | I | O | P | \/L1 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LCtrl | A | S | D | F | G |------| |------| H | J | K | L | ; | ctrl/'|
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |Z / L4|X / L2| C | V | B | | | | N | M | , |. / L2|/ / L4| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| UNI |AltShf| Lalt | Ralt | | Lalt | Ralt | LEAD | UNI | ~/L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | Home | | PgUp | Ins |
* ,------|------|------| |------+--------+------.
* | | | End | | PgDn | | |
* | Space| TAB |------| |------| BSPC |Enter |
* | | | [ | | ] | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
LT(UNI,KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
LT(SYMB,KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, LT(4, KC_Z), LT(MDIA, KC_X), KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(SYMB,KC_GRV),LCTL(LSFT(KC_U)), LALT(KC_LSFT), KC_RALT,KC_LALT,
ALT_T(KC_APP), KC_HOME,
KC_END,
KC_SPC,KC_TAB,KC_LBRC,
// right hand
KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, LT(UNI,KC_EQL),
TG(MDIA), KC_Y, KC_U, KC_I, KC_O, KC_P, LT(SYMB, KC_BSLS),
KC_H, KC_J, KC_K, KC_L, KC_SCLN,CTL_T(KC_QUOT),
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,LT(MDIA, KC_DOT), LT(UNI2, KC_SLSH), KC_RSFT,
KC_LALT, KC_RALT,KC_LEAD,LCTL(LSFT(KC_U)), LT(SYMB,KC_TILD),
KC_PGUP, KC_INS,
KC_PGDN,
KC_RBRC,KC_BSPC, KC_ENT
),
/* Keymap 1: Symbol Layer LCTL(LSFT(KC_U))
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Toggle|Animat| | Hue+ | Hue- |
* ,------|------|------| |------+------+------.
* |Bright|Bright|Solid | | | | |
* |ness- |ness+ |------| |------| DEL | |
* | | | | | EPRM | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
RGB_TOG,RGB_MOD,
F(F_RGB_SLD),
RGB_VAD,RGB_VAI,KC_TRNS,
// right hand
KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
RGB_HUD, RGB_HUI,
KC_TRNS,
F(F_EPRM), KC_DEL, KC_TRNS
),
/* Keymap 2: Media, mouse and navigation
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | gg(1)| gg(2)| gg(3)| gg(4)| gg(5)| gg(6)| | gg(6)| gg(7)| gg(8)| gg(9)| gg(0)| | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | RUN | | | | | | | Up | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | Left | Down | Right| | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | Prev | Next | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA , MOUSE and NAVIGATION
[MDIA] = LAYOUT_ergodox(
KC_TRNS, F(I3_GO_GROUP_1), F(I3_GO_GROUP_2), F(I3_GO_GROUP_3), F(I3_GO_GROUP_4), F(I3_GO_GROUP_5), F(I3_GO_GROUP_6),
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
F(I3_GO_GROUP_6), F(I3_GO_GROUP_7), F(I3_GO_GROUP_8), F(I3_GO_GROUP_9), F(I3_GO_GROUP_10), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
/* Keymap 3: Unicode
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | shrug| yay | hug | smile|smile2| | | | | λ | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | hmm1 | hmm2 | bear1| bear2| fuu |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | eggy1| eggy2| face1| face2| uhu | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | smrk1| smrk2| love | VER | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// Unicode
[UNI] = LAYOUT_ergodox(
KC_TRNS, UC(0x250c), UC(0x2510), UC(0x2514), UC(0x2518), UC(0x2502), UC(0x2500),
KC_TRNS, F(EMOJI_SHRUG), F(EMOJI_YAY), F(EMOJI_HUG), F(EMOJI_SMILE), F(EMOJI_SMILE2), KC_TRNS,
KC_TRNS, F(EMOJI_HMM1), F(EMOJI_HMM2), F(EMOJI_BEAR1), F(EMOJI_BEAR2), F(EMOJI_FUU),
KC_TRNS, F(EMOJI_EGGY1), F(EMOJI_EGGY2), F(EMOJI_FACE1), F(EMOJI_FACE2), F(EMOJI_UHU), KC_TRNS,
KC_TRNS, F(EMOJI_SMRK1), F(EMOJI_SMRK2), F(EMOJI_LOVE), F(F_VRSN),
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
UC(0x2554), UC(0x2557), UC(0x255a), UC(0x255d), UC(0x2551), UC(0x2550), KC_TRNS,
KC_TRNS, UC(0x25a0), UC(0x03bb), UC(0x2192), UC(0x2799), UC(0x25bb), UC(0x2588),
UC(0x263a), UC(0x263b), UC(0x2639), UC(0x2661), UC(0x2665), UC(0x2591),
KC_TRNS, UC(0x2764), UC(0x2610), UC(0x2611), UC(0x2612), UC(0x2713), UC(0x2584),
UC(0x2714), UC(0x2717), UC(0x2718), UC(0x25cf), UC(0x2580),
UC(0x2592), UC(0x2593),
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 4: Unicode 2
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | ¹ | ² | ³ | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | | | | ¾ | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | ¼ | | | ½ | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// Unicode 2
[UNI2] = LAYOUT_ergodox(
KC_TRNS, UC(0x00b9), UC(0x00b2), UC(0x00b3), UC(0x2074), UC(0x2075), UC(0x2076),
KC_TRNS, UC(0x2081), UC(0x2082), UC(0x2083), UC(0x2084), UC(0x2085), UC(0x2086),
KC_TRNS, UC(0x215e), UC(0x215d), UC(0x215c), UC(0x215b), UC(0x215a),
KC_TRNS, KC_TRNS, KC_TRNS, UC(0x2157), UC(0x2156), UC(0x2155), UC(0x2154),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
UC(0x2076), UC(0x2077), UC(0x2078), UC(0x2079), UC(0x2070), UC(0x2103), UC(0x2122),
UC(0x2086), UC(0x2087), UC(0x2088), UC(0x2089), UC(0x2080), UC(0x2044), KC_TRNS,
UC(0x2153), UC(0x2152), UC(0x2151), UC(0x2150), UC(0x00be), KC_TRNS,
UC(0x00bc), UC(0x2159), UC(0x2158), UC(0x00bd), 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
),
};
const uint16_t PROGMEM fn_actions[] = {
[EMOJI_SHRUG] = ACTION_FUNCTION_OPT(EMOJI, SHRUG),
[EMOJI_YAY] = ACTION_FUNCTION_OPT(EMOJI, YAY),
[EMOJI_HUG] = ACTION_FUNCTION_OPT(EMOJI,HUG),
[EMOJI_SMILE] = ACTION_FUNCTION_OPT(EMOJI,SMILE),
[EMOJI_SMILE2] = ACTION_FUNCTION_OPT(EMOJI,SMILE2),
[EMOJI_HMM1] = ACTION_FUNCTION_OPT(EMOJI,HMM1),
[EMOJI_HMM2] = ACTION_FUNCTION_OPT(EMOJI,HMM2),
[EMOJI_BEAR1] = ACTION_FUNCTION_OPT(EMOJI,BEAR1),
[EMOJI_BEAR2] = ACTION_FUNCTION_OPT(EMOJI,BEAR2),
[EMOJI_FUU] = ACTION_FUNCTION_OPT(EMOJI,FUU),
[EMOJI_EGGY1] = ACTION_FUNCTION_OPT(EMOJI,EGGY1),
[EMOJI_EGGY2] = ACTION_FUNCTION_OPT(EMOJI,EGGY2),
[EMOJI_FACE1] = ACTION_FUNCTION_OPT(EMOJI,FACE1),
[EMOJI_FACE2] = ACTION_FUNCTION_OPT(EMOJI,FACE2),
[EMOJI_UHU] = ACTION_FUNCTION_OPT(EMOJI,UHU),
[EMOJI_SMRK1] = ACTION_FUNCTION_OPT(EMOJI,SMRK1),
[EMOJI_SMRK2] = ACTION_FUNCTION_OPT(EMOJI2,SMRK2),
[EMOJI_LOVE] = ACTION_FUNCTION_OPT(EMOJI2,LOVE),
[F_EPRM] = ACTION_FUNCTION(EPRM),
[F_VRSN] = ACTION_FUNCTION(VRSN),
[F_RGB_SLD] = ACTION_FUNCTION(RGB_SLD),
[I3_GO_GROUP_10]= ACTION_FUNCTION_OPT(GO_GROUP,0),
[I3_GO_GROUP_1] = ACTION_FUNCTION_OPT(GO_GROUP,1),
[I3_GO_GROUP_2] = ACTION_FUNCTION_OPT(GO_GROUP,2),
[I3_GO_GROUP_3] = ACTION_FUNCTION_OPT(GO_GROUP,3),
[I3_GO_GROUP_4] = ACTION_FUNCTION_OPT(GO_GROUP,4),
[I3_GO_GROUP_5] = ACTION_FUNCTION_OPT(GO_GROUP,5),
[I3_GO_GROUP_6] = ACTION_FUNCTION_OPT(GO_GROUP,6),
[I3_GO_GROUP_7] = ACTION_FUNCTION_OPT(GO_GROUP,7),
[I3_GO_GROUP_8] = ACTION_FUNCTION_OPT(GO_GROUP,8),
[I3_GO_GROUP_9] = ACTION_FUNCTION_OPT(GO_GROUP,9),
};
#define TAP_ONCE(code) \
register_code (code); \
unregister_code (code)
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
if (record->event.pressed) {
switch(id) {
case EPRM:
eeconfig_init();
break;
case VRSN:
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
break;
case RGB_SLD:
#ifdef RGBLIGHT_ENABLE
rgblight_mode(1);
#endif
break;
case GO_GROUP:
register_code(KC_LCTL); TAP_ONCE(KC_I); unregister_code(KC_LCTL);
TAP_ONCE(KC_G);
if (opt == 0) {
TAP_ONCE(39);
} else {
TAP_ONCE(29+opt);
}
break;
case EMOJI:
switch(opt) {
case SHRUG:
unicode_input_start(); register_hex(0xaf); unicode_input_finish();
TAP_ONCE (KC_BSLS);
register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
TAP_ONCE (KC_SLSH);
unicode_input_start (); register_hex(0xaf); unicode_input_finish();
break;
case YAY:
SEND_STRING ("\\o/");
break;
case HUG:
unicode_input_start(); register_hex(0x0f3c); unicode_input_finish();
TAP_ONCE (KC_SPC);
unicode_input_start(); register_hex(0x3064); unicode_input_finish();
TAP_ONCE (KC_SPC);
unicode_input_start(); register_hex(0x25d5); unicode_input_finish();
unicode_input_start(); register_hex(0x005f); unicode_input_finish();
unicode_input_start(); register_hex(0x25d5); unicode_input_finish();
TAP_ONCE (KC_SPC);
unicode_input_start(); register_hex(0x0f3d); unicode_input_finish();
unicode_input_start(); register_hex(0x3064); unicode_input_finish();
break;
case SMILE:
unicode_input_start(); register_hex(0x0298); unicode_input_finish();
unicode_input_start(); register_hex(0x203f); unicode_input_finish();
unicode_input_start(); register_hex(0x0298); unicode_input_finish();
break;
case SMILE2:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x0298); unicode_input_finish();
unicode_input_start(); register_hex(0x203f); unicode_input_finish();
unicode_input_start(); register_hex(0x0298); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case HMM1:
unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
unicode_input_start(); register_hex(0x005f); unicode_input_finish();
unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
break;
case HMM2:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
unicode_input_start(); register_hex(0x005f); unicode_input_finish();
unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case BEAR1:
unicode_input_start(); register_hex(0x0295); unicode_input_finish();
unicode_input_start(); register_hex(0x2022); unicode_input_finish();
unicode_input_start(); register_hex(0x1d25); unicode_input_finish();
unicode_input_start(); register_hex(0x2022); unicode_input_finish();
unicode_input_start(); register_hex(0x0294); unicode_input_finish();
break;
case BEAR2:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x1d54); unicode_input_finish();
unicode_input_start(); register_hex(0x1d25); unicode_input_finish();
unicode_input_start(); register_hex(0x1d54); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case FUU:
unicode_input_start(); register_hex(0x256d); unicode_input_finish();
unicode_input_start(); register_hex(0x2229); unicode_input_finish();
unicode_input_start(); register_hex(0x256e); unicode_input_finish();
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x002d); unicode_input_finish();
unicode_input_start(); register_hex(0x005f); unicode_input_finish();
unicode_input_start(); register_hex(0x002d); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
unicode_input_start(); register_hex(0x256d); unicode_input_finish();
unicode_input_start(); register_hex(0x2229); unicode_input_finish();
unicode_input_start(); register_hex(0x256e); unicode_input_finish();
break;
case EGGY1:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x256f); unicode_input_finish();
unicode_input_start(); register_hex(0x00b0); unicode_input_finish();
unicode_input_start(); register_hex(0x25a1); unicode_input_finish();
unicode_input_start(); register_hex(0x00b0); unicode_input_finish();
unicode_input_start(); register_hex(0xff09); unicode_input_finish();
unicode_input_start(); register_hex(0x256f); unicode_input_finish();
break;
case EGGY2:
unicode_input_start(); register_hex(0x30ce); unicode_input_finish();
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x0020); unicode_input_finish();
unicode_input_start(); register_hex(0x309c); unicode_input_finish();
unicode_input_start(); register_hex(0x002d); unicode_input_finish();
unicode_input_start(); register_hex(0x309c); unicode_input_finish();
unicode_input_start(); register_hex(0x30ce); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case FACE1:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x002d); unicode_input_finish();
unicode_input_start(); register_hex(0x005f); unicode_input_finish();
unicode_input_start(); register_hex(0x002d); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case FACE2:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x2022); unicode_input_finish();
unicode_input_start(); register_hex(0x005f); unicode_input_finish();
unicode_input_start(); register_hex(0x2022); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case UHU:
unicode_input_start(); register_hex(0x2299); unicode_input_finish();
unicode_input_start(); register_hex(0xfe4f); unicode_input_finish();
unicode_input_start(); register_hex(0x2299); unicode_input_finish();
break;
case SMRK1:
unicode_input_start(); register_hex(0x005e); unicode_input_finish();
unicode_input_start(); register_hex(0x032e); unicode_input_finish();
unicode_input_start(); register_hex(0x005e); unicode_input_finish();
break;
}
break;
case EMOJI2:
switch(opt) {
case SMRK2:
unicode_input_start(); register_hex(0x0028); unicode_input_finish();
unicode_input_start(); register_hex(0x005e); unicode_input_finish();
unicode_input_start(); register_hex(0x032e); unicode_input_finish();
unicode_input_start(); register_hex(0x005e); unicode_input_finish();
unicode_input_start(); register_hex(0x0029); unicode_input_finish();
break;
case LOVE:
unicode_input_start(); register_hex(0x2665); unicode_input_finish();
unicode_input_start(); register_hex(0x203f); unicode_input_finish();
unicode_input_start(); register_hex(0x2665); unicode_input_finish();
break;
}
break;
}
}
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
if (record->event.pressed) {
switch(id) {
case RUN:
return MACRO( D(LCTL), T(I), U(LCTL), T(R), END );
break;
}
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
set_unicode_input_mode(UC_LNX);
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_1_on();
#ifdef RGBLIGHT_ENABLE
rgblight_setrgb(0xff,0x00,0x00);
#endif
break;
case 2:
ergodox_right_led_2_on();
#ifdef RGBLIGHT_ENABLE
rgblight_setrgb(0x00,0xff,0x00);
#endif
break;
case 3:
ergodox_right_led_3_on();
#ifdef RGBLIGHT_ENABLE
rgblight_setrgb(0x00,0x00,0xff);
#endif
break;
case 4:
ergodox_right_led_1_on();
ergodox_right_led_3_on();
#ifdef RGBLIGHT_ENABLE
rgblight_setrgb(0xff,0x00,0xff);
#endif
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,79 @@
# ErgoDox EZ 1337 configuration
Custom layout based on the default layout. Intended for interational
users of us intl-altgr layout. Note that some common keys might be
missing, as this layout is intented to be used on *nix systems by
users familiar with their system. The layout is geared towards
avoiding using the rat (mouse for those of you who are unfamiliar with
tiling window managers) as much as possibly.
# Layouts
All layer images created using [keyboard-layout-editor](http://www.keyboard-layout-editor.com/)
## Base layer
[![Base layer](https://i.imgur.com/PGhP2jZ.png)](http://www.keyboard-layout-editor.com/#/gists/0321b18620180a3e46c498206eb65366)
The base layer here is marked with the us international alt-gr layout,
including characters bound to what on an iso keyboard would be alt-gr
and on an ansi keyboard right alt.
Regular (and irregular) modifier keys are marked with a yellowish
gray. Layer moderators are marked with blue, red and green, which are
the same colors each layer displays on the LEDs when active.
All of the layer switch keys, except for the two center keys marked L1
TOG, are dual purpose. Hence for example the top left key produces ESC
if tapped, and temporarilly toggles L3 when hold down. The two center
L1 TOG keys toggle L1 on and off for more permanent layer toggling.
The UNI keys enter the linux ibus unicode composer mode
(ie. Ctrl+Shift+u). Use this to enter unicode characters. Hit the key,
type in the unicode hex value, and hit enter.
## Layer 1 - Symbols and RGB
[![Layer 1 - Symbols and RGB](https://i.imgur.com/SfkkU5D.png)](http://www.keyboard-layout-editor.com/#/gists/96714e198054c9115bafb5267cc6bc73)
The Symbols and RGB layer contains function keys, commonly used
symbols, a numpad and if you have the new Ergodox Ez shine keys for
controlling various RGB-led functions. In addition, it provides an up
and a down key for easy scrolling. RGB controller keys are yellow.
## Layer 2 - Media, Mouse and Navigation
[![Layer 2 - Media, Mouse and Navigation](https://i.imgur.com/UwPHjCO.png)](http://www.keyboard-layout-editor.com/#/gists/824759486e378bcec30784309a7e5731)
The Media, Mouse and unicode layer contains special keys for moving
the mouse and clicking on it with the keyboard. In addition it
provides standard media control keys, and default arrow keys.
## Layer 3 - Unicode
[![Layer 3 - Unicode](https://i.imgur.com/HRkeY8j.png)](http://www.keyboard-layout-editor.com/#/gists/67d9613dcd873c68693d11863d0fd289)
The unicode layer provides keys for directly typing unicode (utf-8)
## Layer 4 - Unicode 2
[![Layer 43 - Unicode](https://i.imgur.com/dyB459q.png)](http://www.keyboard-layout-editor.com/#/gists/7b2241110ab8311d9668a0798f3baf4a)
The unicode 2 layer provides keys for directly typing unicode (utf-8)
# Changelog
- 02.01.2017 Added delete key on second layer
- 10.01.2017 Added layer images to readme
- 24.01.2017 Added support for Ergodox Shine. Added secondary L2 switch key on left hand
- 24.01.2017 Added unicode keys. Added shrug hug and yay. Moved Navigation to layer 2
- 25.01.2017 Added lots of new emojis and some unicode keys
- 27.01.2017 Added new unicode keys and shortcut for ibus unicode composer key (CTRL+SHIFT+U)
- 11.03.2017 Added additional unicode layer. Moved some layer switch keys to more sane locations
# TODO
- Add macros for lots of stuff. (Lastpass cli, pushbullet cli, other push service cli, linode cli, more?)
- Make macros for gnu screen and i3wm
- Look into the app launch macros in algernon keymap

View file

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

View file

@ -0,0 +1,229 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
#define PLVR 3 // Plover layer
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | LGui | |Plover| 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | L1 | | L2 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |Esc/Ctrl| A | S | D | F | G |------| |------| H | J | K | L | ; | '"/Ctrl|
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L1 | Grv | '" | Left |Rgt/L2| | Up/L2| Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | Home | | PgUp |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | End | | PgDn | | |
* |Backsp|Delete|------| |------| Enter |Space |
* | ace | | LAlt | |TabCtl| | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LGUI,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1),
CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
KC_FN1, KC_GRV, KC_QUOT,KC_LEFT, LT(MDIA, KC_RGHT),
KC_APP, KC_HOME,
KC_END,
KC_BSPC,KC_DELT,KC_LALT,
// right hand
TG(3), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(2), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, CTL_T(KC_QUOT),
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
LT(MDIA, KC_UP), KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_PGUP, CTL_T(KC_ESC),
KC_PGDN,
CTL_T(KC_TAB),KC_ENT, KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | Calc |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_CALC,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | Rclk | Lclk | | | | | | Lclk | Rclk | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft| MsUp |MsDown|MsRght|------| |------|MsLeft|MsDown| MsUp |MsRght| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | Prev | |VolUp | |
* ,------|------|------| |------+------+------.
* | | | Play | | Mute |Brwser|Brwser|
* | Lclk | Rclk |------| |------|Fwd |Back |
* | | | Next | |VolDn | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
LAYOUT_ergodox(
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN1, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R,
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_MPRV,
KC_MPLY,
KC_BTN1, KC_BTN2, KC_MNXT,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, 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_VOLU, KC_TRNS,
KC_MUTE,
KC_VOLD, KC_WBAK, KC_WFWD
),
/* Keymap 4: Steno for Plover from https://github.com/shayneholmes/tmk_keyboard/commit/11290f8489013018f778627db725160c745e75bd
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | q | w | e | r | t |------| |------| y | u | i | o | p | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | a | s | d | f | g | | | | h | j | k | l | ; | ' |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | c | v |------| |------| n | m |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[PLVR] = LAYOUT_ergodox( // layout: layer 4: Steno for Plover
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO,
KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T,
KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_FN4, KC_NO,
KC_NO,
KC_C, KC_V, KC_NO,
// right hand
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_NO, KC_N, KC_M
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1 @@
https://i.imgur.com/zLx5fus.png

View file

@ -0,0 +1,184 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | \ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Del | ' | , | . | P | Y | L1 | | L1 | F | G | C | R | L | / |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | O | E | U | I |------| |------| D | H | T | N |S / L2| - |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |:/Ctrl| Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Backsp|------| |------| Tab |Enter |
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
KC_DELT, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, TG(1),
KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
TG(1), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), KC_MINS,
MEH_T(KC_NO),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,165 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
/******************************************************************************************
* DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/)
* Layer 1: auxiliary keys
* Layer 2: full qwerty layout
*****************************************************************************************/
// LAYERS
#define BASE 0 // dvorak layout (default)
#define AUX 1 // auxiliary keys
// MACROS
/* #define OBRACE 0 // key { or shift */
/* #define CBRACE 1 // key } or shift */
/* #define OBRACK 2 // key [ or left alt */
/* #define CBRACK 3 // key ] or left alt */
/* #define CAPS 4 // caps lock */
// LEDS
#define USB_LED_NUM_LOCK 0
#define USB_LED_CAPS_LOCK 1
#define USB_LED_SCROLL_LOCK 2
#define USB_LED_COMPOSE 3
#define USB_LED_KANA 4
// TIMERS
#define KEY_TAP_FAST 85
#define KEY_TAP_SLOW 95
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Base layer
* Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = / + |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | ~ |" / ' |, / < |. / > | P | Y | [ | | ] | F | G | C | H | L | / / ? |
* |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
* | Tab | A | O | E |U/LSft| I/L1 |------| |------| D/L1|R/RSft| T | N | S | - / _ |
* |--------+------+------+------+------+------| LGUI | | LGUI |------+------+------+------+------+--------|
* | {/LSft |; / : | Q | J | K | X | | | | B | M | W | V | Z | }/RSft |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | ~L1 | | ~L1 | | | \ / || |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | HOME | END | | LEFT | RIGHT|
* ,------|------|------| |------+--------+------.
* | BSPC | DEL | PGUP | | UP | SPACE |RETURN|
* | / | / |------| |------| / | / |
* | LCTL | LALT |PGDWN | | DOWN | LALT | LCTL |
* `--------------------' `----------------------'
*
*/
[BASE] = LAYOUT_ergodox(
// left hand
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TILD, KC_QUOTE, KC_COMM,KC_DOT, KC_P, KC_Y, KC_LBRACKET,
KC_TAB, KC_A, KC_O, KC_E, SFT_T(KC_U), LT(AUX, KC_I),
SFT_T(KC_LBRC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LGUI,
KC_NO, KC_NO, KC_NO, KC_NO, MO(AUX),
KC_HOME, KC_END,
KC_PGUP,
CTL_T(KC_BSPC), ALT_T(KC_DEL), KC_PGDN,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
KC_RBRACKET, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLASH,
LT(AUX, KC_D), SFT_T(KC_H), KC_T, KC_N, KC_S, KC_MINUS,
KC_LGUI, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_RBRC),
MO(AUX), KC_NO, KC_NO, KC_BSLASH, KC_NO,
KC_LEFT, KC_RIGHT,
KC_UP,
KC_DOWN, ALT_T(KC_ENT), CTL_T(KC_SPC)
),
/* Keymap 1: Aux layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | VolUp | | | | | | SLEEP | PWR | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | VolDn | F1 | F2 | F3 | F4 | | | | | | 7 | 8 | 9 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F5 | F6 | F7 | F8 | TRANS|------| |------|TRANS | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | |PSCR |------+------+------+------+------+--------|
* | TRANS | F9 | F10 | F11 | F12 | | | | | | 1 | 2 | 3 | / | TRANS |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS| | TRANS| . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | TRANS| TRANS| | TRANS| TRANS|
* ,------|------|------| |------+------+------.
* | | | TRANS| | TRANS| | |
* |TRANS |TRANS |------| |------| TRANS| TRANS|
* | | | TRANS| | TRANS| | |
* `--------------------' `--------------------'
*/
[AUX] = LAYOUT_ergodox(
// left hand
KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SLEP,
KC_VOLD, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_NO,
KC_NO , KC_F5, KC_F6, KC_F7, KC_F8, KC_TRNS,
KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO,
LCTL(KC_S), LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), KC_TRNS,
KC_TRNS , KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_PWR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_PAST, KC_NO,
KC_TRNS, KC_4, KC_5, KC_6, KC_PPLS, KC_NO,
KC_PSCR, KC_NO, KC_1, KC_2, KC_3, KC_PSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_PEQL, KC_NO,
KC_TRNS , KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(AUX) // FN1 - Momentary Layer 1 (Aux)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
}

View file

@ -0,0 +1,70 @@
# Ergodox Dvorak Layout with emacs binding in mind
* Control & Alt key on the thumbs (activated if pressed with another key).
* In the same way, "U" and "R" are the shift modifier if pressed with another key.
* "I" and "D" set the layer 1 for the auxiliary keys if pressed with another key.
* Software layout set to english.
## Keymap Layers
- L0: dvorak with some customizations (see layout below)
- L1: auxiliary keys (includes function keys, numpad...)
### Keymap 0: Base layer
Keys with double values (like U/LSft) correspond to the 'tapped' key and the 'held' key, respectively
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| ~ | ' | , | . | P | Y | [ | | ] | F | G | C | H | L | / |
|--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
| Tab | A | O | E |U/LSft| I/L1 |------| |------| D/L1|R/RSft| T | N | S | - |
|--------+------+------+------+------+------| LGUI | | LGUI |------+------+------+------+------+--------|
| {/LSft | ; | Q | J | K | X | | | | B | M | W | V | Z | }/RSft |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
| | | | | ~L1 | | ~L1 | | | \ | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| HOME | END | | LEFT | RIGHT|
,------|------|------| |------+--------+------.
| BSPC | DEL | PGUP | | UP | SPACE |RETURN|
| / | / |------| |------| / | / |
| LCTL | LALT |PGDWN | | DOWN | LALT | LCTL |
`--------------------' `----------------------'
</pre></code>
### Keymap 1: Aux layer
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| VolUp | | | | | | SLEEP | PWR | | | | | | |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| VolDn | F1 | F2 | F3 | F4 | | | | | | 7 | 8 | 9 | * | |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | F5 | F6 | F7 | F8 | TRANS|------| |------|TRANS | 4 | 5 | 6 | + | |
|--------+------+------+------+------+------| | |PSCR |------+------+------+------+------+--------|
| TRANS | F9 | F10 | F11 | F12 | | | | | | 1 | 2 | 3 | / | TRANS |
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS| | TRANS| . | 0 | = | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| TRANS| TRANS| | TRANS| TRANS|
,------|------|------| |------+------+------.
| | | TRANS| | TRANS| | |
|TRANS |TRANS |------| |------| TRANS| TRANS|
| | | TRANS| | TRANS| | |
`--------------------' `--------------------'
</pre></code>
## Generation of .hex file
> In the "qmk_firmware/keyboards/ergodox" directory.
> Execute "make dvorak_emacs". Then the hex file "ergodox_ez_dvorak_emacs.hex" is in the root directory : "qmk_firmware".
> Flash with `teensy_loader` binary

View file

@ -0,0 +1,166 @@
#include QMK_KEYBOARD_H
#include "keymap_dvorak.h"
#include "debug.h"
#include "action_layer.h"
/******************************************************************************************
* DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/)
* Layer 1: auxiliary keys
* Layer 2: full qwerty layout
*****************************************************************************************/
// LAYERS
#define BASE 0 // dvorak layout (default)
#define AUX 1 // auxiliary keys
// MACROS
/* #define OBRACE 0 // key { or shift */
/* #define CBRACE 1 // key } or shift */
/* #define OBRACK 2 // key [ or left alt */
/* #define CBRACK 3 // key ] or left alt */
/* #define CAPS 4 // caps lock */
// LEDS
#define USB_LED_NUM_LOCK 0
#define USB_LED_CAPS_LOCK 1
#define USB_LED_SCROLL_LOCK 2
#define USB_LED_COMPOSE 3
#define USB_LED_KANA 4
// TIMERS
#define KEY_TAP_FAST 85
#define KEY_TAP_SLOW 95
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Base layer
* Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = / + |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | ~ |" / ' |, / < |. / > | P | Y | [ | | ] | F | G | C | H | L | / / ? |
* |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
* | Tab | A | O | E |U/LSft| I/L1 |------| |------| D/L1|R/RSft| T | N | S | - / _ |
* |--------+------+------+------+------+------| LGUI | | LGUI |------+------+------+------+------+--------|
* | {/LSft |; / : | Q | J | K | X | | | | B | M | W | V | Z | }/RSft |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | ~L1 | | ~L1 | | | \ / || |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | HOME | END | | LEFT | RIGHT|
* ,------|------|------| |------+--------+------.
* | BSPC | DEL | PGUP | | UP | SPACE |RETURN|
* | / | / |------| |------| / | / |
* | LCTL | LALT |PGDWN | | DOWN | LALT | LCTL |
* `--------------------' `----------------------'
*
*/
[BASE] = LAYOUT_ergodox(
// left hand
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TILD, DV_QUOT, DV_COMM,DV_DOT, DV_P, DV_Y, DV_LBRC,
KC_TAB, DV_A, DV_O, DV_E, SFT_T(DV_U), LT(AUX, DV_I),
SFT_T(DV_LBRC), DV_SCLN, DV_Q, DV_J, DV_K, DV_X, KC_LGUI,
KC_NO, KC_NO, KC_NO, KC_NO, MO(AUX),
KC_HOME, KC_END,
KC_PGUP,
CTL_T(KC_BSPC), ALT_T(KC_DEL), KC_PGDN,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, DV_EQL,
DV_RBRC, DV_F, DV_G, DV_C, DV_R, DV_L, DV_SLSH,
LT(AUX, DV_D), SFT_T(DV_H), DV_T, DV_N, DV_S, DV_MINS,
KC_LGUI, DV_B, DV_M, DV_W, DV_V, DV_Z, SFT_T(DV_RBRC),
MO(AUX), KC_NO, KC_NO, KC_BSLS, KC_NO,
KC_LEFT, KC_RIGHT,
KC_UP,
KC_DOWN, ALT_T(KC_ENT), CTL_T(KC_SPC)
),
/* Keymap 1: Aux layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | VolUp | | | | | | SLEEP | PWR | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | VolDn | F1 | F2 | F3 | F4 | | | | | | 7 | 8 | 9 | * | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | F5 | F6 | F7 | F8 | TRANS|------| |------|TRANS | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | |PSCR |------+-----aan+------+------+------+--------|
* | TRANS | F9 | F10 | F11 | F12 | | | | | | 1 | 2 | 3 | / | TRANS |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS| | TRANS| . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | TRANS| TRANS| | TRANS| TRANS|
* ,------|------|------| |------+------+------.
* | | | TRANS| | TRANS| | |
* |TRANS |TRANS |------| |------| TRANS| TRANS|
* | | | TRANS| | TRANS| | |
* `--------------------' `--------------------'
*/
[AUX] = LAYOUT_ergodox(
// left hand
KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SLEP,
KC_VOLD, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_NO,
KC_NO , KC_F5, KC_F6, KC_F7, KC_F8, KC_TRNS,
KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO,
LCTL(DV_S), LCTL(DV_Z), LCTL(DV_X), LCTL(DV_C), KC_TRNS,
KC_TRNS , KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_PWR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_PAST, KC_NO,
KC_TRNS, KC_4, KC_5, KC_6, KC_PPLS, KC_NO,
KC_PSCR, KC_NO, KC_1, KC_2, KC_3, KC_PSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_PEQL, KC_NO,
KC_TRNS , KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(AUX) // FN1 - Momentary Layer 1 (Aux)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
}

View file

@ -0,0 +1,74 @@
# Ergodox Dvorak Layout with emacs binding in mind - software version
This configuration is the same as the dvorak_emacs layout, but using a sofware dvorak configuration
instead of a firmware configuration. This layout is for those who run their computer in dvorak mode.
* Control & Alt key on the thumbs (activated if pressed with another key).
* In the same way, "U" and "R" are the shift modifier if pressed with another key.
* "I" and "D" set the layer 1 for the auxiliary keys if pressed with another key.
* Software layout set to english.
## Keymap Layers
- L0: dvorak with some customizations (see layout below)
- L1: auxiliary keys (includes function keys, numpad...)
### Keymap 0: Base layer
Keys with double values (like U/LSft) correspond to the 'tapped' key and the 'held' key, respectively
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = |
|--------|------|------|------|------|-------------| |------|------|------|------|------|------|--------|
| ~ | ' | , | . | P | Y | [ | | ] | F | G | C | H | L | / |
|--------|------|------|------|------|------| { | | } |------|------|------|------|------|--------|
| Tab | A | O | E |U/LSft| I/L1 |------| |------| D/L1|R/RSft| T | N | S | - |
|--------|------|------|------|------|------| LGUI | | LGUI |------|------|------|------|------|--------|
| {/LSft | ; | Q | J | K | X | | | | B | M | W | V | Z | }/RSft |
`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
| | | | | ~L1 | | ~L1 | | | \ | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| HOME | END | | LEFT | RIGHT|
,------|------|------| |------|--------|------.
| BSPC | DEL | PGUP | | UP | SPACE |RETURN|
| / | / |------| |------| / | / |
| LCTL | LALT |PGDWN | | DOWN | LALT | LCTL |
`--------------------' `----------------------'
</pre></code>
### Keymap 1: Aux layer
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| VolUp | | | | | | SLEEP | PWR | | | | | | |
|--------|------|------|------|------|-------------| |------|------|------|------|------|------|--------|
| VolDn | F1 | F2 | F3 | F4 | | | | | | 7 | 8 | 9 | * | |
|--------|------|------|------|------|------| | | |------|------|------|------|------|--------|
| | F5 | F6 | F7 | F8 | TRANS|------| |------|TRANS | 4 | 5 | 6 | + | |
|--------|------|------|------|------|------| | |PSCR |------|------|------|------|------|--------|
| TRANS | F9 | F10 | F11 | F12 | | | | | | 1 | 2 | 3 | / | TRANS |
`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------'
|CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS| | TRANS| . | 0 | = | |
`----------------------------------' `----------------------------------'
,-------------. ,-------------.
| TRANS| TRANS| | TRANS| TRANS|
,------|------|------| |------|------|------.
| | | TRANS| | TRANS| | |
|TRANS |TRANS |------| |------| TRANS| TRANS|
| | | TRANS| | TRANS| | |
`--------------------' `--------------------'
</pre></code>
## Generation of .hex file
> In the "qmk_firmware/keyboards/ergodox" directory.
> Execute "make dvorak_emacs". Then the hex file "ergodox_ez_dvorak_emacs.hex" is in the root directory : "qmk_firmware".
> Flash with `teensy_loader` binary

View file

@ -0,0 +1,185 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | BrBck| | Play | 6 | 7 | 8 | 9 | 0 | \ / L2 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Esc | ' | , | . | P | Y | Del | | Ins | F | G | C | R | L | / |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | O | E | U | I |------| |------| D | H | T | N | S | - |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |:/Ctrl| Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| LAlt | LGui | Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | App | L1 | | L2 |PrntScr |
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space| Tab |------| |------| AltShf |Enter |
* | | | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_WBAK,
KC_ESC, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_DELT,
KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_LALT, KC_LGUI, KC_LEFT,KC_RGHT,
CTL_T(KC_APP), TG(1),
KC_HOME,
KC_SPC,KC_TAB,KC_END,
// right hand
KC_MPLY, KC_6, KC_7, KC_8, KC_9, KC_0, LT(MDIA, KC_BSLS),
KC_INS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
MEH_T(KC_NO),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
TG(2), KC_PSCREEN,
KC_PGUP,
KC_PGDN,RALT(KC_RSFT), KC_ENT
),
/* Keymap 1: Symbol & Media Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Prev | Next | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | |VolUp | | |
* | | |------| |------| Mute | |
* | | | | |VolDn | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_MPRV,KC_MNXT,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_VOLU,
KC_VOLD, KC_MUTE, KC_TRNS
),
/* Keymap 2: QWERTY Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Q | W | E | R | T | | | | Y | U | I | O | P | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | A | S | D | F | G |------| |------| H | J | K | L | ; | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
LAYOUT_ergodox( // layer 0 : default
// left hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS,
KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_TRNS, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS,
KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),KC_TRNS,
KC_TRNS, KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,29 @@
# ErgoDox EZ Dvorak International Squisher
Dvorak layout adjusted with several (linux) applications in mind:
* Easier Escape for VIM
* Windows/Super key for awesome WM
* Alt+Shift for international characters
* PrintScreen for sys-rq
* Insert for the X11 clip-board
Major layer changes:
* Common multimedia keys are integrated into layer 0, less common into layer 1
* No mouse keys
* Layer 2 is qwerty (for easier gaming & less fortunate keyboard users)
Known issues:
* Alt+Shift does not work reliably (depends on the X11 kb layout? Not
entirely clear...)
![layer0](https://i.imgur.com/AL70X44.png)
![layer1](https://i.imgur.com/k1DcUdt.png)
![layer2](https://i.imgur.com/nK80mKf.png)
## Changelog
* 2016-03-29
* Initial release

View file

@ -0,0 +1,14 @@
Dvorak support, plover support, gaming support
I'm used to the Kinesis, so originally I was just going to patch up
the thumb keys to be more familiar. But the ergodox is really well
suited to NKRO support in Plover, so I added a layer for that, and
then I remembered that dvorak can be really annoying for video
games (try to reach WASD), so I added a layer for that.
The result is probably a bit idiosyncratic, but it works for me.
(I also don't have any press/hold distinction keys, because that
confuses my fuzzy little brain.)
Contributed by seebs (seebs@seebs.net)

View file

@ -0,0 +1,230 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define PLVR 2 // media keys
#define QWRT 3 // qwerty layer for gaming
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | \ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | ' | , | . | P | Y | L1 | | L2 | F | G | C | R | L | / |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LGui | A | O | E | U | I |------| |------| D | H | T | N | S | - |
* |--------+------+------+------+------+------| Esc | | L3 |------+------+------+------+------+--------|
* | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Lalt | Grv | | Left | Right| | Up | Down | [ | ] | RAlt |
* `----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | LCtrl| Alt | | LGui | RCtrl |
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* |Backsp|Delete|------| |------| Enter |Space |
* | ace| | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, MO(SYMB),
KC_LGUI, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ESC,
KC_LALT, KC_GRV, KC_ESC, KC_LEFT,KC_RGHT,
KC_LCTL, KC_LALT,
KC_HOME,
KC_BSPC,KC_DEL,KC_END,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
TG(PLVR), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
TG(QWRT),KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_RALT,
KC_LGUI, KC_RCTL,
KC_PGUP,
KC_PGDN,KC_ENT, KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | KP7 | KP8 | KP9 | KP* | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | KP4 | KP5 | KP6 | KP+ | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | KP1 | KP2 | KP3 | KP/ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | KP. | KP0 | KP= | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_P7, KC_P8, KC_P9, KC_PAST, KC_F12,
KC_DOWN, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_TRNS,
KC_TRNS,KC_PDOT, KC_P0, KC_PEQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Steno for Plover from https://github.com/shayneholmes/tmk_keyboard/commit/11290f8489013018f778627db725160c745e75bd
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | 1 | 2 | 3 | 4 | 5 | | | L2 | 6 | 7 | 8 | 9 | 0 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | q | w | e | r | t |------| |------| y | u | i | o | p | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | a | s | d | f | g | | | | h | j | k | l | ; | ' |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | c | v |------| |------| n | m |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[PLVR] = LAYOUT_ergodox( // layout: layer 2: Steno for Plover
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T,
KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_FN4, KC_NO,
KC_NO,
KC_C, KC_V, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
TG(2), KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_NO, KC_N, KC_M
),
/* Keymap 3: qwerty-ish
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LGui | A | S | D | F | G |------| |------| H | J | K | L | ; | LGui |
* |--------+------+------+------+------+------| Spc | | L3 |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Lalt | Grv | '" | Left | Right| | Up | Down | [ | ] | RAlt |
* `----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | LCtrl| LAlt | | LGui | RCtrl |
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* |Backsp|Delete|------| |------| Enter |Space |
* | ace| | End | | PgDn | | |
* `--------------------' `----------------------'
*/
[QWRT] = LAYOUT_ergodox( // layer 3: qwerty for gaming
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPACE,
KC_LALT, KC_GRV, KC_QUOT, KC_LEFT,KC_RGHT,
KC_LCTL, KC_LALT,
KC_HOME,
KC_BSPC,KC_DEL,KC_END,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
TG(QWRT), KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_RALT,
KC_LGUI, KC_RCTL,
KC_PGUP,
KC_PGDN,KC_ENT, KC_SPC
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_3_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,39 @@
Dvorak Programmer Layout
========================
This is a dvorak-only layout. The overall philosophy is that the left hand contains a number of layer-switching shortcuts, and the right hand key codes vary based on the layer selected.
Layers
------
* BASE: this is where you type.
* SHELL_NAV: hold down the Tab key to access shell/terminal navigation shorcuts such as forward/backward word, history, Ctrl+C, screen tab movement.
* KEY_NAV: arrow key movement with backward/forward word support, and copy/paste.
* KEY_SEL: same as above, but every movement shift-selects.
* NUMBER: keypad layer.
* SYMBOL: all the symbols.
* BRACKET: special brackets-only layer for programming. Activated by pressing left capslock (OSL)
* SHORTCUTS: sends Hyper keys for Autohotkey to interpret. I use this to switch between specific apps.
* MOUSE: use mouse keys
Updates
-------
2017/02/10:
* Made left shift an MO for SHELL_NAV, and symbol+right shift CAPSLOCK. Made all modifiers OSM.
2017/01/28:
* Made the capslock key a dual momentary layer activation for BRACKETS and SHELL_NAV. One keypress held down for BRACKETS, one keypress, released and then held down for SHELL_NAV
2017/01/22:
* Made brackets toggle an OSL on the left capslock
* Added SHELL_LAYER
2016/12/10:
* toggle for brackets layer is now on left thumb cluster.
2016/11/05:
* removed brackets anywhere but in brackets layer
* added mouse layer back in
* put semicolon-newline and end-newline on symbol layer
* replaced all HYPR with MEH, added more shortcut keys

View file

@ -0,0 +1,406 @@
#include QMK_KEYBOARD_H
#include "led.h"
#include "debug.h"
#include "action_layer.h"
#include "action_code.h"
#define BASE 0 // default layer
#define SHELL_NAV 2
#define KEY_NAV 3 // key navigation layer
#define KEY_SEL 4 // key selection layer
#define NUMBER 5 // number layer
#define SYMBOL 6
#define BRACKETS 7
#define SHORTCUTS 8
#define MOUSE 9
// macros
#define MC_COPY_LINE 0
#define MC_CUT_LINE 1
#define MC_PASTE_LINE 2
#define MC_NEW_SEARCH_TAB 3
#define SCREEN_TAB_LEFT 4
#define SCREEN_TAB_RIGHT 5
#define SCREEN_NEW_TAB 6
#define SWITCH_NDS 7
#define SCREEN_COPY_MODE 8
#define SCREEN_PASTE 9
#define OPEN_CLOSE_PAREN 10
#define OPEN_CLOSE_BRACKET 11
#define OPEN_CLOSE_CURLY 12
#define OPEN_CLOSE_SINGLE_QUOTE 13
#define OPEN_CLOSE_DOUBLE_QUOTE 14
#define SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND 15
#define SEMICOLON_NEWLINE 16
#define END_NEWLINE 17
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// base layer
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, MO(KEY_SEL),
MO(BRACKETS), KC_A, KC_O, KC_E, KC_U, KC_I,
MO(SHELL_NAV), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, MO(KEY_NAV),
OSL(SHORTCUTS),OSM(MOD_LCTL), OSM(MOD_LALT),OSL(SYMBOL),MO(NUMBER),
// thumb cluster
OSM(MOD_LSFT), RCTL(KC_S),
RCTL(KC_DEL),
KC_BSPC,RCTL(KC_BSPC),KC_DEL,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS,
KC_PGUP, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, OSM(MOD_LSFT),
// lower keys - browser tab control
RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), LALT(KC_LEFT), RCTL(KC_W),
// thumb cluster
KC_HOME,KC_END,
KC_UP,
KC_DOWN,KC_ENT, KC_SPC
),
// shell navigation layer
[SHELL_NAV] = LAYOUT_ergodox(
// left 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,
// bottom row
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
// thumb cluster
KC_TRNS,KC_TRNS,
LALT(KC_D),
KC_TRNS,RCTL(KC_W),KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, LALT(KC_D), RCTL(KC_R),
LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), LALT(KC_DOT),
RCTL(KC_C), RCTL(KC_U), M(SCREEN_COPY_MODE), M(SCREEN_PASTE), MEH(KC_V), RCTL(KC_K), M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND),
// bottom row
M(SCREEN_TAB_LEFT), M(SCREEN_TAB_RIGHT), M(SCREEN_NEW_TAB), KC_TRNS, KC_TRNS,
// thumb cluster
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
// key navigation layer
[KEY_NAV] = LAYOUT_ergodox(
// left 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,
// bottom row
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
// thumb cluster
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_PGDN, KC_HOME, KC_UP, KC_END, KC_PGUP, M(MC_COPY_LINE),
RCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, RCTL(KC_RIGHT), M(MC_CUT_LINE),
KC_TRNS, KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_TRNS, M(MC_PASTE_LINE),
// bottom row
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
// thumb cluster
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
// key selection layer
[KEY_SEL] = LAYOUT_ergodox(
// left 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,
// bottom row
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
// thumb cluster
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
RSFT(KC_PGUP), RSFT(KC_PGDN), RSFT(KC_HOME), RSFT(KC_UP), RSFT(KC_END), RSFT(KC_PGUP), M(MC_COPY_LINE),
RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), M(MC_CUT_LINE),
RSFT(KC_PGDN), KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_TRNS, M(MC_PASTE_LINE),
// bottom row
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
// thumb cluster
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
// number layer
[NUMBER] = LAYOUT_ergodox(
// left 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,
// bottom row
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
// thumb cluster
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_PLUS, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS,
KC_MINS, KC_4, KC_5, KC_6, KC_SLSH, KC_TRNS,
KC_TRNS, KC_EQUAL, KC_1, KC_2, KC_3, KC_COLN, KC_TRNS,
// bottom row
KC_0, KC_DOT, KC_COMMA, KC_TRNS, KC_TRNS,
// thumb cluster
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
[SYMBOL] = LAYOUT_ergodox(
// left 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,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_PLUS, KC_AMPR, KC_ASTR, KC_GRAVE,KC_TILD, KC_TRNS,
KC_MINS, KC_DLR, KC_PERC, KC_CIRC, KC_PIPE, KC_TRNS,
KC_TRNS, KC_EQUAL,KC_EXLM, KC_AT, KC_HASH, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
M(SEMICOLON_NEWLINE), M(END_NEWLINE),
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
[BRACKETS] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,M(OPEN_CLOSE_CURLY), M(OPEN_CLOSE_PAREN),M(OPEN_CLOSE_BRACKET), KC_TRNS,KC_TRNS,
KC_TRNS,KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS, KC_LCBR, KC_RCBR, 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,
// right hand
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS, KC_TRNS, M(OPEN_CLOSE_BRACKET),M(OPEN_CLOSE_PAREN),M(OPEN_CLOSE_CURLY),KC_TRNS,KC_TRNS,
KC_TRNS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_TRNS,
KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, 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
),
[SHORTCUTS] = LAYOUT_ergodox(
// left hand
KC_NO, MEH(KC_F1), MEH(KC_F2), MEH(KC_F3), MEH(KC_F4), MEH(KC_F5), MEH(KC_F6),
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,
MEH(KC_0),MEH(KC_1),
MEH(KC_2),
MEH(KC_3),MEH(KC_4),MEH(KC_5),
// right hand
MEH(KC_F7), MEH(KC_F8), MEH(KC_F9), MEH(KC_F10), MEH(KC_F11), MEH(KC_F12), M(SWITCH_NDS),
KC_TRNS, MEH(KC_A), MEH(KC_B), MEH(KC_C), MEH(KC_D), MEH(KC_E), MEH(KC_F),
MEH(KC_G), MEH(KC_H), MEH(KC_I), MEH(KC_J), MEH(KC_K), MEH(KC_L),
KC_TRNS, MEH(KC_M), MEH(KC_N), MEH(KC_O), MEH(KC_P), MEH(KC_Q), KC_CAPSLOCK,
MEH(KC_S), MEH(KC_T), MEH(KC_U), MEH(KC_V), MEH(KC_X),
MEH(KC_6), MEH(KC_7),
MEH(KC_8),
MEH(KC_9), MEH(KC_Y), MEH(KC_Z)
),
[MOUSE] = LAYOUT_ergodox(
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,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, 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_BTN1, KC_BTN2
),
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case MC_COPY_LINE:
if (record->event.pressed) {
return MACRO( T(HOME), D(LSFT), T(END), U(LSFT), D(LCTL), T(C), U(LCTL), END);
}
break;
case MC_CUT_LINE:
if (record->event.pressed) {
return MACRO( T(HOME), D(LSFT), T(END), U(LSFT), D(LCTL), T(X), U(LCTL), END);
}
break;
case MC_PASTE_LINE:
if (record->event.pressed) {
return MACRO( T(END), T(ENTER), D(LCTL), T(V), U(LCTL), END);
}
break;
case MC_NEW_SEARCH_TAB:
if (record->event.pressed) {
return MACRO( D(LCTL), T(T), T(K), U(LCTL), END);
}
break;
case SCREEN_TAB_LEFT:
if (record->event.pressed) {
return MACRO( D(LCTL), T(A), U(LCTL), T(P), END);
}
break;
case SCREEN_TAB_RIGHT:
if (record->event.pressed) {
return MACRO( D(LCTL), T(A), U(LCTL), T(N), END);
}
break;
case SCREEN_NEW_TAB:
if (record->event.pressed) {
return MACRO( D(LCTL), T(A), U(LCTL), T(C), END);
}
break;
case SCREEN_COPY_MODE:
if (record->event.pressed) {
return MACRO( D(LCTL), T(A), U(LCTL), T(ESC), END);
}
break;
case SCREEN_PASTE:
if (record->event.pressed) {
return MACRO( D(LCTL), T(A), U(LCTL), T(RBRC), END);
}
break;
case SWITCH_NDS:
if (record->event.pressed) {
return MACRO( D(LSFT), T(F11), U(LSFT), W(255), D(LALT), T(TAB), U(LALT), END);
}
break;
case OPEN_CLOSE_PAREN:
if (record->event.pressed) {
return MACRO( D(LSFT), T(9), T(0), U(LSFT), T(LEFT), END);
}
break;
case OPEN_CLOSE_BRACKET:
if (record->event.pressed) {
return MACRO( T(LBRC), T(RBRC), T(LEFT), END);
}
break;
case OPEN_CLOSE_CURLY:
if (record->event.pressed) {
return MACRO( D(LSFT), T(LBRC), T(RBRC), U(LSFT), T(LEFT), END);
}
break;
case OPEN_CLOSE_SINGLE_QUOTE:
if (record->event.pressed) {
return MACRO( T(QUOT), T(QUOT), T(LEFT), END);
}
break;
case OPEN_CLOSE_DOUBLE_QUOTE:
if (record->event.pressed) {
return MACRO( D(LSFT), T(QUOT), T(QUOT), U(LSFT), T(LEFT), END);
}
break;
case SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND:
if (record->event.pressed) {
return MACRO( T(UP), T(HOME), D(LALT), T(D), U(LALT), END);
}
break;
case SEMICOLON_NEWLINE:
if (record->event.pressed) {
return MACRO( T(END), T(SCLN), T(ENTER), END);
}
break;
case END_NEWLINE:
if (record->event.pressed) {
return MACRO( T(END), T(ENTER), END);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
return;
};
void led_set_user(uint8_t usb_led) {
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
ergodox_right_led_1_on();
} else {
ergodox_right_led_1_off();
}
}
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case NUMBER:
case SYMBOL:
case BRACKETS:
//case SHELL_LAYER:
ergodox_right_led_2_on();
break;
case KEY_NAV:
case KEY_SEL:
ergodox_right_led_3_on();
break;
case SHORTCUTS:
ergodox_right_led_2_on();
ergodox_right_led_3_on();
break;
default:
// none
break;
}
return;
};

View file

@ -0,0 +1,8 @@
BOOTMAGIC_ENABLE=no
COMMAND_ENABLE=no
SLEEP_LED_ENABLE=no
FORCE_NKRO = yes
DEBUG_ENABLE = no
CONSOLE_ENABLE = no
TAP_DANCE_ENABLE = no
MOUSEKEY_ENABLE = yes

View file

@ -0,0 +1,331 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"
#include "keymap_nordic.h"
#include "keymap_norwegian.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // mouse keys
#define DEVL 3 // dev keys
#define MACRO_PUBLIC 10
#define MACRO_PRIVATE 11
#define MACRO_PROT 12
#define MACRO_SHARED 13
#define MACRO_CONST 14
#define MACRO_DIM 15
#define MACRO_STRING 16
#define MACRO_INT 17
#define MACRO_DEC 18
#define MACRO_BOOL 19
#define MACRO_RETURN 20
#define MACRO_NOTHING 21
#define MACRO_TODO 22
#define MACRO_SAVE 24
#define MACRO_BUILD 25
#define MACRO_DEBUG 26
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | L3 | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | \ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Del | - | , | . | P | Y | LT1 | | LT1 | F | G | C | R | L | Å |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | WIN | A | O | E | U | I |------| |------| D | H | T | N | S | Ä |
* |--------+------+------+------+------+------| LT2 | | LT2 |------+------+------+------+------+--------|
* | LShift | Ö | Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | CTRL | L1 |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Backsp|------| |------| Tab |Enter |
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
MO(DEVL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
KC_DELT, NO_MINS, KC_COMM, KC_DOT, KC_P, KC_Y, TG(SYMB),
KC_LGUI, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, TG(MDIA),
CTL_T(KC_NO), MO(SYMB), LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLASH,
TG(1), KC_F, KC_G, KC_C, KC_R, KC_L, NO_AM,
KC_D, KC_H, KC_T, KC_N, KC_S, NO_AE,
TG(MDIA),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | @ | { | } | [ | ] | | | | < | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | ( | ) | \ | / |------| |------| > | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | UND | CUT | COP | PAS | | | | ? | 1 | 2 | 3 | % | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | . | 0 | = | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS, NO_AT, ALGR(KC_7), ALGR(KC_0), NO_LBRC, NO_RBRC, KC_TRNS,
KC_TRNS, KC_HASH, NO_LPRN, NO_RPRN, ALGR(KC_MINS), NO_SLSH,
KC_TRNS, KC_TRNS, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, NO_LESS, KC_7, KC_8, KC_9, KC_KP_ASTERISK, KC_F12,
LSFT(NO_LESS), KC_4, KC_5, KC_6, KC_KP_PLUS, KC_TRNS,
KC_TRNS, NO_QUES, KC_1, KC_2, KC_3, LSFT(KC_5), KC_TRNS,
KC_DOT,KC_0, LSFT(KC_0), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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
),
/* Keymap 3: Developer keys in vb.net
* shortened in layout beneth, for example int-> integer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Save |Build |Debug | | | | | | bool | int |string| dec | Todo | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| priv | publ |shared| prot | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | const| dim |return|nothin| | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[DEVL] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(MACRO_SAVE), M(MACRO_BUILD), M(MACRO_DEBUG), 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,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(MACRO_BOOL), M(MACRO_INT), M(MACRO_STRING), M(MACRO_DEC), M(MACRO_TODO), KC_TRNS,
M(MACRO_PRIVATE), M(MACRO_PUBLIC), M(MACRO_SHARED), M(MACRO_PROT), KC_TRNS, KC_TRNS,
KC_TRNS, M(MACRO_CONST), M(MACRO_DIM), M(MACRO_RETURN), M(MACRO_NOTHING), 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
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
case MACRO_PUBLIC:
if (record->event.pressed) {
return MACRO( T(P), T(U), T(B), T(L), T(I), T(C), T(SPACE),END);
}
break;
case MACRO_PRIVATE:
if (record->event.pressed) {
return MACRO( T(P), T(R), T(I), T(V), T(A), T(T), T(E), T(SPACE),END);
}
break;
case MACRO_PROT:
if (record->event.pressed) {
return MACRO( T(P), T(R), T(O), T(T), T(E), T(C), T(T), T(E), T(D), T(SPACE),END);
}
break;
case MACRO_SHARED:
if (record->event.pressed) {
return MACRO( T(S), T(H), T(A), T(R), T(E), T(D), T(SPACE), END);
}
break;
case MACRO_CONST:
if (record->event.pressed) {
return MACRO( T(C), T(O), T(N), T(S), T(T), T(SPACE), END);
}
break;
case MACRO_DIM:
if (record->event.pressed) {
return MACRO( T(D), T(I), T(M), T(SPACE), END);
}
break;
case MACRO_STRING:
if (record->event.pressed) {
return MACRO( T(S), T(T), T(R), T(I), T(N), T(G), T(SPACE), END);
}
break;
case MACRO_BOOL:
if (record->event.pressed) {
return MACRO( T(B), T(O), T(O), T(L), T(E), T(A), T(N), T(SPACE), END);
}
break;
case MACRO_INT:
if (record->event.pressed) {
return MACRO( T(I), T(N), T(T), T(SPACE), END);
}
break;
case MACRO_DEC:
if (record->event.pressed) {
return MACRO( T(D), T(E), T(C), T(I), T(M), T(A), T(L), T(SPACE), END);
}
break;
case MACRO_RETURN:
if (record->event.pressed) {
return MACRO( T(R), T(E), T(T), T(U),T(R),T(N), T(SPACE), END);
}
break;
case MACRO_NOTHING:
if (record->event.pressed) {
return MACRO( T(N), T(O), T(T), T(H), T(I), T(N), T(G), T(SPACE), END);
}
case MACRO_TODO:
if (record->event.pressed) {
return MACRO( KC_BSLASH, D(LSHIFT) ,T(T), T(O), T(D), T(O), KC_DOT, U(LSHIFT), T(SPACE),END);
}
break;
case MACRO_SAVE:
if (record->event.pressed) {
return MACRO( D(LCTL) ,T(S), U(LCTL),END);
}
break;
case MACRO_BUILD:
if (record->event.pressed) {
return MACRO( D(LCTL), D(LSHIFT) ,T(B), U(LSHIFT), U(LCTL),END);
}
break;
case MACRO_DEBUG:
if (record->event.pressed) {
return MACRO( KC_F5 ,END);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,28 @@
# ErgoDox EZ Dvorak Programmer SWEDISH
Dvorak layout adjusted for a suitable programmer layout and swedish special characters added:
* åäö characters added
* Layout for common vb.net keywords
* Common Visual Studio commands like Save, Build, Debug
TODO:
* (Layer 4 is qwerty (for easier gaming & less fortunate keyboard users)) Like this idea, will add it later on
Known issues:
* Keymap 2 modifier has not gotten its place yet..
* Print screen, where?
## Changelog
* 2017-05-16
* Initial release
# Author
Christian Westerlund
cwesterlund @ github
Thanks to the author of keymap csharp_dev for inspiration!

View file

@ -0,0 +1,284 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
/******************************************************************************************
* SPANISH DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/)
* Layer 1: auxiliary keys
* Layer 2: full qwerty layout
******************************************************************************************
* IMPORTANT: Software layout must be set to SPANISH QWERTY to work properly
*****************************************************************************************/
// LAYERS
#define BASE 0 // dvorak layout (default)
#define AUX 1 // auxiliary keys
#define QWERTY 2 // qwerty layout
// MACROS
#define OBRACE 0 // key { or shift
#define CBRACE 1 // key } or shift
#define OBRACK 2 // key [ or left alt
#define CBRACK 3 // key ] or left alt
#define CAPS 4 // caps lock
// LEDS
#define USB_LED_NUM_LOCK 0
#define USB_LED_CAPS_LOCK 1
#define USB_LED_SCROLL_LOCK 2
#define USB_LED_COMPOSE 3
#define USB_LED_KANA 4
// TIMERS
#define KEY_TAP_FAST 85
#define KEY_TAP_SLOW 95
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Base layer
* Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | \ | 1 | 2 | 3 | 4 | 5 | <> | | ¡ | 6 | 7 | 8 | 9 | 0 | ' |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | F1/~L1 | . | , | Ñ | P | Y |MEH_T | | L1 | F | G | C | H | L |ALL_T/+ |
* |--------+------+------+------+------+------| DEL | | ~L1 |------+------+------+------+------+--------|
* |Esc/Ctrl| A | O | E | U | I |------| |------| D | R | T | N | S |'/RCtrl |
* |--------+------+------+------+------+------| LGUI | | RALT |------+------+------+------+------+--------|
* | {/LSft | - | Q | J | K | X | | | | B | M | W | V | Z | }/RSft |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |[/LALT| HOME |PGDOWN| PGUP | END | | LEFT | DOWN | UP |RIGHT |]/LALT|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |F5/CAG|F6/~L1| |F7/~L1|F8/CAG|
* ,------|------|------| |------+--------+------.
* | | |F4/CA | |F11/CA| | |
* | ENTER| TAB |------| |------| BSPC | SPACE|
* | | |F3/SA | |F12/SA| | |
* `--------------------' `----------------------'
* CAG = CTRL-ALT-GUI
* CA = CTRL-ALT
* SA = SHIFT-ALT
*
*/
[BASE] = LAYOUT_ergodox(
// left hand
KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_NONUS_BSLASH,
LT(AUX, KC_F1), KC_DOT, KC_COMM,KC_SCLN,KC_P, KC_Y, MEH_T(KC_DEL),
CTL_T(KC_ESC), KC_A, KC_O, KC_E, KC_U, KC_I,
M(OBRACE), KC_SLSH,KC_Q, KC_J, KC_K, KC_X, KC_LGUI,
M(OBRACK), KC_HOME,KC_PGDN,KC_PGUP,KC_END,
LCAG_T(KC_F5), LT(AUX, KC_F6),
MT((MOD_LALT | MOD_LCTL), KC_F4),
KC_ENT,KC_TAB,MT((MOD_LALT | MOD_LSFT), KC_F3),
// right hand
KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
KC_FN1, KC_F, KC_G, KC_C, KC_H, KC_L, ALL_T(KC_RBRACKET),
KC_D, KC_R, KC_T, KC_N, KC_S, CTL_T(KC_QUOTE),
KC_RALT, KC_B, KC_M, KC_W, KC_V, KC_Z, M(CBRACE),
KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,M(CBRACK),
LT(AUX, KC_F7), LCAG_T(KC_F8),
MT((MOD_LALT | MOD_LCTL), KC_F11),
MT((MOD_LALT | MOD_LSFT), KC_F12),KC_BSPC, KC_SPC
),
/* Keymap 1: Aux layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | SLEEP | PWR | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | < | > | MsUp | | | | | ~L0 | | 7 | 8 | 9 | * | `^ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | 4 | 5 | 6 | + | Ç |
* |--------+------+------+------+------+------| | |PSCR |------+------+------+------+------+--------|
* |CAPSLOCK| | | | | | | | | | 1 | 2 | 3 | / | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |CTRL-S|CTRL-Z|CTRL-X|CTRL-C|CTRL-V| | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | Play |
* ,------|------|------| |------+------+------.
* | | | | | VolUp| | |
* | Lclk | Rclk |------| |------| Prev | Next |
* | | | L2 | | VolDn| | |
* `--------------------' `--------------------'
*/
[AUX] = LAYOUT_ergodox(
// left hand
KC_NO , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_SLEP,
KC_TRNS, KC_NONUS_BSLASH, LSFT(KC_NONUS_BSLASH), KC_MS_U, KC_NO, KC_NO, KC_NO,
KC_NO , KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO ,
M(CAPS), KC_NO, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO,
LCTL(KC_S), LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V),
KC_NO , KC_TRNS,
KC_NO,
KC_BTN1, KC_BTN2, TG(QWERTY),
// right hand
KC_PWR, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_NO, KC_7, KC_8, KC_9, KC_PAST, KC_LBRACKET,
KC_NO, KC_4, KC_5, KC_6, KC_PPLS, KC_BSLASH,
KC_PSCR, KC_NO, KC_1, KC_2, KC_3, KC_PSLS, KC_NO,
KC_NO ,KC_DOT, KC_0, KC_PEQL, KC_NO,
KC_TRNS, KC_MPLY,
KC_VOLU,
KC_VOLD, KC_MPRV, KC_MNXT
),
/* Keymap 2: QWERTY layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | \ | 1 | 2 | 3 | 4 | 5 | <> | | ¡ | 6 | 7 | 8 | 9 | 0 | ' |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TRANS | Q | W | E | R | T |MEH_T | | TRANS| Y | U | I | O | P |ALL_T/+ |
* |--------+------+------+------+------+------| DEL | | |------+------+------+------+------+--------|
* |Esc/Ctrl| A | S | D | F | G |------| |------| H | J | K | L | Ñ |'/RCtrl |
* |--------+------+------+------+------+------| LGUI | | RALT |------+------+------+------+------+--------|
* | {/LSft | Z | X | C | V | B | | | | N | M | , | . | - | }/RSft |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |[/LALT| HOME |PGDOWN| PGUP | END | | LEFT | DOWN | UP |RIGHT |]/LALT|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |F5/CAG| TRANS| | TRANS|F8/CAG|
* ,------|------|------| |------+--------+------.
* | | |F4/CA | |F11/CA| | |
* | ENTER| TAB |------| |------| BSPC | SPACE|
* | | | TRANS| |F12/SA| | |
* `--------------------' `----------------------'
* CAG = CTRL-ALT-GUI
* CA = CTRL-ALT
* SA = SHIFT-ALT
*
*/
[QWERTY] = LAYOUT_ergodox(
// left hand
KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_NONUS_BSLASH,
KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, MEH_T(KC_DEL),
CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G,
M(OBRACE), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI,
M(OBRACK), KC_HOME,KC_PGDN,KC_PGUP,KC_END,
LCAG_T(KC_F5), KC_TRNS,
MT((MOD_LALT | MOD_LCTL), KC_F4),
KC_ENT,KC_TAB,KC_TRNS,
// right hand
KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, ALL_T(KC_RBRACKET),
KC_H, KC_J, KC_K, KC_L, KC_SCLN,CTL_T(KC_QUOTE),
KC_RALT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,M(CBRACE),
KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,M(CBRACK),
KC_TRNS, LCAG_T(KC_F8),
MT((MOD_LALT | MOD_LCTL), KC_F11),
MT((MOD_LALT | MOD_LSFT), KC_F12),KC_BSPC, KC_SPC
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(AUX) // FN1 - Momentary Layer 1 (Aux)
};
static uint16_t key_timer;
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case OBRACE: {
if (record->event.pressed) {
key_timer = timer_read();
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
if (timer_elapsed(key_timer) < KEY_TAP_SLOW) {
register_code(KC_RALT);
register_code(KC_QUOTE);
unregister_code(KC_QUOTE);
unregister_code(KC_RALT);
}
}
break;
}
case CBRACE: {
if (record->event.pressed) {
key_timer = timer_read();
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
if (timer_elapsed(key_timer) < KEY_TAP_SLOW) {
register_code(KC_RALT);
register_code(KC_BSLS);
unregister_code(KC_BSLS);
unregister_code(KC_RALT);
}
}
break;
}
case OBRACK: {
if (record->event.pressed) {
key_timer = timer_read();
register_code(KC_LALT);
} else {
unregister_code(KC_LALT);
if (timer_elapsed(key_timer) < KEY_TAP_SLOW) {
register_code(KC_RALT);
register_code(KC_LBRACKET);
unregister_code(KC_LBRACKET);
unregister_code(KC_RALT);
}
}
break;
}
case CBRACK: {
if (record->event.pressed) {
key_timer = timer_read();
register_code(KC_LALT);
} else {
unregister_code(KC_LALT);
if (timer_elapsed(key_timer) < KEY_TAP_SLOW) {
register_code(KC_RALT);
register_code(KC_RBRACKET);
unregister_code(KC_RBRACKET);
unregister_code(KC_RALT);
}
}
break;
}
case CAPS: {
if (record->event.pressed) {
register_code(KC_CAPSLOCK);
} else {
unregister_code(KC_CAPSLOCK);
}
break;
}
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_3_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
// Turn the caps lock led on
if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
ergodox_right_led_1_on();
}
}

View file

@ -0,0 +1,99 @@
# Ergodox Spanish Dvorak Layout
* See spanish dvorak layout [here](http://djelibeibi.unex.es/dvorak/)
* Software layout must be set to SPANISH QWERTY to work properly
## Keymap Layers
- L0: spanish dvorak with some customizations (see layout below)
- L1: auxiliary keys (includes qwerty shortcuts, numpad...)
- L2: qwerty layout with customizations
### Keymap 0: Base layer
Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| \ | 1 | 2 | 3 | 4 | 5 | <> | | ¡ | 6 | 7 | 8 | 9 | 0 | ' |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| F1/~L1 | . | , | Ñ | P | Y |MEH_T | | L1 | F | G | C | H | L |ALL_T/+ |
|--------+------+------+------+------+------| DEL | | ~L1 |------+------+------+------+------+--------|
|Esc/Ctrl| A | O | E | U | I |------| |------| D | R | T | N | S |'/RCtrl |
|--------+------+------+------+------+------| LGUI | | RALT |------+------+------+------+------+--------|
| {/LSft | - | Q | J | K | X | | | | B | M | W | V | Z | }/RSft |
'--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------'
|[/LALT| HOME |PGDOWN| PGUP | END | | LEFT | DOWN | UP |RIGHT |]/LALT|
'----------------------------------' '----------------------------------'
,-------------. ,-------------.
|F5/CAG|F6/~L1| |F7/~L1|F8/CAG|
,------|------|------| |------+--------+------.
| | |F4/CA | |F11/CA| | |
| ENTER| TAB |------| |------| BSPC | SPACE|
| | |F3/SA | |F12/SA| | |
'--------------------' '----------------------'
CAG = CTRL-ALT-GUI
CA = CTRL-ALT
SA = SHIFT-ALT
</pre></code>
### Keymap 1: Aux layer
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| | F1 | F2 | F3 | F4 | F5 | SLEEP| | PWR | F6 | F7 | F8 | F9 | F10 | F11 |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| | < | > | MsUp | | | | | ~L0 | | 7 | 8 | 9 | * | '^ |
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
| | |MsLeft|MsDown|MsRght| |------| |------| | 4 | 5 | 6 | + | Ç |
|--------+------+------+------+------+------| | |PSCR |------+------+------+------+------+--------|
|CAPSLOCK| | | | | | | | | | 1 | 2 | 3 | / | |
'--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------'
|CTRL-S|CTRL-Z|CTRL-X|CTRL-C|CTRL-V| | | . | 0 | = | |
'----------------------------------' '----------------------------------'
,-------------. ,-------------.
| | | | | Play |
,------|------|------| |------+------+------.
| | | | | VolUp| | |
| Lclk | Rclk |------| |------| Prev | Next |
| | | L2 | | VolDn| | |
'--------------------' '--------------------'
</pre></code>
### Keymap 2: QWERTY layer
<pre><code>
,--------------------------------------------------. ,--------------------------------------------------.
| \ | 1 | 2 | 3 | 4 | 5 | <> | | ¡ | 6 | 7 | 8 | 9 | 0 | ' |
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
| TRANS | Q | W | E | R | T |MEH_T | | TRANS| Y | U | I | O | P |ALL_T/+ |
|--------+------+------+------+------+------| DEL | | |------+------+------+------+------+--------|
|Esc/Ctrl| A | S | D | F | G |------| |------| H | J | K | L | Ñ |'/RCtrl |
|--------+------+------+------+------+------| LGUI | | RALT |------+------+------+------+------+--------|
| {/LSft | Z | X | C | V | B | | | | N | M | , | . | - | }/RSft |
'--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------'
|[/LALT| HOME |PGDOWN| PGUP | END | | LEFT | DOWN | UP |RIGHT |]/LALT|
'----------------------------------' '----------------------------------'
,-------------. ,-------------.
|F5/CAG| TRANS| | TRANS|F8/CAG|
,------|------|------| |------+--------+------.
| | |F4/CA | |F11/CA| | |
| ENTER| TAB |------| |------| BSPC | SPACE|
| | | TRANS| |F12/SA| | |
'--------------------' '----------------------'
CAG = CTRL-ALT-GUI
CA = CTRL-ALT
SA = SHIFT-ALT
</pre></code>
## Generation of .hex file
> [Download scripts from here](https://github.com/johgh/keyboard/tree/master/ergodox)
> Execute install.sh and generate.sh scripts.
> Flash with `teensy_loader` binary (should be installed from previous step)

View file

@ -0,0 +1,184 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Grv | 1 | 2 | 3 | 4 | 5 | L1 | | L2 | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | - |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | \/LCtrl| A | S | D | F | G |------| |------| H | J | K | L | ; |'/RCtrl |
* |--------+------+------+------+------+------| RAlt | | RAlt |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L1 | LCtrl| Left| Right| LAlt | | LAlt | Up | Down | RCtrl| ~L2 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Del | Ins | | Esc | App |
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Backsp|------| |------| LGui |Enter |
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, TG(SYMB),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
CTL_T(KC_BSLS), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_RALT,
MO(SYMB), KC_LCTRL, KC_LEFT,KC_RGHT,KC_LALT,
KC_DELT,KC_INS,
KC_HOME,
KC_SPC,KC_BSPC,KC_END,
// right hand
TG(MDIA), KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, CTL_T(KC_QUOT),
KC_RALT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
KC_LALT,KC_UP, KC_DOWN,KC_RCTRL, MO(MDIA),
KC_ESC, KC_APP,
KC_PGUP,
KC_PGDN, KC_LGUI, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | 0 | 0 | . | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_0, KC_0, KC_DOT, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
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);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

View file

@ -0,0 +1,10 @@
# ErgoDox EZ Emacs-OSX-DeadKeys Configuration
Since I'm an Emacs user, ctrl keys are very important and gets a placement where the usual caps_lock is. There
are an extra pair of ctrls, just in case there where problems with the holding one's, but not as comfortable.
Gui button takes a predominant place on the thumb cluster, as I'm using a mac os x and it relies heavily on it.
Finally there is also two Right Alts to easily access to accented letters of the spanish alphabet.
![Default](https://i.imgur.com/EDgp9xj.png)

View file

@ -0,0 +1,13 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include QMK_KEYBOARD_CONFIG_H
#define ONESHOT_TAP_TOGGLE 2
#define ONESHOT_TIMEOUT 300
#undef LEADER_TIMEOUT
#define LEADER_TIMEOUT 300
#endif

View file

@ -0,0 +1,223 @@
#include <keymap_extras/keymap_colemak.h>
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
enum custom_keycodes {
PLACEHOLDER = SAFE_RANGE, // can always be here
RGB_FF00BB // always start with RGB_
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 |Ctrl- | | Ctrl+| 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | S | D | F | G |------| |------| H | Alt/J| K | L |; / L2| LGui/' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* |LShift/(|Z/Ctrl| X | C | V | B | [ | | ] | N | M | , | . |//Ctrl|RShift/)|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | -/L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Leader|------| |------| Tab/L1 |Enter |
* | | | End | | PgDn | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, LCTL(KC_MINS),
KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_LBRC),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_LEAD,KC_END,
// right hand
LCTL(KC_EQL), KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), KC_Y,KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H,ALT_T(KC_J),KC_K, KC_L, LT(MDIA,KC_SCLN),GUI_T(KC_QUOT),
MEH_T(KC_RBRC),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSPC,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, LT(SYMB,KC_MINS),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,LT(SYMB, KC_TAB), KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | 1 | 2 | 3 | 4 | 5 |------| |------| & | _ | - | ; | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | 6 | 7 | 8 | 9 | 0 | | | | | | @ | = | % | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | |NxtTab|PrvTab| | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | |TOG |
* ,------|------|------| |------+------+------.
* |VAI |VAD |HUI | |SAI | |MOD |
* | | |------| |------| | |
* | | |HUD | |SAD | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = LAYOUT_ergodox(
// left hand
RGB_FF00BB, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5,
KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
KC_TRNS, KC_TRNS,KC_TRNS,LCTL(KC_PGUP), LCTL(KC_PGDN),
KC_TRNS,KC_TRNS,
RGB_HUI,
RGB_VAI,RGB_VAD,RGB_HUD,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
KC_AMPR, KC_UNDS, KC_MINS, CM_SCLN, KC_PLUS, KC_TRNS,
KC_TRNS, KC_PIPE, KC_AT, KC_EQL, KC_PERC, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
RGB_TOG, KC_TRNS,
RGB_SAI,
RGB_SAD, KC_TRNS, RGB_MOD
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | PgUp | Home | End | PgDn | |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox(
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_PGUP, KC_HOME, KC_END, KC_PGDN, 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,
// 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
[2] = ACTION_MACRO_TAP(0), // Eric Tang's Famous Macro!
[3] = ACTION_MACRO_TAP(1) // Eric Tang's Famous Macro!
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// dynamically generate these.
case RGB_FF00BB:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
rgblight_mode(1);
rgblight_setrgb(0xff,0x00,0xbb);
#endif
}
return false;
break;
}
return true;
}
LEADER_EXTERNS();
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_ONE_KEY(KC_W) {
register_code(KC_LALT);
register_code(KC_F4);
unregister_code(KC_F4);
unregister_code(KC_LALT);
}
SEQ_ONE_KEY(KC_O) {
register_code(KC_LCTL);
register_code(KC_LSFT);
register_code(KC_O);
unregister_code(KC_O);
unregister_code(KC_LSFT);
unregister_code(KC_LCTL);
}
}
}

View file

@ -0,0 +1,55 @@
# Erez's experimental layout
This is my personal layout which I use to test out ideas which may or may not make it onto the default layout we ship with. It's based off the default layout, with various tweaks.
Changelog:
## Nov 1, 2016:
* Adds dedicated text zooming keys in inner corners
## May 24, 2016:
* Implements Leader key example
* Leader, W sends Alt-F4
* Leader, O sends Ctrl-shift-o (a shortcut I use in FrontApp)
## May 8, 2016:
* Makes bottom-right key send minus/underscore when tapped, L1 temporary toggle when held
* Tweaked the positions of the numbers on the symbol layer. Basically, 12345 are now directly under their number-row counterparts in layer 0. You can imagine pulling the number row down to the home row. And 67890 are directly under 12345 - so it's a matter of just adding 5 and going to the next row (1+5 = 6, 2+5 = 7 and so on).
* Tweaks media/nav layer
* Removes mouse control, as I don't use it
* Makes left home row keys PgUp, Home, End, PgDn
## Apr 29, 2016:
* Tweaks the Hyper and Meh key to send brackets when tapped
* Turns bottom-right key into a minus/underscore (easy to reach with the right pinky)
## Apr 25, 2016:
* Made it so that the right and left Shift keys send opening and closing parens ( ) when tapped
## Feb 11, 2016:
* Updated ASCII legend for thumb clusters
* Made it so outer left-hand thumb key is L1 momentary toggle
* Added % and @ to L1
* Swapped positions for _ and - on L1
## Feb 5, 2016:
* A whole new design for the symbol layer. Specifically:
* Put the minus, underscore, and semicolon right in the homerow for the right hand
* Parens are in better places for me
* The arrow keys now send Ctrl-PgUp and Ctrl-PgDn, for switching browser tabs with the arrows when in symbol layer
* Tab (right-hand outer thumb key) now does double duty to toggle symbol layer when held down
* Backspace (left-hand outer thumb key) now just toggles symbol layer (I wasn't using it as a backspace)
## Jan 19, 2016:
* Made J into dual-action key (Alt when held down), to make Alt-tab more ergonomic.
* Made ' into dual-action key (Win/Cmd when held down).

View file

@ -0,0 +1,7 @@
# Having a file like this allows you to override Makefile definitions
# for your own particular keymap
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
COMMAND_ENABLE = no # Commands for debug and configuration

View file

@ -0,0 +1,69 @@
# ErgoDox Familiar Layout
Familiar layout for those who regularly switch back and forth from ErgoDox to "normal" QWERTY.
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](../../../../license_GPLv3.md../../../../license_GPLv3.md) [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg)](https://github.com/RichardLitt/standard-readme)
## Table of Contents
- [Background](#background)
- [Install](#install)
- [Usage](#usage)
- [Layers](#layers)
- [Contribute](#contribute)
- [Issues](#issues)
- [License](#license)
## Background
This layout is built to be as familiar as possible for users coming directly from a default (QWERTY US) keyboard, while gaining as much advantage as possible from the ErgoDox and QMK featureset. I use an ErgoDoxEZ at home, but I don't have a regular office (CS grad student) so I regularly use either my laptop or a default-setup lab computer; I context switch daily so this layout is meant to reduce the mental overhead as much as possible.
The default ErgoDoxEZ layout is probably more optimized as a solo daily driver - as are a lot of the others available keymaps. The focus of this layout is to get as much from the 'Dox as possible without overly disrupting long-established muscle memory.
Key features of the familiar layout:
1. QWERTY default layout.
1. International symbols layer, mapped in the US-International layout default positions, through [UCIS](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable).
1. Numpad layer on right hand.
1. Thumb cluster holds spacebar and access to secondary layers.
1. Function-layer arrow keys in both the first-person-shooter (actually ESDF instead of WASD) and vim (HJKL) locations.
## Install
If you are on Windows or Mac, choose the proper line in [`keymap.c`](keymap.c) for [unicode/international character support](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable) (starts at line 253).
```c
void matrix_init_user(void) {
set_unicode_input_mode(UC_LNX); // Linux
//set_unicode_input_mode(UC_OSX); // Mac OSX
//set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki)
//set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki)
};
```
For instructions on building and installing this keymap, [go to the wiki](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ergodox#build-dependencies). Below is the command for me; it may be different for you.
```sh
$ make ergodox-ez-familiar-teensy
```
## Usage
[![Familiar Layout](http://i.imgur.com/6nLN9UT.png)](https://gist.github.com/nstickney/13508a9f99cff381d58b7be6f7dcc644)
### Layers
1. Base Layer: QWERTY, with arrow keys at bottom right.
1. UCIS Layer: US-International symbols layer, plus —. Accessed by toggling the `SYMB` layer using the UCIS key (bottom of left thumb cluster).
1. UCIS-Shifted Layer: Making shift work for UCIS characters. An ugly workaround. Any ideas? Accessed by holding shift while the `SYMB` layer is active (toggles the `CSYM` layer).
1. Numpad Layer: Right hand number pad. Accessed by toggling the `NUMP` layer using the NUMP key (bottom of right thumb cluster).
1. Function Layer: F1-F12, arrows on ESDF and HJKL, media player controls. Accessed by holding either FN key (center key of each thumb cluster), which toggles the `ARRW` layer. I know, I need to work on my naming conventions.
## Contribute
[Contributor Covenant](http://contributor-covenant.org/)
I'm terrible at this; I have no background in human-computer interaction, kinesiology, or keyboard-ology. Please send comments/issues/pull requests/angry tweets/etc. If you think there is a better way to take advantage of the ErgoDox/QMK comination without straying far from 84/101-key QWERTY, I want to know it.
### Issues
1. The `CSYM` layer is an ugly workaround. I should write a function for doing different things in the `SYMB` layer depending on whether SHIFT is being held. Or something. Ideas?
1. Right now, the thumb cluster function keys double as slash and whack... this really isnt a great solution.
1. `MENU` and `LEAD` are useless, at the moment.
## License
QMK is licensed ([mostly](https://github.com/qmk/qmk_firmware/issues/1038)) under the [GPLv2](blob/master/license_GPLv2.md). Accordingly, to whatever extent applicable, this keymap is licensed under the [GPLv3](../../../../license_GPLv3.md).

Some files were not shown because too many files have changed in this diff Show more