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"
19 /************************************
21 ************************************/
23 #define PRESS(kc) register_code(kc)
24 #define RELEASE(kc) unregister_code(kc)
26 static void TAP(uint16_t keycode) {
31 static void CMD(uint16_t keycode) {
37 static void CTRL(uint16_t keycode) {
43 static void SHIFT(uint16_t keycode) {
49 static void ALT(uint16_t keycode) {
56 static uint16_t vstate = VIM_START;
57 static bool yank_was_lines = false;
58 static bool SHIFTED = false;
59 static uint32_t mod_override_layer_state = 0;
60 static uint16_t mod_override_triggering_key = 0;
62 static void edit(void) { vstate = VIM_START; layer_on(_EDIT); layer_off(_CMD); }
66 static void simple_movement(uint16_t keycode) {
70 SHIFT(KC_LEFT); // select to start of this word
75 SHIFT(KC_RIGHT); // select to end of this word
97 SHIFT(KC_RIGHT); // select to end of this word
98 SHIFT(KC_RIGHT); // select to end of next word
99 SHIFT(KC_LEFT); // select to start of next word
105 __attribute__ ((weak))
106 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
110 #define PASS_THRU process_record_keymap(keycode, record)
112 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
113 if(record->event.pressed && layer_state_is(_CMD) && IS_MOD(keycode)) {
114 mod_override_layer_state = layer_state;
115 mod_override_triggering_key = keycode;
117 return PASS_THRU; // let the event fall through...
119 if(mod_override_layer_state && !record->event.pressed && keycode == mod_override_triggering_key) {
120 layer_state_set(mod_override_layer_state);
121 mod_override_layer_state = 0;
122 mod_override_triggering_key = 0;
126 if (VIM_START <= keycode && keycode <= VIM_ESC) {
127 if(keycode == VIM_SHIFT) {
128 SHIFTED = record->event.pressed;
132 if (record->event.pressed) {
133 if(keycode == VIM_START) {
134 // entry from anywhere
139 yank_was_lines = false;
141 mod_override_layer_state = 0;
142 mod_override_triggering_key = 0;
149 /*****************************
151 *****************************/
171 yank_was_lines = false;
252 yank_was_lines = false;
257 yank_was_lines = false;
297 yank_was_lines = true;
320 /*****************************
321 * c- ...for change. I never use this...
322 *****************************/
331 simple_movement(keycode);
333 yank_was_lines = false;
343 yank_was_lines = false;
355 /*****************************
356 * ci- ...change inner word
357 *****************************/
365 yank_was_lines = false;
373 /*****************************
375 *****************************/
384 simple_movement(keycode);
386 yank_was_lines = false;
393 yank_was_lines = true;
405 /*****************************
406 * ci- ...delete a word... FROM THE INSIDE!
407 *****************************/
415 yank_was_lines = false;
423 /*****************************
425 *****************************/
430 yank_was_lines = false;
437 // leave open for key repeat
443 // leave open for key repeat
466 SHIFT(KC_RIGHT); // select to end of this word
467 SHIFT(KC_RIGHT); // select to end of next word
468 SHIFT(KC_LEFT); // select to start of next word
478 yank_was_lines = false;
492 /*****************************
493 * vi- ...select a word... FROM THE INSIDE!
494 *****************************/
509 /*****************************
511 *****************************/
516 yank_was_lines = true;
529 yank_was_lines = true;
548 /*****************************
549 * gg, and a grab-bag of other macros i find useful
550 *****************************/
575 /*****************************
577 *****************************/
586 simple_movement(keycode);
589 yank_was_lines = false;
596 yank_was_lines = true;
606 /************************
608 ************************/