diff options
author | Manna Harbour <51143715+manna-harbour@users.noreply.github.com> | 2019-06-26 17:33:12 +1000 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2019-06-26 00:33:12 -0700 |
commit | 4be1dfcee48daeb77e966b08ad9ca51e02253acf (patch) | |
tree | c4f4f8ab7554167af6509d643200fb8ce7e9040b | |
parent | 3483c51f62640c83d35a0b4c4636a5939f2c3898 (diff) | |
download | qmk_firmware-4be1dfcee48daeb77e966b08ad9ca51e02253acf.tar.gz qmk_firmware-4be1dfcee48daeb77e966b08ad9ca51e02253acf.zip |
[Keymap] miryoku layout (#6171)
* First release
* add "#pragma once" to config.h and related docs
* generate config.h with change from miryoku.org
-rw-r--r-- | keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c | 17 | ||||
-rw-r--r-- | layouts/community/ergodox/manna-harbour_miryoku/keymap.c | 21 | ||||
-rw-r--r-- | layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c | 17 | ||||
l--------- | users/manna-harbour_miryoku/README.org | 1 | ||||
-rw-r--r-- | users/manna-harbour_miryoku/config.h | 13 | ||||
-rw-r--r-- | users/manna-harbour_miryoku/manna-harbour_miryoku.c | 56 | ||||
-rw-r--r-- | users/manna-harbour_miryoku/miryoku.org | 609 | ||||
-rw-r--r-- | users/manna-harbour_miryoku/rules.mk | 5 |
8 files changed, 739 insertions, 0 deletions
diff --git a/keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c b/keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c new file mode 100644 index 000000000..56d4de25a --- /dev/null +++ b/keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c | |||
@@ -0,0 +1,17 @@ | |||
1 | |||
2 | // generated from users/manna-harbour_miryoku/miryoku.org | ||
3 | |||
4 | #define LAYOUT_miryoku( \ | ||
5 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, \ | ||
6 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \ | ||
7 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \ | ||
8 | N30, N31, K32, K33, K34, K35, K36, K37, N38, N39 \ | ||
9 | ) \ | ||
10 | LAYOUT( \ | ||
11 | KC_NO, K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, KC_NO, \ | ||
12 | KC_NO, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KC_NO, \ | ||
13 | KC_NO, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, KC_NO, \ | ||
14 | K32, K33, K34, K35, K36, K37 \ | ||
15 | ) | ||
16 | |||
17 | #include "manna-harbour_miryoku.c" | ||
diff --git a/layouts/community/ergodox/manna-harbour_miryoku/keymap.c b/layouts/community/ergodox/manna-harbour_miryoku/keymap.c new file mode 100644 index 000000000..86547df98 --- /dev/null +++ b/layouts/community/ergodox/manna-harbour_miryoku/keymap.c | |||
@@ -0,0 +1,21 @@ | |||
1 | |||
2 | // generated from users/manna-harbour_miryoku/miryoku.org | ||
3 | |||
4 | #define LAYOUT_miryoku(\ | ||
5 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09,\ | ||
6 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19,\ | ||
7 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29,\ | ||
8 | N30, N31, K32, K33, K34, K35, K36, K37, N38, N39\ | ||
9 | )\ | ||
10 | LAYOUT_ergodox_pretty( \ | ||
11 | KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ | ||
12 | KC_NO, K00, K01, K02, K03, K04, KC_NO, KC_NO, K05, K06, K07, K08, K09, KC_NO, \ | ||
13 | KC_NO, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KC_NO, \ | ||
14 | KC_NO, K20, K21, K22, K23, K24, KC_NO, KC_NO, K25, K26, K27, K28, K29, KC_NO, \ | ||
15 | KC_NO, KC_NO, KC_NO, KC_NO, K32, K37, KC_NO, KC_NO, KC_NO, KC_NO, \ | ||
16 | KC_NO, KC_NO, KC_NO, KC_NO, \ | ||
17 | KC_NO, KC_NO, \ | ||
18 | K33, K34, KC_NO, KC_NO, K35, K36 \ | ||
19 | ) | ||
20 | |||
21 | #include "manna-harbour_miryoku.c" | ||
diff --git a/layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c b/layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c new file mode 100644 index 000000000..b1341d41f --- /dev/null +++ b/layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c | |||
@@ -0,0 +1,17 @@ | |||
1 | |||
2 | // generated from users/manna-harbour_miryoku/miryoku.org | ||
3 | |||
4 | #define LAYOUT_miryoku(\ | ||
5 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09,\ | ||
6 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19,\ | ||
7 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29,\ | ||
8 | N30, N31, K32, K33, K34, K35, K36, K37, N38, N39\ | ||
9 | )\ | ||
10 | LAYOUT_ortho_4x12(\ | ||
11 | KC_NO, K01, K02, K03, K04, KC_NO, KC_NO, K05, K06, K07, K08, KC_NO,\ | ||
12 | K00, K11, K12, K13, K14, KC_NO, KC_NO, K15, K16, K17, K18, K09,\ | ||
13 | K10, K21, K22, K23, K24, KC_NO, KC_NO, K25, K26, K27, K28, K19,\ | ||
14 | K20, KC_NO, KC_NO, K32, K33, K34, K35, K36, K37, KC_NO, KC_NO, K29\ | ||
15 | ) | ||
16 | |||
17 | #include "manna-harbour_miryoku.c" | ||
diff --git a/users/manna-harbour_miryoku/README.org b/users/manna-harbour_miryoku/README.org new file mode 120000 index 000000000..b6caaade1 --- /dev/null +++ b/users/manna-harbour_miryoku/README.org | |||
@@ -0,0 +1 @@ | |||
miryoku.org \ No newline at end of file | |||
diff --git a/users/manna-harbour_miryoku/config.h b/users/manna-harbour_miryoku/config.h new file mode 100644 index 000000000..c3c513d06 --- /dev/null +++ b/users/manna-harbour_miryoku/config.h | |||
@@ -0,0 +1,13 @@ | |||
1 | |||
2 | // generated from users/manna-harbour_miryoku/miryoku.org | ||
3 | |||
4 | #pragma once | ||
5 | |||
6 | // Prevent normal rollover on alphas from accidentally triggering mods. | ||
7 | #define IGNORE_MOD_TAP_INTERRUPT | ||
8 | |||
9 | // Enable rapid switch from tap to hold, disables double tap hold auto-repeat. | ||
10 | #define TAPPING_FORCE_HOLD | ||
11 | |||
12 | // Recommended for heavy chording. | ||
13 | #define QMK_KEYS_PER_SCAN 4 | ||
diff --git a/users/manna-harbour_miryoku/manna-harbour_miryoku.c b/users/manna-harbour_miryoku/manna-harbour_miryoku.c new file mode 100644 index 000000000..bb4770afc --- /dev/null +++ b/users/manna-harbour_miryoku/manna-harbour_miryoku.c | |||
@@ -0,0 +1,56 @@ | |||
1 | |||
2 | // generated from users/manna-harbour_miryoku/miryoku.org | ||
3 | |||
4 | #include QMK_KEYBOARD_H | ||
5 | |||
6 | #define KC_NP KC_NO // key is not present | ||
7 | #define KC_NA KC_NO // present but not available for use | ||
8 | #define KC_NU KC_NO // available but not used | ||
9 | #define KC_RST RESET | ||
10 | |||
11 | enum layers { BASE, MEDR, NAVR, MOUR, NSSL, NSL, FUNL }; | ||
12 | |||
13 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
14 | [BASE] = LAYOUT_miryoku( | ||
15 | KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, | ||
16 | LGUI_T(KC_A), LALT_T(KC_R), LCTL_T(KC_S), LSFT_T(KC_T), KC_G, KC_M, LSFT_T(KC_N), LCTL_T(KC_E), LALT_T(KC_I), LGUI_T(KC_O), | ||
17 | KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, | ||
18 | KC_NP, KC_NP, LT(MEDR, KC_ESC), LT(NAVR, KC_SPC), LT(MOUR, KC_TAB), LT(NSSL, KC_ENT), LT(NSL, KC_BSPC), LT(FUNL, KC_DEL), KC_NP, KC_NP | ||
19 | ), | ||
20 | [NAVR] = LAYOUT_miryoku( | ||
21 | KC_RST, KC_NA, KC_NA, KC_NA, KC_NA, KC_AGIN, KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, | ||
22 | KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, | ||
23 | KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, | ||
24 | KC_NP, KC_NP, KC_NA, KC_NA, KC_NA, KC_ENT, KC_BSPC, KC_DEL, KC_NP, KC_NP | ||
25 | ), | ||
26 | [MOUR] = LAYOUT_miryoku( | ||
27 | KC_RST, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU, | ||
28 | KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA, KC_NU, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, | ||
29 | KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, | ||
30 | KC_NP, KC_NP, KC_NA, KC_NA, KC_NA, KC_BTN3, KC_BTN1, KC_BTN2, KC_NP, KC_NP | ||
31 | ), | ||
32 | [MEDR] = LAYOUT_miryoku( | ||
33 | KC_RST, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU, | ||
34 | KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA, KC_NU, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, | ||
35 | KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, KC_NU, KC_NU, KC_NU, KC_NU, KC_NU, | ||
36 | KC_NP, KC_NP, KC_NA, KC_NA, KC_NA, KC_MSTP, KC_MPLY, KC_MUTE, KC_NP, KC_NP | ||
37 | ), | ||
38 | [FUNL] = LAYOUT_miryoku( | ||
39 | KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST, | ||
40 | KC_F11, KC_F4, KC_F5, KC_F6, KC_SLCK, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||
41 | KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, | ||
42 | KC_NP, KC_NP, KC_APP, KC_SPC, KC_TAB, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP | ||
43 | ), | ||
44 | [NSL] = LAYOUT_miryoku( | ||
45 | KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST, | ||
46 | KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||
47 | KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, | ||
48 | KC_NP, KC_NP, KC_DOT, KC_0, KC_MINS, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP | ||
49 | ), | ||
50 | [NSSL] = LAYOUT_miryoku( | ||
51 | KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST, | ||
52 | KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||
53 | KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, | ||
54 | KC_NP, KC_NP, KC_GT, KC_RPRN, KC_UNDS, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP | ||
55 | ) | ||
56 | }; | ||
diff --git a/users/manna-harbour_miryoku/miryoku.org b/users/manna-harbour_miryoku/miryoku.org new file mode 100644 index 000000000..556f95f60 --- /dev/null +++ b/users/manna-harbour_miryoku/miryoku.org | |||
@@ -0,0 +1,609 @@ | |||
1 | #+Title: miryoku.org | ||
2 | |||
3 | The miryoku layout is an ergonomic, minimal, orthogonal layout for ergo or ortho | ||
4 | keyboards, implemented as part of the QMK firmware. The layout is maintained in | ||
5 | emacs org-mode tables and converted to QMK keymap data structures using embedded | ||
6 | python scripts. The layout is mapped onto keyboards with different physical | ||
7 | layouts as a subset without code duplication using the QMK userland feature and | ||
8 | C macros. Versions of the layout can also be seen outside of the QMK source at | ||
9 | [[https://github.com/manna-harbour/miryoku/]]. | ||
10 | |||
11 | * Contents | ||
12 | |||
13 | - [[#layout][Layout]] | ||
14 | - [[#code-generation][Code Generation]] | ||
15 | - [[#subset-mapping][Subset Mapping]] | ||
16 | |||
17 | |||
18 | * Layout | ||
19 | :PROPERTIES: | ||
20 | :CUSTOM_ID: layout | ||
21 | :END: | ||
22 | |||
23 | ** Info | ||
24 | |||
25 | *** General Principles | ||
26 | |||
27 | - Use layers instead of reaching. | ||
28 | - Use both hands instead of contortions. | ||
29 | - Use the home positions as much as possible. | ||
30 | - Make full use of the thumbs. | ||
31 | - Avoid unnecessary complication. | ||
32 | |||
33 | |||
34 | *** Specifics | ||
35 | |||
36 | - 5 columns, 3 rows, 3 thumb keys, 2 hands. | ||
37 | - Can be used on almost any split or non-split ergo or ortho keyboard. | ||
38 | - Includes all keys found on a US layout TKL keyboard, plus media keys and | ||
39 | mouse emulation. | ||
40 | - Home row is the middle row, home thumb key is the middle thumb key. | ||
41 | - Maximum 1-u movement from home position for fingers and thumbs, and only | ||
42 | along one axis (except for the inner index finger column which is | ||
43 | deprioritised compared with the home columns). | ||
44 | - Dual-function modifiers on home row, mirrored on both hands. | ||
45 | - Dual-function layer change on thumbs. | ||
46 | - Layers are designed orthogonally with a single purpose per hand and are | ||
47 | accessed by holding a thumb key on the opposite hand. | ||
48 | - Holding layer change and modifiers on one hand combined with a single key | ||
49 | press on the other hand can produce any combination of modifiers and | ||
50 | single keys without any finger contortions. | ||
51 | - Single function mods are also defined on layers on the same hand as the | ||
52 | layer change thumb key so layer change and mods can be held in any order | ||
53 | or simultaneously without race conditions. | ||
54 | - As mods are only enabled on the opposite hand, auto-repeat is available on | ||
55 | the home row on layers for use with cursor and mouse keys. | ||
56 | - Tap-hold auto-repeat is disabled to enable faster tap-hold switching on | ||
57 | thumbs but thumb tap keys are mirrored onto some layers for use with | ||
58 | auto-repeat. | ||
59 | |||
60 | |||
61 | ** Layers | ||
62 | |||
63 | The layers are maintained in tables, with the thumb keys on the bottom row. NP | ||
64 | indicates the key is not present and is used to fill in the table around the | ||
65 | thumb keys. The grid arrangement of the tables does not imply a particular | ||
66 | physical layout. | ||
67 | |||
68 | Basic keycodes are entered without the KC_ prefix. Symbols can be entered as-is | ||
69 | (excepting '"' (DQUO) and '|' (PIPE)). Empty cells are unused. | ||
70 | |||
71 | The base layer has both halves of the layout joined for convenience. Other | ||
72 | layers are specified as a single hand. | ||
73 | |||
74 | *** Base (BASE) | ||
75 | |||
76 | |||
77 | The base layer is maintained as separate tap and hold tables and are combined | ||
78 | into the corresponding tap-hold keycodes for mods and layer change. RST and | ||
79 | mods will be available on sub layers on the same hand as the layer change thumb | ||
80 | key. Unknown names are considered to be layer names. | ||
81 | |||
82 | Base layer alphas are Colemak DHm. Thumb keys are backspace, enter, delete on | ||
83 | the right and space, tab, escape on the left. Dot, comma and apostrophe are | ||
84 | included for prose, dot and slash for file and directory names. | ||
85 | |||
86 | #+NAME: tap | ||
87 | | Q | W | F | P | B | J | L | U | Y | ' | | ||
88 | | A | R | S | T | G | M | N | E | I | O | | ||
89 | | Z | X | C | D | V | K | H | , | . | / | | ||
90 | | NP | NP | ESC | SPC | TAB | ENT | BSPC | DEL | NP | NP | | ||
91 | |||
92 | #+NAME: hold | ||
93 | | RST | | | | | | | | | RST | | ||
94 | | LGUI | LALT | LCTL | LSFT | | | LSFT | LCTL | LALT | LGUI | | ||
95 | | | | | | | | | | | | | ||
96 | | NP | NP | MEDR | NAVR | MOUR | NSSL | NSL | FUNL | NP | NP | | ||
97 | |||
98 | |||
99 | *** Navigation (NAVR) | ||
100 | |||
101 | Primary right-hand layer (left home thumb) is navigation and editing. Cursor | ||
102 | keys are on the home position, line and page movement below, clipboard above, | ||
103 | caps and insert on the inner column. Thumb keys are duplicated from the base | ||
104 | layer to avoid having to layer change mid edit and to enable auto-repeat. | ||
105 | |||
106 | #+NAME: navr | ||
107 | | AGIN | UNDO | CUT | COPY | PSTE | | ||
108 | | CAPS | LEFT | DOWN | UP | RGHT | | ||
109 | | INS | HOME | PGDN | PGUP | END | | ||
110 | | ENT | BSPC | DEL | NP | NP | | ||
111 | |||
112 | |||
113 | *** Mouse (MOUR) | ||
114 | |||
115 | Secondary RH layer is mouse emulation. Mouse movement mirrors cursor navigation | ||
116 | on home and wheel mirrors line / page movement below. Buttons are on the | ||
117 | thumbs. Mouse movement, click, and drag with modifiers can be performed from | ||
118 | the home position. Unused keys are available for other related functions. | ||
119 | |||
120 | #+NAME: mour | ||
121 | | | | | | | | ||
122 | | | MS_L | MS_D | MS_U | MS_R | | ||
123 | | | WH_L | WH_D | WH_U | WH_R | | ||
124 | | BTN3 | BTN1 | BTN2 | NP | NP | | ||
125 | |||
126 | |||
127 | *** Media (MEDR) | ||
128 | |||
129 | Tertiary RH layer is media control, with volume up / down and next / prev | ||
130 | mirroring the navigation keys. Pause, stop and mute are on thumbs. Unused keys | ||
131 | are available for other related functions. | ||
132 | |||
133 | #+NAME: medr | ||
134 | | | | | | | | ||
135 | | | MPRV | VOLD | VOLU | MNXT | | ||
136 | | | | | | | | ||
137 | | MSTP | MPLY | MUTE | NP | NP | | ||
138 | |||
139 | |||
140 | *** Numerals and Symbols (NSL) | ||
141 | |||
142 | Primary left-hand layer (right home thumb) is numerals and symbols. Numerals | ||
143 | are in the standard numpad locations with symbols in the remaining positions. | ||
144 | Dot is duplicated from the base layer for convenience. | ||
145 | |||
146 | #+NAME: nsl | ||
147 | | [ | 7 | 8 | 9 | ] | | ||
148 | | ; | 4 | 5 | 6 | = | | ||
149 | | ` | 1 | 2 | 3 | \ | | ||
150 | | NP | NP | . | 0 | - | | ||
151 | |||
152 | |||
153 | *** Shifted Numerals and Symbols (NSSL) | ||
154 | |||
155 | Secondary LH layer has shifted symbols in the same locations to reduce chording | ||
156 | when using mods with shifted symbols. Automatically generated from unshifted | ||
157 | table. | ||
158 | |||
159 | |||
160 | *** Function and System (FUNL) | ||
161 | |||
162 | Tertiary LH layer has function keys mirroring the numerals on the primary layer | ||
163 | with extras on the pinkie column, plus system keys on the inner column. App | ||
164 | (menu) is on the tertiary thumb key and other thumb keys are duplicated from the | ||
165 | base layer to enable auto-repeat. | ||
166 | |||
167 | |||
168 | #+NAME: funl | ||
169 | | F12 | F7 | F8 | F9 | PSCR | | ||
170 | | F11 | F4 | F5 | F6 | SLCK | | ||
171 | | F10 | F1 | F2 | F3 | PAUS | | ||
172 | | NP | NP | APP | SPC | TAB | | ||
173 | |||
174 | |||
175 | *** COMMENT Templates | ||
176 | |||
177 | #+NAME: tem | ||
178 | | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | | ||
179 | |------+------+------+------+------+------+------+------+------+------| | ||
180 | | | | | | | | | | | | | ||
181 | | | | | | | | | | | | | ||
182 | | | | | | | | | | | | | ||
183 | | NP | NP | | | | | | | NP | NP | | ||
184 | |||
185 | |||
186 | Duplicate base layer tap keys on thumbs rather than trans to enable auto-repeat. | ||
187 | |||
188 | #+NAME: temr | ||
189 | | <l4> | <l4> | <l4> | <l4> | <l4> | | ||
190 | |------+------+------+------+------| | ||
191 | | | | | | | | ||
192 | | | | | | | | ||
193 | | | | | | | | ||
194 | | ENT | BSPC | DEL | NP | NP | | ||
195 | |||
196 | #+NAME: teml | ||
197 | | <l4> | <l4> | <l4> | <l4> | <l4> | | ||
198 | |------+------+------+------+------| | ||
199 | | | | | | | | ||
200 | | | | | | | | ||
201 | | | | | | | | ||
202 | | NP | NP | ESC | SPC | TAB | | ||
203 | |||
204 | |||
205 | * Code Generation | ||
206 | :PROPERTIES: | ||
207 | :CUSTOM_ID: code-generation | ||
208 | :END: | ||
209 | |||
210 | ** Table Conversion Scripts | ||
211 | |||
212 | *** table-layout-taphold | ||
213 | |||
214 | Produce base layer from separate tap and hold tables. | ||
215 | |||
216 | #+NAME: table-layout-taphold | ||
217 | #+BEGIN_SRC python :var tap_table=tap :var hold_table=hold :var symbol_names_table=symbol-names :var mods_list=mods :tangle no :results verbatim | ||
218 | width = 19 | ||
219 | mods_dict = dict.fromkeys(mods_list) | ||
220 | symbol_names_dict = {} | ||
221 | for symbol, name, shifted_symbol, shifted_name in symbol_names_table: | ||
222 | symbol_names_dict[symbol] = name | ||
223 | symbol_names_dict[shifted_symbol] = shifted_name | ||
224 | results = ' [BASE] = LAYOUT_miryoku(\n' | ||
225 | for tap_row, hold_row in map(None, tap_table, hold_table): | ||
226 | results += ' ' | ||
227 | for tap, hold in map(None, tap_row, hold_row): | ||
228 | if tap == '': | ||
229 | code = 'NU' | ||
230 | elif tap in symbol_names_dict: | ||
231 | code = symbol_names_dict[tap] | ||
232 | else: | ||
233 | code = tap | ||
234 | code = 'KC_' + str(code) | ||
235 | if hold in mods_dict: | ||
236 | code = str(hold) + '_T(' + code + ')' | ||
237 | elif hold != '' and hold != 'NP' and hold != 'RST': | ||
238 | code = 'LT(' + str(hold) + ', ' + code + ')' | ||
239 | results += (code + ', ').ljust(width) | ||
240 | results = results.rstrip(' ') + '\n' | ||
241 | results = results.rstrip('\n, ') + '\n )' | ||
242 | return results | ||
243 | #+END_SRC | ||
244 | |||
245 | #+RESULTS: table-layout-taphold | ||
246 | : [BASE] = LAYOUT_miryoku( | ||
247 | : KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, | ||
248 | : LGUI_T(KC_A), LALT_T(KC_R), LCTL_T(KC_S), LSFT_T(KC_T), KC_G, KC_M, LSFT_T(KC_N), LCTL_T(KC_E), LALT_T(KC_I), LGUI_T(KC_O), | ||
249 | : KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, | ||
250 | : KC_NP, KC_NP, LT(MEDR, KC_ESC), LT(NAVR, KC_SPC), LT(MOUR, KC_TAB), LT(NSSL, KC_ENT), LT(NSL, KC_BSPC), LT(FUNL, KC_DEL), KC_NP, KC_NP | ||
251 | : ) | ||
252 | |||
253 | |||
254 | *** table-layout-half | ||
255 | |||
256 | Produce sub layers given layer name and corresponding table for single hand and | ||
257 | incorporating mods and reset from base layer. Layer names must end with R or L. | ||
258 | A layer with shifted symbols can also be generated. | ||
259 | |||
260 | #+NAME: table-layout-half | ||
261 | #+BEGIN_SRC python :var hold_table=hold :var layer_name="NSL" :var half_table=nsl :var symbol_names_table=symbol-names :var mods_list=mods :var shift="false" :tangle no :results verbatim | ||
262 | width = 9 | ||
263 | mods_dict = dict.fromkeys(mods_list) | ||
264 | symbol_names_dict = {} | ||
265 | shifted_symbol_names_dict = {} | ||
266 | for symbol, name, shifted_symbol, shifted_name in symbol_names_table: | ||
267 | symbol_names_dict[symbol] = name | ||
268 | symbol_names_dict[shifted_symbol] = shifted_name | ||
269 | shifted_symbol_names_dict[symbol] = shifted_name | ||
270 | length = len(half_table[0]) | ||
271 | mode = layer_name[-1:].lower() | ||
272 | results = ' [' + layer_name + '] = LAYOUT_miryoku(\n' | ||
273 | for half_row, hold_row in map(None, half_table, hold_table): | ||
274 | results += ' ' | ||
275 | hold_row_l, hold_row_r = hold_row[:length], hold_row[length:] | ||
276 | for lr, hold_row_lr in ('l', hold_row_l), ('r', hold_row_r): | ||
277 | if lr == mode: | ||
278 | for half in half_row: | ||
279 | if half == '': | ||
280 | code = 'NU' | ||
281 | elif shift == "true" and half in shifted_symbol_names_dict: | ||
282 | code = shifted_symbol_names_dict[half] | ||
283 | elif half in symbol_names_dict: | ||
284 | code = symbol_names_dict[half] | ||
285 | else: | ||
286 | code = half | ||
287 | results += ('KC_' + str(code) + ', ').ljust(width) | ||
288 | else: | ||
289 | for hold in hold_row_lr: | ||
290 | if hold == '' or hold != 'NP' and hold != 'RST' and hold not in mods_dict: | ||
291 | code = 'NA' | ||
292 | else: | ||
293 | code = hold | ||
294 | results += ('KC_' + str(code) + ', ').ljust(width) | ||
295 | results = results.rstrip(' ') + '\n' | ||
296 | results = results.rstrip('\n, ') + '\n )' | ||
297 | return results | ||
298 | #+END_SRC | ||
299 | |||
300 | #+RESULTS: table-layout-half | ||
301 | : [NSL] = LAYOUT_miryoku( | ||
302 | : KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, KC_NA, KC_NA, KC_NA, KC_NA, KC_RST, | ||
303 | : KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, KC_NA, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||
304 | : KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, KC_NA, KC_NA, KC_NA, KC_NA, KC_NA, | ||
305 | : KC_NP, KC_NP, KC_DOT, KC_0, KC_MINS, KC_NA, KC_NA, KC_NA, KC_NP, KC_NP | ||
306 | : ) | ||
307 | |||
308 | |||
309 | *** table-enums | ||
310 | |||
311 | Produce layer enums from layer names in hold table. | ||
312 | |||
313 | #+NAME: table-enums | ||
314 | #+BEGIN_SRC python :var hold_table=hold :var mods_list=mods :tangle no | ||
315 | mods_dict = dict.fromkeys(mods_list) | ||
316 | results = 'enum layers { BASE, ' | ||
317 | for hold_row in hold_table: | ||
318 | for hold in hold_row: | ||
319 | if hold not in mods_dict and hold != '' and hold != 'NP' and hold != 'RST': | ||
320 | results += hold + ', ' | ||
321 | results = results.rstrip(', ') + ' };' | ||
322 | return results | ||
323 | #+END_SRC | ||
324 | |||
325 | #+RESULTS: table-enums | ||
326 | : enum layers { BASE, MEDR, NAVR, MOUR, NSSL, NSL, FUNL }; | ||
327 | |||
328 | |||
329 | ** Data | ||
330 | |||
331 | *** symbol-names | ||
332 | |||
333 | Symbol, name, and shifted symbol mappings for use in tables. | ||
334 | |||
335 | #+NAME: symbol-names | ||
336 | | ` | GRV | ~ | TILD | | ||
337 | | - | MINS | _ | UNDS | | ||
338 | | = | EQL | + | PLUS | | ||
339 | | [ | LBRC | { | LCBR | | ||
340 | | ] | RBRC | } | RCBR | | ||
341 | | \ | BSLS | PIPE | PIPE | | ||
342 | | ; | SCLN | : | COLN | | ||
343 | | ' | QUOT | DQUO | DQUO | | ||
344 | | , | COMM | < | LT | | ||
345 | | . | DOT | > | GT | | ||
346 | | / | SLSH | ? | QUES | | ||
347 | | 1 | 1 | ! | EXLM | | ||
348 | | 2 | 2 | @ | AT | | ||
349 | | 3 | 3 | # | HASH | | ||
350 | | 4 | 4 | $ | DLR | | ||
351 | | 5 | 5 | % | PERC | | ||
352 | | 6 | 6 | ^ | CIRC | | ||
353 | | 7 | 7 | & | AMPR | | ||
354 | | 8 | 8 | * | ASTR | | ||
355 | | 9 | 9 | ( | LPRN | | ||
356 | | 0 | 0 | ) | RPRN | | ||
357 | |||
358 | |||
359 | *** mods | ||
360 | |||
361 | Modifiers usable in hold table. Need to have the same name for KC_ and _T versions. | ||
362 | |||
363 | #+NAME: mods | ||
364 | - LSFT | ||
365 | - LCTL | ||
366 | - LALT | ||
367 | - LGUI | ||
368 | - LAGR | ||
369 | |||
370 | |||
371 | ** Other | ||
372 | |||
373 | *** header | ||
374 | |||
375 | Header for tangled src files. | ||
376 | |||
377 | #+NAME: header | ||
378 | #+BEGIN_SRC C :tangle no | ||
379 | generated from users/manna-harbour_miryoku/miryoku.org | ||
380 | #+END_SRC | ||
381 | |||
382 | |||
383 | * Subset Mapping | ||
384 | :PROPERTIES: | ||
385 | :CUSTOM_ID: subset-mapping | ||
386 | :END: | ||
387 | |||
388 | ** Userspace | ||
389 | |||
390 | The keymap and configuration are shared between keyboards. The keymap is | ||
391 | defined for LAYOUT_miryoku which is 10x4, with the outer 2 positions on the | ||
392 | bottom row unused and the rest of the bottom row are the thumb keys. | ||
393 | |||
394 | |||
395 | *** manna-harbour_miryoku.c | ||
396 | |||
397 | Contains the keymap. Included from keymap.c | ||
398 | |||
399 | [[./manna-harbour_miryoku.c][users/manna-harbour_miryoku/manna-harbour_miryoku.c]] | ||
400 | #+BEGIN_SRC C :noweb yes :tangle manna-harbour_miryoku.c | ||
401 | |||
402 | // <<header>> | ||
403 | |||
404 | #include QMK_KEYBOARD_H | ||
405 | |||
406 | #define KC_NP KC_NO // key is not present | ||
407 | #define KC_NA KC_NO // present but not available for use | ||
408 | #define KC_NU KC_NO // available but not used | ||
409 | #define KC_RST RESET | ||
410 | |||
411 | <<table-enums()>> | ||
412 | |||
413 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
414 | <<table-layout-taphold()>>, | ||
415 | <<table-layout-half(layer_name="NAVR", half_table=navr)>>, | ||
416 | <<table-layout-half(layer_name="MOUR", half_table=mour)>>, | ||
417 | <<table-layout-half(layer_name="MEDR", half_table=medr)>>, | ||
418 | <<table-layout-half(layer_name="FUNL", half_table=funl)>>, | ||
419 | <<table-layout-half(layer_name="NSL", half_table=nsl)>>, | ||
420 | <<table-layout-half(layer_name="NSSL", half_table=nsl, shift="true")>> | ||
421 | }; | ||
422 | #+END_SRC | ||
423 | |||
424 | |||
425 | *** config.h | ||
426 | |||
427 | Config options. Automatically included. | ||
428 | |||
429 | [[./config.h][users/manna-harbour_miryoku/config.h]] | ||
430 | #+BEGIN_SRC C :noweb yes :tangle config.h | ||
431 | |||
432 | // <<header>> | ||
433 | |||
434 | #pragma once | ||
435 | |||
436 | // Prevent normal rollover on alphas from accidentally triggering mods. | ||
437 | #define IGNORE_MOD_TAP_INTERRUPT | ||
438 | |||
439 | // Enable rapid switch from tap to hold, disables double tap hold auto-repeat. | ||
440 | #define TAPPING_FORCE_HOLD | ||
441 | |||
442 | // Recommended for heavy chording. | ||
443 | #define QMK_KEYS_PER_SCAN 4 | ||
444 | |||
445 | #+END_SRC | ||
446 | |||
447 | |||
448 | *** rules.mk | ||
449 | |||
450 | Build options. Automatically included. | ||
451 | |||
452 | [[./rules.mk][users/manna-harbour_miryoku/rules.mk]] | ||
453 | #+BEGIN_SRC makefile :noweb yes :tangle rules.mk | ||
454 | |||
455 | # <<header>> | ||
456 | |||
457 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | ||
458 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | ||
459 | |||
460 | #+END_SRC | ||
461 | |||
462 | |||
463 | ** Layouts | ||
464 | |||
465 | To use the keymap on a keyboard supporting the layouts feature, LAYOUT_miryoku | ||
466 | is defined as a macro mapping onto the layout's own LAYOUT macro, leaving the | ||
467 | unused keys as KC_NO. The userspace keymap is then included. | ||
468 | |||
469 | *** ergodox | ||
470 | |||
471 | For the ergodox layout, the main 5x3 alphas are used as usual. The primary and | ||
472 | secondary thumb keys are the inner and outer 2u thumb keys and the tertiary | ||
473 | thumb key is the innermost key of the partial bottom row. The remaining keys | ||
474 | are unused. | ||
475 | |||
476 | [[../../layouts/community/ergodox/manna-harbour_miryoku/keymap.c][layouts/community/ergodox/manna-harbour_miryoku/keymap.c]] | ||
477 | #+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ergodox/manna-harbour_miryoku/keymap.c | ||
478 | |||
479 | // <<header>> | ||
480 | |||
481 | #define LAYOUT_miryoku(\ | ||
482 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09,\ | ||
483 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19,\ | ||
484 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29,\ | ||
485 | N30, N31, K32, K33, K34, K35, K36, K37, N38, N39\ | ||
486 | )\ | ||
487 | LAYOUT_ergodox_pretty( \ | ||
488 | KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ | ||
489 | KC_NO, K00, K01, K02, K03, K04, KC_NO, KC_NO, K05, K06, K07, K08, K09, KC_NO, \ | ||
490 | KC_NO, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KC_NO, \ | ||
491 | KC_NO, K20, K21, K22, K23, K24, KC_NO, KC_NO, K25, K26, K27, K28, K29, KC_NO, \ | ||
492 | KC_NO, KC_NO, KC_NO, KC_NO, K32, K37, KC_NO, KC_NO, KC_NO, KC_NO, \ | ||
493 | KC_NO, KC_NO, KC_NO, KC_NO, \ | ||
494 | KC_NO, KC_NO, \ | ||
495 | K33, K34, KC_NO, KC_NO, K35, K36 \ | ||
496 | ) | ||
497 | |||
498 | #include "manna-harbour_miryoku.c" | ||
499 | |||
500 | #+END_SRC | ||
501 | |||
502 | To build for any keyboard using the this layout (ergodone, ergodox_ez, | ||
503 | ergodox_infinity, hotdox) e.g. the ergodox_ez, | ||
504 | |||
505 | #+BEGIN_SRC sh :tangle no | ||
506 | cd ../.. && make ergodox_ez:manna-harbour_miryoku:teensy | ||
507 | #+END_SRC | ||
508 | |||
509 | |||
510 | |||
511 | *** ortho_4x12 | ||
512 | |||
513 | For the ortho_4x12 layout, the right half as is as follows: The rightmost column | ||
514 | bottom 3 rows is the pinkie column. The middle 4 columns top 3 rows are for the | ||
515 | remaining fingers. The bottom row left 3 columns are the thumb keys. The | ||
516 | remaining keys are unused. | ||
517 | |||
518 | [[../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c][layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c]] | ||
519 | #+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c | ||
520 | |||
521 | // <<header>> | ||
522 | |||
523 | #define LAYOUT_miryoku(\ | ||
524 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09,\ | ||
525 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19,\ | ||
526 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29,\ | ||
527 | N30, N31, K32, K33, K34, K35, K36, K37, N38, N39\ | ||
528 | )\ | ||
529 | LAYOUT_ortho_4x12(\ | ||
530 | KC_NO, K01, K02, K03, K04, KC_NO, KC_NO, K05, K06, K07, K08, KC_NO,\ | ||
531 | K00, K11, K12, K13, K14, KC_NO, KC_NO, K15, K16, K17, K18, K09,\ | ||
532 | K10, K21, K22, K23, K24, KC_NO, KC_NO, K25, K26, K27, K28, K19,\ | ||
533 | K20, KC_NO, KC_NO, K32, K33, K34, K35, K36, K37, KC_NO, KC_NO, K29\ | ||
534 | ) | ||
535 | |||
536 | #include "manna-harbour_miryoku.c" | ||
537 | |||
538 | #+END_SRC | ||
539 | |||
540 | To build for any keyboard using this layout (4x4, nori, chimera_ls, contra, | ||
541 | divergetm2, jj40, lets_split, lets_split_eh, meira, niu_mini, planck, telophase, | ||
542 | vitamins_included, zinc, zlant, ortho48, kbd4x, levinson, wavelet, plaid) | ||
543 | e.g. the levinson, | ||
544 | |||
545 | #+BEGIN_SRC sh :tangle no | ||
546 | make keebio/levinson:manna-harbour_miryoku:avrdude | ||
547 | #+END_SRC | ||
548 | |||
549 | |||
550 | ** Keyboards | ||
551 | |||
552 | To use the keymap on a keyboard which does not support the layouts feature, | ||
553 | LAYOUT_miryoku is defined as a macro mapping onto the keyboard's own LAYOUT | ||
554 | macro, leaving the unused keys as KC_NO. The userspace keymap is then included. | ||
555 | |||
556 | |||
557 | *** crkbd | ||
558 | |||
559 | The outer columns are unused. | ||
560 | |||
561 | [[../../keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c][keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c]] | ||
562 | #+BEGIN_SRC C :noweb yes :tangle ../../keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c | ||
563 | |||
564 | // <<header>> | ||
565 | |||
566 | #define LAYOUT_miryoku( \ | ||
567 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, \ | ||
568 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \ | ||
569 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \ | ||
570 | N30, N31, K32, K33, K34, K35, K36, K37, N38, N39 \ | ||
571 | ) \ | ||
572 | LAYOUT( \ | ||
573 | KC_NO, K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, KC_NO, \ | ||
574 | KC_NO, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KC_NO, \ | ||
575 | KC_NO, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, KC_NO, \ | ||
576 | K32, K33, K34, K35, K36, K37 \ | ||
577 | ) | ||
578 | |||
579 | #include "manna-harbour_miryoku.c" | ||
580 | |||
581 | #+END_SRC | ||
582 | |||
583 | To build for this keyboard, | ||
584 | |||
585 | #+BEGIN_SRC sh :tangle no | ||
586 | cd ../.. && make crkbd:manna-harbour_miryoku:avrdude | ||
587 | #+END_SRC | ||
588 | |||
589 | |||
590 | * Related Documentation | ||
591 | |||
592 | ** QMK | ||
593 | |||
594 | - https://qmk.fm/ | ||
595 | - https://docs.qmk.fm/#/getting_started_introduction | ||
596 | - https://docs.qmk.fm/#/hardware_keyboard_guidelines | ||
597 | - https://docs.qmk.fm/#/config_options | ||
598 | - https://docs.qmk.fm/#/keycodes | ||
599 | - https://docs.qmk.fm/#/feature_advanced_keycodes | ||
600 | - https://docs.qmk.fm/#/feature_layouts | ||
601 | - https://docs.qmk.fm/#/feature_userspace | ||
602 | - https://docs.qmk.fm/#/getting_started_make_guide | ||
603 | |||
604 | |||
605 | ** Org Mode | ||
606 | |||
607 | - https://orgmode.org/ | ||
608 | - https://orgmode.org/manual/Tables.html | ||
609 | - https://orgmode.org/manual/Working-with-Source-Code.html | ||
diff --git a/users/manna-harbour_miryoku/rules.mk b/users/manna-harbour_miryoku/rules.mk new file mode 100644 index 000000000..baff1431f --- /dev/null +++ b/users/manna-harbour_miryoku/rules.mk | |||
@@ -0,0 +1,5 @@ | |||
1 | |||
2 | # generated from users/manna-harbour_miryoku/miryoku.org | ||
3 | |||
4 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | ||
5 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | ||