Last active
August 10, 2019 05:21
-
-
Save fengye/58aea489fd03a34be219b53bcf80dc4d to your computer and use it in GitHub Desktop.
HHKB keymapping for C++ programmers V3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "unimap_trans.h" | |
#include "print.h" | |
enum macro_id { | |
CPP_POINTER, | |
CPP_COMMENT, | |
L3_QUOTE, | |
L3_MINUS, | |
L3_LBRACKET, | |
L3_RBRACKET, | |
L3_BSLASH, | |
L3_GRAVE, | |
}; | |
enum function_id { | |
KEY_FN3_LSHIFT, | |
KEY_FN4_RSHIFT, | |
KEY_FN34_LNSTART, | |
KEY_FN34_LNEND, | |
}; | |
// L0, for remapped X keycodes | |
// 1st row | |
#define AC_L0_LPRN ACTION_MODS_KEY(MOD_LSFT, KC_9) | |
#define AC_L0_RPRN ACTION_MODS_KEY(MOD_LSFT, KC_0) | |
// 2nd row | |
#define AC_L0_RCBK ACTION_MODS_KEY(MOD_LSFT, KC_RBRACKET) | |
#define AC_L0_LCBK ACTION_MODS_KEY(MOD_LSFT, KC_LBRACKET) | |
// 3rd row | |
#define AC_L0_COLN ACTION_MODS_KEY(MOD_LSFT, KC_SCOLON) | |
#define AC_FN1 ACTION_LAYER_MOMENTARY(1) | |
#define AC_FN3L ACTION_FUNCTION(KEY_FN3_LSHIFT) | |
#define AC_FN4R ACTION_FUNCTION(KEY_FN4_RSHIFT) | |
#define AC_FN5 ACTION_LAYER_TAP_TOGGLE(5) | |
#define AC_TABF ACTION_LAYER_TAP(2, KC_TAB) // FN2 | |
#define AC_ENT_ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER) | |
// L2, mainly for navigation, currently only line start/line end(which will be mapped to ctrl+a/ctrl+e on normal mode and home/end on windows mode) | |
#define AC_LNST ACTION_FUNCTION(KEY_FN34_LNSTART) | |
#define AC_LNED ACTION_FUNCTION(KEY_FN34_LNEND) | |
// L3, for remapped L Shift+X keycodes | |
#define AC_L3(KEY) ACTION_MODS_KEY(MOD_LSFT, KC_##KEY) | |
// 1st row | |
#define AC_L3_DBQT ACTION_MODS_KEY(MOD_LSFT, KC_QUOTE) | |
#define AC_L3_SGQT ACTION_MACRO(L3_QUOTE) | |
#define AC_L3_PIPE ACTION_MODS_KEY(MOD_LSFT, KC_BSLASH) | |
#define AC_L3_MINS ACTION_MACRO(L3_MINUS) | |
#define AC_L3_PLUS ACTION_MODS_KEY(MOD_LSFT, KC_EQUAL) | |
#define AC_L3_LPRN ACTION_MODS_KEY(MOD_LSFT, KC_9) | |
#define AC_L3_RPRN ACTION_MODS_KEY(MOD_LSFT, KC_0) | |
#define AC_L3_LBKT ACTION_MACRO(L3_LBRACKET) | |
#define AC_L3_RBKT ACTION_MACRO(L3_RBRACKET) | |
#define AC_L3_TIDL ACTION_MODS_KEY(MOD_LSFT, KC_GRAVE) | |
#define AC_L3_GRV ACTION_MACRO(L3_GRAVE) | |
// 2nd row | |
#define AC_L3_LSBK ACTION_MODS_KEY(MOD_LSFT, KC_COMMA) | |
#define AC_L3_RSBK ACTION_MODS_KEY(MOD_LSFT, KC_DOT) | |
// 3rd row | |
#define AC_L3_HASH ACTION_MODS_KEY(MOD_LSFT, KC_3) | |
#define AC_L3_DLLR ACTION_MODS_KEY(MOD_LSFT, KC_4) | |
#define AC_L3_CCMT ACTION_MACRO(CPP_COMMENT) | |
// 4th row | |
#define AC_L3_USCR ACTION_MODS_KEY(MOD_LSFT, KC_MINUS) | |
#define AC_L3_QSTM ACTION_MODS_KEY(MOD_LSFT, KC_SLASH) | |
#define AC_L3_CPTR ACTION_MACRO(CPP_POINTER) | |
#define AC_L3_BSLS ACTION_MACRO(L3_BSLASH) | |
// L4, for remapped R Shift+X keycodes | |
#define AC_L4(KEY) ACTION_MODS_KEY(MOD_RSFT, KC_##KEY) | |
// 1st row | |
#define AC_L4_DBQT ACTION_MODS_KEY(MOD_RSFT, KC_QUOTE) | |
#define AC_L4_SGQT ACTION_MACRO(L3_QUOTE) | |
#define AC_L4_PIPE ACTION_MODS_KEY(MOD_RSFT, KC_BSLASH) | |
#define AC_L4_MINS ACTION_MACRO(L3_MINUS) | |
#define AC_L4_PLUS ACTION_MODS_KEY(MOD_RSFT, KC_EQUAL) | |
#define AC_L4_LPRN ACTION_MODS_KEY(MOD_RSFT, KC_9) | |
#define AC_L4_RPRN ACTION_MODS_KEY(MOD_RSFT, KC_0) | |
#define AC_L4_LBKT ACTION_MACRO(L3_LBRACKET) | |
#define AC_L4_RBKT ACTION_MACRO(L3_RBRACKET) | |
#define AC_L4_TIDL ACTION_MODS_KEY(MOD_RSFT, KC_GRAVE) | |
#define AC_L4_GRV ACTION_MACRO(L3_GRAVE) | |
// 2nd row | |
#define AC_L4_LSBK ACTION_MODS_KEY(MOD_RSFT, KC_COMMA) | |
#define AC_L4_RSBK ACTION_MODS_KEY(MOD_RSFT, KC_DOT) | |
// 3rd row | |
#define AC_L4_HASH ACTION_MODS_KEY(MOD_RSFT, KC_3) | |
#define AC_L4_DLLR ACTION_MODS_KEY(MOD_RSFT, KC_4) | |
#define AC_L4_CCMT ACTION_MACRO(CPP_COMMENT) | |
// 4th row | |
#define AC_L4_USCR ACTION_MODS_KEY(MOD_RSFT, KC_MINUS) | |
#define AC_L4_QSTM ACTION_MODS_KEY(MOD_RSFT, KC_SLASH) | |
#define AC_L4_CPTR ACTION_MACRO(CPP_POINTER) | |
#define AC_L4_BSLS ACTION_MACRO(L3_BSLASH) | |
#ifdef KEYMAP_SECTION_ENABLE | |
const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { | |
#else | |
const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { | |
#endif | |
[0] = UNIMAP_HHKB( | |
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL,L0_LPRN,L0_RPRN, | |
TABF,Q, W, E, R, T, Y, U, I, O, P, L0_LCBK,L0_RCBK, BSPC, | |
LCTL,A, S, D, F, G, H, J, K, L, SCLN,L0_COLN, ENT, | |
FN3L,Z, X, C, V, B, N, M, COMM, DOT,SLSH, FN4R, FN1, | |
LALT,LGUI, SPC, TRNS, FN5), | |
// This is HHKB original Fn1 layer but removed navigation keys | |
[1] = UNIMAP_HHKB( | |
PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, | |
CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,TRNS, TRNS, | |
TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,TRNS,TRNS,TRNS,TRNS, PENT, | |
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,TRNS,TRNS,TRNS, TRNS,TRNS, | |
TRNS,TRNS, TRNS, TRNS,TRNS), | |
// Tab navigation | |
[2] = UNIMAP_HHKB( | |
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, | |
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,LNST, UP,LNED,HOME,PGUP,TRNS, TRNS, | |
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,LEFT,DOWN,RGHT, END,PGDN, TRNS, | |
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, | |
TRNS,TRNS, TRNS, TRNS,TRNS), | |
// Remapped L Shift-X keys | |
[3] = UNIMAP_HHKB( | |
L3_TIDL,L3(1), L3_DBQT,L3_GRV,L3_PIPE, L3(5), L3(6), L3(7), L3(8), L3_SGQT, L3(2), L3_USCR,L3_PLUS,L3_LBKT,L3_RBKT, | |
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, L3_LSBK,L3_RSBK, DEL, | |
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,L3_HASH, L3_DLLR, L3_CCMT, | |
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, L3_QSTM,L3_CPTR,L3_BSLS, TRNS, TRNS, | |
TRNS, TRNS, L3_USCR, TRNS, TRNS), | |
// Remapped R Shift-X keys | |
[4] = UNIMAP_HHKB( | |
L4_TIDL,L4(1), L4_DBQT, L4_GRV,L4_PIPE, L4(5), L4(6), L4(7), L4(8), L4_SGQT, L4(2), L4_USCR,L4_PLUS,L4_LBKT,L4_RBKT, | |
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, L4_LSBK,L4_RSBK, DEL, | |
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,L4_HASH, L4_DLLR, L4_CCMT, | |
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, L4_QSTM,L4_CPTR,L4_BSLS, TRNS, TRNS, | |
TRNS, TRNS, L4_USCR, TRNS, TRNS), | |
// Swap left (GUI/WIN)<->(ALT/OPTION) | |
[5] = UNIMAP_HHKB( | |
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, | |
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, | |
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, | |
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, | |
LGUI,LALT, TRNS, TRNS,TRNS), | |
}; | |
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | |
{ | |
switch (id) { | |
case CPP_POINTER: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(MINUS), ST(DOT), RM(), END ) : | |
MACRO_NONE ); | |
case CPP_COMMENT: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(SLSH), T(SLSH), T(SPC), RM(), END ) : | |
MACRO_NONE ); | |
case L3_QUOTE: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(QUOTE), RM(), END ) : | |
MACRO_NONE ); | |
case L3_MINUS: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(MINUS), RM(), END ) : | |
MACRO_NONE ); | |
case L3_LBRACKET: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(LBRACKET), RM(), END ) : | |
MACRO_NONE ); | |
case L3_RBRACKET: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(RBRACKET), RM(), END ) : | |
MACRO_NONE ); | |
case L3_BSLASH: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(BSLASH), RM(), END ) : | |
MACRO_NONE ); | |
case L3_GRAVE: | |
return (record->event.pressed ? | |
MACRO( I(0), SM(), CM(), T(GRAVE), RM(), END ) : | |
MACRO_NONE ); | |
} | |
return MACRO_NONE; | |
} | |
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) | |
{ | |
// The reason we have L/R shift mapped to different layer is | |
// the magic key L Shift + R Shift + [0-4](or other magic keys) | |
switch(id) | |
{ | |
case KEY_FN3_LSHIFT: | |
{ | |
if (record->event.pressed) | |
{ | |
layer_on(3); | |
register_code(KC_LSHIFT); | |
} | |
else | |
{ | |
unregister_code(KC_LSHIFT); | |
layer_off(3); | |
} | |
} | |
break; | |
case KEY_FN4_RSHIFT: | |
{ | |
if (record->event.pressed) | |
{ | |
layer_on(4); | |
register_code(KC_RSHIFT); | |
} | |
else | |
{ | |
unregister_code(KC_RSHIFT); | |
layer_off(4); | |
} | |
} | |
break; | |
case KEY_FN34_LNSTART: | |
{ | |
uint32_t layer_win_on = layer_state_make(5); | |
if (layer_test(layer_win_on)) | |
{ | |
// Windows use HOME/END instead of ctrl+a/ctrl+e | |
if (record->event.pressed) | |
{ | |
register_code(KC_HOME); | |
} | |
else | |
{ | |
unregister_code(KC_HOME); | |
} | |
} | |
else { | |
if (record->event.pressed) | |
{ | |
// down mod | |
add_weak_mods(MOD_BIT(KC_LCTL)); | |
send_keyboard_report(); | |
// down key | |
register_code(KC_A); | |
} | |
else | |
{ | |
// up key | |
unregister_code(KC_A); | |
// up mod | |
del_weak_mods(MOD_BIT(KC_LCTL)); | |
send_keyboard_report(); | |
} | |
} | |
} | |
break; | |
case KEY_FN34_LNEND: | |
{ | |
uint32_t layer_win_on = layer_state_make(5); | |
if (layer_test(layer_win_on)) | |
{ | |
// Windows use HOME/END instead of ctrl+a/ctrl+e | |
if (record->event.pressed) | |
{ | |
register_code(KC_END); | |
} | |
else | |
{ | |
unregister_code(KC_END); | |
} | |
} | |
else | |
{ | |
if (record->event.pressed) | |
{ | |
// down mod | |
add_weak_mods(MOD_BIT(KC_LCTL)); | |
send_keyboard_report(); | |
// down key | |
register_code(KC_E); | |
} | |
else | |
{ | |
// up key | |
unregister_code(KC_E); | |
// up mod | |
del_weak_mods(MOD_BIT(KC_LCTL)); | |
send_keyboard_report(); | |
} | |
} | |
} | |
break; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment