]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/luke/keymap.c
26dcb451b1fd25290287d633275e57e9c6eb1805
[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 #include "planck.h"
45
46 #define _______ KC_TRNS
47 #define XXXXXXX KC_NO
48
49
50 // Layers
51 #define _COLEMAK 0
52 #define _QWERTY 1
53 #define _SYM 2
54 #define _NUM 3
55 #define _GR  4
56 #define _GR_S 5
57 #define _ADJ 6
58 #define _NAV 7
59 #define _PLOVER 8
60
61 // Macro ID numbers
62 #define M_ALT_HASH 1
63 #define M_GR_DASH  2
64 #define M_SYM_LPRN 3 
65 #define M_NAV_UNDS 4 
66 #define M_NUM_RPRN 5 
67 #define M_CTRL_DLR 6 
68 #define M_LCBR_ENT 7
69 #define M_PLOVER   8
70 #define M_EXT_PLV  9
71 #define M_WINDOWS 10
72 #define M_LINUX   11
73 #define M_OSX     12
74 #define M_FUNCTION 13
75 #define M_THEN     14
76 #define M_CATCH    15
77
78 // Macro keys
79 #define ALT_HASH MACROTAP(M_ALT_HASH)   // tap for #, hold for Alt 
80 #define GR_DASH  MACROTAP(M_GR_DASH)    // tap for -, hold for GR layer            a-class-name
81 #define SYM_LPRN MACROTAP(M_SYM_LPRN)   // tap for (, hold for symbols layer       if()
82 #define NAV_UNDS MACROTAP(M_NAV_UNDS)   // tap for _, hold for navigation layer    snake_case_variable
83 #define NUM_RPRN MACROTAP(M_NUM_RPRN)   // tap for ), hold for numbers layer       else if()
84 #define CTRL_DLR MACROTAP(M_CTRL_DLR)   // tap for $, hold for ctrl                $php_is_really_weird
85 #define LCBR_ENT M(M_LCBR_ENT)          // {\n                                     easier code formatting
86 #define PLOVER   M(M_PLOVER)            // PHROPB (plover) or ERFVIK(qwerty)       starts plover
87 #define EXT_PLV  M(M_EXT_PLV)           // PHRO*F (plover) or ERFVYU(qwerty)       stops plover
88 #define WINDOWS  M(M_WINDOWS)           // Sets Unicode handler to windows
89 #define LINUX    M(M_LINUX)             // Sets Unicode handler to linux
90 #define OSX      M(M_OSX)               // Sets Unicode handler to OSX
91 #define FUNCTION M(M_FUNCTION)
92 #define THEN     M(M_THEN)
93 #define CATCH    M(M_CATCH)
94
95
96 // Renames of QMK keys... (would have otherwise been a macro)
97 #define QWERTY DF(_QWERTY)
98 #define COLEMAK DF(_COLEMAK)
99
100
101
102
103
104 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
105
106 /* Colemak
107  * ,-----------------------------------------------------------------------------------.
108  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |  ;:  | Bksp |
109  * |------+------+------+------+------+------+------+------+------+------+------+------|
110  * | Bksp |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  '"  |
111  * |------+------+------+------+------+------+------+------+------+------+------+------`---.
112  * |Shift=|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |  ,<  |  .>  |  /?  |Shift/Ent |
113  * |------+------+------+------+------+------+------+------+------+------+------+----------|
114  * |CtCaps|GUIF4 | Alt# | Gr-  | Sym( | Nav_ |Space | Num) |Ctrl$ | F11  | F12  |Nav toggle|
115  * `---------------------------------------------------------------------------------------'
116  */
117
118 [_COLEMAK] = {
119   {KC_TAB,         KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
120   {KC_BSPC,        KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
121   {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) },
122   {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)}
123 },
124
125
126  
127 /* QWERTY
128  * ,-----------------------------------------------------------------------------------.
129  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
130  * |------+------+------+------+------+------+------+------+------+------+------+------|
131  * | Bksp |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |  ;:  |  '"  |
132  * |------+------+------+------+------+------+------+------+------+------+------+------`---.
133  * |Shift=|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |  ,<  |  .>  |  /?  |Shift/Ent |
134  * |------+------+------+------+------+------+------+------+------+------+------+----------|
135  * |CtCaps|GUIF4 | Alt# | Gr-  | Sym( | Nav_ |Space | Num) |Ctrl$ | F11  | F12  |Nav toggle|
136  * `---------------------------------------------------------------------------------------'
137  */
138
139 [_QWERTY] = {
140   {KC_TAB,   KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
141   {KC_ESC,   KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
142   {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) },
143   {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}
144 },
145
146
147 /* Symbols
148  * ,-----------------------------------------------------------------------------------.
149  * | Tab  |  `   |  @   |  /   |  *   |  ^   |  %   |  :   |  +   |  -   | Del  | Bksp |
150  * |------+------+------+------+------+------+------+------+------+------+------+------|
151  * |      |  [   |  ;   |  }   |  (   |  "   |  '   |  )   | {\n  |  !   |  ]   |  \   |
152  * |------+------+------+------+------+------+------+------+------+------+------+------|
153  * |Shift |  .   |  {   |  <   |  >   |  ~   |  X2  |  =   |  &   |  |   |  ?   |Enter |
154  * |------+------+------+------+------+------+------+------+------+------+------+------|
155  * |      |      |      |      | Sym  |  _   |Space | NUM  |  X2  |      |      |      |
156  * `-----------------------------------------------------------------------------------'
157  */
158  
159 [_SYM] = {
160   {KC_TAB,  KC_GRV,  KC_AT,   KC_SLSH, KC_ASTR, KC_CIRC, KC_PERC, KC_COLN, KC_PLUS, KC_MINS, KC_DEL,  KC_BSPC},
161   {FUNCTION,KC_LBRC, KC_SCLN, KC_RCBR, KC_LPRN, KC_DQT,  KC_QUOT, KC_RPRN, LCBR_ENT,KC_EXLM, KC_RBRC, KC_BSLS},
162   {KC_LSFT, KC_DOT,  KC_LCBR, KC_LABK, KC_RABK, KC_TILD, _______, KC_EQL,  KC_AMPR, KC_PIPE, KC_QUES, KC_ENT },
163   {THEN,    CATCH,   XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______}
164 },
165
166
167 /* Numbers
168  * ,-----------------------------------------------------------------------------------.
169  * | Tab  |  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |  9   |  0   | Bksp |
170  * |------+------+------+------+------+------+------+------+------+------+------+------|
171  * | Bksp |  x   |  D   |  E   |  F   |  +   |  -   |  4   |  5   |  6   |  0   |Enter |
172  * |------+------+------+------+------+------+------+------+------+------+------+------|
173  * |Shift |  (   |  A   |  B   |  C   |  *   |  /   |  1   |  2   |  3   |  )   |Enter |
174  * |------+------+------+------+------+------+------+------+------+------+------+------|
175  * |      |      |      |  GR  | SYM  |  _   |Space | NUM  |  0   |  .   |  f   |      |
176  * `-----------------------------------------------------------------------------------'
177  */
178  
179 [_NUM] = {
180   {KC_TAB,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
181   {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 },
182   {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 },
183   {_______, _______, _______, _______, _______, _______, _______, _______, KC_0,    KC_DOT,  KC_F,    _______}
184 },
185
186
187 /* Gr layer / international keys
188  * ,-----------------------------------------------------------------------------------.
189  * |      |  ä   |  å   |      |  ¢£  |  €¥  |      |  ë   |  ê   |  ü   |  ù   |      |
190  * |------+------+------+------+------+------+------+------+------+------+------+------|
191  * |      |  â   |  à   |  ß   |      |      |      |  è   |  é   |  ï   |  ö   |      |
192  * |------+------+------+------+------+------+------+------+------+------+------+------|
193  * |      |  æ   |  ô   |  ç   |  œ   |      |      |  û   |  «   |  »   |  î   |      |
194  * |------+------+------+------+------+------+------+------+------+------+------+------|
195  * |      |      |      |      |      |      |      |      |      |      |      |      |
196  * `-----------------------------------------------------------------------------------'
197  */
198  
199 [_GR] = {
200   {_______,  UC(0xE4),UC(0xE5), _______,UC(0xA2), UC(0x20AC),_______,UC(0xEB),UC(0xEA),UC(0xFC),UC(0xF9), _______},
201   {_______,  UC(0xE2),UC(0xE0),UC(0xDF), _______, _______,   _______,UC(0xE8),UC(0xE9),UC(0xEF),UC(0xF6), _______},
202   {MO(_GR_S),UC(0xE6),UC(0xF4),UC(0xE7),UC(0x153),_______,   _______,UC(0xFB),UC(0xAB),UC(0xBB),UC(0xEE), MO(_GR_S)},
203   {_______,  _______, _______, _______, _______,  _______,   _______, _______, _______, _______, _______, _______}
204 },
205
206 // Shifted layer of the above
207 [_GR_S] = {
208   {_______,  UC(0xC4),UC(0xC5), _______, UC(0xA3), UC(0xA5),_______, UC(0xCB),UC(0xCA),UC(0xDC),UC(0xD9),_______},
209   {_______,  UC(0xC2),UC(0xC0), UC(0xDF),_______,  _______, _______, UC(0xC8),UC(0xC9),UC(0xCF),UC(0xD6),_______},
210   {MO(_GR_S),UC(0xC6),UC(0xD4), UC(0xC7),UC(0x152),_______, _______, UC(0xDB),UC(0xAB),UC(0xBB),UC(0xCE),MO(_GR_S)},
211   {_______,  _______, _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______}
212 },
213
214
215 /* Adjust Layer (Gr + Num)
216  * ,-----------------------------------------------------------------------------------.
217  * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  | F10  | F11  | F12  |
218  * |------+-------------+------+------+------+------+------+------+------+------+------|
219  * |      |     |Prntscr| ESC  |VOLUP | PLAY | PREV |QWERTY|COLEMAK|PLOVER|     |      |
220  * |------+-------------+------+------+------+------+------+------+------+------+------|
221  * |      |     |BACKLIT| INS  |VOLDWN| MUTE | NEXT | WIND |LINUX | OSX  |      |      |
222  * |------+-------------+------+------+------+------+------+------+------+------+------|
223  * |      |      |      |      |      |      |      |      |      |      |      |      |
224  * `-----------------------------------------------------------------------------------'
225  */
226  
227 [_ADJ] = {
228   {KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12 },
229   {XXXXXXX, XXXXXXX, KC_PSCR, KC_ESC,  KC_VOLU, KC_MPLY, KC_MPRV, QWERTY,  COLEMAK, PLOVER,  XXXXXXX, XXXXXXX},
230   {XXXXXXX, XXXXXXX, BL_STEP, KC_INS,  KC_VOLD, KC_MUTE, KC_MNXT, WINDOWS, LINUX,   OSX,     XXXXXXX, XXXXXXX},
231   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
232 },
233
234
235 /* Navigation
236  * ,-----------------------------------------------------------------------------------.
237  * |      |      | BTN3 | BTN2 | BTN1 |      | ACL0 | HOME | PGDN | PGUP | END  | Bksp |
238  * |------+------+------+------+------+------+------+------+------+------+------+------|
239  * |      |MSLEFT| MSDN | MSUP |MSRGHT|      | ACL1 | LEFT | DOWN | UP   | RGHT |Enter |
240  * |------+------+------+------+------+------+------+------+------+------+------+------|
241  * |      |WHLEFT| WHDN | WHUP |WHRGHT|      | ACL2 |C-LEFT|C-PGDN|C-PGUP|C-RGHT|Enter |
242  * |------+------+------+------+------+------+------+------+------+------+------+------|
243  * |      |      |      |      |      |  _   |Space | ACL0 | ACL1 | ACL2 |      |TGLNAV|
244  * `-----------------------------------------------------------------------------------'
245  */
246  
247 [_NAV] = {
248   {XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN2, KC_BTN1, XXXXXXX, KC_ACL0, KC_HOME, KC_PGDN, KC_PGUP, KC_END,  KC_BSPC},
249   {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 },
250   {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 },
251   {_______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______}
252 },
253
254 /* Plover Layer
255  * ,-----------------------------------------------------------------------------------.
256  * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
257  * |------+------+------+------+------+------+------+------+------+------+------+------|
258  * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
259  * |------+------+------+------+------+------+------+------+------+------+------+------|
260  * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
261  * |------+------+------+------+------+------+------+------+------+------+------+------|
262  * | Exit |      |      |   #  |   A  |   O  |   E  |   U  |      |      |      |      |
263  * `-----------------------------------------------------------------------------------'
264  */
265
266 [_PLOVER] = {
267   {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
268   {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
269   {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
270   {EXT_PLV, XXXXXXX, XXXXXXX, KC_1,    KC_C,    KC_V,    KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
271 }
272
273
274 };
275
276 const uint16_t PROGMEM fn_actions[] = {
277 };
278
279
280 void matrix_init_user(){
281   set_unicode_input_mode(UC_LNX);
282 }
283
284
285 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
286 {
287   switch(id) {
288     case M_ALT_HASH:
289       return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 3, LALT);
290     case M_GR_DASH:
291       {
292         const macro_t* macro = MACRO_TAP_HOLD_LAYER(record, MACRO(T(MINS)), _GR);
293         update_tri_layer(_NUM, _GR, _ADJ);
294         return macro;
295       }
296     case M_SYM_LPRN:
297       return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 9, _SYM);
298     case M_NAV_UNDS:
299       return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, MINS, _NAV);
300     case M_NUM_RPRN:
301       {
302         const macro_t* macro = MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 0, _NUM);
303         update_tri_layer(_NUM, _GR, _ADJ);
304         return macro;
305       }
306     case M_CTRL_DLR:
307       return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 4, LCTL);
308     case M_LCBR_ENT:
309       return MACRODOWN(I(10), D(LSFT), T(LBRC), U(LSFT), T(ENT), END);
310     case M_PLOVER:
311       if (record->event.pressed) {
312         layer_and(0);
313         layer_on(_PLOVER);
314         default_layer_set(_PLOVER);
315         
316         // Starts plover
317         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);
318       }
319       break;    
320     case M_EXT_PLV:
321       if (!record->event.pressed) {
322         layer_off(_PLOVER);
323         default_layer_set(_COLEMAK);
324         
325         //Pauses plover
326         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);
327       }
328       break;
329     case M_WINDOWS:
330       set_unicode_input_mode(UC_WIN);
331       break;
332     case M_LINUX:
333       set_unicode_input_mode(UC_LNX);
334       break;
335     case M_OSX:
336       set_unicode_input_mode(UC_OSX);
337       break;
338     case M_FUNCTION:
339       if (record->event.pressed) {
340         SEND_STRING("function");
341       }
342       break;
343     case M_THEN:
344       if (record->event.pressed) {
345         SEND_STRING("then");
346       }
347       break;
348     case M_CATCH:
349       if (record->event.pressed) {
350         SEND_STRING("catch");
351       }
352       break;
353   }
354   return MACRO_NONE;
355 };