2
0
Просмотр исходного кода

Merge pull request #2 from jackhumbert/master

Update from source
tak3over 9 лет назад
Родитель
Сommit
2ba0de8fcd

+ 710 - 0
keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py

@@ -0,0 +1,710 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""Compiler for keymap.c files
+
+This scrip will generate a keymap.c file from a simple
+markdown file with a specific layout.
+
+Usage:
+    python compile_keymap.py INPUT_PATH [OUTPUT_PATH]
+"""
+from __future__ import division
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import os
+import io
+import re
+import sys
+import json
+import unicodedata
+import collections
+import itertools as it
+
+PY2 = sys.version_info.major == 2
+
+if PY2:
+    chr = unichr
+
+
+KEYBOARD_LAYOUTS = {
+    # These map positions in the parsed layout to
+    # positions in the KEYMAP MATRIX
+    'ergodox_ez': [
+        [ 0,  1,  2,  3,  4,  5,  6],  [38, 39, 40, 41, 42, 43, 44],
+        [ 7,  8,  9, 10, 11, 12, 13],  [45, 46, 47, 48, 49, 50, 51],
+        [14, 15, 16, 17, 18, 19    ],  [    52, 53, 54, 55, 56, 57],
+        [20, 21, 22, 23, 24, 25, 26],  [58, 59, 60, 61, 62, 63, 64],
+        [27, 28, 29, 30, 31        ],  [        65, 66, 67, 68, 69],
+        [                    32, 33],  [70, 71                    ],
+        [                        34],  [72                        ],
+        [                35, 36, 37],  [73, 74, 75                ],
+    ]
+}
+
+ROW_INDENTS = {
+    'ergodox_ez': [0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 5, 0, 6, 0, 4, 0]
+}
+
+BLANK_LAYOUTS = [
+# Compact Layout
+"""
+.------------------------------------.------------------------------------.
+|     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+|     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+!-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+|     |    |    |    |    |    |-----!-----!    |    |    |    |    |     |
+!-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+|     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+'-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ |    |    |    |    |    |                     !    |    |    |    |    |
+ '------------------------'                     '------------------------'
+                        .-----------. .-----------.
+                        |     |     | !     |     |
+                  .-----+-----+-----! !-----+-----+-----.
+                  !     !     |     | !     |     !     !
+                  !     !     !-----! !-----!     !     !
+                  |     |     |     | !     |     |     |
+                  '-----------------' '-----------------'
+""",
+
+# Wide Layout
+"""
+.---------------------------------------------. .---------------------------------------------.
+|       |     |     |     |     |     |       | !       |     |     |     |     |     |       |
+!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
+|       |     |     |     |     |     |       | !       |     |     |     |     |     |       |
+!-------+-----+-----+-----x-----x-----!       ! !       !-----x-----x-----+-----+-----+-------!
+|       |     |     |     |     |     |-------! !-------!     |     |     |     |     |       |
+!-------+-----+-----+-----x-----x-----!       ! !       !-----x-----x-----+-----+-----+-------!
+|       |     |     |     |     |     |       | !       |     |     |     |     |     |       |
+'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
+ |      |     |     |     |     |                             !     |     |     |     |      |
+ '------------------------------'                             '------------------------------'
+                              .---------------. .---------------.
+                              |       |       | !       |       |
+                      .-------+-------+-------! !-------+-------+-------.
+                      !       !       |       | !       |       !       !
+                      !       !       !-------! !-------!       !       !
+                      |       |       |       | !       |       |       |
+                      '-----------------------' '-----------------------'
+""",
+]
+
+
+DEFAULT_CONFIG = {
+    "keymaps_includes": [
+        "keymap_common.h",
+    ],
+    'filler': "-+.'!:x",
+    'separator': "|",
+    'default_key_prefix': ["KC_"],
+}
+
+
+SECTIONS = [
+    'layout_config',
+    'layers',
+]
+
+
+#       Markdown Parsing
+
+ONELINE_COMMENT_RE = re.compile(r"""
+    ^                       # comment must be at the start of the line
+    \s*                     # arbitrary whitespace
+    //                      # start of the comment
+    (.*)                    # the comment
+    $                       # until the end of line
+""", re.MULTILINE | re.VERBOSE
+)
+
+INLINE_COMMENT_RE = re.compile(r"""
+    ([\,\"\[\]\{\}\d])      # anythig that might end a expression
+    \s+                     # comment must be preceded by whitespace
+    //                      # start of the comment
+    \s                      # and succeded by whitespace
+    (?:[^\"\]\}\{\[]*)      # the comment (except things which might be json)
+    $                       # until the end of line
+""", re.MULTILINE | re.VERBOSE)
+
+TRAILING_COMMA_RE = re.compile(r"""
+    ,                       # the comma
+    (?:\s*)                 # arbitrary whitespace
+    $                       # only works if the trailing comma is followed by newline
+    (\s*)                   # arbitrary whitespace
+    ([\]\}])                # end of an array or object
+""", re.MULTILINE | re.VERBOSE)
+
+
+def loads(raw_data):
+    if isinstance(raw_data, bytes):
+        raw_data = raw_data.decode('utf-8')
+
+    raw_data = ONELINE_COMMENT_RE.sub(r"", raw_data)
+    raw_data = INLINE_COMMENT_RE.sub(r"\1", raw_data)
+    raw_data = TRAILING_COMMA_RE.sub(r"\1\2", raw_data)
+    return json.loads(raw_data)
+
+
+def parse_config(path):
+    def reset_section():
+        section.update({
+            'name': section.get('name', ""),
+            'sub_name': "",
+            'start_line': -1,
+            'end_line': -1,
+            'code_lines': [],
+        })
+
+    def start_section(line_index, line):
+        end_section()
+        if line.startswith("# "):
+            name = line[2:]
+        elif line.startswith("## "):
+            name = line[3:]
+        else:
+            name = ""
+
+        name = name.strip().replace(" ", "_").lower()
+        if name in SECTIONS:
+            section['name'] = name
+        else:
+            section['sub_name'] = name
+        section['start_line'] = line_index
+
+    def end_section():
+        if section['start_line'] >= 0:
+            if section['name'] == 'layout_config':
+                config.update(loads("\n".join(
+                    section['code_lines']
+                )))
+            elif section['sub_name'].startswith('layer'):
+                layer_name = section['sub_name']
+                config['layer_lines'][layer_name] = section['code_lines']
+
+        reset_section()
+
+    def amend_section(line_index, line):
+        section['end_line'] = line_index
+        section['code_lines'].append(line)
+
+    config = DEFAULT_CONFIG.copy()
+    config.update({
+        'layer_lines': collections.OrderedDict(),
+        'macro_ids': {'UM'},
+        'unicode_macros': {},
+    })
+
+    section = {}
+    reset_section()
+
+    with io.open(path, encoding="utf-8") as fh:
+        for i, line in enumerate(fh):
+            if line.startswith("#"):
+                start_section(i, line)
+            elif line.startswith("    "):
+                amend_section(i, line[4:])
+            else:
+                # TODO: maybe parse description
+                pass
+
+    end_section()
+    assert 'layout' in config
+    return config
+
+#       header file parsing
+
+IF0_RE = re.compile(r"""
+    ^
+    #if 0
+    $.*?
+    #endif
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+COMMENT_RE = re.compile(r"""
+    /\*
+    .*?
+    \*/"
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+def read_header_file(path):
+    with io.open(path, encoding="utf-8") as fh:
+        data = fh.read()
+    data, _ = COMMENT_RE.subn("", data)
+    data, _ = IF0_RE.subn("", data)
+    return data
+
+
+def regex_partial(re_str_fmt, flags):
+    def partial(*args, **kwargs):
+        re_str = re_str_fmt.format(*args, **kwargs)
+        return re.compile(re_str, flags)
+    return partial
+
+
+KEYDEF_REP = regex_partial(r"""
+    #define
+    \s
+    (
+        (?:{})          # the prefixes
+        (?:\w+)         # the key name
+    )                   # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+ENUM_RE = re.compile(r"""
+    (
+        enum
+        \s\w+\s
+        \{
+        .*?             # the enum content
+        \}
+        ;
+    )                   # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+ENUM_KEY_REP = regex_partial(r"""
+    (
+        {}              # the prefixes
+        \w+             # the key name
+    )                   # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+def parse_keydefs(config, data):
+    prefix_options = "|".join(config['key_prefixes'])
+    keydef_re = KEYDEF_REP(prefix_options)
+    enum_key_re = ENUM_KEY_REP(prefix_options)
+    for match in keydef_re.finditer(data):
+        yield match.groups()[0]
+
+    for enum_match in ENUM_RE.finditer(data):
+        enum = enum_match.groups()[0]
+        for key_match in enum_key_re.finditer(enum):
+            yield key_match.groups()[0]
+
+
+def parse_valid_keys(config, out_path):
+    basepath = os.path.abspath(os.path.join(os.path.dirname(out_path)))
+    dirpaths = []
+    subpaths = []
+    while len(subpaths) < 6:
+        path = os.path.join(basepath, *subpaths)
+        dirpaths.append(path)
+        dirpaths.append(os.path.join(path, "tmk_core", "common"))
+        dirpaths.append(os.path.join(path, "quantum"))
+        subpaths.append('..')
+
+    includes = set(config['keymaps_includes'])
+    includes.add("keycode.h")
+
+    valid_keycodes = set()
+    for dirpath, include in it.product(dirpaths, includes):
+        include_path = os.path.join(dirpath, include)
+        if os.path.exists(include_path):
+            header_data = read_header_file(include_path)
+            valid_keycodes.update(
+                parse_keydefs(config, header_data)
+            )
+    return valid_keycodes
+
+
+#       Keymap Parsing
+
+def iter_raw_codes(layer_lines, filler, separator):
+    filler_re = re.compile("[" + filler + " ]")
+    for line in layer_lines:
+        line, _ = filler_re.subn("", line.strip())
+        if not line:
+            continue
+        codes = line.split(separator)
+        for code in codes[1:-1]:
+            yield code
+
+
+def iter_indexed_codes(raw_codes, key_indexes):
+    key_rows = {}
+    key_indexes_flat = []
+
+    for row_index, key_indexes in enumerate(key_indexes):
+        for key_index in key_indexes:
+            key_rows[key_index] = row_index
+        key_indexes_flat.extend(key_indexes)
+    assert len(raw_codes) == len(key_indexes_flat)
+    for raw_code, key_index in zip(raw_codes, key_indexes_flat):
+        # we keep track of the row mostly for layout purposes
+        yield raw_code, key_index, key_rows[key_index]
+
+
+LAYER_CHANGE_RE = re.compile(r"""
+    (DF|TG|MO)\(\d+\)
+""", re.VERBOSE)
+
+
+MACRO_RE = re.compile(r"""
+    M\(\w+\)
+""", re.VERBOSE)
+
+
+UNICODE_RE = re.compile(r"""
+    U[0-9A-F]{4}
+""", re.VERBOSE)
+
+
+NON_CODE = re.compile(r"""
+    ^[^A-Z0-9_]$
+""", re.VERBOSE)
+
+
+def parse_uni_code(raw_code):
+    macro_id = "UC_" + (
+        unicodedata.name(raw_code)
+        .replace(" ", "_")
+        .replace("-", "_")
+    )
+    code = "M({})".format(macro_id)
+    uc_hex = "{:04X}".format(ord(raw_code))
+    return code, macro_id, uc_hex
+
+
+def parse_key_code(raw_code, key_prefixes, valid_keycodes):
+    if raw_code in valid_keycodes:
+        return raw_code
+
+    for prefix in key_prefixes:
+        code = prefix + raw_code
+        if code in valid_keycodes:
+            return code
+
+
+def parse_code(raw_code, key_prefixes, valid_keycodes):
+    if not raw_code:
+        return 'KC_TRNS', None, None
+
+    if LAYER_CHANGE_RE.match(raw_code):
+        return raw_code, None, None
+
+    if MACRO_RE.match(raw_code):
+        macro_id = raw_code[2:-1]
+        return raw_code, macro_id, None
+
+    if UNICODE_RE.match(raw_code):
+        hex_code = raw_code[1:]
+        return parse_uni_code(chr(int(hex_code, 16)))
+
+    if NON_CODE.match(raw_code):
+        return parse_uni_code(raw_code)
+
+    code = parse_key_code(raw_code, key_prefixes, valid_keycodes)
+    return code, None, None
+
+
+def parse_keymap(config, key_indexes, layer_lines, valid_keycodes):
+    keymap = {}
+    raw_codes = list(iter_raw_codes(
+        layer_lines, config['filler'], config['separator']
+    ))
+    indexed_codes = iter_indexed_codes(raw_codes, key_indexes)
+    key_prefixes = config['key_prefixes']
+    for raw_code, key_index, row_index in indexed_codes:
+        code, macro_id, uc_hex = parse_code(
+            raw_code, key_prefixes, valid_keycodes
+        )
+        # TODO: line numbers for invalid codes
+        err_msg = "Could not parse key '{}' on row {}".format(
+            raw_code, row_index
+        )
+        assert code is not None, err_msg
+        # print(repr(raw_code), repr(code), macro_id, uc_hex)
+        if macro_id:
+            config['macro_ids'].add(macro_id)
+        if uc_hex:
+            config['unicode_macros'][macro_id] = uc_hex
+        keymap[key_index] = (code, row_index)
+    return keymap
+
+
+def parse_keymaps(config, valid_keycodes):
+    keymaps = collections.OrderedDict()
+    key_indexes = config.get(
+        'key_indexes', KEYBOARD_LAYOUTS[config['layout']]
+    )
+    # TODO: maybe validate key_indexes
+
+    for layer_name, layer_lines, in config['layer_lines'].items():
+        keymaps[layer_name] = parse_keymap(
+            config, key_indexes, layer_lines, valid_keycodes
+        )
+    return keymaps
+
+#       keymap.c output
+
+USERCODE = """
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+        case L1:
+            ergodox_right_led_1_on();
+            break;
+        case L2:
+            ergodox_right_led_2_on();
+            break;
+        case L3:
+            ergodox_right_led_3_on();
+            break;
+        case L4:
+            ergodox_right_led_1_on();
+            ergodox_right_led_2_on();
+            break;
+        case L5:
+            ergodox_right_led_1_on();
+            ergodox_right_led_3_on();
+            break;
+        // case L6:
+        //     ergodox_right_led_2_on();
+        //     ergodox_right_led_3_on();
+        //     break;
+        // case L7:
+        //     ergodox_right_led_1_on();
+        //     ergodox_right_led_2_on();
+        //     ergodox_right_led_3_on();
+        //     break;
+        default:
+            ergodox_board_led_off();
+            break;
+    }
+};
+"""
+
+MACROCODE = """
+#define UC_MODE_WIN 0
+#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+
+// TODO: allow default mode to be configured
+static uint16_t unicode_mode = UC_MODE_WIN;
+
+uint16_t hextokeycode(uint8_t hex) {{
+    if (hex == 0x0) {{
+        return KC_P0;
+    }}
+    if (hex < 0xA) {{
+        return KC_P1 + (hex - 0x1);
+    }}
+    return KC_A + (hex - 0xA);
+}}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {{
+    switch (unicode_mode) {{
+    case UC_MODE_WIN:
+        register_code(KC_LALT);
+
+        register_code(KC_PPLS);
+        unregister_code(KC_PPLS);
+
+        register_code(hextokeycode((hi & 0xF0) >> 4));
+        unregister_code(hextokeycode((hi & 0xF0) >> 4));
+        register_code(hextokeycode((hi & 0x0F)));
+        unregister_code(hextokeycode((hi & 0x0F)));
+        register_code(hextokeycode((lo & 0xF0) >> 4));
+        unregister_code(hextokeycode((lo & 0xF0) >> 4));
+        register_code(hextokeycode((lo & 0x0F)));
+        unregister_code(hextokeycode((lo & 0x0F)));
+
+        unregister_code(KC_LALT);
+        break;
+    case UC_MODE_LINUX:
+        register_code(KC_LCTL);
+        register_code(KC_LSFT);
+
+        register_code(KC_U);
+        unregister_code(KC_U);
+
+        register_code(hextokeycode((hi & 0xF0) >> 4));
+        unregister_code(hextokeycode((hi & 0xF0) >> 4));
+        register_code(hextokeycode((hi & 0x0F)));
+        unregister_code(hextokeycode((hi & 0x0F)));
+        register_code(hextokeycode((lo & 0xF0) >> 4));
+        unregister_code(hextokeycode((lo & 0xF0) >> 4));
+        register_code(hextokeycode((lo & 0x0F)));
+        unregister_code(hextokeycode((lo & 0x0F)));
+
+        unregister_code(KC_LCTL);
+        unregister_code(KC_LSFT);
+        break;
+    case UC_MODE_OSX:
+        break;
+    }}
+}}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{
+    if (!record->event.pressed) {{
+        return MACRO_NONE;
+    }}
+    // MACRODOWN only works in this function
+    switch(id) {{
+        case UM:
+            unicode_mode = (unicode_mode + 1) % 2;
+            break;
+{macro_cases}
+{unicode_macro_cases}
+        default:
+            break;
+    }}
+    return MACRO_NONE;
+}};
+"""
+
+
+UNICODE_MACRO_TEMPLATE = """
+case {macro_id}:
+    unicode_action_function(0x{hi:02x}, 0x{lo:02x});
+    break;
+""".strip()
+
+
+def unicode_macro_cases(config):
+    for macro_id, uc_hex in config['unicode_macros'].items():
+        hi = int(uc_hex, 16) >> 8
+        lo = int(uc_hex, 16) & 0xFF
+        unimacro_keys = ", ".join(
+            "T({})".format(
+                "KP_" + digit if digit.isdigit() else digit
+            ) for digit in uc_hex
+        )
+        yield UNICODE_MACRO_TEMPLATE.format(
+            macro_id=macro_id, hi=hi, lo=lo
+        )
+
+
+def iter_keymap_lines(keymap, row_indents=None):
+    col_widths = {}
+    col = 0
+    # first pass, figure out the column widths
+    prev_row_index = None
+    for code, row_index in keymap.values():
+        if row_index != prev_row_index:
+            col = 0
+            if row_indents:
+                col = row_indents[row_index]
+        col_widths[col] = max(len(code), col_widths.get(col, 0))
+        prev_row_index = row_index
+        col += 1
+
+    # second pass, yield the cell values
+    col = 0
+    prev_row_index = None
+    for key_index in sorted(keymap):
+        code, row_index = keymap[key_index]
+        if row_index != prev_row_index:
+            col = 0
+            yield "\n"
+            if row_indents:
+                for indent_col in range(row_indents[row_index]):
+                    pad = " " * (col_widths[indent_col] - 4)
+                    yield (" /*-*/" + pad)
+                col = row_indents[row_index]
+        else:
+            yield pad
+        yield " {}".format(code)
+        if key_index < len(keymap) - 1:
+            yield ","
+            # This will be yielded on the next iteration when
+            # we know that we're not at the end of a line.
+            pad = " " * (col_widths[col] - len(code))
+        prev_row_index = row_index
+        col += 1
+
+
+def iter_keymap_parts(config, keymaps):
+    # includes
+    for include_path in config['keymaps_includes']:
+        yield '#include "{}"\n'.format(include_path)
+
+    yield "\n"
+
+    # definitions
+    for i, macro_id in enumerate(sorted(config['macro_ids'])):
+        yield "#define {} {}\n".format(macro_id, i)
+
+    yield "\n"
+
+    for i, layer_name in enumerate(config['layer_lines']):
+        yield '#define L{0:<3} {0:<5}  // {1}\n'.format(i, layer_name)
+
+    yield "\n"
+
+    # keymaps
+    yield "const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n"
+
+    for i, layer_name in enumerate(config['layer_lines']):
+        # comment
+        layer_lines = config['layer_lines'][layer_name]
+        prefixed_lines = " * " + " * ".join(layer_lines)
+        yield "/*\n{} */\n".format(prefixed_lines)
+
+        # keymap codes
+        keymap = keymaps[layer_name]
+        row_indents = ROW_INDENTS.get(config['layout'])
+        keymap_lines = "".join(iter_keymap_lines(keymap, row_indents))
+        yield "[L{0}] = KEYMAP({1}\n),\n".format(i, keymap_lines)
+
+    yield "};\n\n"
+
+    # no idea what this is for
+    yield "const uint16_t PROGMEM fn_actions[] = {};\n"
+
+    # macros
+    yield MACROCODE.format(
+        macro_cases="",
+        unicode_macro_cases="\n".join(unicode_macro_cases(config)),
+    )
+
+    # TODO: dynamically create blinking lights
+    yield USERCODE
+
+
+def main(argv=sys.argv[1:]):
+    if not argv or '-h' in argv or '--help' in argv:
+        print(__doc__)
+        return 0
+
+    in_path = os.path.abspath(argv[0])
+    if not os.path.exists(in_path):
+        print("No such file '{}'".format(in_path))
+        return 1
+
+    if len(argv) > 1:
+        out_path = os.path.abspath(argv[1])
+    else:
+        dirname = os.path.dirname(in_path)
+        out_path = os.path.join(dirname, "keymap.c")
+
+    config = parse_config(in_path)
+    valid_keys = parse_valid_keys(config, out_path)
+    keymaps = parse_keymaps(config, valid_keys)
+
+    with io.open(out_path, mode="w", encoding="utf-8") as fh:
+        for part in iter_keymap_parts(config, keymaps):
+            fh.write(part)
+
+
+if __name__ == '__main__':
+    sys.exit(main())

Разница между файлами не показана из-за своего большого размера
+ 1240 - 0
keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex


+ 783 - 0
keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c

@@ -0,0 +1,783 @@
+#include "ergodox_ez.h"
+#include "action_layer.h"
+#include "keymap_common.h"
+#include "keymap_extras/keymap_german.h"
+
+#define UC_ASYMPTOTICALLY_EQUAL_TO 0
+#define UC_DIVISION_SIGN 1
+#define UC_DOWNWARDS_ARROW 2
+#define UC_ELEMENT_OF 3
+#define UC_EMPTY_SET 4
+#define UC_FOR_ALL 5
+#define UC_GREEK_CAPITAL_LETTER_ALPHA 6
+#define UC_GREEK_CAPITAL_LETTER_BETA 7
+#define UC_GREEK_CAPITAL_LETTER_CHI 8
+#define UC_GREEK_CAPITAL_LETTER_DELTA 9
+#define UC_GREEK_CAPITAL_LETTER_EPSILON 10
+#define UC_GREEK_CAPITAL_LETTER_ETA 11
+#define UC_GREEK_CAPITAL_LETTER_GAMMA 12
+#define UC_GREEK_CAPITAL_LETTER_IOTA 13
+#define UC_GREEK_CAPITAL_LETTER_KAPPA 14
+#define UC_GREEK_CAPITAL_LETTER_LAMDA 15
+#define UC_GREEK_CAPITAL_LETTER_MU 16
+#define UC_GREEK_CAPITAL_LETTER_NU 17
+#define UC_GREEK_CAPITAL_LETTER_OMEGA 18
+#define UC_GREEK_CAPITAL_LETTER_OMICRON 19
+#define UC_GREEK_CAPITAL_LETTER_PHI 20
+#define UC_GREEK_CAPITAL_LETTER_PI 21
+#define UC_GREEK_CAPITAL_LETTER_PSI 22
+#define UC_GREEK_CAPITAL_LETTER_RHO 23
+#define UC_GREEK_CAPITAL_LETTER_SIGMA 24
+#define UC_GREEK_CAPITAL_LETTER_TAU 25
+#define UC_GREEK_CAPITAL_LETTER_THETA 26
+#define UC_GREEK_CAPITAL_LETTER_UPSILON 27
+#define UC_GREEK_CAPITAL_LETTER_XI 28
+#define UC_GREEK_CAPITAL_LETTER_ZETA 29
+#define UC_GREEK_SMALL_LETTER_ALPHA 30
+#define UC_GREEK_SMALL_LETTER_BETA 31
+#define UC_GREEK_SMALL_LETTER_CHI 32
+#define UC_GREEK_SMALL_LETTER_DELTA 33
+#define UC_GREEK_SMALL_LETTER_EPSILON 34
+#define UC_GREEK_SMALL_LETTER_ETA 35
+#define UC_GREEK_SMALL_LETTER_FINAL_SIGMA 36
+#define UC_GREEK_SMALL_LETTER_GAMMA 37
+#define UC_GREEK_SMALL_LETTER_IOTA 38
+#define UC_GREEK_SMALL_LETTER_KAPPA 39
+#define UC_GREEK_SMALL_LETTER_LAMDA 40
+#define UC_GREEK_SMALL_LETTER_MU 41
+#define UC_GREEK_SMALL_LETTER_NU 42
+#define UC_GREEK_SMALL_LETTER_OMEGA 43
+#define UC_GREEK_SMALL_LETTER_OMICRON 44
+#define UC_GREEK_SMALL_LETTER_PHI 45
+#define UC_GREEK_SMALL_LETTER_PI 46
+#define UC_GREEK_SMALL_LETTER_PSI 47
+#define UC_GREEK_SMALL_LETTER_RHO 48
+#define UC_GREEK_SMALL_LETTER_SIGMA 49
+#define UC_GREEK_SMALL_LETTER_TAU 50
+#define UC_GREEK_SMALL_LETTER_THETA 51
+#define UC_GREEK_SMALL_LETTER_UPSILON 52
+#define UC_GREEK_SMALL_LETTER_XI 53
+#define UC_GREEK_SMALL_LETTER_ZETA 54
+#define UC_INFINITY 55
+#define UC_LEFTWARDS_ARROW 56
+#define UC_MULTIPLICATION_SIGN 57
+#define UC_NOT_AN_ELEMENT_OF 58
+#define UC_NOT_EQUAL_TO 59
+#define UC_PLUS_MINUS_SIGN 60
+#define UC_RIGHTWARDS_ARROW 61
+#define UC_SUBSCRIPT_EIGHT 62
+#define UC_SUBSCRIPT_FIVE 63
+#define UC_SUBSCRIPT_FOUR 64
+#define UC_SUBSCRIPT_NINE 65
+#define UC_SUBSCRIPT_ONE 66
+#define UC_SUBSCRIPT_SEVEN 67
+#define UC_SUBSCRIPT_SIX 68
+#define UC_SUBSCRIPT_THREE 69
+#define UC_SUBSCRIPT_TWO 70
+#define UC_SUBSCRIPT_ZERO 71
+#define UC_SUPERSCRIPT_EIGHT 72
+#define UC_SUPERSCRIPT_FIVE 73
+#define UC_SUPERSCRIPT_FOUR 74
+#define UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N 75
+#define UC_SUPERSCRIPT_NINE 76
+#define UC_SUPERSCRIPT_ONE 77
+#define UC_SUPERSCRIPT_SEVEN 78
+#define UC_SUPERSCRIPT_SIX 79
+#define UC_SUPERSCRIPT_THREE 80
+#define UC_SUPERSCRIPT_TWO 81
+#define UC_SUPERSCRIPT_ZERO 82
+#define UC_THERE_DOES_NOT_EXIST 83
+#define UC_THERE_EXISTS 84
+#define UC_UPWARDS_ARROW 85
+#define UC_VULGAR_FRACTION_ONE_EIGHTH 86
+#define UC_VULGAR_FRACTION_ONE_FIFTH 87
+#define UC_VULGAR_FRACTION_ONE_HALF 88
+#define UC_VULGAR_FRACTION_ONE_QUARTER 89
+#define UC_VULGAR_FRACTION_ONE_SIXTH 90
+#define UC_VULGAR_FRACTION_ONE_THIRD 91
+#define UC_VULGAR_FRACTION_THREE_QUARTERS 92
+#define UC_VULGAR_FRACTION_TWO_THIRDS 93
+#define UM 94
+
+#define L0   0      // layer_0
+#define L1   1      // layer_1
+#define L2   2      // layer_2
+#define L3   3      // layer_3
+#define L4   4      // layer_4
+#define L5   5      // layer_5
+#define L6   6      // layer_6
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * .------------------------------------.------------------------------------.
+ * |MO(5)| 1  | 2  | 3  | 4  | 5  |ACUT | GRV | 6  | 7  | 8  | 9  | 0  |CIRC |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |MO(4)| X  | P  | F  | W  | G  |HOME |TG(2)| H  | J  | K  | L  | Q  |  Z  |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |MO(1)| U  | I  | A  | E  | O  |-----!-----! S  | N  | R  | T  | D  | SS  |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |MO(3)| UE | OE | AE | C  | V  |END  | TAB | B  | M  |COMM| DOT| UP |  Y  |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |LGUI|LALT|LCTL|                     !RCTL|RALT|LEFT|DOWN|RGHT|
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |INS  |TG(2)| !M(UM)|DELT |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     | APP | ! PGUP|     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE|
+ *                   '-----------------' '-----------------'
+ */
+[L0] = KEYMAP(
+ MO(5),   DE_1,     DE_2,     DE_3,    DE_4,    DE_5,    DE_ACUT,
+ MO(4),   DE_X,     DE_P,     DE_F,    DE_W,    DE_G,    KC_HOME,
+ MO(1),   DE_U,     DE_I,     DE_A,    DE_E,    DE_O,
+ MO(3),   DE_UE,    DE_OE,    DE_AE,   DE_C,    DE_V,    KC_END,
+ KC_TRNS, KC_TRNS,  KC_LGUI,  KC_LALT, KC_LCTL,
+ /*-*/    /*-*/     /*-*/     /*-*/    /*-*/    KC_INS,  TG(2),
+ /*-*/    /*-*/     /*-*/     /*-*/    /*-*/    /*-*/    KC_APP,
+ /*-*/    /*-*/     /*-*/     /*-*/    KC_BSPC, KC_LSFT, KC_ESC,
+ DE_GRV,  DE_6,     DE_7,     DE_8,    DE_9,    DE_0,    DE_CIRC,
+ TG(2),   DE_H,     DE_J,     DE_K,    DE_L,    DE_Q,    DE_Z,
+ /*-*/    DE_S,     DE_N,     DE_R,    DE_T,    DE_D,    DE_SS,
+ KC_TAB,  DE_B,     DE_M,     DE_COMM, DE_DOT,  KC_UP,   DE_Y,
+ /*-*/    /*-*/     KC_RCTL,  KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT,
+ M(UM),   KC_DELT,
+ KC_PGUP,
+ KC_PGDN, KC_ENTER, KC_SPACE
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * |     |EXLM|DQOT|PARA|    |    |     |     |    |    |    |    |RING|     |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |     |ASTR|PIPE|SLSH|LCBR|RCBR|     |     |HASH|LESS|MORE|    |DQOT|     |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    |PLUS|EQL |    |    |     |     |BSLS|PERC|SCLN|COLN| ↑  |     |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |    |    |    |                     !    |    | ←  | ↓  | →  |
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |     |     | !     |     |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     |     | !     |     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |     |     |     | !     |     |     |
+ *                   '-----------------' '-----------------'
+ */
+[L1] = KEYMAP(
+ KC_TRNS, DE_EXLM, DE_DQOT, DE_PARA, KC_TRNS,               KC_TRNS,               KC_TRNS,
+ KC_TRNS, DE_ASTR, DE_PIPE, DE_SLSH, DE_LCBR,               DE_RCBR,               KC_TRNS,
+ KC_TRNS, DE_UNDS, DE_MINS, DE_AMPR, DE_LBRC,               DE_RBRC,
+ KC_TRNS, KC_TRNS, DE_PLUS, DE_EQL,  KC_TRNS,               KC_TRNS,               KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    /*-*/                  KC_TRNS,               KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    /*-*/                  /*-*/                  KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS,               KC_TRNS,               KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,               DE_RING,               KC_TRNS,
+ KC_TRNS, DE_HASH, DE_LESS, DE_MORE, KC_TRNS,               DE_DQOT,               KC_TRNS,
+ /*-*/    DE_DLR,  DE_LPRN, DE_RPRN, DE_TILD,               DE_QUOT,               DE_QST,
+ KC_TRNS, DE_BSLS, DE_PERC, DE_SCLN, DE_COLN,               M(UC_UPWARDS_ARROW),   KC_TRNS,
+ /*-*/    /*-*/    KC_TRNS, KC_TRNS, M(UC_LEFTWARDS_ARROW), M(UC_DOWNWARDS_ARROW), M(UC_RIGHTWARDS_ARROW),
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * |     | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |     |    |    |    |    |    |     |     |    | P7 | P8 | P9 |PAST|PSLS |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    |    |    |    |    |-----!-----!    | P4 | P5 | P6 |PMNS|PMNS |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    |    |    |    |    |     | NLCK|    | P1 | P2 | P3 |PPLS|PPLS |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |    |    |    |                     ! P0 |PCMM|PDOT|PENT|PENT|
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |     |     | !     |     |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     |     | !     |     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |     |     |     | !     |     |     |
+ *                   '-----------------' '-----------------'
+ */
+[L2] = KEYMAP(
+ KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F11,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS, KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_F12,  KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_PEQL,
+ KC_TRNS, KC_TRNS, KC_P7,   KC_P8,   KC_P9,   KC_PAST, KC_PSLS,
+ /*-*/    KC_TRNS, KC_P4,   KC_P5,   KC_P6,   KC_PMNS, KC_PMNS,
+ KC_NLCK, KC_TRNS, KC_P1,   KC_P2,   KC_P3,   KC_PPLS, KC_PPLS,
+ /*-*/    /*-*/    KC_P0,   KC_PCMM, KC_PDOT, KC_PENT, KC_PENT,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * |     | ¹  | ²  | ³  | ⁴  | ⁵  |  ∀  |     | ⁶  | ⁷  | ⁸  | ⁹  |  ⁰ |     |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |     | ×  | ½  | ÷  | ¼  |  ⅕ |     |     | ⅙  |    | ⅛  |    |    |     |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    | ±  | AT |EURO| ∅  |-----!-----! ∞  | ⁿ  | ∃  | ∈  |    |     |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     | ⅓  | ≠  | ⅔  | ¾  | ≃  |     |     |EXLM|    | ∄  | ∉  |    |     |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |    |    |    |                     !    |    |    |    |    |
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |     |     | !     |     |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     |     | !     |     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |     |     |     | !     |     |     |
+ *                   '-----------------' '-----------------'
+ */
+[L3] = KEYMAP(
+ KC_TRNS, M(UC_SUPERSCRIPT_ONE),           M(UC_SUPERSCRIPT_TWO),                  M(UC_SUPERSCRIPT_THREE),          M(UC_SUPERSCRIPT_FOUR),               M(UC_SUPERSCRIPT_FIVE),          M(UC_FOR_ALL),
+ KC_TRNS, M(UC_MULTIPLICATION_SIGN),       M(UC_VULGAR_FRACTION_ONE_HALF),         M(UC_DIVISION_SIGN),              M(UC_VULGAR_FRACTION_ONE_QUARTER),    M(UC_VULGAR_FRACTION_ONE_FIFTH), KC_TRNS,
+ KC_TRNS, KC_TRNS,                         M(UC_PLUS_MINUS_SIGN),                  DE_AT,                            DE_EURO,                              M(UC_EMPTY_SET),
+ KC_TRNS, M(UC_VULGAR_FRACTION_ONE_THIRD), M(UC_NOT_EQUAL_TO),                     M(UC_VULGAR_FRACTION_TWO_THIRDS), M(UC_VULGAR_FRACTION_THREE_QUARTERS), M(UC_ASYMPTOTICALLY_EQUAL_TO),   KC_TRNS,
+ KC_TRNS, KC_TRNS,                         KC_TRNS,                                KC_TRNS,                          KC_TRNS,
+ /*-*/    /*-*/                            /*-*/                                   /*-*/                             /*-*/                                 KC_TRNS,                         KC_TRNS,
+ /*-*/    /*-*/                            /*-*/                                   /*-*/                             /*-*/                                 /*-*/                            KC_TRNS,
+ /*-*/    /*-*/                            /*-*/                                   /*-*/                             KC_TRNS,                              KC_TRNS,                         KC_TRNS,
+ KC_TRNS, M(UC_SUPERSCRIPT_SIX),           M(UC_SUPERSCRIPT_SEVEN),                M(UC_SUPERSCRIPT_EIGHT),          M(UC_SUPERSCRIPT_NINE),               M(UC_SUPERSCRIPT_ZERO),          KC_TRNS,
+ KC_TRNS, M(UC_VULGAR_FRACTION_ONE_SIXTH), KC_TRNS,                                M(UC_VULGAR_FRACTION_ONE_EIGHTH), KC_TRNS,                              KC_TRNS,                         KC_TRNS,
+ /*-*/    M(UC_INFINITY),                  M(UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N), M(UC_THERE_EXISTS),               M(UC_ELEMENT_OF),                     KC_TRNS,                         KC_TRNS,
+ KC_TRNS, DE_EXLM,                         KC_TRNS,                                M(UC_THERE_DOES_NOT_EXIST),       M(UC_NOT_AN_ELEMENT_OF),              KC_TRNS,                         KC_TRNS,
+ /*-*/    /*-*/                            KC_TRNS,                                KC_TRNS,                          KC_TRNS,                              KC_TRNS,                         KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS,                         KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * |     | ₁  | ₂  | ₃  | ₄  | ₅  |     |     | ₆  | ₇  | ₈  | ₉  | ₀  |     |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |     | χ  | π  | φ  | ω  | γ  |     |     | η  | ξ  | κ  | λ  |    |  ζ  |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     | υ  | ι  | α  | ε  | ο  |-----!-----! σ  | ν  | ρ  | τ  | δ  |  ς  |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    | θ  |    |    |    |     |     | β  | μ  |    |    |    |  ψ  |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |    |    |    |                     !    |    |    |    |    |
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |     |     | !     |     |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     |     | !     |     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |     |     |     | !     |     |     |
+ *                   '-----------------' '-----------------'
+ */
+[L4] = KEYMAP(
+ KC_TRNS, M(UC_SUBSCRIPT_ONE),              M(UC_SUBSCRIPT_TWO),            M(UC_SUBSCRIPT_THREE),          M(UC_SUBSCRIPT_FOUR),             M(UC_SUBSCRIPT_FIVE),             KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_CHI),     M(UC_GREEK_SMALL_LETTER_PI),    M(UC_GREEK_SMALL_LETTER_PHI),   M(UC_GREEK_SMALL_LETTER_OMEGA),   M(UC_GREEK_SMALL_LETTER_GAMMA),   KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_UPSILON), M(UC_GREEK_SMALL_LETTER_IOTA),  M(UC_GREEK_SMALL_LETTER_ALPHA), M(UC_GREEK_SMALL_LETTER_EPSILON), M(UC_GREEK_SMALL_LETTER_OMICRON),
+ KC_TRNS, KC_TRNS,                          M(UC_GREEK_SMALL_LETTER_THETA), KC_TRNS,                        KC_TRNS,                          KC_TRNS,                          KC_TRNS,
+ KC_TRNS, KC_TRNS,                          KC_TRNS,                        KC_TRNS,                        KC_TRNS,
+ /*-*/    /*-*/                             /*-*/                           /*-*/                           /*-*/                             KC_TRNS,                          KC_TRNS,
+ /*-*/    /*-*/                             /*-*/                           /*-*/                           /*-*/                             /*-*/                             KC_TRNS,
+ /*-*/    /*-*/                             /*-*/                           /*-*/                           KC_TRNS,                          KC_TRNS,                          KC_TRNS,
+ KC_TRNS, M(UC_SUBSCRIPT_SIX),              M(UC_SUBSCRIPT_SEVEN),          M(UC_SUBSCRIPT_EIGHT),          M(UC_SUBSCRIPT_NINE),             M(UC_SUBSCRIPT_ZERO),             KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_ETA),     M(UC_GREEK_SMALL_LETTER_XI),    M(UC_GREEK_SMALL_LETTER_KAPPA), M(UC_GREEK_SMALL_LETTER_LAMDA),   KC_TRNS,                          M(UC_GREEK_SMALL_LETTER_ZETA),
+ /*-*/    M(UC_GREEK_SMALL_LETTER_SIGMA),   M(UC_GREEK_SMALL_LETTER_NU),    M(UC_GREEK_SMALL_LETTER_RHO),   M(UC_GREEK_SMALL_LETTER_TAU),     M(UC_GREEK_SMALL_LETTER_DELTA),   M(UC_GREEK_SMALL_LETTER_FINAL_SIGMA),
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_BETA),    M(UC_GREEK_SMALL_LETTER_MU),    KC_TRNS,                        KC_TRNS,                          KC_TRNS,                          M(UC_GREEK_SMALL_LETTER_PSI),
+ /*-*/    /*-*/                             KC_TRNS,                        KC_TRNS,                        KC_TRNS,                          KC_TRNS,                          KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS,                          KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |     | Χ  | Π  | Φ  | Ω  | Γ  |     |     | Η  | Ξ  | Κ  | Λ  |    |  Ζ  |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     | Υ  | Ι  | Α  | Ε  | Ο  |-----!-----! Σ  | Ν  | Ρ  | Τ  | Δ  |     |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    | Θ  |    |    |    |     |     | Β  | Μ  |    |    |    |  Ψ  |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |    |    |    |                     !    |    |    |    |    |
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |     |     | !     |     |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     |     | !     |     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |     |     |     | !     |     |     |
+ *                   '-----------------' '-----------------'
+ */
+[L5] = KEYMAP(
+ KC_TRNS, KC_TRNS,                            KC_TRNS,                          KC_TRNS,                          KC_TRNS,                            KC_TRNS,                            KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_CHI),     M(UC_GREEK_CAPITAL_LETTER_PI),    M(UC_GREEK_CAPITAL_LETTER_PHI),   M(UC_GREEK_CAPITAL_LETTER_OMEGA),   M(UC_GREEK_CAPITAL_LETTER_GAMMA),   KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_UPSILON), M(UC_GREEK_CAPITAL_LETTER_IOTA),  M(UC_GREEK_CAPITAL_LETTER_ALPHA), M(UC_GREEK_CAPITAL_LETTER_EPSILON), M(UC_GREEK_CAPITAL_LETTER_OMICRON),
+ KC_TRNS, KC_TRNS,                            M(UC_GREEK_CAPITAL_LETTER_THETA), KC_TRNS,                          KC_TRNS,                            KC_TRNS,                            KC_TRNS,
+ KC_TRNS, KC_TRNS,                            KC_TRNS,                          KC_TRNS,                          KC_TRNS,
+ /*-*/    /*-*/                               /*-*/                             /*-*/                             /*-*/                               KC_TRNS,                            KC_TRNS,
+ /*-*/    /*-*/                               /*-*/                             /*-*/                             /*-*/                               /*-*/                               KC_TRNS,
+ /*-*/    /*-*/                               /*-*/                             /*-*/                             KC_TRNS,                            KC_TRNS,                            KC_TRNS,
+ KC_TRNS, KC_TRNS,                            KC_TRNS,                          KC_TRNS,                          KC_TRNS,                            KC_TRNS,                            KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ETA),     M(UC_GREEK_CAPITAL_LETTER_XI),    M(UC_GREEK_CAPITAL_LETTER_KAPPA), M(UC_GREEK_CAPITAL_LETTER_LAMDA),   KC_TRNS,                            M(UC_GREEK_CAPITAL_LETTER_ZETA),
+ /*-*/    M(UC_GREEK_CAPITAL_LETTER_SIGMA),   M(UC_GREEK_CAPITAL_LETTER_NU),    M(UC_GREEK_CAPITAL_LETTER_RHO),   M(UC_GREEK_CAPITAL_LETTER_TAU),     M(UC_GREEK_CAPITAL_LETTER_DELTA),   KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_BETA),    M(UC_GREEK_CAPITAL_LETTER_MU),    KC_TRNS,                          KC_TRNS,                            KC_TRNS,                            M(UC_GREEK_CAPITAL_LETTER_PSI),
+ /*-*/    /*-*/                               KC_TRNS,                          KC_TRNS,                          KC_TRNS,                            KC_TRNS,                            KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS,                            KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    |    |    |    |    |-----!-----!    |    |    |    |    |     |
+ * !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+ * |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ *  |    |    |    |    |    |                     !    |    |    |    |    |
+ *  '------------------------'                     '------------------------'
+ *                         .-----------. .-----------.
+ *                         |     |     | !     |     |
+ *                   .-----+-----+-----! !-----+-----+-----.
+ *                   !     !     |     | !     |     !     !
+ *                   !     !     !-----! !-----!     !     !
+ *                   |     |     |     | !     |     |     |
+ *                   '-----------------' '-----------------'
+ */
+[L6] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS, KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS,
+ /*-*/    /*-*/    /*-*/    /*-*/    KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/    /*-*/    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {};
+
+#define UC_MODE_WIN 0
+#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+
+// TODO: allow default mode to be configured
+static uint16_t unicode_mode = UC_MODE_WIN;
+
+uint16_t hextokeycode(uint8_t hex) {
+    if (hex == 0x0) {
+        return KC_P0;
+    }
+    if (hex < 0xA) {
+        return KC_P1 + (hex - 0x1);
+    }
+    return KC_A + (hex - 0xA);
+}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {
+    switch (unicode_mode) {
+    case UC_MODE_WIN:
+        register_code(KC_LALT);
+
+        register_code(KC_PPLS);
+        unregister_code(KC_PPLS);
+
+        register_code(hextokeycode((hi & 0xF0) >> 4));
+        unregister_code(hextokeycode((hi & 0xF0) >> 4));
+        register_code(hextokeycode((hi & 0x0F)));
+        unregister_code(hextokeycode((hi & 0x0F)));
+        register_code(hextokeycode((lo & 0xF0) >> 4));
+        unregister_code(hextokeycode((lo & 0xF0) >> 4));
+        register_code(hextokeycode((lo & 0x0F)));
+        unregister_code(hextokeycode((lo & 0x0F)));
+
+        unregister_code(KC_LALT);
+        break;
+    case UC_MODE_LINUX:
+        register_code(KC_LCTL);
+        register_code(KC_LSFT);
+
+        register_code(KC_U);
+        unregister_code(KC_U);
+
+        register_code(hextokeycode((hi & 0xF0) >> 4));
+        unregister_code(hextokeycode((hi & 0xF0) >> 4));
+        register_code(hextokeycode((hi & 0x0F)));
+        unregister_code(hextokeycode((hi & 0x0F)));
+        register_code(hextokeycode((lo & 0xF0) >> 4));
+        unregister_code(hextokeycode((lo & 0xF0) >> 4));
+        register_code(hextokeycode((lo & 0x0F)));
+        unregister_code(hextokeycode((lo & 0x0F)));
+
+        unregister_code(KC_LCTL);
+        unregister_code(KC_LSFT);
+        break;
+    case UC_MODE_OSX:
+        break;
+    }
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+    if (!record->event.pressed) {
+        return MACRO_NONE;
+    }
+    // MACRODOWN only works in this function
+    switch(id) {
+        case UM:
+            unicode_mode = (unicode_mode + 1) % 2;
+            break;
+
+case UC_GREEK_SMALL_LETTER_OMICRON:
+    unicode_action_function(0x03, 0xbf);
+    break;
+case UC_LEFTWARDS_ARROW:
+    unicode_action_function(0x21, 0x90);
+    break;
+case UC_GREEK_CAPITAL_LETTER_RHO:
+    unicode_action_function(0x03, 0xa1);
+    break;
+case UC_SUBSCRIPT_THREE:
+    unicode_action_function(0x20, 0x83);
+    break;
+case UC_VULGAR_FRACTION_ONE_EIGHTH:
+    unicode_action_function(0x21, 0x5b);
+    break;
+case UC_GREEK_SMALL_LETTER_LAMDA:
+    unicode_action_function(0x03, 0xbb);
+    break;
+case UC_VULGAR_FRACTION_ONE_THIRD:
+    unicode_action_function(0x21, 0x53);
+    break;
+case UC_GREEK_SMALL_LETTER_XI:
+    unicode_action_function(0x03, 0xbe);
+    break;
+case UC_THERE_DOES_NOT_EXIST:
+    unicode_action_function(0x22, 0x04);
+    break;
+case UC_SUPERSCRIPT_ONE:
+    unicode_action_function(0x00, 0xb9);
+    break;
+case UC_GREEK_SMALL_LETTER_BETA:
+    unicode_action_function(0x03, 0xb2);
+    break;
+case UC_SUBSCRIPT_FIVE:
+    unicode_action_function(0x20, 0x85);
+    break;
+case UC_GREEK_CAPITAL_LETTER_IOTA:
+    unicode_action_function(0x03, 0x99);
+    break;
+case UC_VULGAR_FRACTION_ONE_FIFTH:
+    unicode_action_function(0x21, 0x55);
+    break;
+case UC_GREEK_SMALL_LETTER_PSI:
+    unicode_action_function(0x03, 0xc8);
+    break;
+case UC_SUBSCRIPT_NINE:
+    unicode_action_function(0x20, 0x89);
+    break;
+case UC_SUPERSCRIPT_FOUR:
+    unicode_action_function(0x20, 0x74);
+    break;
+case UC_RIGHTWARDS_ARROW:
+    unicode_action_function(0x21, 0x92);
+    break;
+case UC_SUPERSCRIPT_SIX:
+    unicode_action_function(0x20, 0x76);
+    break;
+case UC_DOWNWARDS_ARROW:
+    unicode_action_function(0x21, 0x93);
+    break;
+case UC_GREEK_SMALL_LETTER_PI:
+    unicode_action_function(0x03, 0xc0);
+    break;
+case UC_SUPERSCRIPT_TWO:
+    unicode_action_function(0x00, 0xb2);
+    break;
+case UC_GREEK_CAPITAL_LETTER_OMEGA:
+    unicode_action_function(0x03, 0xa9);
+    break;
+case UC_GREEK_CAPITAL_LETTER_PSI:
+    unicode_action_function(0x03, 0xa8);
+    break;
+case UC_SUBSCRIPT_FOUR:
+    unicode_action_function(0x20, 0x84);
+    break;
+case UC_GREEK_CAPITAL_LETTER_NU:
+    unicode_action_function(0x03, 0x9d);
+    break;
+case UC_DIVISION_SIGN:
+    unicode_action_function(0x00, 0xf7);
+    break;
+case UC_GREEK_SMALL_LETTER_SIGMA:
+    unicode_action_function(0x03, 0xc3);
+    break;
+case UC_GREEK_SMALL_LETTER_RHO:
+    unicode_action_function(0x03, 0xc1);
+    break;
+case UC_VULGAR_FRACTION_ONE_SIXTH:
+    unicode_action_function(0x21, 0x59);
+    break;
+case UC_GREEK_SMALL_LETTER_GAMMA:
+    unicode_action_function(0x03, 0xb3);
+    break;
+case UC_VULGAR_FRACTION_TWO_THIRDS:
+    unicode_action_function(0x21, 0x54);
+    break;
+case UC_GREEK_SMALL_LETTER_NU:
+    unicode_action_function(0x03, 0xbd);
+    break;
+case UC_GREEK_SMALL_LETTER_ZETA:
+    unicode_action_function(0x03, 0xb6);
+    break;
+case UC_GREEK_SMALL_LETTER_EPSILON:
+    unicode_action_function(0x03, 0xb5);
+    break;
+case UC_GREEK_SMALL_LETTER_KAPPA:
+    unicode_action_function(0x03, 0xba);
+    break;
+case UC_SUPERSCRIPT_SEVEN:
+    unicode_action_function(0x20, 0x77);
+    break;
+case UC_GREEK_CAPITAL_LETTER_PI:
+    unicode_action_function(0x03, 0xa0);
+    break;
+case UC_GREEK_SMALL_LETTER_FINAL_SIGMA:
+    unicode_action_function(0x03, 0xc2);
+    break;
+case UC_GREEK_CAPITAL_LETTER_XI:
+    unicode_action_function(0x03, 0x9e);
+    break;
+case UC_GREEK_SMALL_LETTER_THETA:
+    unicode_action_function(0x03, 0xb8);
+    break;
+case UC_GREEK_SMALL_LETTER_ETA:
+    unicode_action_function(0x03, 0xb7);
+    break;
+case UC_SUBSCRIPT_TWO:
+    unicode_action_function(0x20, 0x82);
+    break;
+case UC_ASYMPTOTICALLY_EQUAL_TO:
+    unicode_action_function(0x22, 0x43);
+    break;
+case UC_GREEK_SMALL_LETTER_ALPHA:
+    unicode_action_function(0x03, 0xb1);
+    break;
+case UC_GREEK_CAPITAL_LETTER_PHI:
+    unicode_action_function(0x03, 0xa6);
+    break;
+case UC_GREEK_SMALL_LETTER_PHI:
+    unicode_action_function(0x03, 0xc6);
+    break;
+case UC_INFINITY:
+    unicode_action_function(0x22, 0x1e);
+    break;
+case UC_GREEK_CAPITAL_LETTER_OMICRON:
+    unicode_action_function(0x03, 0x9f);
+    break;
+case UC_ELEMENT_OF:
+    unicode_action_function(0x22, 0x08);
+    break;
+case UC_MULTIPLICATION_SIGN:
+    unicode_action_function(0x00, 0xd7);
+    break;
+case UC_SUBSCRIPT_ZERO:
+    unicode_action_function(0x20, 0x80);
+    break;
+case UC_GREEK_CAPITAL_LETTER_SIGMA:
+    unicode_action_function(0x03, 0xa3);
+    break;
+case UC_GREEK_SMALL_LETTER_OMEGA:
+    unicode_action_function(0x03, 0xc9);
+    break;
+case UC_SUBSCRIPT_ONE:
+    unicode_action_function(0x20, 0x81);
+    break;
+case UC_GREEK_CAPITAL_LETTER_ZETA:
+    unicode_action_function(0x03, 0x96);
+    break;
+case UC_GREEK_SMALL_LETTER_TAU:
+    unicode_action_function(0x03, 0xc4);
+    break;
+case UC_SUPERSCRIPT_FIVE:
+    unicode_action_function(0x20, 0x75);
+    break;
+case UC_THERE_EXISTS:
+    unicode_action_function(0x22, 0x03);
+    break;
+case UC_PLUS_MINUS_SIGN:
+    unicode_action_function(0x00, 0xb1);
+    break;
+case UC_VULGAR_FRACTION_THREE_QUARTERS:
+    unicode_action_function(0x00, 0xbe);
+    break;
+case UC_SUPERSCRIPT_THREE:
+    unicode_action_function(0x00, 0xb3);
+    break;
+case UC_EMPTY_SET:
+    unicode_action_function(0x22, 0x05);
+    break;
+case UC_UPWARDS_ARROW:
+    unicode_action_function(0x21, 0x91);
+    break;
+case UC_SUPERSCRIPT_NINE:
+    unicode_action_function(0x20, 0x79);
+    break;
+case UC_GREEK_SMALL_LETTER_DELTA:
+    unicode_action_function(0x03, 0xb4);
+    break;
+case UC_GREEK_SMALL_LETTER_MU:
+    unicode_action_function(0x03, 0xbc);
+    break;
+case UC_GREEK_CAPITAL_LETTER_KAPPA:
+    unicode_action_function(0x03, 0x9a);
+    break;
+case UC_SUBSCRIPT_EIGHT:
+    unicode_action_function(0x20, 0x88);
+    break;
+case UC_GREEK_CAPITAL_LETTER_ALPHA:
+    unicode_action_function(0x03, 0x91);
+    break;
+case UC_SUBSCRIPT_SEVEN:
+    unicode_action_function(0x20, 0x87);
+    break;
+case UC_GREEK_CAPITAL_LETTER_BETA:
+    unicode_action_function(0x03, 0x92);
+    break;
+case UC_GREEK_CAPITAL_LETTER_ETA:
+    unicode_action_function(0x03, 0x97);
+    break;
+case UC_SUPERSCRIPT_EIGHT:
+    unicode_action_function(0x20, 0x78);
+    break;
+case UC_SUPERSCRIPT_ZERO:
+    unicode_action_function(0x20, 0x70);
+    break;
+case UC_NOT_AN_ELEMENT_OF:
+    unicode_action_function(0x22, 0x09);
+    break;
+case UC_GREEK_SMALL_LETTER_UPSILON:
+    unicode_action_function(0x03, 0xc5);
+    break;
+case UC_NOT_EQUAL_TO:
+    unicode_action_function(0x22, 0x60);
+    break;
+case UC_GREEK_CAPITAL_LETTER_CHI:
+    unicode_action_function(0x03, 0xa7);
+    break;
+case UC_FOR_ALL:
+    unicode_action_function(0x22, 0x00);
+    break;
+case UC_GREEK_CAPITAL_LETTER_TAU:
+    unicode_action_function(0x03, 0xa4);
+    break;
+case UC_VULGAR_FRACTION_ONE_QUARTER:
+    unicode_action_function(0x00, 0xbc);
+    break;
+case UC_GREEK_SMALL_LETTER_CHI:
+    unicode_action_function(0x03, 0xc7);
+    break;
+case UC_GREEK_CAPITAL_LETTER_THETA:
+    unicode_action_function(0x03, 0x98);
+    break;
+case UC_GREEK_SMALL_LETTER_IOTA:
+    unicode_action_function(0x03, 0xb9);
+    break;
+case UC_GREEK_CAPITAL_LETTER_LAMDA:
+    unicode_action_function(0x03, 0x9b);
+    break;
+case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N:
+    unicode_action_function(0x20, 0x7f);
+    break;
+case UC_GREEK_CAPITAL_LETTER_UPSILON:
+    unicode_action_function(0x03, 0xa5);
+    break;
+case UC_GREEK_CAPITAL_LETTER_MU:
+    unicode_action_function(0x03, 0x9c);
+    break;
+case UC_GREEK_CAPITAL_LETTER_EPSILON:
+    unicode_action_function(0x03, 0x95);
+    break;
+case UC_GREEK_CAPITAL_LETTER_GAMMA:
+    unicode_action_function(0x03, 0x93);
+    break;
+case UC_SUBSCRIPT_SIX:
+    unicode_action_function(0x20, 0x86);
+    break;
+case UC_GREEK_CAPITAL_LETTER_DELTA:
+    unicode_action_function(0x03, 0x94);
+    break;
+case UC_VULGAR_FRACTION_ONE_HALF:
+    unicode_action_function(0x00, 0xbd);
+    break;
+        default:
+            break;
+    }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+        case L1:
+            ergodox_right_led_1_on();
+            break;
+        case L2:
+            ergodox_right_led_2_on();
+            break;
+        case L3:
+            ergodox_right_led_3_on();
+            break;
+        case L4:
+            ergodox_right_led_1_on();
+            ergodox_right_led_2_on();
+            break;
+        case L5:
+            ergodox_right_led_1_on();
+            ergodox_right_led_3_on();
+            break;
+        // case L6:
+        //     ergodox_right_led_2_on();
+        //     ergodox_right_led_3_on();
+        //     break;
+        // case L7:
+        //     ergodox_right_led_1_on();
+        //     ergodox_right_led_2_on();
+        //     ergodox_right_led_3_on();
+        //     break;
+        default:
+            ergodox_board_led_off();
+            break;
+    }
+};

+ 188 - 0
keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md

@@ -0,0 +1,188 @@
+# ManuNeo Ergodox Keyboard Layout
+
+Compile this file to a `keymap.c` file using `compile_keymap.py`
+
+    python compile_keymap.py keymaps/german-manuneo/keymap.md
+
+Tested with python 2.7 and python 3.4
+
+
+# Layout Config
+
+    {
+        "layout": "ergodox_ez",
+        "keymaps_includes": [
+            "ergodox_ez.h",
+            "action_layer.h",
+            "keymap_common.h",
+            "keymap_extras/keymap_german.h",
+        ],
+        "key_prefixes": ["DE_", "KC_"],
+        "macros": {
+            // TODO: implement macros
+            // "MUC": "",
+        },
+        // TODO: implement default unicode mode
+    }
+
+
+# Layers
+
+
+## Layer 0
+
+    .------------------------------------.------------------------------------.
+    |MO(5)| 1  | 2  | 3  | 4  | 5  |ACUT | GRV | 6  | 7  | 8  | 9  | 0  |CIRC |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |MO(4)| X  | P  | F  | W  | G  |HOME |TG(2)| H  | J  | K  | L  | Q  |  Z  |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |MO(1)| U  | I  | A  | E  | O  |-----!-----! S  | N  | R  | T  | D  | SS  |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |MO(3)| UE | OE | AE | C  | V  |END  | TAB | B  | M  |COMM| DOT| UP |  Y  |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |LGUI|LALT|LCTL|                     !RCTL|RALT|LEFT|DOWN|RGHT|
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |INS  |TG(2)| !M(UM)|DELT |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     | APP | ! PGUP|     !     !
+                      !     !     !-----! !-----!     !     !
+                      |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE|
+                      '-----------------' '-----------------'
+
+
+## Layer 1
+
+    .------------------------------------.------------------------------------.
+    |     |EXLM|DQOT|PARA|    |    |     |     |    |    |    |    |RING|     |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |     |ASTR|PIPE|SLSH|LCBR|RCBR|     |     |HASH|LESS|MORE|    |DQOT|     |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    |PLUS|EQL |    |    |     |     |BSLS|PERC|SCLN|COLN| ↑  |     |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |    |    |    |                     !    |    | ←  | ↓  | →  |
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |     |     | !     |     |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     |     | !     |     !     !
+                      !     !     !-----! !-----!     !     !
+                      |     |     |     | !     |     |     |
+                      '-----------------' '-----------------'
+
+
+## Layer 2
+
+    .------------------------------------.------------------------------------.
+    |     | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |     |    |    |    |    |    |     |     |    | P7 | P8 | P9 |PAST|PSLS |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    |    |    |    |    |-----!-----!    | P4 | P5 | P6 |PMNS|PMNS |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    |    |    |    |    |     | NLCK|    | P1 | P2 | P3 |PPLS|PPLS |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |    |    |    |                     ! P0 |PCMM|PDOT|PENT|PENT|
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |     |     | !     |     |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     |     | !     |     !     !
+                      !     !     !-----! !-----!     !     !
+                      |     |     |     | !     |     |     |
+                      '-----------------' '-----------------'
+
+
+
+## Layer 3
+
+http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html
+
+    .------------------------------------.------------------------------------.
+    |     | ¹  | ²  | ³  | ⁴  | ⁵  |  ∀  |     | ⁶  | ⁷  | ⁸  | ⁹  |  ⁰ |     |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |     | ×  | ½  | ÷  | ¼  |  ⅕ |     |     | ⅙  |    | ⅛  |    |    |     |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    | ±  | AT |EURO| ∅  |-----!-----! ∞  | ⁿ  | ∃  | ∈  |    |     |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     | ⅓  | ≠  | ⅔  | ¾  | ≃  |     |     |EXLM|    | ∄  | ∉  |    |     |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |    |    |    |                     !    |    |    |    |    |
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |     |     | !     |     |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     |     | !     |     !     !
+                      !     !     !-----! !-----!     !     !
+                      |     |     |     | !     |     |     |
+                      '-----------------' '-----------------'
+
+
+## Layer 4
+
+
+    .------------------------------------.------------------------------------.
+    |     | ₁  | ₂  | ₃  | ₄  | ₅  |     |     | ₆  | ₇  | ₈  | ₉  | ₀  |     |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |     | χ  | π  | φ  | ω  | γ  |     |     | η  | ξ  | κ  | λ  |    |  ζ  |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     | υ  | ι  | α  | ε  | ο  |-----!-----! σ  | ν  | ρ  | τ  | δ  |  ς  |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    | θ  |    |    |    |     |     | β  | μ  |    |    |    |  ψ  |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |    |    |    |                     !    |    |    |    |    |
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |     |     | !     |     |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     |     | !     |     !     !
+                      !     !     !-----! !-----!     !     !
+                      |     |     |     | !     |     |     |
+                      '-----------------' '-----------------'
+
+
+## Layer 5
+
+    .------------------------------------.------------------------------------.
+    |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |     | Χ  | Π  | Φ  | Ω  | Γ  |     |     | Η  | Ξ  | Κ  | Λ  |    |  Ζ  |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     | Υ  | Ι  | Α  | Ε  | Ο  |-----!-----! Σ  | Ν  | Ρ  | Τ  | Δ  |     |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    | Θ  |    |    |    |     |     | Β  | Μ  |    |    |    |  Ψ  |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |    |    |    |                     !    |    |    |    |    |
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |     |     | !     |     |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     |     | !     |     !     !
+                      !     !     !-----! !-----!     !     !
+                      |     |     |     | !     |     |     |
+                      '-----------------' '-----------------'
+
+
+## Layer 6
+
+    .------------------------------------.------------------------------------.
+    |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+    !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+    |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    |    |    |    |    |-----!-----!    |    |    |    |    |     |
+    !-----+----+----+----x----x----!     !     !----x----x----+----+----+-----!
+    |     |    |    |    |    |    |     |     |    |    |    |    |    |     |
+    '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+     |    |    |    |    |    |                     !    |    |    |    |    |
+     '------------------------'                     '------------------------'
+                            .-----------. .-----------.
+                            |     |     | !     |     |
+                      .-----+-----+-----! !-----+-----+-----.
+                      !     !     |     | !     |     !     !
+                      !     !     !-----! !-----!     !     !
+                      |     |     |     | !     |     |     |
+                      '-----------------' '-----------------'
+

+ 74 - 53
keyboard/ergodox_ez/keymaps/osx_de/keymap.c

@@ -13,9 +13,11 @@
 #define M_CTRL_CMDV 1
 #define M_CTRL_CMDC 2
 #define M_MEH_SH_ACUT 3
-#define M_DE_PLUS_CTRLALT 12
-#define M_DE_CIRC_CTRLCMD 13
+#define M_DE_OSX_PLUS_CTRLALT 12
+#define M_DE_OSX_CIRC_CTRLCMD 13
 #define M_TOGGLE_5 14
+#define M_CTL_SFT_HASH 15
+#define M_LGUI_SHFT 16
 
 #define SM_SMILE 4
 #define SM_SMIRK 5
@@ -30,19 +32,19 @@
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Basic layer
  *
- * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |  ESC   |   1  |   2  |   3  |   4  |   5  |CMD-V |           |CMD-C |   6  |   7  |   8  |   9  |   0  |   ß    |
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |  TAB   |   Q  |   W  |   E  |   R  |   T  | CMD  |           | CMD  |   Z  |   U  |   I  |   O  |   P  |   ü    |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |  LALT  |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ö  |  ä/RALT|
- * |--------+------+------+------+------+------| LALT |           | RALT |------+------+------+------+------+--------|
- * | LShift |Y/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |-/Ctrl| RShift |
- * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |</L1|  ^°  |AltShf| Left | Right|                                       |  Up  | Down | CMD-SHIFT |  +  | #/L1 |
- *   `----------------------------------'                                       `----------------------------------'
+ * ,-----------------------------------------------------.           ,--------------------------------------------------.
+ * |  ESC   |   1  |   2  |   3  |   4  |   5  |CTL_SFT/#|           |CTL_SFT/#|   6  |   7  |   8  |   9  |   0  |   ß    |
+ * |--------+------+------+------+------+----------------|           |---------+------+------+------+------+------+--------|
+ * |  TAB   |   Q  |   W  |   E  |   R  |   T  | CMD     |           | CMD     |   Z  |   U  |   I  |   O  |   P  |   ü    |
+ * |--------+------+------+------+------+------|         |           |         |------+------+------+------+------+--------|
+ * |  LALT  |   A  |   S  |   D  |   F  |   G  |---------|           |---------|   H |   J  |   K  |   L  |   ö  |  ä/RALT|
+ * |--------+------+------+------+------+------| LALT    |           | RALT    |------+------+------+------+------+--------|
+ * | LShift |Y/Ctrl|   X  |   C  |   V  |   B  |         |           |         |   N  |   M  |   ,  |   .  |-/Ctrl| RShift |
+ * `--------+------+------+------+------+----------------'           `-------------+------+------+------+------+--------'
+ *   |</L1| ^°/CTRL_CMD | +/CTRL_ALT | UP | DOWN|                    |  Left  | Right | CMD-SHFT| ALT-SHIFT  | +/L1 |
+ *   `------------------------------------------'                    `---------------------------------------------'
  *                                        ,-------------.       ,---------------.
- *                                        | MDIA | Meh  |       | Hyper|  NUM   |
+ *                                        |`/Meh | Media|       | NUM | ´/Hyper |
  *                                 ,------|------|------|       |------+--------+------.
  *                                 |      |      | Home |       | PgUp |        |      |
  *                                 | Back-|  Del |------|       |------|  Enter | Space|
@@ -53,21 +55,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 // Otherwise, it needs KC_*
 [BASE] = KEYMAP(  // layer 0 : default
         // left hand
-        KC_ESC,                  DE_1,         DE_2,   DE_3,   DE_4,   DE_5,   M(M_CTRL_CMDV),
-        KC_TAB,                  DE_Q,         DE_W,   DE_E,   DE_R,   DE_T,   KC_LGUI,
-        KC_LALT,                   DE_A,         DE_S,   DE_D,   DE_F,   DE_G,
-        KC_LSFT,                 CTL_T(DE_Y),  DE_X,   DE_C,   DE_V,   DE_B,   KC_LALT,
-        LT(SYMB,DE_LESS),        M(M_DE_CIRC_CTRLCMD),      M(M_DE_PLUS_CTRLALT), LALT(KC_LSFT),  LGUI(KC_LSFT),
-                                               			  	M(M_MEH_SH_ACUT), 	TG(2),
+        KC_ESC,                  DE_OSX_1,         DE_OSX_2,   DE_OSX_3,   DE_OSX_4,   DE_OSX_5,   M(M_CTL_SFT_HASH),
+        KC_TAB,                  DE_OSX_Q,         DE_OSX_W,   DE_OSX_E,   DE_OSX_R,   DE_OSX_T,   KC_LGUI,
+        KC_LALT,                 DE_OSX_A,         DE_OSX_S,   DE_OSX_D,   DE_OSX_F,   DE_OSX_G,
+        KC_LSFT,                 CTL_T(DE_OSX_Y),  DE_OSX_X,   DE_OSX_C,   DE_OSX_V,   DE_OSX_B,   KC_LALT,
+        LT(SYMB,DE_OSX_LESS),        M(M_DE_OSX_CIRC_CTRLCMD),      M(M_DE_OSX_PLUS_CTRLALT), KC_UP,  KC_DOWN,
+                                               			  	M(M_MEH_SH_ACUT), 	TG(MDIA),
                                                               					KC_HOME,
                                                				KC_BSPC,KC_DEL,		LT(SMLY,KC_END),
         // right hand
-             M(M_CTRL_CMDC),  DE_6,   DE_7,   DE_8,   DE_9,   DE_0,     	DE_SS,
-             KC_RGUI,     DE_Z,   DE_U,   DE_I,   DE_O,   DE_P,         	DE_UE,
-                          DE_H,   DE_J,   DE_K,   DE_L,   DE_OE,		ALT_T(DE_AE),
-             KC_RALT,	  DE_N,   DE_M,   DE_COMM,DE_DOT, CTL_T(DE_MINS),   	KC_RSFT,
-                                  KC_LEFT,  KC_UP,KC_DOWN,KC_RIGHT,        LT(SYMB,DE_HASH),
-             TG(4),	  ALL_T(DE_ACUT),
+             M(M_CTL_SFT_HASH),  DE_OSX_6,  DE_OSX_7,   DE_OSX_8,   DE_OSX_9,   DE_OSX_0,   DE_OSX_SS,
+             KC_RGUI,     DE_OSX_Z,   DE_OSX_U,   DE_OSX_I,   DE_OSX_O,   DE_OSX_P,         	DE_OSX_UE,
+                          DE_OSX_H,   DE_OSX_J,   DE_OSX_K,   DE_OSX_L,   DE_OSX_OE,		ALT_T(DE_OSX_AE),
+             KC_RALT,	  DE_OSX_N,   DE_OSX_M,   DE_OSX_COMM,DE_OSX_DOT, CTL_T(DE_OSX_MINS),   	KC_RSFT,
+                                  KC_LEFT,  KC_RIGHT,LGUI(KC_LSFT),LALT(KC_LSFT),        LT(SYMB,DE_OSX_PLUS),
+             TG(NUMB),	  ALL_T(DE_OSX_ACUT),
              KC_PGUP,
              KC_PGDN,KC_ENT, KC_SPC
     ),
@@ -76,42 +78,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * ,--------------------------------------------------.           ,--------------------------------------------------.
  * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |  L5  |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |  <   |  >   |   !  |  ?   |      |      |           |      |   \  |   [  |   ]  |   |  |   #  |   F12  |
+ * |        |  <   |  >   |   !  |  ?   |      |      |           |      |   \  |   [  |   ]  |   <  |   >  |   !    |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   #  |   $  |   \  |   /  |   .  |------|           |------|   /  |   (  |   )  |   {  |   }  |        |
+ * |        |   #  |   $  |   \  |   /  |   .  |------|           |------|   /  |   (  |   )  |   {  |   }  |   #    |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |   ^  |   %  |   |  |   ~  |      |           |      |   &  |   <  |   >  |   "  |   '  |    ?   |
+ * |        |      |   ^  |   %  |   |  |   ~  |      |           |      |   |  |   ~  |  ^   |   UP |      |   $    |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      |      |      |                                       |      |      |   .  |   !  |      |
+ *   |      |      |      |      |      |                                       |   '  |  LEFT| DOWN  | RIGHT |    |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
- *                                        |      |      |       |      |      |
+ *                                        |      |      |       | F13  |  F12 |
  *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |      |       | F14  |      |      |
  *                                 |      |      |------|       |------|      |      |
- *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |      |       | F15  |      |      |
  *                                 `--------------------'       `--------------------'
  */
 // SYMBOLS
 [SYMB] = KEYMAP(
        // left hand
        KC_TRNS,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
-       KC_TRNS,DE_LESS,DE_MORE,DE_EXLM,DE_QST, KC_TRNS,KC_TRNS,
-       KC_TRNS,DE_HASH,DE_DLR, DE_BSLS,DE_SLSH,KC_DOT,
-       KC_TRNS,KC_TRNS,DE_LESS,DE_PERC,DE_PIPE,DE_TILD,KC_TRNS,
+       KC_TRNS,DE_OSX_LESS,DE_OSX_MORE,DE_OSX_EXLM,DE_OSX_QST, KC_TRNS,KC_TRNS,
+       KC_TRNS,DE_OSX_HASH,DE_OSX_DLR, DE_OSX_BSLS,DE_OSX_SLSH,KC_DOT,
+       KC_TRNS,KC_TRNS,DE_OSX_LESS,DE_OSX_PERC,DE_OSX_PIPE,DE_OSX_TILD,KC_TRNS,
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                        KC_TRNS,KC_TRNS,
                                                KC_TRNS,
                                KC_TRNS,KC_DEL,KC_TRNS,
        // right hand
-       M(M_TOGGLE_5), KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
-       KC_TRNS, LALT(LSFT(KC_7)),   LALT(KC_5),   LALT(KC_6),    LALT(KC_7),    DE_HASH, KC_F12,
-                DE_SLSH,   DE_LPRN,   DE_RPRN,    LALT(KC_8),    LALT(KC_9), KC_TRNS,
-       KC_TRNS, DE_AMPR, KC_GRV,   LSFT(KC_GRV),    DE_DQOT,    DE_QUOT, DE_QST,
-                         KC_TRNS,KC_DOT,  KC_EXLM,    KC_TRNS,  KC_TRNS,
-       KC_TRNS, KC_TRNS,
-       KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_TRNS
+       M(M_TOGGLE_5), KC_F6, KC_F7,   KC_F8,  KC_F9,   KC_F10,   KC_F11,
+       KC_TRNS, LALT(LSFT(KC_7)),   LALT(KC_5),   LALT(KC_6),    DE_OSX_LESS,    DE_OSX_MORE, DE_OSX_EXLM,
+                DE_OSX_SLSH,              DE_OSX_LPRN,   DE_OSX_RPRN,    LALT(KC_8),    LALT(KC_9),  DE_OSX_HASH,
+       KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD,  DE_OSX_CIRC,    KC_UP, DE_OSX_MINS,  LSFT(KC_4),
+                         DE_OSX_QUOT,   KC_LEFT,  KC_DOWN,    KC_RIGHT,  KC_TRNS,
+       KC_F13, KC_F12,
+       KC_F14,
+       KC_F15, KC_TRNS, KC_TRNS
 ),
 /* Keymap 2: Media and mouse keys
  *
@@ -135,7 +137,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                 `--------------------'       `--------------------'
  */
 // MEDIA AND MOUSE
-KEYMAP(
+[MDIA] = KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D,
@@ -177,7 +179,7 @@ KEYMAP(
  *                                 |      |      |      |       |      |        |      |
  *                                 `--------------------'       `----------------------'
  */
-KEYMAP(
+[SMLY] = KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS,    KC_TRNS,  KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,
        KC_TRNS, KC_TRNS,    KC_TRNS,  KC_TRNS,    KC_TRNS,    KC_TRNS,
@@ -197,7 +199,7 @@ KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS
 ),
 //number pad
-KEYMAP(
+[NUMB] = KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
@@ -209,9 +211,9 @@ KEYMAP(
        // right hand
        KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
        KC_TRNS, KC_UP,   KC_7,   KC_8,    KC_9,    LSFT(KC_RBRC), KC_F12,
-                KC_DOWN, KC_4,   KC_5,    KC_6,    KC_RBRC, DE_MINS,
+                KC_DOWN, KC_4,   KC_5,    KC_6,    KC_RBRC, DE_OSX_MINS,
        KC_TRNS, LSFT(KC_6), KC_1,   KC_2,    KC_3,    LSFT(KC_7), KC_TRNS,
-                         KC_0,KC_DOT,  KC_0,    DE_EQL,  KC_TRNS,
+                         KC_0,KC_DOT,  KC_COMM,    DE_OSX_EQL,  KC_TRNS,
        KC_TRNS, KC_TRNS,
        KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS
@@ -238,7 +240,7 @@ KEYMAP(
  *                                 |      |      |  F4  |       |      |        |      |
  *                                 `--------------------'       `----------------------'
  */
-KEYMAP(
+[EGOS] = KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -308,11 +310,30 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 			if (timer_elapsed(start) > 150){
 				return MACRO(U(LCTRL),U(LSFT),U(LALT),END);
 			} else {
-				return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_ACUT here, as macro needs KC_ prefix
+				return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_OSX_ACUT here, as macro needs KC_ prefix
 			}
 		}
 		break;
-	case M_DE_CIRC_CTRLCMD:
+	case M_LGUI_SHFT:
+		if (record->event.pressed){
+			return MACRO(D(LGUI),D(LSFT),END);
+		}else{
+			return MACRO(U(LGUI),U(LSFT),END);
+		}
+		break;
+	case M_CTL_SFT_HASH:
+		if (record->event.pressed) {
+			start=timer_read(); 
+			return MACRO(D(LCTRL),D(LSFT),END); 
+		} else {
+			if (timer_elapsed(start) > 150){
+				return MACRO(U(LCTRL),U(LSFT),END);
+			} else {
+				return MACRO(U(LCTRL),U(LSFT),T(BSLS),END);
+			}
+		}
+		break;	
+	case M_DE_OSX_CIRC_CTRLCMD:
 		if (record->event.pressed) {
 			start = timer_read();
 			return MACRO(D(LCTRL),D(LGUI),END);
@@ -324,7 +345,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 			}
 		}
 		break;
-	case M_DE_PLUS_CTRLALT:
+	case M_DE_OSX_PLUS_CTRLALT:
 		if (record->event.pressed) {
 			start = timer_read();
 			return MACRO(D(LCTRL),D(LALT),END);

Разница между файлами не показана из-за своего большого размера
+ 1197 - 1199
keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex


BIN
keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png


+ 136 - 0
keyboard/planck/keymaps/tak3over.c

@@ -0,0 +1,136 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+//
+// Custom style by tak3over.  Dropped the dvorak layer as it was not being used by me. Shifted over
+// keys to make room for a second function key on the left side.  Now has a keypad and most all
+// standard keyboard keys. Including Delete. See TK layer.
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _TK 2
+#define _LW 3
+#define _RS 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  | TK   |Raise |    Space    |Lower | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QW] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
+  {KC_LCTL, KC_LALT, KC_LGUI, MO(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  | TK   |Raise |    Space    |Lower | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_CM] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
+  {KC_LCTL, KC_LALT, KC_LGUI, MO(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* TenKey, Arrow, and Function key Layer
+ * ,-----------------------------------------------------------------------------------.
+ * |  `   |   1  |   2  |   3  |   4  |   5  |  6   |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  | Left | Up   | Down | Right| Del  |   *  |   4  |   5  |   6  |   +  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Home | PGUP | PGDN | End  | Ins  |   .  |   1  |   2  |   3  |   -  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  | TK   |Raise |    Space    |Lower | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_TK] = {
+  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
+  {KC_ESC,  KC_LEFT, KC_UP,   KC_DOWN, KC_RGHT, KC_DEL,  KC_ASTR, KC_4,    KC_5,    KC_6,    KC_PLUS, KC_SLSH},
+  {KC_LSFT, KC_HOME, KC_PGUP, KC_PGDN, KC_END,  KC_INS,  KC_DOT,  KC_1,    KC_2,    KC_3,    KC_MINS, KC_ENT },
+  {KC_LCTL, KC_LALT, KC_LGUI, MO(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |Qwerty|Colemk|Brite | Reset|Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |  TK  |Raise |    Space    |Lower | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RS] = {
+  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
+  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), M(0),    RESET,   KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |Qwerty|Colemk|Brite | Reset|Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |  TK  |Raise |    Space    |Lower | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LW] = {
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), M(0),    RESET,   KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+            #ifdef BACKLIGHT_ENABLE
+              backlight_step();
+            #endif
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};

+ 2 - 2
keyboard/preonic/Makefile

@@ -139,8 +139,8 @@ COMMAND_ENABLE = yes    # Commands for debug and configuration
 # SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
 # NKRO_ENABLE = yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES 		# MIDI controls
-# AUDIO_ENABLE = YES 		# Audio output on port C6
+MIDI_ENABLE = YES 		# MIDI controls
+AUDIO_ENABLE = YES 		# Audio output on port C6
 # UNICODE_ENABLE = YES 		# Unicode
 # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
 # RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.  Do not enable this with MIDI at the same time.

+ 1 - 1
keyboard/preonic/keymaps/default/keymap.c

@@ -88,7 +88,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     return MACRO_NONE;
 };
 
-void * matrix_init_user(void) {
+void matrix_init_user(void) {
 #ifdef AUDIO_ENABLE
     init_notes();
     play_notes(&start_up, 9, false);

+ 1 - 1
keyboard/preonic/keymaps/lock/keymap.c

@@ -99,7 +99,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     return MACRO_NONE;
 };
 
-void * matrix_init_user(void) {
+void matrix_init_user(void) {
     init_notes();
     play_notes(&start_up, 9, false);
 }

+ 6 - 10
keyboard/preonic/preonic.c

@@ -1,16 +1,16 @@
 #include "preonic.h"
 
 __attribute__ ((weak))
-void * matrix_init_user(void) {
+void matrix_init_user(void) {
 
 };
 
 __attribute__ ((weak))
-void * matrix_scan_user(void) {
+void matrix_scan_user(void) {
 
 };
 
-void * matrix_init_kb(void) {
+void matrix_init_kb(void) {
 	#ifdef BACKLIGHT_ENABLE
     	backlight_init_ports();
 	#endif
@@ -24,13 +24,9 @@ void * matrix_init_kb(void) {
     DDRE |= (1<<6);
     PORTE |= (1<<6);
 
-	if (matrix_init_user) {
-		(*matrix_init_user)();
-	}
+	matrix_init_user();
 };
 
-void * matrix_scan_kb(void) {
-	if (matrix_scan_user) {
-		(*matrix_scan_user)();
-	}
+void matrix_scan_kb(void) {
+	matrix_scan_user();
 };

+ 2 - 2
keyboard/preonic/preonic.h

@@ -44,7 +44,7 @@
 	{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \
 }
 
-void * matrix_init_user(void);
-void * matrix_scan_user(void);
+void matrix_init_user(void);
+void matrix_scan_user(void);
 
 #endif

Разница между файлами не показана из-за своего большого размера
+ 1713 - 0
keyboard/preonic/preonic_music.hex


+ 78 - 78
quantum/keymap_extras/keymap_german_osx.h

@@ -9,92 +9,92 @@
 // Alt gr
 
 // normal characters
-#define DE_Z KC_Y
-#define DE_Y KC_Z
+#define DE_OSX_Z KC_Y
+#define DE_OSX_Y KC_Z
 
-#define DE_A KC_A
-#define DE_B KC_B
-#define DE_C KC_C
-#define DE_D KC_D
-#define DE_E KC_E
-#define DE_F KC_F
-#define DE_G KC_G
-#define DE_H KC_H
-#define DE_I KC_I
-#define DE_J KC_J
-#define DE_K KC_K
-#define DE_L KC_L
-#define DE_M KC_M
-#define DE_N KC_N
-#define DE_O KC_O
-#define DE_P KC_P
-#define DE_Q KC_Q
-#define DE_R KC_R
-#define DE_S KC_S
-#define DE_T KC_T
-#define DE_U KC_U
-#define DE_V KC_V
-#define DE_W KC_W
-#define DE_X KC_X
+#define DE_OSX_A KC_A
+#define DE_OSX_B KC_B
+#define DE_OSX_C KC_C
+#define DE_OSX_D KC_D
+#define DE_OSX_E KC_E
+#define DE_OSX_F KC_F
+#define DE_OSX_G KC_G
+#define DE_OSX_H KC_H
+#define DE_OSX_I KC_I
+#define DE_OSX_J KC_J
+#define DE_OSX_K KC_K
+#define DE_OSX_L KC_L
+#define DE_OSX_M KC_M
+#define DE_OSX_N KC_N
+#define DE_OSX_O KC_O
+#define DE_OSX_P KC_P
+#define DE_OSX_Q KC_Q
+#define DE_OSX_R KC_R
+#define DE_OSX_S KC_S
+#define DE_OSX_T KC_T
+#define DE_OSX_U KC_U
+#define DE_OSX_V KC_V
+#define DE_OSX_W KC_W
+#define DE_OSX_X KC_X
 
-#define DE_0 KC_0
-#define DE_1 KC_1
-#define DE_2 KC_2
-#define DE_3 KC_3
-#define DE_4 KC_4
-#define DE_5 KC_5
-#define DE_6 KC_6
-#define DE_7 KC_7
-#define DE_8 KC_8
-#define DE_9 KC_9
+#define DE_OSX_0 KC_0
+#define DE_OSX_1 KC_1
+#define DE_OSX_2 KC_2
+#define DE_OSX_3 KC_3
+#define DE_OSX_4 KC_4
+#define DE_OSX_5 KC_5
+#define DE_OSX_6 KC_6
+#define DE_OSX_7 KC_7
+#define DE_OSX_8 KC_8
+#define DE_OSX_9 KC_9
 
-#define DE_DOT KC_DOT
-#define DE_COMM KC_COMM
+#define DE_OSX_DOT KC_DOT
+#define DE_OSX_COMM KC_COMM
 
-#define DE_SS KC_MINS
-#define DE_AE KC_QUOT
-#define DE_UE KC_LBRC
-#define DE_OE KC_SCLN
+#define DE_OSX_SS KC_MINS
+#define DE_OSX_AE KC_QUOT
+#define DE_OSX_UE KC_LBRC
+#define DE_OSX_OE KC_SCLN
 
-#define DE_CIRC KC_NUBS // accent circumflex ^ and ring °
-#define DE_ACUT KC_EQL // accent acute ´ and grave `
-#define DE_PLUS KC_RBRC // + and * and ~
-#define DE_HASH KC_BSLS // # and '
-#define DE_LESS KC_GRV // < and > and |
-#define DE_MINS KC_SLSH // - and _
+#define DE_OSX_CIRC KC_NUBS // accent circumflex ^ and ring °
+#define DE_OSX_ACUT KC_EQL // accent acute ´ and grave `
+#define DE_OSX_PLUS KC_RBRC // + and * and ~
+#define DE_OSX_HASH KC_BSLS // # and '
+#define DE_OSX_LESS KC_GRV // < and > and |
+#define DE_OSX_MINS KC_SLSH // - and _
 
 // shifted characters
-#define DE_RING LSFT(DE_CIRC) // °
-#define DE_EXLM LSFT(KC_1) // !
-#define DE_DQOT LSFT(KC_2) // "
-#define DE_PARA LSFT(KC_3) // §
-#define DE_DLR  LSFT(KC_4) // $
-#define DE_PERC LSFT(KC_5) // %
-#define DE_AMPR LSFT(KC_6) // &
-#define DE_SLSH LSFT(KC_7) // /
-#define DE_LPRN LSFT(KC_8) // (
-#define DE_RPRN LSFT(KC_9) // )
-#define DE_EQL  LSFT(KC_0) // =
-#define DE_QST  LSFT(DE_SS) // ?
-#define DE_GRV  LSFT(DE_ACUT) // `
-#define DE_ASTR LSFT(DE_PLUS) // *
-#define DE_QUOT LSFT(DE_HASH) // '
-#define DE_MORE LSFT(DE_LESS) // >
-#define DE_COLN LSFT(KC_DOT) // :
-#define DE_SCLN LSFT(KC_COMM) // ;
-#define DE_UNDS LSFT(DE_MINS) // _
+#define DE_OSX_RING LSFT(DE_OSX_CIRC) // °
+#define DE_OSX_EXLM LSFT(KC_1) // !
+#define DE_OSX_DQOT LSFT(KC_2) // "
+#define DE_OSX_PARA LSFT(KC_3) // §
+#define DE_OSX_DLR  LSFT(KC_4) // $
+#define DE_OSX_PERC LSFT(KC_5) // %
+#define DE_OSX_AMPR LSFT(KC_6) // &
+#define DE_OSX_SLSH LSFT(KC_7) // /
+#define DE_OSX_LPRN LSFT(KC_8) // (
+#define DE_OSX_RPRN LSFT(KC_9) // )
+#define DE_OSX_EQL  LSFT(KC_0) // =
+#define DE_OSX_QST  LSFT(DE_OSX_SS) // ?
+#define DE_OSX_GRV  LSFT(DE_OSX_ACUT) // `
+#define DE_OSX_ASTR LSFT(DE_OSX_PLUS) // *
+#define DE_OSX_QUOT LSFT(DE_OSX_HASH) // '
+#define DE_OSX_MORE LSFT(DE_OSX_LESS) // >
+#define DE_OSX_COLN LSFT(KC_DOT) // :
+#define DE_OSX_SCLN LSFT(KC_COMM) // ;
+#define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _
 
 // Alt-ed characters
-#define DE_SQ2 LALT(KC_2) // ²
-#define DE_SQ3 LALT(KC_3) // ³
-#define DE_LCBR LALT(KC_8) // {
-#define DE_LBRC LALT(KC_5) // [
-#define DE_RBRC LALT(KC_6) // ]
-#define DE_RCBR LALT(KC_9) // }
-#define DE_BSLS LALT(LSFT(KC_7)) // backslash
-#define DE_AT  LALT(DE_L) // @
-#define DE_EURO LALT(KC_E) // €
-#define DE_TILD LALT(DE_N) // ~
-#define DE_PIPE LALT(DE_7) // |
+#define DE_OSX_SQ2 LALT(KC_2) // ²
+#define DE_OSX_SQ3 LALT(KC_3) // ³
+#define DE_OSX_LCBR LALT(KC_8) // {
+#define DE_OSX_LBRC LALT(KC_5) // [
+#define DE_OSX_RBRC LALT(KC_6) // ]
+#define DE_OSX_RCBR LALT(KC_9) // }
+#define DE_OSX_BSLS LALT(LSFT(KC_7)) // backslash
+#define DE_OSX_AT  LALT(DE_OSX_L) // @
+#define DE_OSX_EURO LALT(KC_E) // €
+#define DE_OSX_TILD LALT(DE_OSX_N) // ~
+#define DE_OSX_PIPE LALT(DE_OSX_7) // |
 
 #endif