Add magic backspace to my layout (#2758)
* Add Haegin's keymap * Potential improvements to the keyboard * Add haegin minidox layout * Add Haegin's keyboard to ergodox layouts * Update Haegin's minidox keymap * Add home, end, and page up and down * Magic Backspace Backspace still acts as control when you hold it down, but if you tap it twice and hold it's a held backspace. Tapping it more than twice it continues to act as backspace, but it deletes more characters with each tap with the quantity deleted based on the fibonacci sequence. * Switch to deleting words after 4 taps When hitting backspace, after 4 taps this switches to deleting by word because if you're hitting backspace that frantically you must need to delete a lot of stuff. Holding backspace after 4 taps will delete words in the same way that holding alt+backspace deletes words on a normal keyboard.
This commit is contained in:
		
				
					committed by
					
						
						Drashna Jaelre
					
				
			
			
				
	
			
			
			
						parent
						
							5226e4c79b
						
					
				
				
					commit
					8ec2269519
				
			@@ -11,6 +11,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define _______ KC_TRNS
 | 
					#define _______ KC_TRNS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					  TD_BSPC = 0
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
					const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Keymap 0: Basic layer
 | 
					/* Keymap 0: Basic layer
 | 
				
			||||||
@@ -46,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			|||||||
        LT(SYMBOLS,KC_GRV),  KC_QUOT,            KC_SLSH,         KC_LALT,  SFT_T(KC_RGHT),
 | 
					        LT(SYMBOLS,KC_GRV),  KC_QUOT,            KC_SLSH,         KC_LALT,  SFT_T(KC_RGHT),
 | 
				
			||||||
                                                                                             KC_HOME,            KC_END,
 | 
					                                                                                             KC_HOME,            KC_END,
 | 
				
			||||||
                                                                                                                 KC_PGUP,
 | 
					                                                                                                                 KC_PGUP,
 | 
				
			||||||
                                                                            GUI_T(KC_SPC),   CTL_T(KC_BSPC),     LGUI(KC_SPC),
 | 
					                                                                            GUI_T(KC_SPC),   TD(TD_BSPC),     LGUI(KC_SPC),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Right hand
 | 
					        // Right hand
 | 
				
			||||||
        KC_RGHT,        KC_6,              KC_7,                KC_8,        KC_9,        KC_0,                LGUI(KC_SPC),
 | 
					        KC_RGHT,        KC_6,              KC_7,                KC_8,        KC_9,        KC_0,                LGUI(KC_SPC),
 | 
				
			||||||
@@ -137,16 +141,90 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			|||||||
                                  _______, _______, _______,
 | 
					                                  _______, _______, _______,
 | 
				
			||||||
    // right hand
 | 
					    // right hand
 | 
				
			||||||
       _______, _______, _______, _______, _______, _______, _______,
 | 
					       _______, _______, _______, _______, _______, _______, _______,
 | 
				
			||||||
       _______,  _______, _______,   KC_UP, _______, _______, _______,
 | 
					       _______, _______, KC_HOME,   KC_UP,  KC_END, KC_PGUP, _______,
 | 
				
			||||||
                 KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_MPLY,
 | 
					                KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_MPLY,
 | 
				
			||||||
       _______,  KC_VOLD, KC_MPRV, KC_MPLY, KC_MFFD, _______, _______,
 | 
					       KC_MUTE, KC_VOLD, KC_MPRV, KC_MPLY, KC_MFFD, _______, _______,
 | 
				
			||||||
                          KC_MUTE, _______, _______, _______, _______,
 | 
					                          _______, _______, _______, _______, _______,
 | 
				
			||||||
       _______, _______,
 | 
					       _______, _______,
 | 
				
			||||||
       _______,
 | 
					       _______,
 | 
				
			||||||
       _______, _______,  KC_WBAK
 | 
					       _______, _______,  KC_WBAK
 | 
				
			||||||
),
 | 
					),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					  BSPC_LETTER = 0,
 | 
				
			||||||
 | 
					  BSPC_WORD = 1,
 | 
				
			||||||
 | 
					  HOLD_CTRL = 2
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  int a;
 | 
				
			||||||
 | 
					  int b;
 | 
				
			||||||
 | 
					  int state;
 | 
				
			||||||
 | 
					} fib_tap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static fib_tap fib_bspc = {
 | 
				
			||||||
 | 
					  .a = 0,
 | 
				
			||||||
 | 
					  .b = 1,
 | 
				
			||||||
 | 
					  .state = BSPC_LETTER
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cur_backspace (qk_tap_dance_state_t *state) {
 | 
				
			||||||
 | 
					  int next_fib = fib_bspc.a + fib_bspc.b;
 | 
				
			||||||
 | 
					  fib_bspc.a = fib_bspc.b;
 | 
				
			||||||
 | 
					  fib_bspc.b = next_fib;
 | 
				
			||||||
 | 
					  for (int i=0; i < next_fib; i++) {
 | 
				
			||||||
 | 
					    unregister_code(KC_BSPC);
 | 
				
			||||||
 | 
					    register_code(KC_BSPC);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void dance_backspace (qk_tap_dance_state_t *state, void *user_data) {
 | 
				
			||||||
 | 
					  // If we're at the fifth tap, switch to deleting by words, and reset the fib
 | 
				
			||||||
 | 
					  // counter
 | 
				
			||||||
 | 
					  if (state->count == 4) {
 | 
				
			||||||
 | 
					    register_code(KC_LALT);
 | 
				
			||||||
 | 
					    fib_bspc.state = BSPC_WORD;
 | 
				
			||||||
 | 
					    fib_bspc.a = 0;
 | 
				
			||||||
 | 
					    fib_bspc.b = 1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // If we're on the first press, wait to find out if it's being held
 | 
				
			||||||
 | 
					  // If we're on the second tap, process the first tap, because we're past
 | 
				
			||||||
 | 
					  // holding for ctrl now, then act normally
 | 
				
			||||||
 | 
					  if (state->count == 2) {
 | 
				
			||||||
 | 
					    register_code(KC_BSPC);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (state->count > 1) {
 | 
				
			||||||
 | 
					    cur_backspace(state);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void dance_backspace_ended (qk_tap_dance_state_t *state, void *user_data) {
 | 
				
			||||||
 | 
					  if (state->count == 1) {
 | 
				
			||||||
 | 
					    if (state->pressed) {
 | 
				
			||||||
 | 
					      fib_bspc.state = HOLD_CTRL;
 | 
				
			||||||
 | 
					      register_code(KC_LCTRL);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      register_code(KC_BSPC);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void dance_backspace_reset (qk_tap_dance_state_t *state, void *user_data) {
 | 
				
			||||||
 | 
					  switch (fib_bspc.state) {
 | 
				
			||||||
 | 
					    case HOLD_CTRL: unregister_code(KC_LCTRL); break;
 | 
				
			||||||
 | 
					    case BSPC_WORD: unregister_code(KC_BSPC); unregister_code(KC_LALT); break;
 | 
				
			||||||
 | 
					    case BSPC_LETTER: unregister_code(KC_BSPC); break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  fib_bspc.a = 0;
 | 
				
			||||||
 | 
					  fib_bspc.b = 1;
 | 
				
			||||||
 | 
					  fib_bspc.state = BSPC_LETTER;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qk_tap_dance_action_t tap_dance_actions[] = {
 | 
				
			||||||
 | 
					  [TD_BSPC] = ACTION_TAP_DANCE_FN_ADVANCED (dance_backspace, dance_backspace_ended, dance_backspace_reset)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const uint16_t PROGMEM fn_actions[] = {
 | 
					const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||||
    [1] = ACTION_LAYER_TAP_TOGGLE(SYMBOLS)                // FN1 - Momentary Layer 1 (Symbols)
 | 
					    [1] = ACTION_LAYER_TAP_TOGGLE(SYMBOLS)                // FN1 - Momentary Layer 1 (Symbols)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								layouts/community/ergodox/haegin/rules.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								layouts/community/ergodox/haegin/rules.mk
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					TAP_DANCE_ENABLE=yes
 | 
				
			||||||
		Reference in New Issue
	
	Block a user