qmk

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.z3bra.org/qmk.git
Log | Files | Refs | Submodules | LICENSE

commit 5b776cfc2daef235595e67ddc0a073490745e736
parent 48b5903677b773940f1f92d9cb1bf278290fc075
Author: Callum Oakley <c.oakley108@gmail.com>
Date:   Tue, 25 Jun 2019 07:13:40 +0100

[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

Diffstat:
keyboards/planck/keymaps/callum/config.h | 7-------
keyboards/planck/keymaps/callum/keymap.c | 526++++++++++++++++++++++++++++++++++---------------------------------------------
keyboards/planck/keymaps/callum/readme.md | 27+++++++++++++++++++++------
keyboards/planck/keymaps/callum/rules.mk | 2+-
4 files changed, 249 insertions(+), 313 deletions(-)

diff --git a/keyboards/planck/keymaps/callum/config.h b/keyboards/planck/keymaps/callum/config.h @@ -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 diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c @@ -1,331 +1,259 @@ #include "planck.h" #include "action_layer.h" -extern keymap_config_t keymap_config; +#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 -#define AC(X) A(C(X)) -#define SC(X) S(C(X)) +extern keymap_config_t keymap_config; enum planck_layers { - _COLEMAK, - _QWERTY, - _SYMB, - _MOVE, - _FUNC, - _MOUSE, -}; - -enum planck_keycodes { - COLEMAK = SAFE_RANGE, - QWERTY, + BASE, SYMB, MOVE, FUNC, - MOUSE, }; -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, +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, +}; - FUNC, KC_LCTL, KC_LALT, KC_LGUI, - SYMB, KC_ENT, KC_SPC, MOVE, - KC_RGUI, KC_RALT, KC_RCTL, FUNC +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [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); +bool send_string_if_keydown(keyrecord_t *record, const char *s) { + if (record->event.pressed) { + SEND_STRING(s); + } + return true; } -void set_qwerty(void) { -#ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(qwerty_song); -#endif - set_single_persistent_default_layer(_QWERTY); -} +int cmd_keys_down = 0; bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case COLEMAK: - if (record->event.pressed) { - set_colemak(); - } - return false; - case QWERTY: + // 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) { - 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); + if (cmd_keys_down == 0) { + register_code(KC_LCMD); + } else { + register_code(KC_LCTL); + } + cmd_keys_down++; } else { - layer_off(_MOVE); + if (cmd_keys_down == 1) { + unregister_code(KC_LCMD); + } else { + unregister_code(KC_LCTL); + } + cmd_keys_down--; } - 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; + return true; } return true; } diff --git a/keyboards/planck/keymaps/callum/readme.md b/keyboards/planck/keymaps/callum/readme.md @@ -1,11 +1,11 @@ -# callum’s 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 diff --git a/keyboards/planck/keymaps/callum/rules.mk b/keyboards/planck/keymaps/callum/rules.mk @@ -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