1 /* Copyright 2015-2017 Christon DeWan
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #include "xtonhasvim.h"
18 #include "fancylighting.h"
20 /************************************
22 ************************************/
24 #define PRESS(kc) register_code(kc)
25 #define RELEASE(kc) unregister_code(kc)
27 static void TAP(uint16_t keycode) {
32 static void CMD(uint16_t keycode) {
38 static void CTRL(uint16_t keycode) {
44 static void SHIFT(uint16_t keycode) {
50 static void ALT(uint16_t keycode) {
57 uint16_t vstate = VIM_START;
58 static bool yank_was_lines = false;
59 static bool SHIFTED = false;
60 static uint32_t mod_override_layer_state = 0;
61 static uint16_t mod_override_triggering_key = 0;
63 static void edit(void) { vstate = VIM_START; layer_clear(); }
67 static void simple_movement(uint16_t keycode) {
71 SHIFT(KC_LEFT); // select to start of this word
76 SHIFT(KC_RIGHT); // select to end of this word
98 SHIFT(KC_RIGHT); // select to end of this word
99 SHIFT(KC_RIGHT); // select to end of next word
100 SHIFT(KC_LEFT); // select to start of next word
106 static void comma_period(uint16_t keycode) {
126 __attribute__ ((weak))
127 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
131 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
132 /* keymap gets first whack */
133 if(!process_record_keymap(keycode, record)) return false;
135 /****** FIREY_RETURN *****/
136 if(record->event.pressed && keycode == FIREY_RETURN) {
137 start_firey_return();
141 /****** mod passthru *****/
142 if(record->event.pressed && layer_state_is(vim_cmd_layer()) && (IS_MOD(keycode) || keycode == LSFT(KC_LALT))) {
143 mod_override_layer_state = layer_state;
144 mod_override_triggering_key = keycode;
145 // TODO: change this to track key location instead
147 return true; // let the event fall through...
149 if(mod_override_layer_state && !record->event.pressed && keycode == mod_override_triggering_key) {
150 layer_state_set(mod_override_layer_state);
151 mod_override_layer_state = 0;
152 mod_override_triggering_key = 0;
156 if (VIM_START <= keycode && keycode <= VIM_ESC) {
157 if(keycode == VIM_SHIFT) {
158 SHIFTED = record->event.pressed;
162 if (record->event.pressed) {
163 if(keycode == VIM_START) {
164 // entry from anywhere
165 layer_on(vim_cmd_layer());
169 yank_was_lines = false;
171 mod_override_layer_state = 0;
172 mod_override_triggering_key = 0;
179 /*****************************
181 *****************************/
201 yank_was_lines = false;
282 yank_was_lines = false;
287 yank_was_lines = false;
327 yank_was_lines = true;
334 comma_period(keycode);
339 /*****************************
340 * c- ...for change. I never use this...
341 *****************************/
350 simple_movement(keycode);
352 yank_was_lines = false;
362 yank_was_lines = false;
374 /*****************************
375 * ci- ...change inner word
376 *****************************/
384 yank_was_lines = false;
392 /*****************************
394 *****************************/
403 simple_movement(keycode);
405 yank_was_lines = false;
412 yank_was_lines = true;
424 /*****************************
425 * ci- ...delete a word... FROM THE INSIDE!
426 *****************************/
434 yank_was_lines = false;
442 /*****************************
444 *****************************/
449 yank_was_lines = false;
456 // leave open for key repeat
462 // leave open for key repeat
485 SHIFT(KC_RIGHT); // select to end of this word
486 SHIFT(KC_RIGHT); // select to end of next word
487 SHIFT(KC_LEFT); // select to start of next word
497 yank_was_lines = false;
507 comma_period(keycode);
515 /*****************************
516 * vi- ...select a word... FROM THE INSIDE!
517 *****************************/
532 /*****************************
534 *****************************/
539 yank_was_lines = true;
552 yank_was_lines = true;
567 comma_period(keycode);
575 /*****************************
576 * gg, and a grab-bag of other macros i find useful
577 *****************************/
602 /*****************************
604 *****************************/
613 simple_movement(keycode);
616 yank_was_lines = false;
623 yank_was_lines = true;
633 /************************
635 ************************/