qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

README.md (7611B)


      1 # keymap_beautifier.py
      2 
      3 ## About
      4 This Python 3 script, by [Tsan-Kuang Lee](https://github.com/tsankuanglee) takes the keymap.c downloaded from [ErgoDox EZ Configurator](https://configure.ergodox-ez.com/) and beautifies it for easier customization, allowing one to quickly draft a layout to build upon.
      5 
      6 ## Features
      7 For example, the original `keymap.c` looks like
      8 
      9 ```
     10 [0] = LAYOUT_ergodox(KC_EQUAL,KC_1,KC_2,KC_3,KC_4,KC_5,LCTL(KC_MINUS),KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_LBRC,KC_BSPC,KC_A,KC_S,KC_D,KC_F,KC_G,SC_LSPO,CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,HYPR_T(KC_NO),LT(1,KC_GRAVE),KC_QUOTE,LALT(KC_LSFT),KC_LEFT,KC_RIGHT,ALT_T(KC_APPLICATION),KC_LGUI,KC_HOME,KC_SPACE,KC_UNDS,KC_END,LCTL(KC_EQUAL),KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_RBRC,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLS,KC_H,ALT_T(KC_J),KC_K,KC_L,LT(2,KC_SCLN),GUI_T(KC_QUOTE),MEH_T(KC_NO),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),SC_RSPC,KC_UP,KC_DOWN,KC_LBRC,KC_RBRC,TT(1),KC_LALT,CTL_T(KC_ESCAPE),KC_PGUP,KC_PGDN,LT(1,KC_TAB),KC_ENTER),
     11 ```
     12 
     13 The beautifier parses it and outputs:
     14 
     15 ```
     16 [0] = LAYOUT_ergodox(
     17 // left hand
     18 
     19 KC_EQUAL      , KC_1       , KC_2           , KC_3   , KC_4    , KC_5, LCTL(KC_MINUS),
     20 KC_DELETE     , KC_Q       , KC_W           , KC_E   , KC_R    , KC_T, KC_LBRC   ,
     21 KC_BSPC       , KC_A       , KC_S           , KC_D   , KC_F    , KC_G,
     22 SC_LSPO       , CTL_T(KC_Z), KC_X           , KC_C   , KC_V    , KC_B, HYPR_T(KC_NO)  ,
     23 LT(1,KC_GRAVE), KC_QUOTE   , LALT(KC_LSFT)  , KC_LEFT, KC_RIGHT,
     24 
     25 // left thumb
     26 
     27           ALT_T(KC_APPLICATION), KC_LGUI,
     28                                  KC_HOME,
     29 KC_SPACE, KC_UNDS              , KC_END ,
     30 
     31 // right hand
     32 
     33 LCTL(KC_EQUAL), KC_6, KC_7       , KC_8    , KC_9       , KC_0           , KC_MINUS       ,
     34 KC_RBRC       , KC_Y, KC_U       , KC_I    , KC_O       , KC_P           , KC_BSLS        ,
     35                 KC_H, ALT_T(KC_J), KC_K    , KC_L       , LT(2,KC_SCLN)  , GUI_T(KC_QUOTE),
     36 MEH_T(KC_NO)  , KC_N, KC_M       , KC_COMMA, KC_DOT     , CTL_T(KC_SLASH), SC_RSPC        ,
     37                       KC_UP      , KC_DOWN , KC_LBRC,     KC_RBRC        , TT(1)          ,
     38 
     39 // right thumb
     40 
     41 KC_LALT  , CTL_T(KC_ESCAPE),
     42 KC_PGUP  ,
     43 KC_PGDN, LT(1,KC_TAB)    , KC_ENTER
     44 )
     45 ```
     46 
     47 Optionally, it can also render [LAYOUT_ergodox_pretty](https://github.com/qmk/qmk_firmware/blob/ee700b2e831067bdb7584425569b61bc6329247b/keyboards/ergodox_ez/keymaps/bpruitt-goddard/keymap.c#L49-L57):
     48 ```
     49 [0] = LAYOUT_ergodox_pretty(
     50   KC_ESCAPE,        KC_1,     KC_2,    KC_3,     KC_4,           KC_5,          QK_LEAD,      QK_LEAD, KC_6          , KC_7            , KC_8            , KC_9               , KC_0              , KC_BSPC             ,
     51      KC_TAB,        KC_Q,     KC_W,    KC_E,     KC_R,           KC_T,          KC_HYPR,      KC_HYPR, KC_Y          , KC_U            , KC_I            , KC_O               , KC_P              , KC_BSLS             ,
     52    KC_LCTL,         KC_A,     KC_S,    KC_D,     KC_F,           KC_G,                                 KC_H          , KC_J            , KC_K            , KC_L               , KC_SCLN           , KC_QUOTE            ,
     53   KC_LSFT,          KC_Z,     KC_X,    KC_C,     KC_V,           KC_B,           SH_MON,      SH_MON , KC_N          , KC_M            , KC_COMMA        , KC_DOT             , KC_SLASH          , KC_RSFT             ,
     54 LT(6,KC_NO), LT(7,KC_NO), KC_LCTL,  KC_LGUI,  KC_LALT,                                                                 ALGR_T(KC_MINUS), RGUI_T(KC_EQUAL), RCTL_T(KC_LBRC),     LT(10,KC_RBRC),     LT(6,KC_APPLICATION),
     55 
     56                                                        LT(6,KC_GRAVE),     MEH_T(KC_NO),      KC_LEFT, KC_RIGHT      ,
     57                                                                        LT(10,KC_DELETE),      KC_UP  ,
     58                                              KC_SPACE, LT(8,KC_ENTER),  LT(7,KC_BSPC),        KC_DOWN, LT(7,KC_SPACE), LT(8,KC_ENTER)
     59 )
     60 ```
     61 
     62 We can also align everythng t othe left (easier editing in my opinon):
     63 ```
     64 [0] = LAYOUT_ergodox_pretty(
     65 KC_ESCAPE  , KC_1       , KC_2    , KC_3   , KC_4    , KC_5          , QK_LEAD         ,      QK_LEAD, KC_6          , KC_7            , KC_8            , KC_9               , KC_0              , KC_BSPC             ,
     66 KC_TAB     , KC_Q       , KC_W    , KC_E   , KC_R    , KC_T          , KC_HYPR         ,      KC_HYPR, KC_Y          , KC_U            , KC_I            , KC_O               , KC_P              , KC_BSLS             ,
     67 KC_LCTL    , KC_A       , KC_S    , KC_D   , KC_F    , KC_G          ,                                 KC_H          , KC_J            , KC_K            , KC_L               , KC_SCLN           , KC_QUOTE            ,
     68 KC_LSFT    , KC_Z       , KC_X    , KC_C   , KC_V    , KC_B          , SH_MON          ,      SH_MON , KC_N          , KC_M            , KC_COMMA        , KC_DOT             , KC_SLASH          , KC_RSFT             ,
     69 LT(6,KC_NO), LT(7,KC_NO), KC_LCTL , KC_LGUI, KC_LALT ,                                                                 ALGR_T(KC_MINUS), RGUI_T(KC_EQUAL), RCTL_T(KC_LBRC),     LT(10,KC_RBRC),     LT(6,KC_APPLICATION),
     70 
     71                                                        LT(6,KC_GRAVE), MEH_T(KC_NO)    ,      KC_LEFT, KC_RIGHT      ,
     72                                                                        LT(10,KC_DELETE),      KC_UP  ,
     73                                              KC_SPACE, LT(8,KC_ENTER), LT(7,KC_BSPC)   ,      KC_DOWN, LT(7,KC_SPACE), LT(8,KC_ENTER)
     74 )
     75 ```
     76 
     77 ## Usage
     78 
     79 ### With docker
     80 This is the cleaner way. `Docker` is the only requirement. The program executes within a container that has all dependencies installed.
     81 
     82 First build the images. (Run once)
     83 ```
     84 cd QMK_GIT_REPO_dir/keyboards/ergodox_ez/util/keymap_beautifier
     85 docker build -t keymapbeautifier:1.0 .
     86 ```
     87 Run it
     88 ```
     89 cd QMK_GIT_REPO_dir/keyboards/ergodox_ez/util/keymap_beautifier
     90 cp PATH_TO_YOUR_C_SOURCE_FILE.c input.c
     91 ./docker_run.sh input.c -p -c -o output.c
     92 ```
     93 The prettified file is written to `output.c`. See the section Tweaks for non-default settings.
     94 
     95 ### Without docker
     96 Requirements:
     97 * python3 (tested on 3.7.4)
     98 * python module `pycparser` installed (with `pip install pycparser`)
     99 
    100 To run:
    101 ```
    102 cd QMK_GIT_REPO_dir/keyboards/ergodox_ez/util/keymap_beautifier
    103 cp PATH_TO_YOUR_C_SOURCE_FILE.c input.c
    104 ./KeymapBeautifier.py input.c -p -c -o output.c
    105 ```
    106 The prettified file is written to `output.c`. See the section Tweaks for non-default settings.
    107 
    108 ## Tweaks
    109 ```
    110 usage: KeymapBeautifier.py [-h] [-o OUTPUT_FILENAME] [-p] [-c] input_filename
    111 
    112 Beautify keymap.c downloaded from ErgoDox-Ez Configurator for easier
    113 customization.
    114 
    115 positional arguments:
    116   input_filename        input file: c source code file that has the layer
    117                         keymaps
    118 
    119 optional arguments:
    120   -h, --help            show this help message and exit
    121   -o OUTPUT_FILENAME, --output-filename OUTPUT_FILENAME
    122                         output file: beautified c filename. If not given,
    123                         output to STDOUT.
    124   -p, --pretty-output-layout
    125                         use LAYOUT_ergodox_pretty for output instead of
    126                         LAYOUT_ergodox
    127   -c, --justify-toward-center
    128                         for LAYOUT_ergodox_pretty, align right for the left
    129                         half, and align left for the right half. Default is
    130                         align left for both halves.
    131 ```
    132 For example,
    133 ```
    134 ./docker_run.sh input.c -p -c -o output.c
    135 # or if you don't want to use docker:
    136 #./KeymapBeautifier.py input.c -p -c -o output.c
    137 ```
    138 will read `input.c`, and produce `output.c` with LAYOUT_ergodox_pretty, and have the key symbols gravitating toward the center.
    139