Skip to content

Instantly share code, notes, and snippets.

@fengye
Last active August 10, 2019 05:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fengye/58aea489fd03a34be219b53bcf80dc4d to your computer and use it in GitHub Desktop.
Save fengye/58aea489fd03a34be219b53bcf80dc4d to your computer and use it in GitHub Desktop.
HHKB keymapping for C++ programmers V3
#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