diff options
Diffstat (limited to 'keyboards/georgi')
| -rw-r--r-- | keyboards/georgi/config.h | 1 | ||||
| -rw-r--r-- | keyboards/georgi/keymaps/default-flipped/keymap.c | 237 | ||||
| -rw-r--r-- | keyboards/georgi/keymaps/default-flipped/readme.md | 11 | ||||
| -rw-r--r-- | keyboards/georgi/keymaps/default-flipped/rules.mk | 41 | ||||
| -rw-r--r-- | keyboards/georgi/keymaps/default/keymap.c | 1 | ||||
| -rw-r--r-- | keyboards/georgi/keymaps/minimal/keymap.c | 1 | ||||
| -rw-r--r-- | keyboards/georgi/keymaps/norman/keymap.c | 1 |
7 files changed, 290 insertions, 3 deletions
diff --git a/keyboards/georgi/config.h b/keyboards/georgi/config.h index b35a1be78..49d54adcd 100644 --- a/keyboards/georgi/config.h +++ b/keyboards/georgi/config.h | |||
| @@ -30,6 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 30 | #define NO_ACTION_FUNCTION | 30 | #define NO_ACTION_FUNCTION |
| 31 | #define NO_ACTION_ONESHOT | 31 | #define NO_ACTION_ONESHOT |
| 32 | #define NO_ACTION_MACRO | 32 | #define NO_ACTION_MACRO |
| 33 | #define IGNORE_MOD_TAP_INTERRUPT | ||
| 33 | 34 | ||
| 34 | /* USB Device descriptor parameter */ | 35 | /* USB Device descriptor parameter */ |
| 35 | #define VENDOR_ID 0xFEED | 36 | #define VENDOR_ID 0xFEED |
diff --git a/keyboards/georgi/keymaps/default-flipped/keymap.c b/keyboards/georgi/keymaps/default-flipped/keymap.c new file mode 100644 index 000000000..09243f2a2 --- /dev/null +++ b/keyboards/georgi/keymaps/default-flipped/keymap.c | |||
| @@ -0,0 +1,237 @@ | |||
| 1 | /* | ||
| 2 | * Good on you for modifying your layout, this is the most nonQMK layout you will come across | ||
| 3 | * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer | ||
| 4 | * | ||
| 5 | * Don't modify the steno layer directly, instead add chords using the keycodes and macros | ||
| 6 | * from sten.h to the layout you want to modify. | ||
| 7 | * | ||
| 8 | * Observe the comment above processQWERTY! | ||
| 9 | * | ||
| 10 | * http://docs.gboards.ca | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include QMK_KEYBOARD_H | ||
| 14 | #include "sten.h" | ||
| 15 | #include "keymap_steno.h" | ||
| 16 | |||
| 17 | // Proper Layers | ||
| 18 | #define FUNCT (LSD | LK | LP | LH) | ||
| 19 | #define MEDIA (LSD | LK | LW | LR) | ||
| 20 | #define MOVE (ST1 | ST2) | ||
| 21 | |||
| 22 | // QMK Layers | ||
| 23 | #define STENO_LAYER 0 | ||
| 24 | #define GAMING 1 | ||
| 25 | #define GAMING_2 2 | ||
| 26 | |||
| 27 | /* Keyboard Layout | ||
| 28 | * ,---------------------------------. ,------------------------------. | ||
| 29 | * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD | | ||
| 30 | * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----| | ||
| 31 | * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | BB | RG | RS | RZ | | ||
| 32 | * `---------------------------------' `------------------------------' | ||
| 33 | * ,---------------, .---------------. | ||
| 34 | * | LNO | LA | LO | | RE | RU | RNO | | ||
| 35 | * `---------------' `---------------' | ||
| 36 | */ | ||
| 37 | |||
| 38 | // Note: You can only use basic keycodes here! | ||
| 39 | // P() is just a wrapper to make your life easier. | ||
| 40 | // | ||
| 41 | // http://docs.gboards.ca | ||
| 42 | uint32_t processQwerty(bool lookup) { | ||
| 43 | // Specials | ||
| 44 | P( RT | RS | RD | RZ | LNO, SEND_STRING(VERSION); SEND_STRING(__DATE__)); | ||
| 45 | P( LNO | RNO | LA | LO | RE | RU, SEND(KC_MPLY)); | ||
| 46 | P( LFT | LK | LP | LW, REPEAT()); | ||
| 47 | P( ST1 | ST2 | LW | ST4, SEND(KC_BSPC)); | ||
| 48 | |||
| 49 | // Mouse Keys | ||
| 50 | P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2)); | ||
| 51 | P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1)); | ||
| 52 | |||
| 53 | // Thumb Chords | ||
| 54 | P( LA | LO | RE | RU, SEND(KC_CAPS)); | ||
| 55 | P( LA | RU, SEND(KC_ESC)); | ||
| 56 | P( LO | RE, SEND(KC_LCTL)); | ||
| 57 | P( LNO | RNO | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT)); | ||
| 58 | P( LNO | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT)); | ||
| 59 | |||
| 60 | // Mods | ||
| 61 | P( RT | RD | RS | RZ, SEND(KC_LGUI)); | ||
| 62 | P( RT | RD, SEND(KC_LCTL)); | ||
| 63 | P( RS | RZ, SEND(KC_LALT)); | ||
| 64 | P( LA | LNO, SEND(KC_LCTL)); | ||
| 65 | P( LA | LO, SEND(KC_LALT)); | ||
| 66 | P( LO, SEND(KC_LSFT)); | ||
| 67 | |||
| 68 | // Function Layer | ||
| 69 | P( FUNCT | RF | RR, SEND(KC_F5)); | ||
| 70 | P( FUNCT | RP | RB, SEND(KC_F6)); | ||
| 71 | P( FUNCT | RL | RG, SEND(KC_F7)); | ||
| 72 | P( FUNCT | RT | RS, SEND(KC_F8)); | ||
| 73 | P( FUNCT | RF, SEND(KC_F1)); | ||
| 74 | P( FUNCT | RP, SEND(KC_F2)); | ||
| 75 | P( FUNCT | RL, SEND(KC_F3)); | ||
| 76 | P( FUNCT | RT, SEND(KC_F4)); | ||
| 77 | P( FUNCT | RR, SEND(KC_F9)); | ||
| 78 | P( FUNCT | RG, SEND(KC_F10)); | ||
| 79 | P( FUNCT | RB, SEND(KC_F11)); | ||
| 80 | P( FUNCT | RS, SEND(KC_F12)); | ||
| 81 | |||
| 82 | // Movement Layer | ||
| 83 | P( MOVE | RF, SEND(KC_LEFT)); | ||
| 84 | P( MOVE | RP, SEND(KC_DOWN)); | ||
| 85 | P( MOVE | RL, SEND(KC_UP)); | ||
| 86 | P( MOVE | RT, SEND(KC_RIGHT)); | ||
| 87 | P( MOVE | ST3, SEND(KC_PGUP)); | ||
| 88 | P( MOVE | ST4, SEND(KC_PGDN)); | ||
| 89 | |||
| 90 | // Media Layer | ||
| 91 | P( MEDIA | RF, SEND(KC_MPRV)); | ||
| 92 | P( MEDIA | RP, SEND(KC_MPLY)); | ||
| 93 | P( MEDIA | RL, SEND(KC_MPLY)); | ||
| 94 | P( MEDIA | RT, SEND(KC_MNXT)); | ||
| 95 | P( MEDIA | RD, SEND(KC_VOLU)); | ||
| 96 | P( MEDIA | RZ, SEND(KC_VOLD)); | ||
| 97 | P( MEDIA | RS, SEND(KC_MUTE)); | ||
| 98 | |||
| 99 | // Number Row, Left | ||
| 100 | P( LNO | LSU, SEND(KC_1)); | ||
| 101 | P( LNO | LFT, SEND(KC_2)); | ||
| 102 | P( LNO | LP, SEND(KC_3)); | ||
| 103 | P( LNO | LH, SEND(KC_4)); | ||
| 104 | P( LNO | ST1, SEND(KC_5)); | ||
| 105 | P( LNO | ST3, SEND(KC_6)); | ||
| 106 | P( LNO | RF, SEND(KC_7)); | ||
| 107 | P( LNO | RP, SEND(KC_8)); | ||
| 108 | P( LNO | RL, SEND(KC_9)); | ||
| 109 | P( LNO | RT, SEND(KC_0)); | ||
| 110 | |||
| 111 | // Number Row, Right | ||
| 112 | P( RNO | LSU, SEND(KC_1)); | ||
| 113 | P( RNO | LFT, SEND(KC_2)); | ||
| 114 | P( RNO | LP, SEND(KC_3)); | ||
| 115 | P( RNO | LH, SEND(KC_4)); | ||
| 116 | P( RNO | ST1, SEND(KC_5)); | ||
| 117 | P( RNO | ST3, SEND(KC_6)); | ||
| 118 | P( RNO | RF, SEND(KC_7)); | ||
| 119 | P( RNO | RP, SEND(KC_8)); | ||
| 120 | P( RNO | RL, SEND(KC_9)); | ||
| 121 | P( RNO | RT, SEND(KC_0)); | ||
| 122 | P( RNO | LA, SEND(KC_5)); | ||
| 123 | |||
| 124 | // Specials | ||
| 125 | P( RU | RNO, SEND(KC_TAB)); | ||
| 126 | P( RE | RU, SEND(KC_BSPC)); | ||
| 127 | P( RD | RZ, SEND(KC_ENT)); | ||
| 128 | P( RE, SEND(KC_ENT)); | ||
| 129 | P( RD, SEND(KC_BSPC)); | ||
| 130 | P( LNO, SEND(KC_BSPC)); | ||
| 131 | P( RNO, SEND(KC_BSPC)); | ||
| 132 | P( LA, SEND(KC_SPC)); | ||
| 133 | P( RU, SEND(KC_SPC)); | ||
| 134 | P( RZ, SEND(KC_ESC)); | ||
| 135 | |||
| 136 | // Symbols and Numbers | ||
| 137 | P( PWR | RE | RU, SEND(KC_ENT)); | ||
| 138 | P( PWR | LA | LO, SEND(KC_SPC)); | ||
| 139 | P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // ( | ||
| 140 | P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // ) | ||
| 141 | P( PWR | ST1 | ST2, SEND(KC_GRV)); // ` | ||
| 142 | P( PWR | RD | RZ, SEND(KC_ESC)); | ||
| 143 | P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // # | ||
| 144 | P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $ | ||
| 145 | P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // ! | ||
| 146 | P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // % | ||
| 147 | P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @ | ||
| 148 | P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^ | ||
| 149 | P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // { | ||
| 150 | P( PWR | LW, SEND(KC_LBRC)); | ||
| 151 | P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // } | ||
| 152 | P( PWR | LR, SEND(KC_RBRC)); | ||
| 153 | P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // | | ||
| 154 | P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~ | ||
| 155 | P( PWR | ST3, SEND(KC_QUOT)); | ||
| 156 | P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // " | ||
| 157 | P( PWR | RF, SEND(KC_KP_PLUS)); | ||
| 158 | P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // & | ||
| 159 | P( PWR | RP, SEND(KC_MINS)); | ||
| 160 | P( PWR | RB, SEND(KC_EQL)); | ||
| 161 | P( PWR | RL, SEND(KC_SLSH)); | ||
| 162 | P( PWR | RG, SEND(KC_COMM)); | ||
| 163 | P( PWR | RT, SEND(KC_PAST)); | ||
| 164 | P( PWR | RS, SEND(KC_DOT)); | ||
| 165 | P( PWR | RD, SEND(KC_TAB)); | ||
| 166 | P( PWR | LA, SEND(KC_LSFT)); | ||
| 167 | P( PWR | LO, SEND(KC_SLSH)); | ||
| 168 | P( PWR | RE, SEND(KC_SCLN)); | ||
| 169 | P( PWR | RU, SEND(KC_BSLS)); | ||
| 170 | P( PWR | LNO, SEND(KC_BSLS)); | ||
| 171 | |||
| 172 | // Letters | ||
| 173 | P( LSU | LSD, SEND(KC_A)); | ||
| 174 | P( LFT | LK, SEND(KC_S)); | ||
| 175 | P( LP | LW, SEND(KC_D)); | ||
| 176 | P( LH | LR, SEND(KC_F)); | ||
| 177 | P( ST1 | ST2, SEND(KC_G)); | ||
| 178 | P( ST3 | ST4, SEND(KC_H)); | ||
| 179 | P( RF | RR, SEND(KC_J)); | ||
| 180 | P( RT | RS, SEND(KC_SCLN)); | ||
| 181 | P( RG | RL, SEND(KC_L)); | ||
| 182 | P( RP | RB, SEND(KC_K)); | ||
| 183 | P( LSU, SEND(KC_Q)); | ||
| 184 | P( LSD, SEND(KC_Z)); | ||
| 185 | P( LFT, SEND(KC_W)); | ||
| 186 | P( LK, SEND(KC_X)); | ||
| 187 | P( LP, SEND(KC_E)); | ||
| 188 | P( LW, SEND(KC_C)); | ||
| 189 | P( LH, SEND(KC_R)); | ||
| 190 | P( LR, SEND(KC_V)); | ||
| 191 | P( ST1, SEND(KC_T)); | ||
| 192 | P( ST2, SEND(KC_B)); | ||
| 193 | P( ST3, SEND(KC_Y)); | ||
| 194 | P( ST4, SEND(KC_N)); | ||
| 195 | P( RF, SEND(KC_U)); | ||
| 196 | P( RR, SEND(KC_M)); | ||
| 197 | P( RP, SEND(KC_I)); | ||
| 198 | P( RB, SEND(KC_COMM)); | ||
| 199 | P( RL, SEND(KC_O)); | ||
| 200 | P( RG, SEND(KC_DOT)); | ||
| 201 | P( RT, SEND(KC_P)); | ||
| 202 | P( RS, SEND(KC_SLSH)); | ||
| 203 | P( RNO, SEND(KC_BSPC)); | ||
| 204 | P( LNO, SEND(KC_BSPC)); | ||
| 205 | |||
| 206 | return 0; | ||
| 207 | } | ||
| 208 | |||
| 209 | // "Layers" | ||
| 210 | // Steno layer should be first in your map. | ||
| 211 | // When PWR | FN | ST3 | ST4 is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end. | ||
| 212 | // If you need more space for chords, remove the two gaming layers. | ||
| 213 | // Note: If using NO_ACTION_TAPPING, LT will not work! | ||
| 214 | |||
| 215 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
| 216 | // Main layer, everything goes through here | ||
| 217 | [STENO_LAYER] = LAYOUT_georgi( | ||
| 218 | STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, | ||
| 219 | STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, | ||
| 220 | STN_A, STN_O, STN_N1, STN_N7, STN_E, STN_U | ||
| 221 | ), | ||
| 222 | // Gaming layer with Numpad, Very limited | ||
| 223 | [GAMING] = LAYOUT_georgi( | ||
| 224 | KC_LSFT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT, | ||
| 225 | KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_DQUO, | ||
| 226 | KC_LALT, KC_SPC, LT(GAMING_2, KC_ENT), KC_DEL, KC_ASTR, TO(STENO_LAYER) | ||
| 227 | ), | ||
| 228 | |||
| 229 | [GAMING_2] = LAYOUT_georgi( | ||
| 230 | KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, | ||
| 231 | KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, | ||
| 232 | KC_LALT, KC_SPC, KC_ENT, KC_DEL, KC_ASTR, TO(STENO_LAYER) | ||
| 233 | ) | ||
| 234 | }; | ||
| 235 | |||
| 236 | // Don't fuck with this, thanks. | ||
| 237 | size_t keymapsCount = sizeof(keymaps)/sizeof(keymaps[0]); | ||
diff --git a/keyboards/georgi/keymaps/default-flipped/readme.md b/keyboards/georgi/keymaps/default-flipped/readme.md new file mode 100644 index 000000000..f9da34b02 --- /dev/null +++ b/keyboards/georgi/keymaps/default-flipped/readme.md | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | # Georgi QWERTY/Steno firmware | ||
| 2 | |||
| 3 | This is the default keymap for Georgi, it's based heavily off of the naps62 ErgoDox and the Gergo layout. | ||
| 4 | It is both a ergonomic and programmer friendly keymap. | ||
| 5 | |||
| 6 | Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR! | ||
| 7 | |||
| 8 | ## Space issues | ||
| 9 | If you find yourself running out of space for dictionary entries, disabling mousekeys in rules.mk will save | ||
| 10 | you about 4k for entries! | ||
| 11 | Get a free 1k by deleting the Gaming layers from the keymap! | ||
diff --git a/keyboards/georgi/keymaps/default-flipped/rules.mk b/keyboards/georgi/keymaps/default-flipped/rules.mk new file mode 100644 index 000000000..90d8057c3 --- /dev/null +++ b/keyboards/georgi/keymaps/default-flipped/rules.mk | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | #---------------------------------------------------------------------------- | ||
| 2 | # make georgi:default:dfu | ||
| 3 | # Make sure you have dfu-programmer installed! | ||
| 4 | #---------------------------------------------------------------------------- | ||
| 5 | |||
| 6 | NO_REPEAT = no | ||
| 7 | VERBOSE = yes | ||
| 8 | KEYBOARD_SHARED_EP = yes | ||
| 9 | CUSTOM_MATRIX = yes | ||
| 10 | |||
| 11 | #Firmware reduction options | ||
| 12 | MOUSEKEY_ENABLE = yes # 1500 bytes | ||
| 13 | NO_TAPPING = no # 2000 bytes | ||
| 14 | NO_PRINT = yes | ||
| 15 | |||
| 16 | #Debug options | ||
| 17 | CONSOLE_ENABLE = no | ||
| 18 | DEBUG_MATRIX_SCAN_RATE = no | ||
| 19 | DEBUG_MATRIX = no | ||
| 20 | ONLY_QWERTY = no | ||
| 21 | |||
| 22 | # A bunch of stuff that you shouldn't touch unless you | ||
| 23 | # know what you're doing. | ||
| 24 | # | ||
| 25 | # No touchy, capiche? | ||
| 26 | SRC += matrix.c i2c_master.c | ||
| 27 | ifeq ($(strip $(DEBUG_MATRIX)), yes) | ||
| 28 | OPT_DEFS += -DDEBUG_MATRIX | ||
| 29 | endif | ||
| 30 | ifeq ($(strip $(NO_REPEAT)), yes) | ||
| 31 | OPT_DEFS += -DNO_REPEAT | ||
| 32 | endif | ||
| 33 | ifeq ($(strip $(NO_PRINT)), yes) | ||
| 34 | OPT_DEFS += -DNO_PRINT -DNO_DEBUG | ||
| 35 | endif | ||
| 36 | ifeq ($(strip $(ONLY_QWERTY)), yes) | ||
| 37 | OPT_DEFS += -DONLYQWERTY | ||
| 38 | endif | ||
| 39 | ifeq ($(strip $(NO_TAPPING)), yes) | ||
| 40 | OPT_DEFS += -DNO_ACTION_TAPPING | ||
| 41 | endif | ||
diff --git a/keyboards/georgi/keymaps/default/keymap.c b/keyboards/georgi/keymaps/default/keymap.c index 404aac8fc..93c551af2 100644 --- a/keyboards/georgi/keymaps/default/keymap.c +++ b/keyboards/georgi/keymaps/default/keymap.c | |||
| @@ -13,7 +13,6 @@ | |||
| 13 | #include QMK_KEYBOARD_H | 13 | #include QMK_KEYBOARD_H |
| 14 | #include "sten.h" | 14 | #include "sten.h" |
| 15 | #include "keymap_steno.h" | 15 | #include "keymap_steno.h" |
| 16 | #define IGNORE_MOD_TAP_INTERRUPT | ||
| 17 | 16 | ||
| 18 | // Proper Layers | 17 | // Proper Layers |
| 19 | #define FUNCT (LSD | LK | LP | LH) | 18 | #define FUNCT (LSD | LK | LP | LH) |
diff --git a/keyboards/georgi/keymaps/minimal/keymap.c b/keyboards/georgi/keymaps/minimal/keymap.c index 1d9b57e9a..e9294c5cc 100644 --- a/keyboards/georgi/keymaps/minimal/keymap.c +++ b/keyboards/georgi/keymaps/minimal/keymap.c | |||
| @@ -13,7 +13,6 @@ | |||
| 13 | #include QMK_KEYBOARD_H | 13 | #include QMK_KEYBOARD_H |
| 14 | #include "sten.h" | 14 | #include "sten.h" |
| 15 | #include "keymap_steno.h" | 15 | #include "keymap_steno.h" |
| 16 | #define IGNORE_MOD_TAP_INTERRUPT | ||
| 17 | 16 | ||
| 18 | // Proper Layers | 17 | // Proper Layers |
| 19 | #define FUNCT (LSD | LK | LP | LH) | 18 | #define FUNCT (LSD | LK | LP | LH) |
diff --git a/keyboards/georgi/keymaps/norman/keymap.c b/keyboards/georgi/keymaps/norman/keymap.c index 58c42c852..4591aab22 100644 --- a/keyboards/georgi/keymaps/norman/keymap.c +++ b/keyboards/georgi/keymaps/norman/keymap.c | |||
| @@ -13,7 +13,6 @@ | |||
| 13 | #include QMK_KEYBOARD_H | 13 | #include QMK_KEYBOARD_H |
| 14 | #include "sten.h" | 14 | #include "sten.h" |
| 15 | #include "keymap_steno.h" | 15 | #include "keymap_steno.h" |
| 16 | #define IGNORE_MOD_TAP_INTERRUPT | ||
| 17 | 16 | ||
| 18 | // Proper Layers | 17 | // Proper Layers |
| 19 | #define FUNCT (LSD | LK | LP | LH) | 18 | #define FUNCT (LSD | LK | LP | LH) |
