First PR for KBD6x HHKB layout keymap (#4704)

* initial commit for Othi's HHKB layout keymap,
covering multiple modifiers hold and vim-like support and german characters. If there's
any suggestion i can be reached via mnpqraven on github or Othi#6661 on
discord

* added readme.md. TODO: update readme.md

* changed to default quantum keycode for `KC_TRNS`,
removed `PREVENT_STUCK_MODIFIERS`,
fixed tap dance using one shots
TODO: unicode implementation at https://docs.qmk.fm/#/feature_unicode

* keymap documentaion(readme) added

* unicode init
TODO: figure out what made the compose sequence not running

* update unicode and readme
This commit is contained in:
Othi 2018-12-24 17:06:12 +00:00 committed by Drashna Jaelre
parent 7e56c4bcb1
commit fc921a9c54
4 changed files with 275 additions and 0 deletions

View file

@ -0,0 +1,10 @@
#pragma once
#define ONESHOT_TAP_TOOGLE 2
#define ONESHOT_TIMEOUT 2000
// tap dance configurations
#define TAPPING_TERM 200
#define TAPPING_TOGGLE 2
#define PERMISSIVE_HOLD
// Fix KC_GESC conflict with Cmd+Alt+Esc on macros
#define GRAVE_ESC_GUI_OVERRIDE

View file

@ -0,0 +1,190 @@
/* Copyright 2018 Othi
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// read README.md for rundown of what does what
// #define BL 0
#define CL 0
#define NM_MODE 2
#define VI_MODE 3
#define FN3 4
#define ACCENT 5
#define ACCENT_CAP 6
//Unicode keymaps
void eeconfig_init_user(void) {
set_unicode_input_mode(UC_LNX);
}
#define DE_AE UC(0x00E4)
#define DE_SS UC(0x00DF)
#define DE_OE UC(0x00F6)
#define DE_UE UC(0x00FC)
#define DE_AE_CAP UC(0x00C4)
#define DE_OE_CAP UC(0x00D6)
#define DE_UE_CAP UC(0x00DC)
uint32_t layer_state_set_user(uint32_t state) {
switch (biton32(state)) {
case NM_MODE:
rgblight_setrgb (0x00, 0x66, 0x00);
break;
case VI_MODE:
rgblight_setrgb (0x66, 0x66, 0x00);
break;
case ACCENT:
rgblight_setrgb (0x7A, 0x00, 0xFF);
break;
case ACCENT_CAP:
rgblight_setrgb (0x7A, 0xFF, 0xFF);
break;
default: // for any other layers, or the default layer
rgblight_setrgb (0xFF, 0x00, 0x00);
break;
}
return state;
}
//Tap Dance Declarations
enum {
CTL_NM = 0,
ALT_NM = 1,
SFT_NM = 2,
GUI_NM = 3
};
void dance_CTL_NM_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
set_oneshot_mods(MOD_LCTL);
} else {
register_code (KC_LCTL);
layer_on(NM_MODE);
}
}
void dance_CTL_NM_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_LCTL);
} else {
unregister_code (KC_LCTL);
layer_off(NM_MODE);
}
}
void dance_GUI_NM_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code (KC_LGUI);
} else {
register_code (KC_LGUI);
layer_on(NM_MODE);
}
}
void dance_GUI_NM_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_LGUI);
} else {
unregister_code (KC_LGUI);
layer_off(NM_MODE);
}
}
void dance_ALT_NM_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code (KC_LALT);
} else {
register_code (KC_LALT);
layer_on(NM_MODE);
}
}
void dance_ALT_NM_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_LALT);
} else {
unregister_code (KC_LALT);
layer_off(NM_MODE);
}
}
void dance_SFT_NM_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code (KC_LSFT);
set_oneshot_mods(MOD_LSFT);
} else {
register_code (KC_LSFT);
layer_on(NM_MODE);
}
}
void dance_SFT_NM_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_LSFT);
} else {
unregister_code (KC_LSFT);
layer_off(NM_MODE);
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[CTL_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_CTL_NM_finished, dance_CTL_NM_reset),
[GUI_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_GUI_NM_finished, dance_GUI_NM_reset),
[ALT_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_ALT_NM_finished, dance_ALT_NM_reset),
[SFT_NM] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_SFT_NM_finished, dance_SFT_NM_reset)
};
// backup
// old R3 capslock, LT(NM_MODE,KC_BSPC),
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[CL] = LAYOUT(
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL,
MT(MOD_LGUI,KC_TAB), LT(NM_MODE,KC_Q), KC_W, LT(ACCENT,KC_F), KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSPC,
MT(MOD_LCTL,KC_BSPC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT,
TD(SFT_NM), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, MT(MOD_LCTL,KC_COMM), MT(MOD_LSFT,KC_DOT), MT(MOD_LALT,KC_SLSH), LM(CL,MOD_LGUI|MOD_LSFT), TT(NM_MODE),
_______, TD(CTL_NM), TD(ALT_NM), KC_SPC, LM(CL,MOD_LGUI|MOD_LALT), OSL(ACCENT) , _______
),
[NM_MODE] = LAYOUT(
KC_GRV, KC_MPRV, KC_MNXT, KC_MPLY, KC_END, _______, _______, _______, _______, _______, KC_HOME, _______, _______, RESET, KC_INS,
LGUI(KC_TAB), _______, LCTL(KC_RGHT), _______, _______, _______, _______, KC_UP, KC_PGUP, _______, _______, _______, TG(CL), KC_DEL,
_______, KC_LEFT, _______, KC_RGHT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_ENT, KC_QUOT, KC_LGUI,
KC_LSFT, _______, _______, _______, _______, LCTL(KC_LEFT), _______, _______, _______, _______, _______, TG(VI_MODE), TO(CL),
_______, TD(CTL_NM), TD(ALT_NM), KC_SPC, LM(CL,MOD_LGUI|MOD_LALT), OSL(ACCENT), _______
),
[VI_MODE] = LAYOUT(
KC_GRV, KC_MPRV, KC_MNXT, KC_MPLY, LSFT(KC_END), KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, LSFT(KC_HOME), KC_F11, KC_F12, RESET, KC_INS,
LGUI(KC_TAB), _______, LSFT(LCTL(KC_RGHT)), _______, _______, _______, _______, LSFT(KC_UP), _______, _______, _______, _______, TG(CL), KC_BSPC,
_______, _______, _______, _______, _______, _______, LSFT(LCTL(KC_LEFT)), LSFT(KC_DOWN), LSFT(KC_RGHT), _______, KC_SCLN, KC_QUOT, KC_LGUI,
KC_LSFT, _______, _______, _______, _______, LSFT(LCTL(KC_LEFT)), _______, _______, _______, _______, KC_SLSH, OSM(MOD_LSFT), TO(CL),
_______, TD(CTL_NM), TD(ALT_NM), KC_SPC, LM(CL,MOD_LGUI|MOD_LALT), OSL(ACCENT), _______
),
[ACCENT] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, RGB_TOG, RGB_MODE_PLAIN, _______, _______, _______, _______, _______, DE_UE, _______, _______, _______, _______, _______,
_______, DE_AE, UC_Z, DE_SS, _______, _______, _______, _______, _______, _______, DE_OE, _______, _______,
OSL(ACCENT_CAP), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(CL),
_______, _______, _______, _______, _______, _______, _______
),
[ACCENT_CAP] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, DE_UE_CAP, _______, _______, _______, _______, _______,
_______, DE_AE_CAP, _______, DE_SS, _______, _______, _______, _______, _______, _______, DE_OE_CAP, _______, TO(CL),
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
};

View file

@ -0,0 +1,56 @@
## Othi's Universal HHKB keymap
### Goals
- Colemak layout. If you don't use Colemak then you'll need to also change the arrow key bindigns in other layers
- Vim-like navigation layer so you can use vim binding arrowkeys in non-vim environment
- Good modifier support so you don't have to hold 14 modifier keys at the same time
- RGB indicating layer change(only work with plain colors so far, don't put your rgb to pulsing or any non static animation)
### Layers
- **CL:**
The base layer, default is Colemak
- **NM_MODE:**
Vim-like arrowkeys in the home row, it's `LHNE` for *JENK Colemak* and `HJKL` for *QWERTY*
Also `HOME`, `END` and next/prev word (`Ctrl + Left/Right`) in `0, 4, w, b` like in vim
- **VI_MODE:**
The same as `NM_MODE` but with `KC_LSFT` held down for mostly highlighting
- **ACCENT + ACCENT_CAP:**
Function row and Unicode characters
### Modifiers and Tap Dance keys
**LHS:**
- Any Tap Dance key with the format of `TD(XXX_NM)` act as normal XXX modifier upon hold, but will hold **and** put you to `NM_MODE` when double click hold(a tap before the hold)(eg you can produce `Alt + PgUp` by pressing `Alt + Alt + U`)
- `KC_TAB` acts as both `KC_TAB` on tap and `KC_LGUI` on hold
- R3 CapsLock acts as both `KC_BSPC` on tap and `KC_LCTL` on hold
- Holding `KC_Q` also puts you into `NM_MODE`
- Holding `KC_F` puts you into `VI_MODE` for fast function keys
**RHS:**
- 3 keys `KC_SCLN`, `KC_DOT` and `KC_SLSH` in `CL` layer can also be held down for respectively `KC_LCTL`, `KC_LSFT`, `KC_LALT` for easier 2-hand modifier holding
- Right modifiers hold the selected modifier with `KC_LGUI` at the same time, mainly for i3wm, you can change this to whatever combination you want
### Misc. functionalities
**Unicode:**
- In case the keyboard output the 4-digit codepoint instead of the actual unicode, you need to change the rewrite input mode of the keyboard into the EEPROM(you only have to do this if the EEPROM was cleared or your current machine use another unicode compose method other than IBus/Linux's `Ctrl + Shift + U`). Change the corresponding Input `void eeconfig_init_user(void)`. See [this](https://docs.qmk.fm/#/feature_unicode) for availble input modes.
- **NOTE:** make sure to keep your qmk env up to date with upstream

View file

@ -0,0 +1,19 @@
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
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
UNICODE_ENABLE = yes # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
TAP_DANCE_ENABLE=yes