[Keymap] the results of some experiments and radically simplify keymap.c (#6172)

* keymap simplification and fancy alt tab behaviour

* move symbols around and try ergo numbers

* mess with symbol positions

* f11 and f12 for volume control (for ease of remapping)

* slack unread navigation

* experiment with mods on home row

* mods on symbol layer

* dedicated tab left and tab right keys

* swap next and prev

* remove hold to shift on a and o

* revert to simpler keymap

* restore readme

* point to keymap image

* cmd + cmd -> cmd + ctrl

* expand readme

* slack unread channel navigation

* Update keyboards/planck/keymaps/callum/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* return true from cmd handling block
master
Callum Oakley 2019-06-25 07:13:40 +01:00 committed by Drashna Jaelre
parent 48b5903677
commit 5b776cfc2d
4 changed files with 257 additions and 321 deletions

View File

@ -1,7 +0,0 @@
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_INTERVAL 16
#define MOUSEKEY_MAX_SPEED 20
#define MOUSEKEY_TIME_TO_MAX 100
#define MOUSEKEY_WHEEL_DELAY 0
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 100

View File

@ -1,331 +1,259 @@
#include "planck.h"
#include "action_layer.h"
#define a KC_A
#define b KC_B
#define c KC_C
#define d KC_D
#define e KC_E
#define f KC_F
#define g KC_G
#define h KC_H
#define i KC_I
#define j KC_J
#define k KC_K
#define l KC_L
#define m KC_M
#define n KC_N
#define o KC_O
#define p KC_P
#define q KC_Q
#define r KC_R
#define s KC_S
#define t KC_T
#define u KC_U
#define v KC_V
#define w KC_W
#define x KC_X
#define y KC_Y
#define z KC_Z
#define lalt KC_LALT
#define lctl KC_LCTL
#define lsft KC_LSFT
#define ralt KC_RALT
#define rctl KC_RCTL
#define rsft KC_RSFT
#define n0 KC_0
#define n1 KC_1
#define n2 KC_2
#define n3 KC_3
#define n4 KC_4
#define n5 KC_5
#define n6 KC_6
#define n7 KC_7
#define n8 KC_8
#define n9 KC_9
#define bspc KC_BSPC
#define caps KC_CAPS
#define comm KC_COMM
#define dash A(KC_MINS)
#define scln KC_SCLN
#define slsh KC_SLSH
#define spc KC_SPC
#define tab KC_TAB
#define del KC_DEL
#define dot KC_DOT
#define ent KC_ENT
#define mins KC_MINS
#define quot KC_QUOT
#define esc KC_ESC
#define gbp A(KC_3)
#define down KC_DOWN
#define home KC_HOME
#define end KC_END
#define up KC_UP
#define pgdn KC_PGDN
#define pgup KC_PGUP
#define left KC_LEFT
#define rght KC_RGHT
#define tabl S(C(KC_TAB))
#define tabr C(KC_TAB)
#define fwd G(KC_RBRC)
#define back G(KC_LBRC)
#define dtl C(KC_LEFT)
#define dtr C(KC_RGHT)
#define slup S(A(KC_UP))
#define sldn S(A(KC_DOWN))
#define f1 KC_F1
#define f2 KC_F2
#define f3 KC_F3
#define f4 KC_F4
#define f5 KC_F5
#define f6 KC_F6
#define f7 KC_F7
#define f8 KC_F8
#define f9 KC_F9
#define f10 KC_F10
#define f11 KC_F11
#define f12 KC_F12
#define f13 KC_F13
#define f14 KC_F14
#define f15 KC_F15
#define f16 KC_F16
#define f17 KC_F17
#define f18 KC_F18
#define f19 KC_F19
#define f20 KC_F20
#define mute KC_MUTE
#define next KC_MNXT
#define play KC_MPLY
#define prev KC_MPRV
#define vold KC_F11
#define volu KC_F12
#define symb MO(SYMB)
#define move MO(MOVE)
#define func MO(FUNC)
#define rset RESET
#define powr KC_POWER
#define ____ KC_TRNS
#define xxxx KC_NO
extern keymap_config_t keymap_config;
#define AC(X) A(C(X))
#define SC(X) S(C(X))
enum planck_layers {
_COLEMAK,
_QWERTY,
_SYMB,
_MOVE,
_FUNC,
_MOUSE,
};
enum planck_keycodes {
COLEMAK = SAFE_RANGE,
QWERTY,
BASE,
SYMB,
MOVE,
FUNC,
MOUSE,
};
enum planck_keycodes {
ampr = SAFE_RANGE,
astr,
at,
bsls,
circ,
dlr,
eql,
exlm,
grv,
hash,
lbrc,
lcbr,
lprn,
perc,
pipe,
plus,
rbrc,
rcbr,
rprn,
tild,
cmd,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* COLEMAK
* ,-----------------------------------------------------------------------.
* |Tab | Q | W | F | P | G | J | L | U | Y | ; | - |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Bksp | A | R | S | T | D | H | N | E | I | O | ' |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Shift| Z | X | C | V | B | K | M | , | . | / |Shift|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Func |Ctrl | Alt |Super|Symb |Enter|Space|Move |Super| Alt |Ctrl |Func |
* `-----------------------------------------------------------------------'
*/
[_COLEMAK] = LAYOUT_planck_grid(
KC_TAB, KC_Q, KC_W, KC_F,
KC_P, KC_G, KC_J, KC_L,
KC_U, KC_Y, KC_SCLN, KC_MINS,
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_LSFT, KC_Z, KC_X, KC_C,
KC_V, KC_B, KC_K, KC_M,
KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
FUNC, KC_LCTL, KC_LALT, KC_LGUI,
SYMB, KC_ENT, KC_SPC, MOVE,
KC_RGUI, KC_RALT, KC_RCTL, FUNC
[BASE] = LAYOUT_planck_grid(
tab, q, w, f, p, g, j, l, u, y, scln, mins,
bspc, a, r, s, t, d, h, n, e, i, o, quot,
lsft, z, x, c, v, b, k, m, comm, dot, slsh, rsft,
func, lctl, lalt, cmd, move, ent, spc, symb, cmd, ralt, rctl, func
),
/* QWERTY
* ,-----------------------------------------------------------------------.
* |Tab | Q | W | E | R | T | Y | U | I | O | P | - |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Bksp | A | S | D | F | G | H | J | K | L | ; | ' |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Shift| Z | X | C | V | B | N | M | , | . | / |Shift|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Func |Ctrl | Alt |Super|Symb |Enter|Space|Move |Super| Alt |Ctrl |Func |
* `-----------------------------------------------------------------------'
*/
[_QWERTY] = LAYOUT_planck_grid(
KC_TAB, KC_Q, KC_W, KC_E,
KC_R, KC_T, KC_Y, KC_U,
KC_I, KC_O, KC_P, KC_MINS,
KC_BSPC, KC_A, KC_S, KC_D,
KC_F, KC_G, KC_H, KC_J,
KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C,
KC_V, KC_B, KC_N, KC_M,
KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
FUNC, KC_LCTL, KC_LALT, KC_LGUI,
SYMB, KC_ENT, KC_SPC, MOVE,
KC_RGUI, KC_RALT, KC_RCTL, FUNC
[SYMB] = LAYOUT_planck_grid(
esc, n7, n5, n3, n1, n9, n8, n0, n2, n4, n6, dash,
del, bsls, hash, astr, eql, pipe, at, rprn, lprn, dlr, ampr, gbp,
caps, grv, exlm, lbrc, rbrc, circ, tild, rcbr, lcbr, plus, perc, caps,
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
),
/* SYMB
* ,-----------------------------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |ndash|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | Del | ! | @ | # | $ | % | ^ | & | * | ( | ) | £ |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | ~ | ` | + | = | | | \ | [ | ] | { | } | |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------'
*/
[_SYMB] = LAYOUT_planck_grid(
KC_ESC, KC_1, KC_2, KC_3,
KC_4, KC_5, KC_6, KC_7,
KC_8, KC_9, KC_0, A(KC_MINS),
KC_DEL, KC_EXLM, KC_AT, KC_HASH,
KC_DLR, KC_PERC, KC_CIRC, KC_AMPR,
KC_ASTR, KC_LPRN, KC_RPRN, A(KC_3),
_______, KC_TILD, KC_GRV, KC_PLUS,
KC_EQL, KC_PIPE, KC_BSLS, KC_LBRC,
KC_RBRC, KC_LCBR, KC_RCBR, _______,
_______, _______, _______, _______,
_______, _______, _______, _______,
_______, _______, _______, _______
[MOVE] = LAYOUT_planck_grid(
esc, xxxx, slup, dtl, dtr, xxxx, xxxx, home, up, end, xxxx, xxxx,
del, xxxx, sldn, tabl, tabr, xxxx, xxxx, left, down, rght, xxxx, xxxx,
____, xxxx, xxxx, back, fwd, xxxx, xxxx, pgdn, pgup, xxxx, xxxx, ____,
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
),
/* MOVE
* ,-----------------------------------------------------------------------.
* | | | | | | |CtrUp|Home | Up | End |Caps |Mouse|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | | | |CtrL |Left |Down |Right|CtrR | |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | | | |CtrDn|PgDn |PgUp |TabL |TabR | |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------'
*/
[_MOVE] = LAYOUT_planck_grid(
AC(KC_A), AC(KC_B), AC(KC_C), AC(KC_D),
AC(KC_E), AC(KC_F), C(KC_UP), KC_HOME,
KC_UP, KC_END, KC_CAPS, MOUSE,
AC(KC_G), AC(KC_H), AC(KC_I), AC(KC_J),
AC(KC_K), AC(KC_L), C(KC_LEFT), KC_LEFT,
KC_DOWN, KC_RGHT, C(KC_RIGHT), XXXXXXX,
_______, AC(KC_M), AC(KC_N), AC(KC_O),
AC(KC_P), AC(KC_Q), C(KC_DOWN), KC_PGDN,
KC_PGUP, SC(KC_TAB), C(KC_TAB), _______,
_______, _______, _______, _______,
_______, _______, _______, _______,
_______, _______, _______, _______
[FUNC] = LAYOUT_planck_grid(
rset, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, volu,
powr, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, vold,
____, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, ____,
____, ____, ____, ____, prev, mute, play, next, ____, ____, ____, ____
),
/* FUNC
* ,-----------------------------------------------------------------------.
* |Reset| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 |VolUp|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Power| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |VolDn|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | | | | | | |Clmak|Qwrty| |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | |Prev |Mute |Play |Next | | | | |
* `-----------------------------------------------------------------------'
*/
[_FUNC] = LAYOUT_planck_grid(
RESET, KC_F1, KC_F2, KC_F3,
KC_F4, KC_F5, KC_F6, KC_F7,
KC_F8, KC_F9, KC_F10, KC_VOLU,
KC_POWER, KC_F11, KC_F12, KC_F13,
KC_F14, KC_F15, KC_F16, KC_F17,
KC_F18, KC_F19, KC_F20, KC_VOLD,
_______, XXXXXXX, KC_HOME, SC(KC_TAB),
C(KC_TAB), KC_END, XXXXXXX, XXXXXXX,
XXXXXXX, COLEMAK, QWERTY, _______,
_______, _______, _______, _______,
KC_MPRV, KC_MUTE, KC_MPLY, KC_MNXT,
_______, _______, _______, _______
),
/* MOUSE
* ,-----------------------------------------------------------------------.
* | | |CtrL |CtrU |CtrR | B5 |CtrU | ScL |Up | ScR | | |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | Ac0 | Ac1 | Ac2 | B4 |CtrL |Left |Down |Right|CtrR | |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | |Home | End | B3 |CtrD | ScD | ScU |TabL |TabR | |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | | | B2 | B1 | | | | | |
* `-----------------------------------------------------------------------'
*/
[_MOUSE] = LAYOUT_planck_grid(
_______, XXXXXXX, C(KC_LEFT), C(KC_UP),
C(KC_RIGHT), KC_BTN5, C(KC_UP), KC_WH_R,
KC_MS_U, KC_WH_L, XXXXXXX, XXXXXXX,
_______, XXXXXXX, KC_ACL0, KC_ACL1,
KC_ACL2, KC_BTN4, C(KC_LEFT), KC_MS_L,
KC_MS_D, KC_MS_R, C(KC_RIGHT), XXXXXXX,
_______, XXXXXXX, XXXXXXX, KC_HOME,
KC_END, KC_BTN3, C(KC_DOWN), KC_WH_U,
KC_WH_D, SC(KC_TAB), C(KC_TAB), _______,
_______, _______, _______, _______,
_______, KC_BTN2, KC_BTN1, _______,
_______, _______, _______, _______
)
};
#ifdef AUDIO_ENABLE
float colemak_song[][2] = SONG(COLEMAK_SOUND);
float qwerty_song[][2] = SONG(QWERTY_SOUND);
#endif
void set_colemak(void) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(colemak_song);
#endif
set_single_persistent_default_layer(_COLEMAK);
}
void set_qwerty(void) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(qwerty_song);
#endif
set_single_persistent_default_layer(_QWERTY);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case COLEMAK:
if (record->event.pressed) {
set_colemak();
}
return false;
case QWERTY:
if (record->event.pressed) {
set_qwerty();
}
return false;
case SYMB:
if (record->event.pressed) {
layer_off(_MOUSE);
layer_on(_SYMB);
} else {
layer_off(_SYMB);
}
return false;
case MOVE:
if (record->event.pressed) {
layer_off(_MOUSE);
layer_on(_MOVE);
} else {
layer_off(_MOVE);
}
return false;
case FUNC:
if (record->event.pressed) {
layer_off(_MOUSE);
layer_on(_FUNC);
} else {
layer_off(_FUNC);
}
return false;
case MOUSE:
if (record->event.pressed) {
layer_on(_MOUSE);
}
return false;
// Override the defualt auto shifted symbols to use SEND_STRING
// See https://github.com/qmk/qmk_firmware/issues/4072
case KC_EXLM:
if (record->event.pressed) { SEND_STRING("!"); }
return false;
case KC_AT:
if (record->event.pressed) { SEND_STRING("@"); }
return false;
case KC_HASH:
if (record->event.pressed) { SEND_STRING("#"); }
return false;
case KC_DLR:
if (record->event.pressed) { SEND_STRING("$"); }
return false;
case KC_PERC:
if (record->event.pressed) { SEND_STRING("%"); }
return false;
case KC_CIRC:
if (record->event.pressed) { SEND_STRING("^"); }
return false;
case KC_AMPR:
if (record->event.pressed) { SEND_STRING("&"); }
return false;
case KC_ASTR:
if (record->event.pressed) { SEND_STRING("*"); }
return false;
case KC_LPRN:
if (record->event.pressed) { SEND_STRING("("); }
return false;
case KC_RPRN:
if (record->event.pressed) { SEND_STRING(")"); }
return false;
case KC_TILD:
if (record->event.pressed) { SEND_STRING("~"); }
return false;
case KC_GRV:
if (record->event.pressed) { SEND_STRING("`"); }
return false;
case KC_PLUS:
if (record->event.pressed) { SEND_STRING("+"); }
return false;
case KC_EQL:
if (record->event.pressed) { SEND_STRING("="); }
return false;
case KC_PIPE:
if (record->event.pressed) { SEND_STRING("|"); }
return false;
case KC_BSLS:
if (record->event.pressed) { SEND_STRING("\\"); }
return false;
case KC_LBRC:
if (record->event.pressed) { SEND_STRING("["); }
return false;
case KC_RBRC:
if (record->event.pressed) { SEND_STRING("]"); }
return false;
case KC_LCBR:
if (record->event.pressed) { SEND_STRING("{"); }
return false;
case KC_RCBR:
if (record->event.pressed) { SEND_STRING("}"); }
return false;
bool send_string_if_keydown(keyrecord_t *record, const char *s) {
if (record->event.pressed) {
SEND_STRING(s);
}
return true;
}
int cmd_keys_down = 0;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// Override the defualt auto shifted symbols to use SEND_STRING See
// https://github.com/qmk/qmk_firmware/issues/4072
case ampr:
return send_string_if_keydown(record, "&");
case astr:
return send_string_if_keydown(record, "*");
case at:
return send_string_if_keydown(record, "@");
case bsls:
return send_string_if_keydown(record, "\\");
case circ:
return send_string_if_keydown(record, "^");
case dlr:
return send_string_if_keydown(record, "$");
case eql:
return send_string_if_keydown(record, "=");
case exlm:
return send_string_if_keydown(record, "!");
case grv:
return send_string_if_keydown(record, "`");
case hash:
return send_string_if_keydown(record, "#");
case lbrc:
return send_string_if_keydown(record, "[");
case lcbr:
return send_string_if_keydown(record, "{");
case lprn:
return send_string_if_keydown(record, "(");
case perc:
return send_string_if_keydown(record, "%");
case pipe:
return send_string_if_keydown(record, "|");
case plus:
return send_string_if_keydown(record, "+");
case rbrc:
return send_string_if_keydown(record, "]");
case rcbr:
return send_string_if_keydown(record, "}");
case rprn:
return send_string_if_keydown(record, ")");
case tild:
return send_string_if_keydown(record, "~");
// cmd + cmd -> cmd + ctl
case cmd:
if (record->event.pressed) {
if (cmd_keys_down == 0) {
register_code(KC_LCMD);
} else {
register_code(KC_LCTL);
}
cmd_keys_down++;
} else {
if (cmd_keys_down == 1) {
unregister_code(KC_LCMD);
} else {
unregister_code(KC_LCTL);
}
cmd_keys_down--;
}
return true;
}
return true;
}

View File

@ -1,11 +1,11 @@
# callums planck layout
# callum's planck layout
This is a layout for the grid planck, built with a few ideals in mind:
- Consistent and minimal response times should be maintained. Keys that react
differently depending on whether they are tapped or held, keys that react
differently if they are double tapped, etc. should be avoided -- they
inevitably send their keycode later than a normal key -- interrupting the
differently if they are double tapped, etc. should be avoided they
inevitably send their keycode later than a normal key interrupting the
immediate feedback from the screen. Therefore we restrict ourselves to
chording as our only means of getting more than one symbol out of a single
physical key.
@ -17,7 +17,22 @@ This is a layout for the grid planck, built with a few ideals in mind:
- There should be two of every modifier (one on each side), otherwise certain
long key combinations become hard to make.
A layout graphic can be found [here][keyboard-layout-editor] (excludes window
management keys).
- It should be possible to do things you might want to do while using the mouse
with only the left hand (e.g. change tabs, navigate back or forwards in
browser history).
[keyboard-layout-editor]: http://www.keyboard-layout-editor.com/#/gists/ade5ec1f814bf83046489a4b632575ff
- Symbols should be arranged so that the most frequently used are easiest to
reach. This includes numbers, and lower numbers are more commonly used than
higher ones. (number arrangement borrowed from [dustypomeleau's minidox
layout][].
Layout rendered with [keyboard-layout-editor.com][]:
![](https://callum-oakley.github.io/images/keymap.png)
The only behaviour not captured in this graphic is: pressing both cmd keys will
send cmd+ctrl. See [keymap.c][] for details.
[dustypomeleau's minidox layout]: https://github.com/qmk/qmk_firmware/tree/master/keyboards/minidox/keymaps/dustypomerleau
[keyboard-layout-editor.com]: http://www.keyboard-layout-editor.com
[keymap.c]: keymap.c

View File

@ -3,7 +3,7 @@
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration