[Keymap] miryoku layout (#6171)
* First release * add "#pragma once" to config.h and related docs * generate config.h with change from miryoku.org
This commit is contained in:
		
				
					committed by
					
						 Drashna Jaelre
						Drashna Jaelre
					
				
			
			
				
	
			
			
			
						parent
						
							3483c51f62
						
					
				
				
					commit
					4be1dfcee4
				
			
							
								
								
									
										17
									
								
								keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
|  | ||||
| // generated from users/manna-harbour_miryoku/miryoku.org | ||||
|  | ||||
| #define LAYOUT_miryoku( \ | ||||
|        K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09, \ | ||||
|        K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19, \ | ||||
|        K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29, \ | ||||
|        N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39 \ | ||||
| ) \ | ||||
| LAYOUT( \ | ||||
| KC_NO, K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,   KC_NO, \ | ||||
| KC_NO, K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,   KC_NO, \ | ||||
| KC_NO, K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,   KC_NO, \ | ||||
|                      K32,   K33,   K34,   K35,   K36,   K37 \ | ||||
| ) | ||||
|  | ||||
| #include "manna-harbour_miryoku.c" | ||||
							
								
								
									
										21
									
								
								layouts/community/ergodox/manna-harbour_miryoku/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								layouts/community/ergodox/manna-harbour_miryoku/keymap.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
|  | ||||
| // generated from users/manna-harbour_miryoku/miryoku.org | ||||
|  | ||||
| #define LAYOUT_miryoku(\ | ||||
| K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,\ | ||||
| K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,\ | ||||
| K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,\ | ||||
| N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39\ | ||||
| )\ | ||||
| LAYOUT_ergodox_pretty( \ | ||||
| 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, \ | ||||
| KC_NO, K00,   K01,   K02,   K03,   K04,   KC_NO, KC_NO, K05,   K06,   K07,   K08,   K09,   KC_NO, \ | ||||
| KC_NO, K10,   K11,   K12,   K13,   K14,                 K15,   K16,   K17,   K18,   K19,   KC_NO, \ | ||||
| KC_NO, K20,   K21,   K22,   K23,   K24,   KC_NO, KC_NO, K25,   K26,   K27,   K28,   K29,   KC_NO, \ | ||||
| KC_NO, KC_NO, KC_NO, KC_NO, K32,                               K37,   KC_NO, KC_NO, KC_NO, KC_NO, \ | ||||
|                                    KC_NO, KC_NO, KC_NO, KC_NO, \ | ||||
|                                           KC_NO, KC_NO, \ | ||||
|                             K33,   K34,   KC_NO, KC_NO, K35,   K36 \ | ||||
| ) | ||||
|  | ||||
| #include "manna-harbour_miryoku.c" | ||||
							
								
								
									
										17
									
								
								layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
|  | ||||
| // generated from users/manna-harbour_miryoku/miryoku.org | ||||
|  | ||||
| #define LAYOUT_miryoku(\ | ||||
| K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,\ | ||||
| K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,\ | ||||
| K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,\ | ||||
| N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39\ | ||||
| )\ | ||||
| LAYOUT_ortho_4x12(\ | ||||
| KC_NO, K01,   K02,   K03,   K04,   KC_NO, KC_NO, K05,   K06,   K07,   K08,   KC_NO,\ | ||||
| K00,   K11,   K12,   K13,   K14,   KC_NO, KC_NO, K15,   K16,   K17,   K18,   K09,\ | ||||
| K10,   K21,   K22,   K23,   K24,   KC_NO, KC_NO, K25,   K26,   K27,   K28,   K19,\ | ||||
| K20,   KC_NO, KC_NO, K32,   K33,   K34,   K35,   K36,   K37,   KC_NO, KC_NO, K29\ | ||||
| ) | ||||
|  | ||||
| #include "manna-harbour_miryoku.c" | ||||
							
								
								
									
										1
									
								
								users/manna-harbour_miryoku/README.org
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								users/manna-harbour_miryoku/README.org
									
									
									
									
									
										Symbolic link
									
								
							| @@ -0,0 +1 @@ | ||||
| miryoku.org | ||||
							
								
								
									
										13
									
								
								users/manna-harbour_miryoku/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								users/manna-harbour_miryoku/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
|  | ||||
| // generated from users/manna-harbour_miryoku/miryoku.org | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| // Prevent normal rollover on alphas from accidentally triggering mods. | ||||
| #define IGNORE_MOD_TAP_INTERRUPT | ||||
|  | ||||
| // Enable rapid switch from tap to hold, disables double tap hold auto-repeat. | ||||
| #define TAPPING_FORCE_HOLD | ||||
|  | ||||
| // Recommended for heavy chording. | ||||
| #define QMK_KEYS_PER_SCAN 4 | ||||
							
								
								
									
										56
									
								
								users/manna-harbour_miryoku/manna-harbour_miryoku.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								users/manna-harbour_miryoku/manna-harbour_miryoku.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
|  | ||||
| // generated from users/manna-harbour_miryoku/miryoku.org | ||||
|  | ||||
| #include QMK_KEYBOARD_H | ||||
|  | ||||
| #define KC_NP KC_NO // key is not present | ||||
| #define KC_NA KC_NO // present but not available for use | ||||
| #define KC_NU KC_NO // available but not used | ||||
| #define KC_RST RESET | ||||
|  | ||||
| enum layers { BASE, MEDR, NAVR, MOUR, NSSL, NSL, FUNL }; | ||||
|  | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|   [BASE] = LAYOUT_miryoku( | ||||
|     KC_Q,              KC_W,              KC_F,              KC_P,              KC_B,              KC_J,              KC_L,              KC_U,              KC_Y,              KC_QUOT, | ||||
|     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), | ||||
|     KC_Z,              KC_X,              KC_C,              KC_D,              KC_V,              KC_K,              KC_H,              KC_COMM,           KC_DOT,            KC_SLSH, | ||||
|     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 | ||||
|   ), | ||||
|   [NAVR] = LAYOUT_miryoku( | ||||
|     KC_RST,  KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_AGIN, KC_UNDO, KC_CUT,  KC_COPY, KC_PSTE, | ||||
|     KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA,   KC_CAPS, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, | ||||
|     KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_INS,  KC_HOME, KC_PGDN, KC_PGUP, KC_END, | ||||
|     KC_NP,   KC_NP,   KC_NA,   KC_NA,   KC_NA,   KC_ENT,  KC_BSPC, KC_DEL,  KC_NP,   KC_NP | ||||
|   ), | ||||
|   [MOUR] = LAYOUT_miryoku( | ||||
|     KC_RST,  KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_NU,   KC_NU,   KC_NU,   KC_NU, | ||||
|     KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA,   KC_NU,   KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, | ||||
|     KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, | ||||
|     KC_NP,   KC_NP,   KC_NA,   KC_NA,   KC_NA,   KC_BTN3, KC_BTN1, KC_BTN2, KC_NP,   KC_NP | ||||
|   ), | ||||
|   [MEDR] = LAYOUT_miryoku( | ||||
|     KC_RST,  KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_NU,   KC_NU,   KC_NU,   KC_NU, | ||||
|     KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_NA,   KC_NU,   KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, | ||||
|     KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NU,   KC_NU,   KC_NU,   KC_NU,   KC_NU, | ||||
|     KC_NP,   KC_NP,   KC_NA,   KC_NA,   KC_NA,   KC_MSTP, KC_MPLY, KC_MUTE, KC_NP,   KC_NP | ||||
|   ), | ||||
|   [FUNL] = LAYOUT_miryoku( | ||||
|     KC_F12,  KC_F7,   KC_F8,   KC_F9,   KC_PSCR, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST, | ||||
|     KC_F11,  KC_F4,   KC_F5,   KC_F6,   KC_SLCK, KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||||
|     KC_F10,  KC_F1,   KC_F2,   KC_F3,   KC_PAUS, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA, | ||||
|     KC_NP,   KC_NP,   KC_APP,  KC_SPC,  KC_TAB,  KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP | ||||
|   ), | ||||
|   [NSL] = LAYOUT_miryoku( | ||||
|     KC_LBRC, KC_7,    KC_8,    KC_9,    KC_RBRC, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST, | ||||
|     KC_SCLN, KC_4,    KC_5,    KC_6,    KC_EQL,  KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||||
|     KC_GRV,  KC_1,    KC_2,    KC_3,    KC_BSLS, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA, | ||||
|     KC_NP,   KC_NP,   KC_DOT,  KC_0,    KC_MINS, KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP | ||||
|   ), | ||||
|   [NSSL] = LAYOUT_miryoku( | ||||
|     KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST, | ||||
|     KC_COLN, KC_DLR,  KC_PERC, KC_CIRC, KC_PLUS, KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||||
|     KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_PIPE, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA, | ||||
|     KC_NP,   KC_NP,   KC_GT,   KC_RPRN, KC_UNDS, KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP | ||||
|   ) | ||||
| }; | ||||
							
								
								
									
										609
									
								
								users/manna-harbour_miryoku/miryoku.org
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										609
									
								
								users/manna-harbour_miryoku/miryoku.org
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,609 @@ | ||||
| #+Title: miryoku.org | ||||
|  | ||||
| The miryoku layout is an ergonomic, minimal, orthogonal layout for ergo or ortho | ||||
| keyboards, implemented as part of the QMK firmware.  The layout is maintained in | ||||
| emacs org-mode tables and converted to QMK keymap data structures using embedded | ||||
| python scripts.  The layout is mapped onto keyboards with different physical | ||||
| layouts as a subset without code duplication using the QMK userland feature and | ||||
| C macros.  Versions of the layout can also be seen outside of the QMK source at | ||||
| [[https://github.com/manna-harbour/miryoku/]]. | ||||
|  | ||||
| * Contents | ||||
|  | ||||
| - [[#layout][Layout]] | ||||
| - [[#code-generation][Code Generation]] | ||||
| - [[#subset-mapping][Subset Mapping]] | ||||
|  | ||||
|  | ||||
| * Layout | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: layout | ||||
| :END: | ||||
|  | ||||
| ** Info | ||||
|  | ||||
| *** General Principles | ||||
|  | ||||
|     - Use layers instead of reaching. | ||||
|     - Use both hands instead of contortions. | ||||
|     - Use the home positions as much as possible. | ||||
|     - Make full use of the thumbs. | ||||
|     - Avoid unnecessary complication. | ||||
|  | ||||
|  | ||||
| *** Specifics | ||||
|  | ||||
|     - 5 columns, 3 rows, 3 thumb keys, 2 hands. | ||||
|     - Can be used on almost any split or non-split ergo or ortho keyboard. | ||||
|     - Includes all keys found on a US layout TKL keyboard, plus media keys and | ||||
|       mouse emulation. | ||||
|     - Home row is the middle row, home thumb key is the middle thumb key. | ||||
|     - Maximum 1-u movement from home position for fingers and thumbs, and only | ||||
|       along one axis (except for the inner index finger column which is | ||||
|       deprioritised compared with the home columns). | ||||
|     - Dual-function modifiers on home row, mirrored on both hands. | ||||
|     - Dual-function layer change on thumbs. | ||||
|     - Layers are designed orthogonally with a single purpose per hand and are | ||||
|       accessed by holding a thumb key on the opposite hand. | ||||
|     - Holding layer change and modifiers on one hand combined with a single key | ||||
|       press on the other hand can produce any combination of modifiers and | ||||
|       single keys without any finger contortions. | ||||
|     - Single function mods are also defined on layers on the same hand as the | ||||
|       layer change thumb key so layer change and mods can be held in any order | ||||
|       or simultaneously without race conditions. | ||||
|     - As mods are only enabled on the opposite hand, auto-repeat is available on | ||||
|       the home row on layers for use with cursor and mouse keys. | ||||
|     - Tap-hold auto-repeat is disabled to enable faster tap-hold switching on | ||||
|       thumbs but thumb tap keys are mirrored onto some layers for use with | ||||
|       auto-repeat. | ||||
|  | ||||
|  | ||||
| ** Layers | ||||
|  | ||||
| The layers are maintained in tables, with the thumb keys on the bottom row.  NP | ||||
| indicates the key is not present and is used to fill in the table around the | ||||
| thumb keys.  The grid arrangement of the tables does not imply a particular | ||||
| physical layout. | ||||
|  | ||||
| Basic keycodes are entered without the KC_ prefix.  Symbols can be entered as-is | ||||
| (excepting '"' (DQUO) and '|' (PIPE)).  Empty cells are unused. | ||||
|  | ||||
| The base layer has both halves of the layout joined for convenience.  Other | ||||
| layers are specified as a single hand. | ||||
|  | ||||
| *** Base (BASE) | ||||
|  | ||||
|  | ||||
| The base layer is maintained as separate tap and hold tables and are combined | ||||
| into the corresponding tap-hold keycodes for mods and layer change.  RST and | ||||
| mods will be available on sub layers on the same hand as the layer change thumb | ||||
| key.  Unknown names are considered to be layer names. | ||||
|  | ||||
| Base layer alphas are Colemak DHm.  Thumb keys are backspace, enter, delete on | ||||
| the right and space, tab, escape on the left.  Dot, comma and apostrophe are | ||||
| included for prose, dot and slash for file and directory names. | ||||
|  | ||||
| #+NAME: tap | ||||
| | Q    | W    | F    | P    | B    | J    | L    | U    | Y    | '    | | ||||
| | A    | R    | S    | T    | G    | M    | N    | E    | I    | O    | | ||||
| | Z    | X    | C    | D    | V    | K    | H    | ,    | .    | /    | | ||||
| | NP   | NP   | ESC  | SPC  | TAB  | ENT  | BSPC | DEL  | NP   | NP   | | ||||
|  | ||||
| #+NAME: hold | ||||
| | RST  |      |      |      |      |      |      |      |      | RST  | | ||||
| | LGUI | LALT | LCTL | LSFT |      |      | LSFT | LCTL | LALT | LGUI | | ||||
| |      |      |      |      |      |      |      |      |      |      | | ||||
| | NP   | NP   | MEDR | NAVR | MOUR | NSSL | NSL  | FUNL | NP   | NP   | | ||||
|  | ||||
|  | ||||
| *** Navigation (NAVR) | ||||
|  | ||||
| Primary right-hand layer (left home thumb) is navigation and editing.  Cursor | ||||
| keys are on the home position, line and page movement below, clipboard above, | ||||
| caps and insert on the inner column.  Thumb keys are duplicated from the base | ||||
| layer to avoid having to layer change mid edit and to enable auto-repeat. | ||||
|  | ||||
| #+NAME: navr | ||||
| | AGIN | UNDO | CUT  | COPY | PSTE | | ||||
| | CAPS | LEFT | DOWN | UP   | RGHT | | ||||
| | INS  | HOME | PGDN | PGUP | END  | | ||||
| | ENT  | BSPC | DEL  | NP   | NP   | | ||||
|  | ||||
|  | ||||
| *** Mouse (MOUR) | ||||
|  | ||||
| Secondary RH layer is mouse emulation.  Mouse movement mirrors cursor navigation | ||||
| on home and wheel mirrors line / page movement below.  Buttons are on the | ||||
| thumbs.  Mouse movement, click, and drag with modifiers can be performed from | ||||
| the home position.  Unused keys are available for other related functions. | ||||
|  | ||||
| #+NAME: mour | ||||
| |      |      |      |      |      | | ||||
| |      | MS_L | MS_D | MS_U | MS_R | | ||||
| |      | WH_L | WH_D | WH_U | WH_R | | ||||
| | BTN3 | BTN1 | BTN2 | NP   | NP   | | ||||
|  | ||||
|  | ||||
| *** Media (MEDR) | ||||
|  | ||||
| Tertiary RH layer is media control, with volume up / down and next / prev | ||||
| mirroring the navigation keys.  Pause, stop and mute are on thumbs.  Unused keys | ||||
| are available for other related functions. | ||||
|  | ||||
| #+NAME: medr | ||||
| |      |      |      |      |      | | ||||
| |      | MPRV | VOLD | VOLU | MNXT | | ||||
| |      |      |      |      |      | | ||||
| | MSTP | MPLY | MUTE | NP   | NP   | | ||||
|  | ||||
|  | ||||
| *** Numerals and Symbols (NSL) | ||||
|  | ||||
| Primary left-hand layer (right home thumb) is numerals and symbols.  Numerals | ||||
| are in the standard numpad locations with symbols in the remaining positions. | ||||
| Dot is duplicated from the base layer for convenience. | ||||
|  | ||||
| #+NAME: nsl | ||||
| | [    | 7    | 8    | 9    | ]    | | ||||
| | ;    | 4    | 5    | 6    | =    | | ||||
| | `    | 1    | 2    | 3    | \    | | ||||
| | NP   | NP   | .    | 0    | -    | | ||||
|  | ||||
|  | ||||
| *** Shifted Numerals and Symbols (NSSL) | ||||
|  | ||||
| Secondary LH layer has shifted symbols in the same locations to reduce chording | ||||
| when using mods with shifted symbols.  Automatically generated from unshifted | ||||
| table. | ||||
|  | ||||
|  | ||||
| *** Function and System (FUNL) | ||||
|  | ||||
| Tertiary LH layer has function keys mirroring the numerals on the primary layer | ||||
| with extras on the pinkie column, plus system keys on the inner column.  App | ||||
| (menu) is on the tertiary thumb key and other thumb keys are duplicated from the | ||||
| base layer to enable auto-repeat. | ||||
|  | ||||
|  | ||||
| #+NAME: funl | ||||
| | F12  | F7   | F8   | F9   | PSCR | | ||||
| | F11  | F4   | F5   | F6   | SLCK | | ||||
| | F10  | F1   | F2   | F3   | PAUS | | ||||
| | NP   | NP   | APP  | SPC  | TAB  | | ||||
|  | ||||
|  | ||||
| *** COMMENT Templates | ||||
|  | ||||
| #+NAME: tem | ||||
| | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | <l4> | | ||||
| |------+------+------+------+------+------+------+------+------+------| | ||||
| |      |      |      |      |      |      |      |      |      |      | | ||||
| |      |      |      |      |      |      |      |      |      |      | | ||||
| |      |      |      |      |      |      |      |      |      |      | | ||||
| | NP   | NP   |      |      |      |      |      |      | NP   | NP   | | ||||
|  | ||||
|  | ||||
| Duplicate base layer tap keys on thumbs rather than trans to enable auto-repeat. | ||||
|  | ||||
| #+NAME: temr | ||||
| | <l4> | <l4> | <l4> | <l4> | <l4> | | ||||
| |------+------+------+------+------| | ||||
| |      |      |      |      |      | | ||||
| |      |      |      |      |      | | ||||
| |      |      |      |      |      | | ||||
| | ENT  | BSPC | DEL  | NP   | NP   | | ||||
|  | ||||
| #+NAME: teml | ||||
| | <l4> | <l4> | <l4> | <l4> | <l4> | | ||||
| |------+------+------+------+------| | ||||
| |      |      |      |      |      | | ||||
| |      |      |      |      |      | | ||||
| |      |      |      |      |      | | ||||
| | NP   | NP   | ESC  | SPC  | TAB  | | ||||
|  | ||||
|  | ||||
| * Code Generation | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: code-generation | ||||
| :END: | ||||
|  | ||||
| ** Table Conversion Scripts | ||||
|  | ||||
| *** table-layout-taphold | ||||
|  | ||||
| Produce base layer from separate tap and hold tables. | ||||
|  | ||||
| #+NAME: table-layout-taphold | ||||
| #+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 | ||||
| width = 19 | ||||
| mods_dict = dict.fromkeys(mods_list) | ||||
| symbol_names_dict = {} | ||||
| for symbol, name, shifted_symbol, shifted_name in symbol_names_table: | ||||
|   symbol_names_dict[symbol] = name | ||||
|   symbol_names_dict[shifted_symbol] = shifted_name | ||||
| results = '  [BASE] = LAYOUT_miryoku(\n' | ||||
| for tap_row, hold_row in map(None, tap_table, hold_table): | ||||
|   results += '    ' | ||||
|   for tap, hold in map(None, tap_row, hold_row): | ||||
|     if tap == '': | ||||
|       code = 'NU' | ||||
|     elif tap in symbol_names_dict: | ||||
|       code = symbol_names_dict[tap] | ||||
|     else: | ||||
|       code = tap | ||||
|     code = 'KC_' + str(code) | ||||
|     if hold in mods_dict: | ||||
|       code = str(hold) + '_T(' + code + ')' | ||||
|     elif hold != '' and hold != 'NP' and hold != 'RST': | ||||
|       code = 'LT(' + str(hold) + ', ' + code + ')' | ||||
|     results += (code + ', ').ljust(width) | ||||
|   results = results.rstrip(' ') + '\n' | ||||
| results = results.rstrip('\n, ') + '\n  )' | ||||
| return results | ||||
| #+END_SRC | ||||
|  | ||||
| #+RESULTS: table-layout-taphold | ||||
| :   [BASE] = LAYOUT_miryoku( | ||||
| :     KC_Q,              KC_W,              KC_F,              KC_P,              KC_B,              KC_J,              KC_L,              KC_U,              KC_Y,              KC_QUOT, | ||||
| :     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), | ||||
| :     KC_Z,              KC_X,              KC_C,              KC_D,              KC_V,              KC_K,              KC_H,              KC_COMM,           KC_DOT,            KC_SLSH, | ||||
| :     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 | ||||
| :   ) | ||||
|  | ||||
|  | ||||
| *** table-layout-half | ||||
|  | ||||
| Produce sub layers given layer name and corresponding table for single hand and | ||||
| incorporating mods and reset from base layer.  Layer names must end with R or L. | ||||
| A layer with shifted symbols can also be generated. | ||||
|  | ||||
| #+NAME: table-layout-half | ||||
| #+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 | ||||
| width = 9 | ||||
| mods_dict = dict.fromkeys(mods_list) | ||||
| symbol_names_dict = {} | ||||
| shifted_symbol_names_dict = {} | ||||
| for symbol, name, shifted_symbol, shifted_name in symbol_names_table: | ||||
|   symbol_names_dict[symbol] = name | ||||
|   symbol_names_dict[shifted_symbol] = shifted_name | ||||
|   shifted_symbol_names_dict[symbol] = shifted_name | ||||
| length = len(half_table[0]) | ||||
| mode = layer_name[-1:].lower() | ||||
| results = '  [' + layer_name + '] = LAYOUT_miryoku(\n' | ||||
| for half_row, hold_row in map(None, half_table, hold_table): | ||||
|   results += '    ' | ||||
|   hold_row_l, hold_row_r = hold_row[:length], hold_row[length:] | ||||
|   for lr, hold_row_lr in ('l', hold_row_l), ('r', hold_row_r): | ||||
|     if lr == mode: | ||||
|       for half in half_row: | ||||
|         if half == '': | ||||
|           code = 'NU' | ||||
|         elif shift == "true" and half in shifted_symbol_names_dict: | ||||
|           code = shifted_symbol_names_dict[half] | ||||
|         elif half in symbol_names_dict: | ||||
|           code = symbol_names_dict[half] | ||||
|         else: | ||||
|           code = half | ||||
|         results += ('KC_' + str(code) + ', ').ljust(width) | ||||
|     else: | ||||
|       for hold in hold_row_lr: | ||||
|         if hold == '' or hold != 'NP' and hold != 'RST' and hold not in mods_dict: | ||||
|           code = 'NA' | ||||
|         else: | ||||
|           code = hold | ||||
|         results += ('KC_' + str(code) + ', ').ljust(width) | ||||
|   results = results.rstrip(' ') + '\n' | ||||
| results = results.rstrip('\n, ') + '\n  )' | ||||
| return results | ||||
| #+END_SRC | ||||
|  | ||||
| #+RESULTS: table-layout-half | ||||
| :   [NSL] = LAYOUT_miryoku( | ||||
| :     KC_LBRC, KC_7,    KC_8,    KC_9,    KC_RBRC, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_RST, | ||||
| :     KC_SCLN, KC_4,    KC_5,    KC_6,    KC_EQL,  KC_NA,   KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, | ||||
| :     KC_GRV,  KC_1,    KC_2,    KC_3,    KC_BSLS, KC_NA,   KC_NA,   KC_NA,   KC_NA,   KC_NA, | ||||
| :     KC_NP,   KC_NP,   KC_DOT,  KC_0,    KC_MINS, KC_NA,   KC_NA,   KC_NA,   KC_NP,   KC_NP | ||||
| :   ) | ||||
|  | ||||
|  | ||||
| *** table-enums | ||||
|  | ||||
| Produce layer enums from layer names in hold table. | ||||
|  | ||||
| #+NAME: table-enums | ||||
| #+BEGIN_SRC python :var hold_table=hold :var mods_list=mods :tangle no | ||||
| mods_dict = dict.fromkeys(mods_list) | ||||
| results = 'enum layers { BASE, ' | ||||
| for hold_row in hold_table: | ||||
|   for hold in hold_row: | ||||
|     if hold not in mods_dict and hold != '' and hold != 'NP' and hold != 'RST': | ||||
|       results += hold + ', ' | ||||
| results = results.rstrip(', ') + ' };' | ||||
| return results | ||||
| #+END_SRC | ||||
|  | ||||
| #+RESULTS: table-enums | ||||
| : enum layers { BASE, MEDR, NAVR, MOUR, NSSL, NSL, FUNL }; | ||||
|  | ||||
|  | ||||
| ** Data | ||||
|  | ||||
| *** symbol-names | ||||
|  | ||||
| Symbol, name, and shifted symbol mappings for use in tables. | ||||
|  | ||||
| #+NAME: symbol-names | ||||
| | `    | GRV  | ~    | TILD | | ||||
| | -    | MINS | _    | UNDS | | ||||
| | =    | EQL  | +    | PLUS | | ||||
| | [    | LBRC | {    | LCBR | | ||||
| | ]    | RBRC | }    | RCBR | | ||||
| | \    | BSLS | PIPE | PIPE | | ||||
| | ;    | SCLN | :    | COLN | | ||||
| | '    | QUOT | DQUO | DQUO | | ||||
| | ,    | COMM | <    | LT   | | ||||
| | .    | DOT  | >    | GT   | | ||||
| | /    | SLSH | ?    | QUES | | ||||
| | 1    | 1    | !    | EXLM | | ||||
| | 2    | 2    | @    | AT   | | ||||
| | 3    | 3    | #    | HASH | | ||||
| | 4    | 4    | $    | DLR  | | ||||
| | 5    | 5    | %    | PERC | | ||||
| | 6    | 6    | ^    | CIRC | | ||||
| | 7    | 7    | &    | AMPR | | ||||
| | 8    | 8    | *    | ASTR | | ||||
| | 9    | 9    | (    | LPRN | | ||||
| | 0    | 0    | )    | RPRN | | ||||
|  | ||||
|  | ||||
| *** mods | ||||
|  | ||||
| Modifiers usable in hold table.  Need to have the same name for KC_ and _T versions. | ||||
|  | ||||
| #+NAME: mods | ||||
| - LSFT | ||||
| - LCTL | ||||
| - LALT | ||||
| - LGUI | ||||
| - LAGR | ||||
|  | ||||
|  | ||||
| ** Other | ||||
|  | ||||
| *** header | ||||
|  | ||||
| Header for tangled src files. | ||||
|  | ||||
| #+NAME: header | ||||
| #+BEGIN_SRC C :tangle no | ||||
| generated from users/manna-harbour_miryoku/miryoku.org | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
| * Subset Mapping | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: subset-mapping | ||||
| :END: | ||||
|  | ||||
| ** Userspace | ||||
|  | ||||
| The keymap and configuration are shared between keyboards.  The keymap is | ||||
| defined for LAYOUT_miryoku which is 10x4, with the outer 2 positions on the | ||||
| bottom row unused and the rest of the bottom row are the thumb keys. | ||||
|  | ||||
|  | ||||
| *** manna-harbour_miryoku.c | ||||
|  | ||||
| Contains the keymap.  Included from keymap.c | ||||
|  | ||||
| [[./manna-harbour_miryoku.c][users/manna-harbour_miryoku/manna-harbour_miryoku.c]] | ||||
| #+BEGIN_SRC C :noweb yes :tangle manna-harbour_miryoku.c | ||||
|  | ||||
| // <<header>> | ||||
|  | ||||
| #include QMK_KEYBOARD_H | ||||
|  | ||||
| #define KC_NP KC_NO // key is not present | ||||
| #define KC_NA KC_NO // present but not available for use | ||||
| #define KC_NU KC_NO // available but not used | ||||
| #define KC_RST RESET | ||||
|  | ||||
| <<table-enums()>> | ||||
|  | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| <<table-layout-taphold()>>, | ||||
| <<table-layout-half(layer_name="NAVR", half_table=navr)>>, | ||||
| <<table-layout-half(layer_name="MOUR", half_table=mour)>>, | ||||
| <<table-layout-half(layer_name="MEDR", half_table=medr)>>, | ||||
| <<table-layout-half(layer_name="FUNL", half_table=funl)>>, | ||||
| <<table-layout-half(layer_name="NSL", half_table=nsl)>>, | ||||
| <<table-layout-half(layer_name="NSSL", half_table=nsl, shift="true")>> | ||||
| }; | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
| *** config.h | ||||
|  | ||||
| Config options.  Automatically included. | ||||
|  | ||||
| [[./config.h][users/manna-harbour_miryoku/config.h]] | ||||
| #+BEGIN_SRC C :noweb yes :tangle config.h | ||||
|  | ||||
| // <<header>> | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| // Prevent normal rollover on alphas from accidentally triggering mods. | ||||
| #define IGNORE_MOD_TAP_INTERRUPT | ||||
|  | ||||
| // Enable rapid switch from tap to hold, disables double tap hold auto-repeat. | ||||
| #define TAPPING_FORCE_HOLD | ||||
|  | ||||
| // Recommended for heavy chording. | ||||
| #define QMK_KEYS_PER_SCAN 4 | ||||
|  | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
| *** rules.mk | ||||
|  | ||||
| Build options.  Automatically included. | ||||
|  | ||||
| [[./rules.mk][users/manna-harbour_miryoku/rules.mk]] | ||||
| #+BEGIN_SRC makefile :noweb yes :tangle rules.mk | ||||
|  | ||||
| # <<header>> | ||||
|  | ||||
| MOUSEKEY_ENABLE = yes        # Mouse keys(+4700) | ||||
| EXTRAKEY_ENABLE = yes        # Audio control and System control(+450) | ||||
|  | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
| ** Layouts | ||||
|  | ||||
| To use the keymap on a keyboard supporting the layouts feature, LAYOUT_miryoku | ||||
| is defined as a macro mapping onto the layout's own LAYOUT macro, leaving the | ||||
| unused keys as KC_NO.  The userspace keymap is then included. | ||||
|  | ||||
| *** ergodox | ||||
|  | ||||
| For the ergodox layout, the main 5x3 alphas are used as usual. The primary and | ||||
| secondary thumb keys are the inner and outer 2u thumb keys and the tertiary | ||||
| thumb key is the innermost key of the partial bottom row.  The remaining keys | ||||
| are unused. | ||||
|  | ||||
| [[../../layouts/community/ergodox/manna-harbour_miryoku/keymap.c][layouts/community/ergodox/manna-harbour_miryoku/keymap.c]] | ||||
| #+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ergodox/manna-harbour_miryoku/keymap.c | ||||
|  | ||||
| // <<header>> | ||||
|  | ||||
| #define LAYOUT_miryoku(\ | ||||
| K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,\ | ||||
| K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,\ | ||||
| K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,\ | ||||
| N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39\ | ||||
| )\ | ||||
| LAYOUT_ergodox_pretty( \ | ||||
| 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, \ | ||||
| KC_NO, K00,   K01,   K02,   K03,   K04,   KC_NO, KC_NO, K05,   K06,   K07,   K08,   K09,   KC_NO, \ | ||||
| KC_NO, K10,   K11,   K12,   K13,   K14,                 K15,   K16,   K17,   K18,   K19,   KC_NO, \ | ||||
| KC_NO, K20,   K21,   K22,   K23,   K24,   KC_NO, KC_NO, K25,   K26,   K27,   K28,   K29,   KC_NO, \ | ||||
| KC_NO, KC_NO, KC_NO, KC_NO, K32,                               K37,   KC_NO, KC_NO, KC_NO, KC_NO, \ | ||||
|                                    KC_NO, KC_NO, KC_NO, KC_NO, \ | ||||
|                                           KC_NO, KC_NO, \ | ||||
|                             K33,   K34,   KC_NO, KC_NO, K35,   K36 \ | ||||
| ) | ||||
|  | ||||
| #include "manna-harbour_miryoku.c" | ||||
|  | ||||
| #+END_SRC | ||||
|  | ||||
| To build for any keyboard using the this layout (ergodone, ergodox_ez, | ||||
| ergodox_infinity, hotdox) e.g. the ergodox_ez, | ||||
|  | ||||
| #+BEGIN_SRC sh :tangle no | ||||
| cd ../.. && make ergodox_ez:manna-harbour_miryoku:teensy | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
|  | ||||
| *** ortho_4x12 | ||||
|  | ||||
| For the ortho_4x12 layout, the right half as is as follows: The rightmost column | ||||
| bottom 3 rows is the pinkie column.  The middle 4 columns top 3 rows are for the | ||||
| remaining fingers.  The bottom row left 3 columns are the thumb keys.  The | ||||
| remaining keys are unused. | ||||
|  | ||||
| [[../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c][layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c]] | ||||
| #+BEGIN_SRC C :noweb yes :tangle ../../layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c | ||||
|  | ||||
| // <<header>> | ||||
|  | ||||
| #define LAYOUT_miryoku(\ | ||||
| K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,\ | ||||
| K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,\ | ||||
| K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,\ | ||||
| N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39\ | ||||
| )\ | ||||
| LAYOUT_ortho_4x12(\ | ||||
| KC_NO, K01,   K02,   K03,   K04,   KC_NO, KC_NO, K05,   K06,   K07,   K08,   KC_NO,\ | ||||
| K00,   K11,   K12,   K13,   K14,   KC_NO, KC_NO, K15,   K16,   K17,   K18,   K09,\ | ||||
| K10,   K21,   K22,   K23,   K24,   KC_NO, KC_NO, K25,   K26,   K27,   K28,   K19,\ | ||||
| K20,   KC_NO, KC_NO, K32,   K33,   K34,   K35,   K36,   K37,   KC_NO, KC_NO, K29\ | ||||
| ) | ||||
|  | ||||
| #include "manna-harbour_miryoku.c" | ||||
|  | ||||
| #+END_SRC | ||||
|  | ||||
| To build for any keyboard using this layout (4x4, nori, chimera_ls, contra, | ||||
| divergetm2, jj40, lets_split, lets_split_eh, meira, niu_mini, planck, telophase, | ||||
| vitamins_included, zinc, zlant, ortho48, kbd4x, levinson, wavelet, plaid) | ||||
| e.g. the levinson, | ||||
|  | ||||
| #+BEGIN_SRC sh :tangle no | ||||
| make keebio/levinson:manna-harbour_miryoku:avrdude | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
| ** Keyboards | ||||
|  | ||||
| To use the keymap on a keyboard which does not support the layouts feature, | ||||
| LAYOUT_miryoku is defined as a macro mapping onto the keyboard's own LAYOUT | ||||
| macro, leaving the unused keys as KC_NO.  The userspace keymap is then included. | ||||
|  | ||||
|  | ||||
| *** crkbd | ||||
|  | ||||
| The outer columns are unused. | ||||
|  | ||||
| [[../../keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c][keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c]] | ||||
| #+BEGIN_SRC C :noweb yes :tangle ../../keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c | ||||
|  | ||||
| // <<header>> | ||||
|  | ||||
| #define LAYOUT_miryoku( \ | ||||
|        K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09, \ | ||||
|        K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19, \ | ||||
|        K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29, \ | ||||
|        N30,   N31,   K32,   K33,   K34,   K35,   K36,   K37,   N38,   N39 \ | ||||
| ) \ | ||||
| LAYOUT( \ | ||||
| KC_NO, K00,   K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,   KC_NO, \ | ||||
| KC_NO, K10,   K11,   K12,   K13,   K14,   K15,   K16,   K17,   K18,   K19,   KC_NO, \ | ||||
| KC_NO, K20,   K21,   K22,   K23,   K24,   K25,   K26,   K27,   K28,   K29,   KC_NO, \ | ||||
|                      K32,   K33,   K34,   K35,   K36,   K37 \ | ||||
| ) | ||||
|  | ||||
| #include "manna-harbour_miryoku.c" | ||||
|  | ||||
| #+END_SRC | ||||
|  | ||||
| To build for this keyboard, | ||||
|  | ||||
| #+BEGIN_SRC sh :tangle no | ||||
| cd ../.. && make crkbd:manna-harbour_miryoku:avrdude | ||||
| #+END_SRC | ||||
|  | ||||
|  | ||||
| * Related Documentation | ||||
|  | ||||
| ** QMK | ||||
|  | ||||
| - https://qmk.fm/ | ||||
| - https://docs.qmk.fm/#/getting_started_introduction | ||||
| - https://docs.qmk.fm/#/hardware_keyboard_guidelines | ||||
| - https://docs.qmk.fm/#/config_options | ||||
| - https://docs.qmk.fm/#/keycodes | ||||
| - https://docs.qmk.fm/#/feature_advanced_keycodes | ||||
| - https://docs.qmk.fm/#/feature_layouts | ||||
| - https://docs.qmk.fm/#/feature_userspace | ||||
| - https://docs.qmk.fm/#/getting_started_make_guide | ||||
|  | ||||
|  | ||||
| ** Org Mode | ||||
|  | ||||
| - https://orgmode.org/ | ||||
| - https://orgmode.org/manual/Tables.html | ||||
| - https://orgmode.org/manual/Working-with-Source-Code.html | ||||
							
								
								
									
										5
									
								
								users/manna-harbour_miryoku/rules.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								users/manna-harbour_miryoku/rules.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
|  | ||||
| # generated from users/manna-harbour_miryoku/miryoku.org | ||||
|  | ||||
| MOUSEKEY_ENABLE = yes        # Mouse keys(+4700) | ||||
| EXTRAKEY_ENABLE = yes        # Audio control and System control(+450) | ||||
		Reference in New Issue
	
	Block a user