Vim Layout for Ergodox-EZ (mac only) (#2112)
[jackhill/qmk/firmware.git] / keyboards / ergodox_ez / keymaps / vim / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "quantum_keycodes.h"
3 #include "action_layer.h"
4 #include "version.h"
5 #include "vim.h"
6
7 #define VERSION_STRING QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION
8 #define _______ KC_TRNS
9 #define X_____X KC_TRNS
10 #define KC_ATM LGUI(LSFT(KC_P))
11 #define KC_ATP LGUI(LCTL(KC_P))
12 #define TO_NORM TO(NORMAL_MODE)
13
14 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
15
16 /* Normal mode
17 *
18 * ,--------------------------------------------------. ,--------------------------------------------------.
19 * | | | | | | | | | | | | | | | |
20 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
21 * | TAB | | WORD | END | | | | | | YANK | UNDO | | OPEN | PUT | |
22 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
23 * | ⎋ | | | DEL | | |------| |------| ← | ↓ | ↑ | → | | ⎋ |
24 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
25 * | SHIFT | | | |VISUAL| BACK | | | | | | | | | SHIFT |
26 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
27 * | | | | | | | | | | | |
28 * `----------------------------------' `----------------------------------'
29 * ,-------------. ,-------------.
30 * | | | | | |
31 * ,------|------|------| |------+------+------.
32 * | | | | | | | |
33 * |SPACE |DELETE|------| |------|ENTER |BACKSP|
34 * | | | | | | | |
35 * `--------------------' `--------------------'
36 */
37 [NORMAL_MODE] = KEYMAP(
38 // Layer 2 Left Hand
39 X_____X,X_____X,X_____X,X_____X,X_____X,X_____X,X_____X,
40 KC_TAB ,X_____X,VIM_W, VIM_E ,X_____X,X_____X,X_____X,
41 X_____X,VIM_A ,VIM_S ,VIM_D ,X_____X,X_____X,
42 KC_LSFT,X_____X,VIM_X ,VIM_C ,VIM_V ,VIM_B ,X_____X,
43 KC_LCTL,KC_LALT,X_____X,X_____X,X_____X,
44
45 KC_HOME,KC_END ,
46 TO(SYMB),
47 GUI_T(KC_SPC), KC_ESC ,_______,
48
49
50 // Layer 2 Right Hand
51 X_____X,X_____X,X_____X,X_____X,X_____X,X_____X,X_____X,
52 X_____X,VIM_Y ,VIM_U ,VIM_I ,VIM_O ,VIM_P ,X_____X,
53 VIM_H ,VIM_J ,VIM_K ,VIM_L ,X_____X,X_____X,
54 X_____X,X_____X,X_____X,X_____X,X_____X,X_____X,KC_LSFT,
55 X_____X,X_____X,X_____X,KC_RALT,KC_RCTL,
56
57 KC_PGUP, KC_PGDN,
58 TO(SYMB),
59 KC_DEL , KC_ENT, GUI_T(KC_BSPC)
60 ),
61
62 /* Insert mode
63 *
64 * ,--------------------------------------------------. ,--------------------------------------------------.
65 * | NORMAL | 1 | 2 | 3 | 4 | 5 | ⇧⌘P | | PROJ | 6 | 7 | 8 | 9 | 0 | - |
66 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
67 * | ⇥ | Q | W | E | R | T | ` | | - | Y | U | I | O | P | \ |
68 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
69 * | ⎋ | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
70 * |--------+------+------+------+------+------| = | | + |------+------+------+------+------+--------|
71 * | L⇧ | Z | X | C | V | B | | | | N | M | , | . | / | R⇧ |
72 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
73 * | ⌃ | ⌥ | ( | [ | { | | } | ] | ) | ⌥ | ⌃ |
74 * `----------------------------------' `----------------------------------'
75 * ,-------------. ,-------------.
76 * | HOME | END | | PGDN | PGUP |
77 * ,------|------|------| |------+------+------.
78 * |SPACE | | | | | | BSPC |
79 * | |NORMAL|------| |------| ENTER| |
80 * | ⌘ | | | | | | ⌘ |
81 * `--------------------' `--------------------'
82 */
83 [INSERT_MODE] = KEYMAP(
84 // Left Hand
85 NOR_MOD,KC_1, KC_2, KC_3, KC_4, KC_5, KC_ATM,
86 KC_TAB ,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_GRV,
87 KC_ESC ,KC_A, KC_S, KC_D, KC_F, KC_G,
88 KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_EQL,
89 KC_LCTL,KC_LALT,KC_LPRN,KC_LBRC, KC_LCBR,
90
91 KC_HOME,KC_END ,
92 TO(SYMB),
93 GUI_T(KC_SPC),KC_ESC ,TO_NORM,
94
95
96 // Right Hand
97 KC_ATP , KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
98 KC_MINS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
99 KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
100 KC_PLUS, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,KC_RSFT,
101 KC_RCBR,KC_RBRC, KC_RPRN,KC_RALT,KC_RCTL,
102
103 KC_PGUP, KC_PGDN,
104 TO(SYMB),
105 MO(MOUSE) , KC_ENT, GUI_T(KC_BSPC)
106 ),
107
108 [SYMB] = KEYMAP(
109 // Left Hand
110 NOR_MOD,KC_1, KC_2, KC_3, KC_4, KC_5, KC_ATM,
111 KC_TAB ,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_GRV,
112 _______,KC_A, KC_S, KC_D, KC_F, KC_G,
113 KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_EQL,
114 KC_LCTL,KC_LALT,KC_LPRN,KC_LBRC, KC_LCBR,
115
116 _______,_______,
117 _______,
118 _______,_______,TO_NORM,
119
120 // Right Hand
121 KC_ATP , KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
122 KC_MINS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
123 KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
124 KC_PLUS, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,KC_RSFT,
125 KC_RCBR,KC_RBRC, KC_RPRN,KC_RALT,KC_RCTL,
126
127 _______,_______,
128 _______,
129 _______,_______,_______
130 ),
131
132 [MOUSE] = KEYMAP(
133 // Left Hand
134 _______,_______,_______,_______,_______,_______,_______,
135 _______,_______,_______,_______,_______,_______,_______,
136 _______,_______,_______,_______,_______,_______,
137 _______,_______,_______,_______,_______,_______,_______,
138 _______,_______,_______,_______,_______,
139
140 _______,_______,
141 _______,
142 _______,_______,_______,
143
144 // Right Hand
145 _______,_______,_______,_______,_______,_______,_______,
146 _______,_______,KC_BTN1,KC_BTN3,KC_BTN2,_______,_______,
147 KC_MS_L,KC_MS_D,KC_MS_U,KC_MS_R,_______,_______,
148 _______,_______,_______,_______,_______,_______,_______,
149 _______,_______,_______,_______,_______,
150
151 _______,_______,
152 _______,
153 _______,_______,_______
154 ),
155 };
156
157 const uint16_t PROGMEM fn_actions[] = {
158 [1] = ACTION_LAYER_TAP_TOGGLE(1)
159 };
160
161 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
162 switch(id) {
163 case 0:
164 if (record->event.pressed) { SEND_STRING (VERSION_STRING); }
165 break;
166 }
167 return MACRO_NONE;
168 };
169
170 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
171 bool SHIFTED = (keyboard_report->mods & MOD_BIT(KC_LSFT)) |
172 (keyboard_report->mods & MOD_BIT(KC_RSFT));
173
174 switch (keycode) {
175
176 case VIM_A:
177 if (record->event.pressed) { SHIFTED ? VIM_APPEND_LINE() : VIM_APPEND(); }
178 return false;
179
180 case VIM_B:
181 if (record->event.pressed) {
182 switch(VIM_QUEUE) {
183 case KC_NO: VIM_BACK(); break;
184 case VIM_C: VIM_CHANGE_BACK(); break;
185 case VIM_D: VIM_DELETE_BACK(); break;
186 case VIM_V: VIM_VISUAL_BACK(); break;
187 }
188 }
189 return false;
190
191 case VIM_C:
192 if (record->event.pressed) {
193 switch(VIM_QUEUE) {
194 case KC_NO: SHIFTED ? VIM_CHANGE_LINE() : VIM_LEADER(VIM_C); break;
195 case VIM_C: VIM_CHANGE_WHOLE_LINE(); break;
196 }
197 }
198 return false;
199
200 case VIM_D:
201 if (record->event.pressed) {
202 switch(VIM_QUEUE) {
203 case KC_NO: SHIFTED ? VIM_DELETE_LINE() : VIM_LEADER(VIM_D); break;
204 case VIM_D: VIM_DELETE_WHOLE_LINE(); break;
205 }
206 }
207 return false;
208
209 case VIM_E:
210 if (record->event.pressed) {
211 switch (VIM_QUEUE) {
212 case KC_NO: VIM_END(); break;
213 case VIM_C: VIM_CHANGE_END(); break;
214 case VIM_D: VIM_DELETE_END(); break;
215 case VIM_V: VIM_VISUAL_END(); break;
216 }
217 }
218 return false;
219
220 case VIM_H:
221 if (record->event.pressed) {
222 switch (VIM_QUEUE) {
223 case KC_NO: VIM_LEFT(); break;
224 case VIM_C: VIM_CHANGE_LEFT(); break;
225 case VIM_D: VIM_DELETE_LEFT(); break;
226 case VIM_V: VIM_VISUAL_LEFT(); break;
227 }
228 }
229 return false;
230
231 case VIM_I:
232 if (record->event.pressed) {
233 switch (VIM_QUEUE) {
234 case KC_NO: layer_on(INSERT_MODE); break;
235 case VIM_C: VIM_LEADER(VIM_CI); break;
236 case VIM_D: VIM_LEADER(VIM_DI); break;
237 case VIM_V: VIM_LEADER(VIM_VI); break;
238 }
239 }
240 return false;
241
242 case VIM_J:
243 if (record->event.pressed) {
244 switch (VIM_QUEUE) {
245 case KC_NO: SHIFTED ? VIM_JOIN() : VIM_DOWN(); break;
246 case VIM_C: VIM_CHANGE_DOWN(); break;
247 case VIM_D: VIM_DELETE_DOWN(); break;
248 case VIM_V: VIM_VISUAL_DOWN(); break;
249 }
250 }
251 return false;
252
253 case VIM_K:
254 if (record->event.pressed) {
255 switch (VIM_QUEUE) {
256 case KC_NO: VIM_UP(); break;
257 case VIM_C: VIM_CHANGE_UP(); break;
258 case VIM_D: VIM_DELETE_UP(); break;
259 case VIM_V: VIM_VISUAL_UP(); break;
260 }
261 }
262 return false;
263
264 case VIM_L:
265 if (record->event.pressed) {
266 switch (VIM_QUEUE) {
267 case KC_NO: VIM_RIGHT(); break;
268 case VIM_C: VIM_CHANGE_RIGHT(); break;
269 case VIM_D: VIM_DELETE_RIGHT(); break;
270 case VIM_V: VIM_VISUAL_RIGHT(); break;
271 }
272 }
273 return false;
274
275 case VIM_O:
276 if (record->event.pressed) { SHIFTED ? VIM_OPEN_ABOVE() : VIM_OPEN(); }
277 return false;
278
279 case VIM_P:
280 if (record->event.pressed) { SHIFTED ? VIM_PUT_BEFORE() : VIM_PUT(); }
281 return false;
282
283 case VIM_S:
284 if (record->event.pressed) { SHIFTED ? VIM_CHANGE_WHOLE_LINE() : VIM_SUBSTITUTE(); }
285 return false;
286
287 case VIM_U:
288 if (record->event.pressed) { VIM_UNDO(); }
289 return false;
290
291 case VIM_V:
292 if (record->event.pressed) { VIM_LEADER(VIM_V); }
293 return false;
294
295 case VIM_W:
296 if (record->event.pressed) {
297 switch (VIM_QUEUE) {
298 case KC_NO: VIM_WORD(); break;
299 case VIM_C: VIM_CHANGE_WORD(); break;
300 case VIM_CI: VIM_CHANGE_INNER_WORD(); break;
301 case VIM_D: VIM_DELETE_WORD(); break;
302 case VIM_DI: VIM_DELETE_INNER_WORD(); break;
303 case VIM_V: VIM_VISUAL_WORD(); break;
304 case VIM_VI: VIM_VISUAL_INNER_WORD(); break;
305 }
306 }
307 return false;
308
309 case VIM_X:
310 if (record->event.pressed) { VIM_CUT(); }
311 return false;
312
313 case VIM_Y:
314 if (record->event.pressed) { SHIFTED ? VIM_YANK_LINE() : VIM_YANK(); }
315 return false;
316
317 // dynamically generate these.
318 case EPRM:
319 if (record->event.pressed) { eeconfig_init(); }
320 return false;
321 case VRSN:
322 if (record->event.pressed) { SEND_STRING(VERSION_STRING); }
323 return false;
324 case RGB_SLD:
325 if (record->event.pressed) { rgblight_mode(1); }
326 return false;
327 }
328
329 // End by clearing the queue unless keycode is a
330 // if ((record->event.pressed) &&
331 // (keycode != VIM_I ||
332 // keycode != VIM_C ||
333 // keycode != VIM_D ||
334 // keycode != VIM_V)) {
335 // VIM_LEADER(KC_NO);
336 // }
337
338 return true;
339 };
340
341 void matrix_init_user(void) {
342 debug_enable = true;
343 VIM_LEADER(KC_NO);
344 };
345
346 void matrix_scan_user(void) {
347 uint8_t layer = biton32(layer_state);
348
349 ergodox_board_led_off();
350 ergodox_right_led_1_off();
351 ergodox_right_led_2_off();
352 ergodox_right_led_3_off();
353 switch (layer) {
354 case 1:
355 ergodox_right_led_1_on();
356 break;
357 case 2:
358 ergodox_right_led_2_on();
359 break;
360 case 3:
361 ergodox_right_led_3_on();
362 break;
363 case 4:
364 ergodox_right_led_1_on();
365 ergodox_right_led_2_on();
366 break;
367 case 5:
368 ergodox_right_led_1_on();
369 ergodox_right_led_3_on();
370 break;
371 case 6:
372 ergodox_right_led_2_on();
373 ergodox_right_led_3_on();
374 break;
375 case 7:
376 ergodox_right_led_1_on();
377 ergodox_right_led_2_on();
378 ergodox_right_led_3_on();
379 break;
380 default:
381 break;
382 }
383
384 };