2024-09-28 15:47:29 +02:00
// Copyright 2024 binaryDiv (@binaryDiv)
// SPDX-License-Identifier: GPL-2.0-or-later
# include QMK_KEYBOARD_H
// Define layer names for better readability
enum layer_names {
// Base layer
L_BASE ,
2024-10-31 10:25:03 +01:00
// "Code" layer -- TODO name? MOVE?
2024-09-28 15:47:29 +02:00
L_CODE ,
2024-10-31 10:25:03 +01:00
// Symbols layer
L_SYMBOLS ,
2024-09-28 15:47:29 +02:00
// Fn / keyboard control layer: Used for keyboard configuration
L_FN ,
} ;
// Custom keycodes
enum custom_keycodes {
// Macro to select the current word (Ctrl-Left, Shift-Ctrl-Right)
MACRO_SELECT_WORD = SAFE_RANGE ,
2024-10-31 10:25:03 +01:00
// Macro to clear the current line (End, Shift-Home, Delete)
MACRO_CLEAR_LINE ,
// Macro to type 4 spaces when pressing Code+Tab (4 backspaces if holding Shift)
MACRO_FOUR_SPACES ,
2024-09-28 15:47:29 +02:00
} ;
const uint16_t PROGMEM keymaps [ ] [ MATRIX_ROWS ] [ MATRIX_COLS ] = {
// Base layer
[ L_BASE ] = LAYOUT_ortho_6x13 (
2024-10-31 10:25:03 +01:00
KC_ESC , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , LALT ( LSFT ( KC_R ) ) , LSFT ( KC_F10 ) , _______ , _______ , _______ , KC_KB_MUTE ,
KC_GRAVE , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINUS , KC_EQUAL ,
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LEFT_BRACKET , KC_RIGHT_BRACKET ,
KC_BACKSPACE , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SEMICOLON , KC_QUOTE , KC_BACKSLASH ,
KC_LEFT_SHIFT , KC_ESC , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMMA , KC_DOT , KC_SLASH , KC_RIGHT_SHIFT ,
KC_LEFT_CTRL , KC_LEFT_ALT , KC_LEFT_GUI , MO ( L_CODE ) , MO ( L_SYMBOLS ) , KC_SPACE , _______ , KC_BACKSPACE , KC_ENTER , OSM ( MOD_RALT ) , KC_DELETE , MO ( L_FN ) , KC_RIGHT_CTRL
) , // TODO maybe don't use one-shot for Super and Code? I make too much mistakes with that... for Code, some extra combination or "hold for a second" would be good to lock it
2024-09-28 15:47:29 +02:00
// "Code" key layer
[ L_CODE ] = LAYOUT_ortho_6x13 (
2024-10-31 10:25:03 +01:00
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , KC_PRINT_SCREEN , _______ , _______ , _______ , _______ ,
_______ , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 ,
MACRO_FOUR_SPACES , KC_HOME , KC_UP , KC_END , KC_PGUP , _______ , KC_MS_WH_UP , KC_MS_BTN1 , KC_MS_UP , KC_MS_BTN2 , _______ , KC_F12 , _______ ,
KC_CAPS_LOCK , KC_LEFT , KC_DOWN , KC_RIGHT , KC_PGDN , _______ , KC_MS_WH_DOWN , KC_MS_LEFT , KC_MS_DOWN , KC_MS_RIGHT , _______ , _______ , _______ ,
_______ , LCTL ( KC_LEFT ) , MACRO_SELECT_WORD , LCTL ( KC_RIGHT ) , LALT ( LSFT ( KC_TAB ) ) , LALT ( KC_TAB ) , MACRO_CLEAR_LINE , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , KC_ENTER , _______ , KC_DELETE , _______ , _______ , _______ , _______ , _______
) ,
// Symbols layer
[ L_SYMBOLS ] = LAYOUT_ortho_6x13 (
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
//GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL,
_______ , KC_QUESTION , KC_AT , KC_EXCLAIM , KC_CIRCUMFLEX , _______ , KC_PIPE , KC_UNDERSCORE , KC_EQUAL , KC_LEFT_BRACKET , KC_RIGHT_BRACKET , _______ , _______ ,
_______ , KC_AMPERSAND , KC_ASTERISK , KC_DOLLAR , KC_HASH , KC_DOUBLE_QUOTE , KC_SLASH , KC_LEFT_PAREN , KC_RIGHT_PAREN , KC_LEFT_CURLY_BRACE , KC_RIGHT_CURLY_BRACE , _______ , _______ ,
_______ , _______ , KC_PERCENT , _______ , KC_COLON , KC_QUOTE , KC_BACKSLASH , KC_MINUS , KC_PLUS , KC_LEFT_ANGLE_BRACKET , KC_RIGHT_ANGLE_BRACKET , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , KC_DOT , _______ , _______ , _______ , _______ , _______ , _______ , _______
2024-09-28 15:47:29 +02:00
) ,
// "Fn" key layer
[ L_FN ] = LAYOUT_ortho_6x13 (
2024-10-31 10:25:03 +01:00
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
2024-09-28 15:47:29 +02:00
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , OS_TOGG , _______ , RGB_MOD , RGB_TOG ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , RGB_SPD , RGB_SPI ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , QK_CLEAR_EEPROM , QK_REBOOT ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , QK_BOOTLOADER
)
} ;
// Define mapping for rotary encoder
# if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map [ ] [ NUM_ENCODERS ] [ NUM_DIRECTIONS ] = {
[ L_BASE ] = {
ENCODER_CCW_CW ( KC_KB_VOLUME_DOWN , KC_KB_VOLUME_UP )
} ,
[ L_CODE ] = {
ENCODER_CCW_CW ( KC_MS_WH_UP , KC_MS_WH_DOWN )
} ,
[ L_FN ] = {
ENCODER_CCW_CW ( RGB_VAD , RGB_VAI )
}
} ;
# endif
bool process_record_user ( uint16_t keycode , keyrecord_t * record ) {
switch ( keycode ) {
case MACRO_SELECT_WORD :
// Run macro when keycode is pressed
if ( record - > event . pressed ) {
// Select word
SEND_STRING ( SS_LCTL ( SS_TAP ( X_LEFT ) ) SS_LSFT ( SS_LCTL ( SS_TAP ( X_RIGHT ) ) ) ) ;
}
break ;
2024-10-31 10:25:03 +01:00
case MACRO_CLEAR_LINE :
if ( record - > event . pressed ) {
SEND_STRING ( SS_TAP ( X_END ) SS_LSFT ( SS_TAP ( X_HOME ) ) SS_TAP ( X_BACKSPACE ) ) ;
}
break ;
case MACRO_FOUR_SPACES :
if ( record - > event . pressed ) {
if ( get_mods ( ) & MOD_MASK_SHIFT ) {
// Type 4 backspaces
SEND_STRING ( " \b \b \b \b " ) ;
} else {
// Type 4 spaces
SEND_STRING ( " " ) ;
}
}
break ;
2024-09-28 15:47:29 +02:00
}
return true ;
}
2024-10-31 10:25:03 +01:00
// TODO: Idea for leader keys: vim keybindings everywhere :D
// Examples:
// - leader dd -> Home, Shift+Down, Ctrl+X
// - leader D -> Shift+End, Ctrl+X
// - same for yy/Y, etc.
// another symbol layer for easier access, e.g.:
// JK = () OP = [] L: = {} UI = -=