]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/luke/keymap.c
Adds support for Planck Rev 6 (#2666)
[qmk_firmware.git] / keyboards / planck / keymaps / luke / keymap.c
1 /*
2  * A keyboard layout for the gridded planck.
3  *
4  * Copyright (C) 2017 Luke Silva
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  *
20  * ,-----------------------------------------------------------------------------------.
21  * |      |      |      |      |      |      |      |      |      |      |      |      |
22  * |------+------+------+------+------+------+------+------+------+------+------+------|
23  * |      |      |      |      |      |      |      |      |      |      |      |      |
24  * |------+------+------+------+------+------+------+------+------+------+------+------|
25  * |      |      |      |      |      |      |      |      |      |      |      |      |
26  * |------+------+------+------+------+------+------+------+------+------+------+------|
27  * |      |      |      |      |      |      |      |      |      |      |      |      |
28  * `-----------------------------------------------------------------------------------'
29  *
30  * This layout uses colemak by default, and is designed for programming, with easy access to symbols
31  * through either double purpose modifiers or colemak style rolling for commonly used symbol clusters
32  * Eg: compare colemak 'this' to '(){\n}' on the symbol layer.
33  *
34  * The layout also supports a range of multilingual characters, covering those
35  * needed for French, German, Swedish and likely some other European Languages.
36  * In the future full support for Colemak's multilingual deadkeys may be introduced.
37  *
38  * The multilingual characters are inputted through QMK's unicode engine, using
39  * the Linux input method by default, however this can be changed at runtime.
40  *
41  */
42
43
44 #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
45 #include "planck.h"
46
47 #define _______ KC_TRNS
48 #define XXXXXXX KC_NO
49
50
51 // Layers
52 #define _COLEMAK 0
53 #define _QWERTY 1
54 #define _SYM 2
55 #define _NUM 3
56 #define _GR  4
57 #define _GR_S 5
58 #define _ADJ 6
59 #define _NAV 7
60 #define _PLOVER 8
61
62 // Macro ID numbers
63 #define M_ALT_HASH 1
64 #define M_GR_DASH  2
65 #define M_SYM_LPRN 3
66 #define M_NAV_UNDS 4
67 #define M_NUM_RPRN 5
68 #define M_CTRL_DLR 6
69 #define M_LCBR_ENT 7
70 #define M_PLOVER   8
71 #define M_EXT_PLV  9
72 #define M_WINDOWS 10
73 #define M_LINUX   11
74 #define M_OSX     12
75 #define M_FUNCTION 13
76 #define M_THEN     14
77 #define M_CATCH    15
78
79 // Macro keys
80 #define ALT_HASH MACROTAP(M_ALT_HASH)   // tap for #, hold for Alt
81 #define GR_DASH  MACROTAP(M_GR_DASH)    // tap for -, hold for GR layer            a-class-name
82 #define SYM_LPRN MACROTAP(M_SYM_LPRN)   // tap for (, hold for symbols layer       if()
83 #define NAV_UNDS MACROTAP(M_NAV_UNDS)   // tap for _, hold for navigation layer    snake_case_variable
84 #define NUM_RPRN MACROTAP(M_NUM_RPRN)   // tap for ), hold for numbers layer       else if()
85 #define CTRL_DLR MACROTAP(M_CTRL_DLR)   // tap for $, hold for ctrl                $php_is_really_weird
86 #define LCBR_ENT M(M_LCBR_ENT)          // {\n                                     easier code formatting
87 #define PLOVER   M(M_PLOVER)            // PHROPB (plover) or ERFVIK(qwerty)       starts plover
88 #define EXT_PLV  M(M_EXT_PLV)           // PHRO*F (plover) or ERFVYU(qwerty)       stops plover
89 #define WINDOWS  M(M_WINDOWS)           // Sets Unicode handler to windows
90 #define LINUX    M(M_LINUX)             // Sets Unicode handler to linux
91 #define OSX      M(M_OSX)               // Sets Unicode handler to OSX
92 #define FUNCTION M(M_FUNCTION)
93 #define THEN     M(M_THEN)
94 #define CATCH    M(M_CATCH)
95
96
97 // Renames of QMK keys... (would have otherwise been a macro)
98 #define QWERTY DF(_QWERTY)
99 #define COLEMAK DF(_COLEMAK)
100
101
102
103
104
105 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
106
107 /* Colemak
108  * ,-----------------------------------------------------------------------------------.
109  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |  ;:  | Bksp |
110  * |------+------+------+------+------+------+------+------+------+------+------+------|
111  * | Bksp |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  '"  |
112  * |------+------+------+------+------+------+------+------+------+------+------+------`---.
113  * |Shift=|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |  ,<  |  .>  |  /?  |Shift/Ent |
114  * |------+------+------+------+------+------+------+------+------+------+------+----------|
115  * |CtCaps|GUIF4 | Alt# | Gr-  | Sym( | Nav_ |Space | Num) |Ctrl$ | F11  | F12  |Nav toggle|
116  * `---------------------------------------------------------------------------------------'
117  */
118
119 [_COLEMAK] = {
120   {KC_TAB,         KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
121   {KC_BSPC,        KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
122   {SFT_T(KC_EQL),  KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, SFT_T(KC_ENT) },
123   {CTL_T(KC_CAPS), KC_LGUI,  ALT_HASH, GR_DASH, SYM_LPRN, NAV_UNDS,  KC_SPC, NUM_RPRN, CTRL_DLR, KC_F11, KC_F12, TG(_NAV)}
124 },
125
126
127
128 /* QWERTY
129  * ,-----------------------------------------------------------------------------------.
130  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
131  * |------+------+------+------+------+------+------+------+------+------+------+------|
132  * | Bksp |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |  ;:  |  '"  |
133  * |------+------+------+------+------+------+------+------+------+------+------+------`---.
134  * |Shift=|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |  ,<  |  .>  |  /?  |Shift/Ent |
135  * |------+------+------+------+------+------+------+------+------+------+------+----------|
136  * |CtCaps|GUIF4 | Alt# | Gr-  | Sym( | Nav_ |Space | Num) |Ctrl$ | F11  | F12  |Nav toggle|
137  * `---------------------------------------------------------------------------------------'
138  */
139
140 [_QWERTY] = {
141   {KC_TAB,   KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
142   {KC_ESC,   KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
143   {KC_LSFT,  KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, SFT_T(KC_ENT) },
144   {CTL_T(KC_CAPS),    KC_LGUI, KC_LALT, GR_DASH, SYM_LPRN,KC_SPC,  KC_SPC, NUM_RPRN, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT}
145 },
146
147
148 /* Symbols
149  * ,-----------------------------------------------------------------------------------.
150  * | Tab  |  `   |  @   |  /   |  *   |  ^   |  %   |  :   |  +   |  -   | Del  | Bksp |
151  * |------+------+------+------+------+------+------+------+------+------+------+------|
152  * |      |  [   |  ;   |  }   |  (   |  "   |  '   |  )   | {\n  |  !   |  ]   |  \   |
153  * |------+------+------+------+------+------+------+------+------+------+------+------|
154  * |Shift |  .   |  {   |  <   |  >   |  ~   |  X2  |  =   |  &   |  |   |  ?   |Enter |
155  * |------+------+------+------+------+------+------+------+------+------+------+------|
156  * |      |      |      |      | Sym  |  _   |Space | NUM  |  X2  |      |      |      |
157  * `-----------------------------------------------------------------------------------'
158  */
159
160 [_SYM] = {
161   {KC_TAB,  KC_GRV,  KC_AT,   KC_SLSH, KC_ASTR, KC_CIRC, KC_PERC, KC_COLN, KC_PLUS, KC_MINS, KC_DEL,  KC_BSPC},
162   {FUNCTION,KC_LBRC, KC_SCLN, KC_RCBR, KC_LPRN, KC_DQT,  KC_QUOT, KC_RPRN, LCBR_ENT,KC_EXLM, KC_RBRC, KC_BSLS},
163   {KC_LSFT, KC_DOT,  KC_LCBR, KC_LABK, KC_RABK, KC_TILD, _______, KC_EQL,  KC_AMPR, KC_PIPE, KC_QUES, KC_ENT },
164   {THEN,    CATCH,   XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______}
165 },
166
167
168 /* Numbers
169  * ,-----------------------------------------------------------------------------------.
170  * | Tab  |  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |  9   |  0   | Bksp |
171  * |------+------+------+------+------+------+------+------+------+------+------+------|
172  * | Bksp |  x   |  D   |  E   |  F   |  +   |  -   |  4   |  5   |  6   |  0   |Enter |
173  * |------+------+------+------+------+------+------+------+------+------+------+------|
174  * |Shift |  (   |  A   |  B   |  C   |  *   |  /   |  1   |  2   |  3   |  )   |Enter |
175  * |------+------+------+------+------+------+------+------+------+------+------+------|
176  * |      |      |      |  GR  | SYM  |  _   |Space | NUM  |  0   |  .   |  f   |      |
177  * `-----------------------------------------------------------------------------------'
178  */
179
180 [_NUM] = {
181   {KC_TAB,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
182   {KC_BSPC, KC_X,    S(KC_D), S(KC_E), S(KC_F), KC_PLUS, KC_MINS, KC_4,    KC_5,    KC_6,    KC_0,    KC_ENT },
183   {KC_LSFT, KC_LPRN, S(KC_A), S(KC_B), S(KC_C), KC_ASTR, KC_SLSH, KC_1,    KC_2,    KC_3,    KC_RPRN, KC_ENT },
184   {_______, _______, _______, _______, _______, _______, _______, _______, KC_0,    KC_DOT,  KC_F,    _______}
185 },
186
187
188 /* Gr layer / international keys
189  * ,-----------------------------------------------------------------------------------.
190  * |      |  ä   |  å   |      |  ¢£  |  €¥  |      |  ë   |  ê   |  ü   |  ù   |      |
191  * |------+------+------+------+------+------+------+------+------+------+------+------|
192  * |      |  â   |  à   |  ß   |      |      |      |  è   |  é   |  ï   |  ö   |      |
193  * |------+------+------+------+------+------+------+------+------+------+------+------|
194  * |      |  æ   |  ô   |  ç   |  œ   |      |      |  û   |  «   |  »   |  î   |      |
195  * |------+------+------+------+------+------+------+------+------+------+------+------|
196  * |      |      |      |      |      |      |      |      |      |      |      |      |
197  * `-----------------------------------------------------------------------------------'
198  */
199
200 [_GR] = {
201   {_______,  UC(0xE4),UC(0xE5), _______,UC(0xA2), UC(0x20AC),_______,UC(0xEB),UC(0xEA),UC(0xFC),UC(0xF9), _______},
202   {_______,  UC(0xE2),UC(0xE0),UC(0xDF), _______, _______,   _______,UC(0xE8),UC(0xE9),UC(0xEF),UC(0xF6), _______},
203   {MO(_GR_S),UC(0xE6),UC(0xF4),UC(0xE7),UC(0x153),_______,   _______,UC(0xFB),UC(0xAB),UC(0xBB),UC(0xEE), MO(_GR_S)},
204   {_______,  _______, _______, _______, _______,  _______,   _______, _______, _______, _______, _______, _______}
205 },
206
207 // Shifted layer of the above
208 [_GR_S] = {
209   {_______,  UC(0xC4),UC(0xC5), _______, UC(0xA3), UC(0xA5),_______, UC(0xCB),UC(0xCA),UC(0xDC),UC(0xD9),_______},
210   {_______,  UC(0xC2),UC(0xC0), UC(0xDF),_______,  _______, _______, UC(0xC8),UC(0xC9),UC(0xCF),UC(0xD6),_______},
211   {MO(_GR_S),UC(0xC6),UC(0xD4), UC(0xC7),UC(0x152),_______, _______, UC(0xDB),UC(0xAB),UC(0xBB),UC(0xCE),MO(_GR_S)},
212   {_______,  _______, _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______}
213 },
214
215
216 /* Adjust Layer (Gr + Num)
217  * ,-----------------------------------------------------------------------------------.
218  * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  | F10  | F11  | F12  |
219  * |------+-------------+------+------+------+------+------+------+------+------+------|
220  * |      |     |Prntscr| ESC  |VOLUP | PLAY | PREV |QWERTY|COLEMAK|PLOVER|     |      |
221  * |------+-------------+------+------+------+------+------+------+------+------+------|
222  * |      |     |BACKLIT| INS  |VOLDWN| MUTE | NEXT | WIND |LINUX | OSX  |      |      |
223  * |------+-------------+------+------+------+------+------+------+------+------+------|
224  * |      |      |      |      |      |      |      |      |      |      |      |      |
225  * `-----------------------------------------------------------------------------------'
226  */
227
228 [_ADJ] = {
229   {KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12 },
230   {XXXXXXX, XXXXXXX, KC_PSCR, KC_ESC,  KC_VOLU, KC_MPLY, KC_MPRV, QWERTY,  COLEMAK, PLOVER,  XXXXXXX, XXXXXXX},
231   {XXXXXXX, XXXXXXX, BL_STEP, KC_INS,  KC_VOLD, KC_MUTE, KC_MNXT, WINDOWS, LINUX,   OSX,     XXXXXXX, XXXXXXX},
232   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
233 },
234
235
236 /* Navigation
237  * ,-----------------------------------------------------------------------------------.
238  * |      |      | BTN3 | BTN2 | BTN1 |      | ACL0 | HOME | PGDN | PGUP | END  | Bksp |
239  * |------+------+------+------+------+------+------+------+------+------+------+------|
240  * |      |MSLEFT| MSDN | MSUP |MSRGHT|      | ACL1 | LEFT | DOWN | UP   | RGHT |Enter |
241  * |------+------+------+------+------+------+------+------+------+------+------+------|
242  * |      |WHLEFT| WHDN | WHUP |WHRGHT|      | ACL2 |C-LEFT|C-PGDN|C-PGUP|C-RGHT|Enter |
243  * |------+------+------+------+------+------+------+------+------+------+------+------|
244  * |      |      |      |      |      |  _   |Space | ACL0 | ACL1 | ACL2 |      |TGLNAV|
245  * `-----------------------------------------------------------------------------------'
246  */
247
248 [_NAV] = {
249   {XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN2, KC_BTN1, XXXXXXX, KC_ACL0, KC_HOME, KC_PGDN, KC_PGUP, KC_END,  KC_BSPC},
250   {XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, KC_ACL1, KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT,KC_ENT },
251   {XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, XXXXXXX, KC_ACL2, LCTL(KC_LEFT), LCTL(KC_PGDN), LCTL(KC_PGUP), LCTL(KC_RIGHT), KC_ENT },
252   {_______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______}
253 },
254
255 /* Plover Layer
256  * ,-----------------------------------------------------------------------------------.
257  * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
258  * |------+------+------+------+------+------+------+------+------+------+------+------|
259  * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
260  * |------+------+------+------+------+------+------+------+------+------+------+------|
261  * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
262  * |------+------+------+------+------+------+------+------+------+------+------+------|
263  * | Exit |      |      |   #  |   A  |   O  |   E  |   U  |      |      |      |      |
264  * `-----------------------------------------------------------------------------------'
265  */
266
267 [_PLOVER] = {
268   {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
269   {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
270   {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
271   {EXT_PLV, XXXXXXX, XXXXXXX, KC_1,    KC_C,    KC_V,    KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
272 }
273
274
275 };
276
277 const uint16_t PROGMEM fn_actions[] = {
278 };
279
280
281 void matrix_init_user(){
282   set_unicode_input_mode(UC_LNX);
283 }
284
285
286 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
287 {
288   switch(id) {
289     case M_ALT_HASH:
290       return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 3, LALT);
291     case M_GR_DASH:
292       {
293         const macro_t* macro = MACRO_TAP_HOLD_LAYER(record, MACRO(T(MINS)), _GR);
294         update_tri_layer(_NUM, _GR, _ADJ);
295         return macro;
296       }
297     case M_SYM_LPRN:
298       return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 9, _SYM);
299     case M_NAV_UNDS:
300       return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, MINS, _NAV);
301     case M_NUM_RPRN:
302       {
303         const macro_t* macro = MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 0, _NUM);
304         update_tri_layer(_NUM, _GR, _ADJ);
305         return macro;
306       }
307     case M_CTRL_DLR:
308       return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 4, LCTL);
309     case M_LCBR_ENT:
310       return MACRODOWN(I(10), D(LSFT), T(LBRC), U(LSFT), T(ENT), END);
311     case M_PLOVER:
312       if (record->event.pressed) {
313         layer_and(0);
314         layer_on(_PLOVER);
315         default_layer_set(_PLOVER);
316
317         // Starts plover
318         return MACRO(I(10), D(E), D(R), D(F), D(V), D(I), D(K), U(E), U(R), U(F), U(V), U(I), U(K), END);
319       }
320       break;
321     case M_EXT_PLV:
322       if (!record->event.pressed) {
323         layer_off(_PLOVER);
324         default_layer_set(_COLEMAK);
325
326         //Pauses plover
327         return MACRO(I(10), D(E), D(R), D(F), D(V), D(Y), D(U), U(E), U(R), U(F), U(V), U(Y), U(U), END);
328       }
329       break;
330     case M_WINDOWS:
331       set_unicode_input_mode(UC_WIN);
332       break;
333     case M_LINUX:
334       set_unicode_input_mode(UC_LNX);
335       break;
336     case M_OSX:
337       set_unicode_input_mode(UC_OSX);
338       break;
339     case M_FUNCTION:
340       if (record->event.pressed) {
341         SEND_STRING("function");
342       }
343       break;
344     case M_THEN:
345       if (record->event.pressed) {
346         SEND_STRING("then");
347       }
348       break;
349     case M_CATCH:
350       if (record->event.pressed) {
351         SEND_STRING("catch");
352       }
353       break;
354   }
355   return MACRO_NONE;
356 };