~ruther/qmk_firmware

538874f90f5ae69b241f80baa639fb6dbc4cfa80 — Ismael Venegas Castelló 6 years ago 8a330b3
Keymap: Hacker Dvorak (#4514)

* Hacker Dvorak

Programmer Dvorak based layout for the Ergodox EZ.

* Address drashna comments.

* Fix RGB and drop OSL for MO.

* Add gulp file to automate development.

* Fix gulpfile.

* Caps, num and scroll lock indicators.

* Fix scroll lock.
A keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore => keyboards/ergodox_ez/keymaps/hacker_dvorak/.gitignore +2 -0
@@ 0,0 1,2 @@
node_modules/
package-lock.json

A keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h => keyboards/ergodox_ez/keymaps/hacker_dvorak/config.h +82 -0
@@ 0,0 1,82 @@
/*
  Set any config.h overrides for your specific keymap here.
  See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
*/
#pragma once


/* Keyboard Settings */
#undef  TAPPING_TERM
#define TAPPING_TERM 150

#undef  DEBOUNCE
#define DEBOUNCE 10

#undef  IGNORE_MOD_TAP_INTERRUPT
#define IGNORE_MOD_TAP_INTERRUPT

#undef  FORCE_NKRO
#define FORCE_NKRO

/* This isn't defined by default, so there is no need to undefine it first. */
#define LEADER_TIMEOUT 500
#define PERMISSIVE_HOLD
#define QMK_KEYS_PER_SCAN 4


// RGB Lights
#undef  RGBLIGHT_HUE_STEP
#define RGBLIGHT_HUE_STEP 24

#undef  RGBLIGHT_SAT_STEP
#define RGBLIGHT_SAT_STEP 24

#undef  RGBLIGHT_VAL_STEP
#define RGBLIGHT_VAL_STEP 24

#undef  RGBLIGHT_BRI_STEP
#define RGBLIGHT_BRI_STEP 24

#undef  RGBLIGHT_LIMIT_VAL
#define RGBLIGHT_LIMIT_VAL 255

/* This isn't defined by default, so there is no need to undefine it first. */
#define RGBLIGHT_SLEEP


// Mouse
#undef  MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 10

#undef  MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 15

#undef  MOUSEKEY_MAX_SPEED
#define MOUSEKEY_MAX_SPEED 15

#undef  MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150

#undef  MOUSEKEY_WHEEL_MAX_SPEED
#define MOUSEKEY_WHEEL_MAX_SPEED 15

#undef  MOUSEKEY_WHEEL_TIME_TO_MAX
#define MOUSEKEY_WHEEL_TIME_TO_MAX 150


/* This is defined only if CONSOLE_ENABLE is set to "yes" */
// #undef  NO_DEBUG
// #define NO_DEBUG

// #undef  NO_PRINT
// #define NO_PRINT

/* For COMBO only*/
// #define COMBO_COUNT 1
// #define COMBO_TERM 200

/* For tap toggle */
// #define TAPPING_TOGGLE 2
// #define ONESHOT_TAP_TOGGLE 2
// #define ONESHOT_TIMEOUT 300


A keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md => keyboards/ergodox_ez/keymaps/hacker_dvorak/default.png.md +1 -0
@@ 0,0 1,1 @@
https://i.imgur.com/fKX0Zbs.png

A keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md => keyboards/ergodox_ez/keymaps/hacker_dvorak/default_highres.png.md +1 -0
@@ 0,0 1,1 @@
https://i.imgur.com/giAc3M9.jpg

A keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js => keyboards/ergodox_ez/keymaps/hacker_dvorak/gulpfile.js +13 -0
@@ 0,0 1,13 @@
let gulp = require('gulp');
let run = require('gulp-run-command').default;

 
gulp.task('clean', run('rm -rf ../../../../.build'));

gulp.task('build', ['clean'], run('make -C ../../../../ ergodox_ez:hacker_dvorak', {
    ignoreErrors: true
}));

gulp.task('watch', ['build'], () => {
    gulp.watch(['keymap.c', 'config.h', 'rules.mk'], ['build']);
});

A keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c => keyboards/ergodox_ez/keymaps/hacker_dvorak/keymap.c +781 -0
@@ 0,0 1,781 @@
#include QMK_KEYBOARD_H
#include "keymap_dvorak.h"
#include "sendstring_dvorak.h"
#include "keymap_plover.h"
#include "keymap_plover_dvorak.h"


#define SCTL(kc) LSFT(LCTL(kc))

// Layers
enum layers {
    DVORAK_US = 0,
    PLOVER_US,
    GAMING_US,
    ARROWS_US,
    MOUSE_US,
    NUMPAD_US,
    LAYERS_US,
    DVORAK_DV,
    PLOVER_DV,
    GAMING_DV,
    ARROWS_DV,
    MOUSE_DV,
    NUMPAD_DV,
    LAYERS_DV,
    MEDIA_FN,
    HYPER_FN,
    MEH_FN,
    MEH_FN_PLUS,
    FIRMWARE
};

int CAPS_LOCK   = 0;
int NUM_LOCK    = 0;
int SCROLL_LOCK = 0;

enum tap_dances {
    TD_ESC_CAPS = 0
};

qk_tap_dance_action_t tap_dance_actions[] = {
    [TD_ESC_CAPS]  = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CLCK)
};


enum custom_keycodes {
    PLACEHOLDER = SAFE_RANGE, // can always be here
    RGB_GREEN  // to set default RGB layer as green once
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /*
     * ,--------------------------------------------------.    ,--------------------------------------------------.
     * |    0   |   1  |   2  |   3  |   4  |   5  |  6   |    |  38  |  39  |  40  |  41  |  42  |  43  |   44   |
     * |--------+------+------+------+------+------+------|    |------+------+------+------+------+------+--------|
     * |    7   |   8  |   9  |  10  |  11  |  12  |  13  |    |  45  |  46  |  47  |  48  |  49  |  50  |   51   |
     * |--------+------+------+------+------+------|      |    |      |------+------+------+------+------+--------|
     * |   14   |  15  |  16  |  17  |  18  |  19  |------|    |------|  52  |  53  |  54  |  55  |  56  |   57   |
     * |--------+------+------+------+------+------|  26  |    |  58  |------+------+------+------+------+--------|
     * |   20   |  21  |  22  |  23  |  24  |  25  |      |    |      |  59  |  60  |  61  |  62  |  63  |   64   |
     * `--------+------+------+------+------+-------------'    `-------------+------+------+------+------+--------'
     *   |  27  |  28  |  29  |  30  |  31  |                                |  65  |  66  |  67  |  68  |  69  |
     *   `----------------------------------'                                `----------------------------------'
     *                                       ,-------------.  ,-------------.
     *                                       |  32  |  33  |  |  70  |  71  |
     *                                ,------+------+------|  |------+------+------.
     *                                |      |      |  34  |  |  72  |      |      |
     *                                |  35  |  36  |------|  |------|  74  |  75  |
     *                                |      |      |  37  |  |  73  |      |      |
     *                                `--------------------'  `--------------------'
     */
    [DVORAK_US] = LAYOUT_ergodox(
        // left hand
        KC_ESC,     KC_LABK,         KC_LCBR,         KC_LBRC,             KC_LPRN,             KC_EXLM, KC_AMPR,
        KC_TAB,     KC_QUOT,         SCMD_T(KC_COMM), MEH_T(KC_DOT),       ALL_T(KC_P),         KC_Y,    KC_AT,
        KC_EQL,     CTL_T(KC_A),     SFT_T(KC_O),     LT(NUMPAD_US, KC_E), LT(ARROWS_US, KC_U), KC_I,
        KC_BSLS,    ALGR_T(KC_SCLN), ALT_T(KC_Q),     LT(MEDIA_FN, KC_J),  GUI_T(KC_K),         KC_X,    KC_PERC,
        MO(MEH_FN), TG(LAYERS_US),   KC_CIRC,         KC_PLUS,             KC_COLN,

        // left thumb
                KC_LEFT, KC_RGHT,
                         KC_HOME,
        KC_SPC, KC_BSPC, KC_END,

        // right hand
        KC_PIPE, KC_QUES, KC_RPRN,            KC_RBRC,            KC_RCBR,      KC_RABK,       KC_ASTR,
        KC_HASH, KC_F,    ALL_T(KC_G),        MEH_T(KC_C),        SCMD_T(KC_R), KC_L,          KC_SLSH,
                 KC_D,    LT(MOUSE_US, KC_H), LT(HYPER_FN, KC_T), SFT_T(KC_N),  CTL_T(KC_S),   KC_MINS,
        KC_DLR,  KC_B,    GUI_T(KC_M),        LT(MEDIA_FN, KC_W), ALT_T(KC_V),  ALGR_T(KC_Z),  KC_GRV,
                          KC_DQUO,            KC_UNDS,            KC_TILD,      TG(DVORAK_DV), MO(MEH_FN_PLUS),

        // right thumb
        KC_UP,   KC_DOWN,
        KC_PGUP,
        KC_PGDN, KC_DEL,  KC_ENT
    ),

    [PLOVER_US] = LAYOUT_ergodox(
        // left hand
        XXXXXXX,    XXXXXXX,       KC_MS_BTN2, KC_MS_UP,   KC_MS_BTN1,  KC_MS_BTN3, GUI_T(KC_NO),
        KC_ESC,     KC_MS_BTN4,    KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PV_NUM,
        KC_TAB,     PV_LS,         PV_LT,      PV_LP,      PV_LH,       PV_STAR,
        KC_CLCK,    PV_LS,         PV_LK,      PV_LW,      PV_LR,       PV_STAR,    PV_STAR,
        MO(MEH_FN), TG(LAYERS_US), PV_NUM,     PV_NUM,     PV_NUM,

        // left thumb
              KC_SPACE, KC_BSPACE,
                        KC_HOME,
        PV_A, PV_O,     KC_END,

        // right hand
        KC_MS_ACCEL2, KC_MS_ACCEL1,  KC_MS_ACCEL0, KC_UP,   KC_APPLICATION, XXXXXXX,        KC_MS_WH_UP,
        PV_NUM,       KC_MS_WH_LEFT, KC_LEFT,      KC_DOWN, KC_RIGHT,       KC_MS_WH_RIGHT, KC_MS_WH_DOWN,
                      PV_STAR,       PV_RF,        PV_RP,   PV_RL,          PV_RT,          PV_RD,
        PV_STAR,      PV_STAR,       PV_RR,        PV_RB,   PV_RG,          PV_RS,          PV_RZ,
                                     PV_NUM,       PV_NUM,  PV_NUM,         PV_NUM,         MO(MEH_FN_PLUS),

        // right thumb
        KC_DELETE, KC_ENTER,
        KC_PGUP,
        KC_PGDOWN, PV_E,     PV_U
    ),

    [GAMING_US] = LAYOUT_ergodox(
        // left hand
        KC_ESCAPE,            GUI_T(KC_MINS), KC_I,     KC_O,   KC_P,   ALGR_T(KC_EQL), KC_T,
        KC_TAB,               KC_LALT,        KC_Q,     KC_W,   KC_E,   ALL_T(KC_R),    KC_G,
        LT(MOUSE_US, KC_GRV), KC_LCTRL,       KC_A,     KC_S,   KC_D,   MEH_T(KC_F),
        KC_BSLS,              KC_LSHIFT,      KC_Z,     KC_X,   KC_C,   SCMD_T(KC_V),   KC_M,
        MO(MEH_FN),           TG(LAYERS_US),  KC_COMM, KC_DOT, KC_LBRC,

        // left thumb
                   MO(MEDIA_FN), KC_NLCK,
                                 KC_SCLN,
         KC_SPACE, KC_ENTER,     KC_BSPACE,

        // right hand
        KC_QUOT,       KC_Y,       KC_K,        KC_U,        KC_KP_7, KC_KP_8,  KC_KP_9,
        KC_MS_WH_UP,   KC_H,       KC_J,        KC_L,        KC_KP_4, KC_KP_2,  KC_KP_6,
                       KC_B,       KC_MS_UP,    KC_N,        KC_KP_1, KC_KP_5,  KC_KP_3,
        KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN,  KC_MS_RIGHT, KC_UP,   KC_KP_0,  KC_SLASH,
                                   KC_RBRC,     KC_LEFT,     KC_DOWN, KC_RIGHT, MO(MEH_FN_PLUS),

        // right thumb
        KC_MS_BTN5, MO(HYPER_FN),
        KC_MS_BTN4,
        KC_MS_BTN3, KC_MS_BTN2,   KC_MS_BTN1
    ),

    [ARROWS_US] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX,       XXXXXXX,      XXXXXXX,      XXXXXXX,    XXXXXXX, XXXXXXX,
        XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX,    XXXXXXX, XXXXXXX,
        XXXXXXX, KC_LCTRL,      KC_LSHIFT,    XXXXXXX,      _______,    XXXXXXX,
        XXXXXXX, KC_RALT,       KC_LALT,      GUI_T(KC_NO), XXXXXXX,    XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,       XXXXXXX,      XXXXXXX,      XXXXXXX,

        // left thumb
                  XXXXXXX,   XXXXXXX,
                             KC_HOME,
        KC_SPACE, KC_BSPACE, KC_END,

        // right hand
        LGUI(KC_X), XXXXXXX,       LCTL(KC_X), KC_MS_WH_UP,   XXXXXXX,       XXXXXXX,        XXXXXXX,
        LGUI(KC_C), XXXXXXX,       LCTL(KC_C), KC_UP,         SCTL(KC_C),    LCTL(KC_Z),     LGUI(KC_Z),
                    KC_MS_WH_LEFT, KC_LEFT,    KC_DOWN,       KC_RIGHT,      KC_MS_WH_RIGHT, KC_APPLICATION,
        LGUI(KC_V), XXXXXXX,       LCTL(KC_V), KC_MS_WH_DOWN, SCTL(KC_V),    LCTL(KC_Y),     SGUI(KC_Z),
        XXXXXXX,    XXXXXXX,       XXXXXXX,    XXXXXXX,       KC_SLCK,

        // right thumb
        XXXXXXX,   XXXXXXX,
        KC_PGUP,
        KC_PGDOWN, KC_DELETE, KC_ENTER
    ),

    [MOUSE_US] = LAYOUT_ergodox(
        // left hand
        XXXXXXX,       XXXXXXX,       XXXXXXX,    KC_MS_WH_UP,   LCTL(KC_X),  XXXXXXX,        LGUI(KC_X),
        LGUI(KC_Z),    LCTL(KC_Z),    SCTL(KC_C), KC_MS_UP,      LCTL(KC_C),  KC_MS_BTN4,     LGUI(KC_C),
        KC_MS_BTN3,    KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN,    KC_MS_RIGHT, KC_MS_WH_RIGHT,
        LGUI(KC_Z),    LCTL(KC_Y),    SCTL(KC_V), KC_MS_WH_DOWN, LCTL(KC_V),  KC_MS_BTN5,     LGUI(KC_V),
        KC_SLCK, XXXXXXX,       XXXXXXX,    XXXXXXX,       XXXXXXX,

        // left thumb
                    XXXXXXX,    XXXXXXX,
                                XXXXXXX,
        KC_MS_BTN1, KC_MS_BTN2, XXXXXXX,

        // right hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX,      XXXXXXX,       XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX,
                 XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT,    KC_LCTRL,      KC_MS_ACCEL2,
        XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT,      KC_RALT,       XXXXXXX,
                          XXXXXXX, XXXXXXX,      XXXXXXX,      XXXXXXX,       XXXXXXX,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, KC_MS_ACCEL0
    ),

    [NUMPAD_US] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX,  XXXXXXX,      XXXXXXX, XXXXXXX,       XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,  GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO),  XXXXXXX, XXXXXXX,
        _______, KC_LCTRL, KC_LSHIFT,    _______, MEH_T(KC_NO),  XXXXXXX,
        XXXXXXX, KC_RALT,  KC_LALT,      XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,  XXXXXXX,      XXXXXXX, XXXXXXX,

        // left thumb
                  XXXXXXX,   XXXXXXX,
                             KC_HOME,
        KC_SPACE, KC_BSPACE, KC_END,

        // right hand
        KC_X, KC_A, KC_B,   KC_C, KC_D,     KC_E,    KC_F,
        KC_O, KC_I, KC_1,   KC_2, KC_3,     KC_SLSH, KC_PERC,
              KC_M, KC_4,   KC_5, KC_6,     KC_PLUS, KC_MINS,
        KC_L, KC_J, KC_7,   KC_8, KC_9,     KC_ASTR, KC_CIRC,
                    KC_DOT, KC_0, KC_COMM, KC_UNDS,  KC_BSLS,

        // right thumb
        XXXXXXX,   XXXXXXX,
        KC_PGUP,
        KC_PGDOWN, KC_DELETE, KC_ENTER
    ),

    [LAYERS_US] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,

        // left thumb
                 XXXXXXX, XXXXXXX,
                          XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,

        // right hand
        XXXXXXX, XXXXXXX, XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,
                 XXXXXXX, TO(DVORAK_US), TO(PLOVER_US), TO(GAMING_US), XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,
                          XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX
    ),

    [DVORAK_DV] = LAYOUT_ergodox(
        // left hand
        KC_ESC,     DV_LABK,         DV_LCBR,         DV_LBRC,             DV_LPRN,             DV_EXLM, DV_AMPR,
        KC_TAB,     DV_QUOT,         SCMD_T(DV_COMM), MEH_T(DV_DOT),       ALL_T(DV_P),         DV_Y,    DV_AT,
        DV_EQL,     CTL_T(DV_A),     SFT_T(DV_O),     LT(NUMPAD_DV, DV_E), LT(ARROWS_DV, DV_U), DV_I,
        DV_BSLS,    ALGR_T(DV_SCLN), ALT_T(DV_Q),     LT(MEDIA_FN, DV_J),  GUI_T(DV_K),         DV_X,    DV_PERC,
        MO(MEH_FN), TG(LAYERS_DV),   DV_CIRC,         DV_PLUS,             DV_COLN,

        // left thumb
                KC_LEFT, KC_RGHT,
                         KC_HOME,
        KC_SPC, KC_BSPC, KC_END,

        // right hand
        DV_PIPE, DV_QUES, DV_RPRN,            DV_RBRC,            DV_RCBR,      DV_RABK,      DV_ASTR,
        DV_HASH, DV_F,    ALL_T(DV_G),        MEH_T(DV_C),        SCMD_T(DV_R), DV_L,         DV_SLSH,
                 DV_D,    LT(MOUSE_DV, DV_H), LT(HYPER_FN, DV_T), SFT_T(DV_N),  CTL_T(DV_S),  DV_MINS,
        DV_DLR,  DV_B,    GUI_T(DV_M),        LT(MEDIA_FN, DV_W), ALT_T(DV_V),  ALGR_T(DV_Z), DV_GRV,
                          DV_DQUO,            DV_UNDS,            DV_TILD,      _______,      MO(MEH_FN_PLUS),

        // right thumb
        KC_UP,   KC_DOWN,
        KC_PGUP,
        KC_PGDN, KC_DEL,  KC_ENT
    ),

    [PLOVER_DV] = LAYOUT_ergodox(
        // left hand
        XXXXXXX,    XXXXXXX,       KC_MS_BTN2, KC_MS_UP,   KC_MS_BTN1,  KC_MS_BTN3, GUI_T(KC_NO),
        KC_ESC,     KC_MS_BTN4,    KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN5, PD_NUM,
        KC_TAB,     PD_LS,         PD_LT,      PD_LP,      PD_LH,       PD_STAR,
        KC_CLCK,    PD_LS,         PD_LK,      PD_LW,      PD_LR,       PD_STAR,    PD_STAR,
        MO(MEH_FN), TG(LAYERS_DV), PD_NUM,     PD_NUM,     PD_NUM,

        // left thumb
              KC_SPACE, KC_BSPACE,
                        KC_HOME,
        PD_A, PD_O,     KC_END,

        // right hand
        KC_MS_ACCEL2, KC_MS_ACCEL1,  KC_MS_ACCEL0, KC_UP,   KC_APPLICATION, XXXXXXX,        KC_MS_WH_UP,
        PD_NUM,       KC_MS_WH_LEFT, KC_LEFT,      KC_DOWN, KC_RIGHT,       KC_MS_WH_RIGHT, KC_MS_WH_DOWN,
                      PD_STAR,       PD_RF,        PD_RP,   PD_RL,          PD_RT,          PD_RD,
        PD_STAR,      PD_STAR,       PD_RR,        PD_RB,   PD_RG,          PD_RS,          PD_RZ,
                                     PD_NUM,       PD_NUM,  PD_NUM,         PD_NUM,         MO(MEH_FN_PLUS),

        // right thumb
        KC_DELETE, KC_ENTER,
        KC_PGUP,
        KC_PGDOWN, PD_E,     PD_U
    ),

    [GAMING_DV] = LAYOUT_ergodox(
        // left hand
        KC_ESCAPE,            GUI_T(DV_MINS), DV_I,    DV_O,   DV_P,    ALGR_T(DV_EQL), DV_T,
        KC_TAB,               KC_LALT,        DV_Q,    DV_W,   DV_E,    ALL_T(DV_R),    DV_G,
        LT(MOUSE_DV, DV_GRV), KC_LCTRL,       DV_A,    DV_S,   DV_D,    MEH_T(DV_F),
        DV_BSLS,              KC_LSHIFT,      DV_Z,    DV_X,   DV_C,    SCMD_T(DV_V),   DV_M,
        MO(MEH_FN),           TG(LAYERS_DV),  DV_COMM, DV_DOT, DV_LBRC,

        // left thumb
                   MO(MEDIA_FN), KC_NLCK,
                                 DV_SCLN,
         KC_SPACE, KC_ENTER,     KC_BSPACE,

        // right hand
        DV_QUOT,       DV_Y,       DV_K,       DV_U,        KC_KP_7, KC_KP_8,  KC_KP_9,
        KC_MS_WH_UP,   DV_H,       DV_J,       DV_L,        KC_KP_4, KC_KP_2,  KC_KP_6,
                       DV_B,       KC_MS_UP,   DV_N,        KC_KP_1, KC_KP_5,  KC_KP_3,
        KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_UP,   KC_KP_0,  DV_SLSH,
                                   DV_RBRC,    KC_LEFT,     KC_DOWN, KC_RIGHT, MO(MEH_FN_PLUS),

        // right thumb
        KC_MS_BTN5, MO(HYPER_FN),
        KC_MS_BTN4,
        KC_MS_BTN3, KC_MS_BTN2,   KC_MS_BTN1
    ),

    [ARROWS_DV] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX,       XXXXXXX,      XXXXXXX,      XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, SCMD_T(KC_NO), MEH_T(KC_NO), ALL_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, KC_LCTRL,      KC_LSHIFT,    XXXXXXX,      _______, XXXXXXX,
        XXXXXXX, KC_RALT,       KC_LALT,      GUI_T(KC_NO), XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,       XXXXXXX,      XXXXXXX,      XXXXXXX,

        // left thumb
                  XXXXXXX,   XXXXXXX,
                             KC_HOME,
        KC_SPACE, KC_BSPACE, KC_END,

        // right hand
        LGUI(DV_X), XXXXXXX,       LCTL(DV_X), KC_MS_WH_UP,   XXXXXXX,       XXXXXXX,        XXXXXXX,
        LGUI(DV_C), XXXXXXX,       LCTL(DV_C), KC_UP,         SCTL(DV_C),    LCTL(DV_Z),     LGUI(DV_Z),
                    KC_MS_WH_LEFT, KC_LEFT,    KC_DOWN,       KC_RIGHT,      KC_MS_WH_RIGHT, KC_APPLICATION,
        LGUI(DV_V), XXXXXXX,       LCTL(DV_V), KC_MS_WH_DOWN, SCTL(DV_V),    LCTL(DV_Y),     SGUI(DV_Z),
        XXXXXXX,    XXXXXXX,       XXXXXXX,    XXXXXXX,       KC_SLCK,

        // right thumb
        XXXXXXX,   XXXXXXX,
        KC_PGUP,
        KC_PGDOWN, KC_DELETE, KC_ENTER
    ),

    [MOUSE_DV] = LAYOUT_ergodox(
        // left hand
        XXXXXXX,       XXXXXXX,       XXXXXXX,    KC_MS_WH_UP,   LCTL(DV_X),  XXXXXXX,        LGUI(DV_X),
        LGUI(DV_Z),    LCTL(DV_Z),    SCTL(DV_C), KC_MS_UP,      LCTL(DV_C),  KC_MS_BTN4,     LGUI(DV_C),
        KC_MS_BTN3,    KC_MS_WH_LEFT, KC_MS_LEFT, KC_MS_DOWN,    KC_MS_RIGHT, KC_MS_WH_RIGHT,
        LGUI(DV_Z),    LCTL(DV_Y),    SCTL(DV_V), KC_MS_WH_DOWN, LCTL(DV_V),  KC_MS_BTN5,     LGUI(DV_V),
        KC_SLCK, XXXXXXX,       XXXXXXX,    XXXXXXX,       XXXXXXX,

        // left thumb
                    XXXXXXX,    XXXXXXX,
                                XXXXXXX,
        KC_MS_BTN1, KC_MS_BTN2, XXXXXXX,

        // right hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      XXXXXXX,      XXXXXXX,       XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, ALL_T(KC_NO), MEH_T(KC_NO), SCMD_T(KC_NO), XXXXXXX,
                 XXXXXXX, _______, KC_MS_ACCEL1, KC_LSHIFT,    KC_LCTRL,      KC_MS_ACCEL2,
        XXXXXXX, XXXXXXX, XXXXXXX, GUI_T(KC_NO), KC_LALT,      KC_RALT,       XXXXXXX,
                          XXXXXXX, XXXXXXX,      XXXXXXX,      XXXXXXX,       XXXXXXX,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, KC_MS_ACCEL0
    ),

    [NUMPAD_DV] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX,  XXXXXXX,      XXXXXXX, XXXXXXX,       XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,  GUI_T(KC_NO), XXXXXXX, ALL_T(KC_NO),  XXXXXXX, XXXXXXX,
        _______, KC_LCTRL, KC_LSHIFT,    _______, MEH_T(KC_NO),  XXXXXXX,
        XXXXXXX, KC_RALT,  KC_LALT,      XXXXXXX, SCMD_T(KC_NO), XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX,  XXXXXXX,      XXXXXXX, XXXXXXX,

        // left thumb
                  XXXXXXX,   XXXXXXX,
                             KC_HOME,
        KC_SPACE, KC_BSPACE, KC_END,

        // right hand
        DV_X, DV_A, DV_B,   DV_C, DV_D,    DV_E,    DV_F,
        DV_O, DV_I, DV_1,   DV_2, DV_3,    DV_SLSH, DV_PERC,
              DV_M, DV_4,   DV_5, DV_6,    DV_PLUS, DV_MINS,
        DV_L, DV_J, DV_7,   DV_8, DV_9,    DV_ASTR, DV_CIRC,
                    DV_DOT, DV_0, DV_COMM, DV_UNDS, DV_BSLS,

        // right thumb
        XXXXXXX,   XXXXXXX,
        KC_PGUP,
        KC_PGDOWN, KC_DELETE, KC_ENTER
    ),

    [LAYERS_DV] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,

        // left thumb
                 XXXXXXX, XXXXXXX,
                          XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,

        // right hand
        XXXXXXX, XXXXXXX, XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,
                 XXXXXXX, TO(DVORAK_DV), TO(PLOVER_DV), TO(GAMING_DV), XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,
                          XXXXXXX,       XXXXXXX,       XXXXXXX,       XXXXXXX, XXXXXXX,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX
    ),

    [MEDIA_FN] = LAYOUT_ergodox(
        // left hand
        KC_AUDIO_VOL_DOWN,   KC_AUDIO_MUTE, RGB_TOG,    XXXXXXX, KC_MAIL,      KC_FIND, KC_WWW_REFRESH,
        KC_MEDIA_PREV_TRACK, KC_F9,         KC_F7,      KC_F5,   KC_F3,        KC_F1,   KC_WWW_HOME,
        KC_PAUSE,            KC_F19,        KC_F17,     KC_F15,  KC_F13,       KC_F11,
        RGB_HUD,             XXXXXXX,       XXXXXXX,    _______, KC_F23,       KC_F21,  KC_WWW_BACK,
        RGB_VAD,             KC_CLCK,       KC_PSCREEN, XXXXXXX, MO(FIRMWARE),

        // left thumb
                 _______, XXXXXXX,
                          XXXXXXX,
        XXXXXXX, XXXXXXX, KC_MEDIA_EJECT,

        // right hand
        KC_WWW_FAVORITES, KC_MY_COMPUTER, KC_CALCULATOR,   XXXXXXX, RGB_MOD,         RGB_M_P,        KC_AUDIO_VOL_UP,
        KC_WWW_SEARCH,    KC_F2,          KC_F4,           KC_F6,   KC_F8,           KC_F10,         KC_MEDIA_NEXT_TRACK,
                          KC_F12,         KC_F14,          KC_F16,  KC_F18,          KC_F20,         KC_MEDIA_PLAY_PAUSE,
        KC_WWW_FORWARD,   KC_F22,         KC_F24,          _______, XXXXXXX,         XXXXXXX,        RGB_HUI,
                                          KC_SYSTEM_POWER, XXXXXXX, KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, RGB_VAI,

        // right thumb
        XXXXXXX,   XXXXXXX,
        XXXXXXX,
        RGB_GREEN, XXXXXXX, XXXXXXX
    ),

    [HYPER_FN] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, HYPR(KC_F1),  HYPR(KC_F2),  HYPR(KC_F3),  HYPR(KC_F4),  HYPR(KC_F5),  XXXXXXX,
        XXXXXXX, HYPR(KC_F6),  HYPR(KC_F7),  HYPR(KC_F8),  HYPR(KC_F9),  HYPR(KC_F10), XXXXXXX,
        XXXXXXX, HYPR(KC_F11), HYPR(KC_F12), HYPR(KC_F13), HYPR(KC_F14), HYPR(KC_F15),
        XXXXXXX, HYPR(KC_F16), HYPR(KC_F17), HYPR(KC_F18), HYPR(KC_F19), HYPR(KC_F20), XXXXXXX,
        XXXXXXX, HYPR(KC_F21), HYPR(KC_F22), HYPR(KC_F23), HYPR(KC_F24),

        // left thumb
                 XXXXXXX, XXXXXXX,
                          XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,

        // right hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
                 XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
                 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,

        // right thumb
        XXXXXXX, _______,
        XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX
    ),

    [MEH_FN] = LAYOUT_ergodox(
        // left hand
        LCA(KC_F11),  LCA(KC_F9),  LCA(KC_F7),  LCA(KC_F5),  LCA(KC_F3),  LCA(KC_F1),  XXXXXXX,
        LCAG(KC_F11), LCAG(KC_F9), LCAG(KC_F7), LCAG(KC_F5), LCAG(KC_F3), LCAG(KC_F1), XXXXXXX,
        MEH(KC_F11),  MEH(KC_F9),  MEH(KC_F7),  MEH(KC_F5),  MEH(KC_F3),  MEH(KC_F1),
        SGUI(KC_F11), SGUI(KC_F9), SGUI(KC_F7), SGUI(KC_F5), SGUI(KC_F3), SGUI(KC_F1), XXXXXXX,
        _______,      XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,

        // left thumb
                 XXXXXXX, XXXXXXX,
                          XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,

        // right hand
        XXXXXXX, LCA(KC_F2),  LCA(KC_F4),  LCA(KC_F6),  LCA(KC_F8),  LCA(KC_F10),  LCA(KC_F12),
        XXXXXXX, LCAG(KC_F2), LCAG(KC_F4), LCAG(KC_F6), LCAG(KC_F8), LCAG(KC_F10), LCAG(KC_F12),
                 MEH(KC_F2),  MEH(KC_F4),  MEH(KC_F6),  MEH(KC_F8),  MEH(KC_F10),  MEH(KC_F12),
        XXXXXXX, SGUI(KC_F2), SGUI(KC_F4), SGUI(KC_F6), SGUI(KC_F8), SGUI(KC_F10), SGUI(KC_F12),
                              XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,      XXXXXXX,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX
    ),

    [MEH_FN_PLUS] = LAYOUT_ergodox(
        // left hand
        LCA(KC_F23),  LCA(KC_F21),  LCA(KC_F19),  LCA(KC_F17),  LCA(KC_F15),  LCA(KC_F13),  XXXXXXX,
        LCAG(KC_F23), LCAG(KC_F21), LCAG(KC_F19), LCAG(KC_F17), LCAG(KC_F15), LCAG(KC_F13), XXXXXXX,
        MEH(KC_F23),  MEH(KC_F21),  MEH(KC_F19),  MEH(KC_F17),  MEH(KC_F15),  MEH(KC_F13),
        SGUI(KC_F23), SGUI(KC_F21), SGUI(KC_F19), SGUI(KC_F17), SGUI(KC_F15), SGUI(KC_F13), XXXXXXX,
        XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,

        // left thumb
                 XXXXXXX, XXXXXXX,
                          XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,

        // right hand
        XXXXXXX, LCA(KC_F14),  LCA(KC_F16),  LCA(KC_F18),  LCA(KC_F20),  LCA(KC_F22),  LCA(KC_F24),
        XXXXXXX, LCAG(KC_F14), LCAG(KC_F16), LCAG(KC_F18), LCAG(KC_F20), LCAG(KC_F22), LCAG(KC_F24),
                 MEH(KC_F14),  MEH(KC_F16),  MEH(KC_F18),  MEH(KC_F20),  MEH(KC_F22),  MEH(KC_F24),
        XXXXXXX, SGUI(KC_F14), SGUI(KC_F16), SGUI(KC_F18), SGUI(KC_F20), SGUI(KC_F22), SGUI(KC_F24),
                               XXXXXXX,      XXXXXXX,      XXXXXXX,      XXXXXXX,      _______,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX
    ),

    [FIRMWARE] = LAYOUT_ergodox(
        // left hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,

        // left thumb
               XXXXXXX, XXXXXXX,
                        XXXXXXX,
        RESET, XXXXXXX, XXXXXXX,

        // right hand
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
                 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
                          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,

        // right thumb
        XXXXXXX, XXXXXXX,
        XXXXXXX,
        XXXXXXX, XXXXXXX, EEP_RST
    )
};


bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case RGB_GREEN:
            if (record->event.pressed) {
                #ifdef RGBLIGHT_ENABLE
                    rgblight_enable();
                    rgblight_mode(1);
                    rgblight_sethsv_red();
                #endif
            }

            return false;

        case KC_CLCK:
            if (record->event.pressed) {
                if (!(CAPS_LOCK)) {
                    ergodox_right_led_1_on();
                    CAPS_LOCK = 1;
                } else {
                    ergodox_right_led_1_off();
                    CAPS_LOCK = 0;
                }
            }

            return true;

        case KC_NLCK:
            if (record->event.pressed) {
                if (!(NUM_LOCK)) {
                    ergodox_right_led_2_on();
                    NUM_LOCK = 1;
                } else {
                    ergodox_right_led_2_off();
                    NUM_LOCK = 0;
                }
            }

            return true;

        case KC_SLCK:
            if (record->event.pressed) {
                if (!(SCROLL_LOCK)) {
                    ergodox_right_led_3_on();
                    SCROLL_LOCK = 1;
                } else {
                    ergodox_right_led_3_off();
                    SCROLL_LOCK = 0;
                }
            }

        case KC_MS_WH_LEFT:
            if (record->event.pressed) {
                if (SCROLL_LOCK) {
                    return false;
                } else {
                    return true;
                }
            }

        case KC_MS_WH_UP:
            if (record->event.pressed) {
                if (SCROLL_LOCK) {
                    return false;
                } else {
                    return true;
                }
            }

        case KC_MS_WH_DOWN:
            if (record->event.pressed) {
                if (SCROLL_LOCK) {
                    return false;
                } else {
                    return true;
                }
            }

        case KC_MS_WH_RIGHT:
            if (record->event.pressed) {
                if (SCROLL_LOCK) {
                    return false;
                } else {
                    return true;
                }
            }

        default:
            return true;
    }
}

uint32_t layer_state_set_user(uint32_t state) {
    uint8_t layer = biton32(state);

    switch (layer) {
        case DVORAK_US:
            rgblight_sethsv_noeeprom_red();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);

            break;

        case PLOVER_US:
            rgblight_sethsv_noeeprom_red();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);

            break;

        case GAMING_US:
            rgblight_sethsv_noeeprom_red();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);

            break;

        case ARROWS_US:
            rgblight_sethsv_noeeprom_blue();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case MOUSE_US:
            rgblight_sethsv_noeeprom_blue();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case NUMPAD_US:
            rgblight_sethsv_noeeprom_blue();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case LAYERS_US:
            rgblight_sethsv_noeeprom_cyan();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case DVORAK_DV:
            rgblight_sethsv_noeeprom_green();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
            break;

        case PLOVER_DV:
            rgblight_sethsv_noeeprom_green();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);

            break;

        case GAMING_DV:
            rgblight_sethsv_noeeprom_green();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);

            break;

        case ARROWS_DV:
            rgblight_sethsv_noeeprom_blue();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case MOUSE_DV:
            rgblight_sethsv_noeeprom_blue();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case NUMPAD_DV:
            rgblight_sethsv_noeeprom_blue();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case LAYERS_DV:
            rgblight_sethsv_noeeprom_cyan();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case MEDIA_FN:
            rgblight_sethsv_noeeprom_yellow();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case HYPER_FN:
            rgblight_sethsv_noeeprom_magenta();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        case MEH_FN:
            rgblight_sethsv_noeeprom_magenta();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 4);

            break;

        case MEH_FN_PLUS:
            rgblight_sethsv_noeeprom_magenta();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 5);

            break;

        case FIRMWARE:
            rgblight_sethsv_noeeprom_pink();
            rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);

            break;

        default:
            break;
    }

    return state;
};

A keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json => keyboards/ergodox_ez/keymaps/hacker_dvorak/package.json +15 -0
@@ 0,0 1,15 @@
{
  "name": "hacker_dvorak",
  "version": "1.0.0",
  "description": "Inspired by the [*Programmer Dvorak*](https://www.kaufmann.no/roland/dvorak) keyboard layout, cherry picked ideas from other layouts in the [EZ Repository](https://configure.ergodox-ez.com/search?q=dvorak&legacy=true), a character distribution [heatmap vizualizer](https://run.plnkr.co/plunks/5EEO8nJ2wRzYAfT3), my own subjective use cases and lots of trial and error.",
  "main": "gulpfile.js",
  "scripts": {
    "test": "test"
  },
  "author": "SalchiPapa",
  "license": "GPL-2.0",
  "dependencies": {
    "gulp": "^3.9.1",
    "gulp-run-command": "0.0.9"
  }
}

A keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md => keyboards/ergodox_ez/keymaps/hacker_dvorak/readme.md +62 -0
@@ 0,0 1,62 @@
# [Ergodox EZ Hacker Dvorak Layout](https://configure.ergodox-ez.com/layouts/Wadz/latest/0)

Inspired by the [*Programmer Dvorak*](https://www.kaufmann.no/roland/dvorak) keyboard layout, cherry picked ideas from other layouts in the [EZ Repository](https://configure.ergodox-ez.com/search?q=dvorak&legacy=true), a character distribution [heatmap vizualizer](https://run.plnkr.co/plunks/5EEO8nJ2wRzYAfT3), my own subjective use cases and lots of trial and error.

## Setup

Configure your OS keyboard layout to US, or the keymap will be incorrect.

## Limitations

I plan to use [QMK](https://docs.qmk.fm) in the future, in order to overcome some limitations of the Ergodox EZ [graphical configurator](https://configure.ergodox-ez.com/layouts/default/latest/0)), however I will defer that, until more progress is made to the new [configurator](https://medium.com/the-ergo/the-configurator-is-out-of-beta-e107aec80cae).

## Layers

1. Dvorak
  * US Dvorak layout.
  * All symbols (including shifted symbols).
  * All modifier are dual keys positioned near the home row.
2. Querty
  * Used to overcome the limitation pointed above, when your OS layout is set to Dvorak instead of US, this way you can use 
    Standard Dvorak (available by default on all the main operating systems) on other normal keybdoards and Hacker Dvorak on 
    the Ergodox EZ Shine at the same time, without changing back and forth tho OS layout.
3. Gaming
  * Still in development.
  * Left side is mainly "normal" Qwerty.
  * Right side is mainly for movement, either using the mouse, the arrow keys, the number pad or the `H`, `J`, `K`, `L` as       direction keys.
4. Arrows
  * Arrow keys navigation.
  * All modifier keys.
  * Common text edititng shortcuts (doesn't work for MacOS).
5. Mouse
  * Mouse navigation.
  * All modifier keys.
  * Common text edititng shortcuts (doesn't work for MacOS).
6. Numpad
  * ATM style numpad.
  * All modifier keys.
  * Letters from `A` to `F` for hexadecimal numbers (`B` is also used for binary numeric literals in most programming 
    languages, ie. `0b11001`).
  * `X` for hexadecimal numeric literals in most programming languages, ie. `0xbeef`.
  * `O` for octal numeric literals in most programming languages, ie `0o123`.
  * `J` for complex numeric literals in Python, ie. `3j`.
  * `I` and `M` for complex Julia numeric literals, ie. `3im`.
  * Common symbols for mathematical operations.
7. Hyper Fn
  * Useful for custom global shortcuts.
8. Media Fn
  * Media keys.
  * Function keys.
  * EZ Shine keys.
9. Meh Fn
  * Useful for custom application shortcuts.
10. Meh Fn +
  * Useful for custom standard shortcuts.
  
## To Do

Add images.

***

Please comment below if you have any ideas or suggestions. If you have used this layout or used it as a base, I'd love to hear about your experience!
\ No newline at end of file

A keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk => keyboards/ergodox_ez/keymaps/hacker_dvorak/rules.mk +35 -0
@@ 0,0 1,35 @@
# Set any rules.mk overrides for your specific keymap here.
# See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file
NKRO_ENABLE       = yes  # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
TAP_DANCE_ENABLE  = yes
MOUSEKEY_ENABLE   = yes  # Mouse keys(+4700b).
EXTRAKEY_ENABLE   = yes  # Audio control and System control(+450b).
SLEEP_LED_ENABLE  = yes  # Turn off leds when computer is sleeping.
KEY_LOCK_ENABLE   = yes  # (+1730b)
RGBLIGHT_ENABLE   = yes
LEADER_ENABLE     = yes


UNICODE_ENABLE    = no  # For Unicode.
COMMAND_ENABLE    = no  # Commands for debug and configuration
SWAP_HANDS_ENABLE = no  # Allow swapping hands of keyboard.


# This are by default off:
# CONSOLE_ENABLE    = no  # Console for debug(+400)
# BOOTMAGIC_ENABLE  = no  # Virtual DIP switch configuration(+1000)
# API_SYSEX_ENABLE  = no
# MIDI_ENABLE       = no
# UNICODEMAP_ENABLE = no
# BLUETOOTH_ENABLE  = no
# AUDIO_ENABLE      = no
# FAUXCLICKY_ENABLE = no
# VARIABLE_TRACE    = no
# BACKLIGHT_ENABLE  = no
# RGB_MATRIX_ENABLE = no
# COMBO_ENABLE      = no


# This don't need argument:
# CUSTOM_MATRIX    # Custom matrix file for the ErgoDox EZ
# SPLIT_KEYBOARD

A quantum/keymap_extras/keymap_plover_dvorak.h => quantum/keymap_extras/keymap_plover_dvorak.h +47 -0
@@ 0,0 1,47 @@
/* Copyright 2016 James Kay
 *
 * 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_PLOVER_DVORAK_H
#define KEYMAP_PLOVER_DVORAK_H

#include "keymap_dvorak.h"

#define PD_NUM  DV_1
#define PD_LS   DV_Q
#define PD_LT   DV_W
#define PD_LP   DV_E
#define PD_LH   DV_R
#define PD_LK   DV_S
#define PD_LW   DV_D
#define PD_LR   DV_F

#define PD_STAR DV_Y
#define PD_RF   DV_U
#define PD_RP   DV_I
#define PD_RL   DV_O
#define PD_RT   DV_P
#define PD_RD   DV_LBRC
#define PD_RR   DV_J
#define PD_RB   DV_K
#define PD_RG   DV_L
#define PD_RS   DV_SCLN
#define PD_RZ   DV_QUOT

#define PD_A    DV_C
#define PD_O    DV_V
#define PD_E    DV_N
#define PD_U    DV_M

#endif