]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
[Keymap] miryoku layout (#6171)
authorManna Harbour <51143715+manna-harbour@users.noreply.github.com>
Wed, 26 Jun 2019 07:33:12 +0000 (17:33 +1000)
committerDrashna Jaelre <drashna@live.com>
Wed, 26 Jun 2019 07:33:12 +0000 (00:33 -0700)
* First release

*  add "#pragma once" to config.h and related docs

* generate config.h with change from miryoku.org

keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c [new file with mode: 0644]
layouts/community/ergodox/manna-harbour_miryoku/keymap.c [new file with mode: 0644]
layouts/community/ortho_4x12/manna-harbour_miryoku/keymap.c [new file with mode: 0644]
users/manna-harbour_miryoku/README.org [new symlink]
users/manna-harbour_miryoku/config.h [new file with mode: 0644]
users/manna-harbour_miryoku/manna-harbour_miryoku.c [new file with mode: 0644]
users/manna-harbour_miryoku/miryoku.org [new file with mode: 0644]
users/manna-harbour_miryoku/rules.mk [new file with mode: 0644]

diff --git a/keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c b/keyboards/crkbd/keymaps/manna-harbour_miryoku/keymap.c
new file mode 100644 (file)
index 0000000..56d4de2
--- /dev/null
@@ -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"
diff --git a/layouts/community/ergodox/manna-harbour_miryoku/keymap.c b/layouts/community/ergodox/manna-harbour_miryoku/keymap.c
new file mode 100644 (file)
index 0000000..86547df
--- /dev/null
@@ -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"
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 (file)
index 0000000..b1341d4
--- /dev/null
@@ -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"
diff --git a/users/manna-harbour_miryoku/README.org b/users/manna-harbour_miryoku/README.org
new file mode 120000 (symlink)
index 0000000..b6caaad
--- /dev/null
@@ -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 (file)
index 0000000..c3c513d
--- /dev/null
@@ -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
diff --git a/users/manna-harbour_miryoku/manna-harbour_miryoku.c b/users/manna-harbour_miryoku/manna-harbour_miryoku.c
new file mode 100644 (file)
index 0000000..bb4770a
--- /dev/null
@@ -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
+  )
+};
diff --git a/users/manna-harbour_miryoku/miryoku.org b/users/manna-harbour_miryoku/miryoku.org
new file mode 100644 (file)
index 0000000..556f95f
--- /dev/null
@@ -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
diff --git a/users/manna-harbour_miryoku/rules.mk b/users/manna-harbour_miryoku/rules.mk
new file mode 100644 (file)
index 0000000..baff143
--- /dev/null
@@ -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)