diff --git a/keyboards/durgod/k320/keymaps/moults31/config.h b/keyboards/durgod/k320/keymaps/moults31/config.h
new file mode 100644
index 00000000000..01f47b8c109
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/moults31/config.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/durgod/k320/keymaps/moults31/keymap.c b/keyboards/durgod/k320/keymaps/moults31/keymap.c
new file mode 100644
index 00000000000..c44fe15855d
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/moults31/keymap.c
@@ -0,0 +1,84 @@
+/* Copyright 2021 moults31
+ * Adapted from kuenhlee and Don Kjer and Coirault
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+#include "moults31.h"
+
+// Layer shorthand
+enum _layer {
+ _BASE,
+ _FUNC,
+ _LAYER3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _BASE: Base Layer (Default Layer)
+ * ,-----------------------------------------------------------. ,--------------.
+ * |Esc |f1| f2| f3| f4| | f5| f6| f7| f8| | f9|f10|f11|f12| |Prnt|ScLk|Paus|
+ * |-----------------------------------------------------------| |--------------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| - | = |Backsp | | Ins|Home|PgUp|
+ * |-----------------------------------------------------------| |--------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | Del| End|PgDn|
+ * |------------------------------------------------------ Ret | `--------------'
+ * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #| |
+ * |-----------------------------------------------------------| ,----.
+ * |Shift| \| Z| X| C| V| B| N| M| ,| .| /|Shift | | Up |
+ * |-----------------------------------------------------------| ,-------------.
+ * |Ctrl|Gui |Alt | Space |Alt | Fn |App |Ctrl| |Lft| Dn |Rig |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_BASE] = LAYOUT_tkl_ansi( /* Base Layer */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FUNC),KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ /* Keymap _FUNC: Function Layer
+ * ,-----------------------------------------------------------. ,--------------.
+ * | |Play|Stop|Prev|Next| |Mute|Vol+|Vol-| | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |------------------------------------------------------- | `--------------'
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,----.
+ * | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-------------.
+ * | | | | | |Func | | | | | | |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_FUNC] = LAYOUT_tkl_ansi( /* Function Layer */
+ _______, KC_MPLY, KC_MSTP, KC_MRWD, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, M_VSC_VIEWSIZEINC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, M_VSC_EDGRPPRV, M_VSC_VIEWSIZEDEC, M_VSC_EDGRPNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, M_VSC_MVEDTRPRVGRP, _______, M_VSC_MVEDTRNXTGRP
+ ),
+ [_LAYER3] = LAYOUT_tkl_ansi( /* Function Layer */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
+
diff --git a/keyboards/durgod/k320/keymaps/moults31/readme.md b/keyboards/durgod/k320/keymaps/moults31/readme.md
new file mode 100644
index 00000000000..e3a3f150f3a
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/moults31/readme.md
@@ -0,0 +1,10 @@
+# The default keymap for Durgod Taurus K320.
+
+Layer 0 : Standard Keys TKL layout
+
+Layer 1 : Media control and VScode navigation
+- Reusing Durgod's Original Media Control for Fn + F1 ~ Fn + F7
+
+## Supported PCBs
+
+This keymap intended for use on Durgod K320 ANSI
diff --git a/keyboards/durgod/k320/keymaps/moults31/rules.mk b/keyboards/durgod/k320/keymaps/moults31/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/moults31/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/dztech/dz60rgb/keymaps/moults31/keymap.c b/keyboards/dztech/dz60rgb/keymaps/moults31/keymap.c
new file mode 100644
index 00000000000..98802270a6f
--- /dev/null
+++ b/keyboards/dztech/dz60rgb/keymaps/moults31/keymap.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ CTL_T(KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_SLSH, KC_RSHFT, KC_UP, LT(2, KC_DEL),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_COMM, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ _______, _______, KC_UP, _______, _______, _______, KC_CALC, _______, KC_INS, _______, KC_PSCR, KC_HOME, KC_END, RESET,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, EEP_RST,
+ _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
+ ),
+ [2] = LAYOUT(
+ RGB_MOD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ _______, _______, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, EEP_RST, RESET,
+ _______, RGB_SAD, RGB_HUD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, _______,
+ _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_VAD, RGB_SPD
+ ),
+};
diff --git a/keyboards/dztech/dz60rgb/keymaps/moults31/readme.md b/keyboards/dztech/dz60rgb/keymaps/moults31/readme.md
new file mode 100644
index 00000000000..19bccf13e6c
--- /dev/null
+++ b/keyboards/dztech/dz60rgb/keymaps/moults31/readme.md
@@ -0,0 +1,11 @@
+# moults31 DZ60RBG V2 Layout
+
+Similar to the default dz60rgb v2 layout with some minor changes for quality of life in programming.
+
+Brief summary of improvements over default:
+* More intuitive media keys in layer 1
+* More intuitive RGB control keys in layer 2
+* Standard left-alt
+* Anne Pro 2 style home/end placement in layer 1
+* Grave key moved to right-alt position for easier ctrl-grave vscode shortcut
+* Removed layer 4 (mac layout?)
diff --git a/keyboards/dztech/dz60rgb/keymaps/moults31/rules.mk b/keyboards/dztech/dz60rgb/keymaps/moults31/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/dztech/dz60rgb/keymaps/moults31/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/gmmk/pro/keymaps/moults31/keymap.c b/keyboards/gmmk/pro/keymaps/moults31/keymap.c
new file mode 100644
index 00000000000..90ac428c742
--- /dev/null
+++ b/keyboards/gmmk/pro/keymaps/moults31/keymap.c
@@ -0,0 +1,92 @@
+/* Copyright 2021 Glorious, LLC
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+*/
+
+#include QMK_KEYBOARD_H
+
+#include "moults31.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Prt Rotary(Mute)
+// ~ 1 2 3 4 5 6 7 8 9 0 - (=) BackSpc Del
+// Tab Q W E R T Y U I O P [ ] \ PgUp
+// Caps A S D F G H J K L ; " Enter PgDn
+// Sh_L Z X C V B N M , . ? Sh_R Up End
+// Ct_L Win_L Alt_L SPACE Alt_R FN Ct_R Left Down Right
+
+
+ // The FN key by default maps to a momentary toggle to layer 1 to provide access to the RESET key (to put the board into bootloader mode). Without
+ // this mapping, you have to open the case to hit the button on the bottom of the PCB (near the USB cable attachment) while plugging in the USB
+ // cable to get the board into bootloader mode - definitely not fun when you're working on your QMK builds. Remove this and put it back to KC_RGUI
+ // if that's your preference.
+ //
+ // To put the keyboard in bootloader mode, use FN+backslash. If you accidentally put it into bootloader, you can just unplug the USB cable and
+ // it'll be back to normal when you plug it back in.
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_MPLY,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_DEL,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_CALC, _______, KC_INS, _______, KC_PSCR, _______, _______, RESET, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT(
+ M_GDB_STOP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_VSC_DBGCNSLFOCUS,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, M_VSC_VIEWSIZEINC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, M_VSC_EDGRPPRV, M_VSC_VIEWSIZEDEC, M_VSC_EDGRPNXT, _______, _______, _______, _______, _______, _______, _______, _______, M_GDB_PLAY, M_GDB_PAUSE,
+ _______, M_VSC_FILEPRV, M_VSC_FILENXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_GDB_STEPOUT, _______,
+ _______, _______, _______, _______, _______, _______, _______, M_GDB_RESTART, M_GDB_STEPIN, M_GDB_STEPOVER
+ ),
+
+};
+
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ const layer_state_t curr_layer = get_highest_layer(layer_state);
+ if(curr_layer == 2) {
+ if (clockwise) {
+ moults31_tap_custom_code(M_VSC_FILENXT);
+ } else {
+ moults31_tap_custom_code(M_VSC_FILEPRV);
+ }
+ }
+ else if(curr_layer == 1) {
+ if (clockwise) {
+ moults31_tap_custom_code(M_VSC_VIEWSIZEINC);
+ } else {
+ moults31_tap_custom_code(M_VSC_VIEWSIZEDEC);
+ }
+ }
+ else {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ return false;
+}
diff --git a/keyboards/knobgoblin/keymaps/moults31/keymap.c b/keyboards/knobgoblin/keymaps/moults31/keymap.c
new file mode 100644
index 00000000000..16830bc98da
--- /dev/null
+++ b/keyboards/knobgoblin/keymaps/moults31/keymap.c
@@ -0,0 +1,170 @@
+/* Copyright 2020 MrT1ddl3s
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+
+#include "moults31.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_ortho(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_MPLY, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_MUTE, MO(10), KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_ortho(
+ KC_ESC, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_HOME, KC_TRNS, KC_PGUP, KC_TRNS,
+ KC_END , KC_UP, KC_PGDN, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_SPC,
+ KC_TRNS, MO(10), KC_BSPC, KC_DEL, KC_TRNS
+ ),
+
+ [2] = LAYOUT_ortho(
+ KC_2, KC_TRNS, KC_TRNS, KC_TRNS,
+ M_VSC_MVEDTRPRVGRP, M_VSC_MVEDTRNXTGRP, KC_TRNS, KC_TRNS,
+ M_VSC_EDGRPPRV, M_VSC_EDGRPNXT, KC_TRNS, KC_TRNS,
+ KC_TRNS, M_VSC_SIDEBARFOCUS, M_VSC_SIDEBARCLOSE, M_VSC_TERMFOCUS, KC_TRNS,
+ M_VSC_FILECLOSE, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [3] = LAYOUT_ortho(
+ KC_3, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, M_GDB_PAUSE,
+ M_GDB_RESTART, M_GDB_STOP, KC_TRNS, M_GDB_PAUSE,
+ M_VSC_DBGCNSLFOCUS, M_GDB_STEPOVER, M_GDB_STEPIN, M_GDB_STEPOUT, M_GDB_PLAY,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, M_GDB_PLAY
+ ),
+
+ [4] = LAYOUT_ortho(
+ KC_4, KC_TRNS, KC_TRNS, KC_TRNS,
+ M_OBS_VOICE_UNMUTE, M_OBS_MOOSIC_MUTE, M_OBS_MOOSIC_UNMUTE, KC_TRNS,
+ M_OBS_DSKT_MUTE, M_OBS_DSKT_UNMUTE, M_OBS_VOICE_MUTE, KC_TRNS,
+ KC_TRNS, M_OBS_BRB, M_OBS_GAME, M_OBS_JSTCHT, KC_TRNS,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [5] = LAYOUT_ortho(
+ KC_5, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [6] = LAYOUT_ortho(
+ KC_6, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [7] = LAYOUT_ortho(
+ KC_7, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [8] = LAYOUT_ortho(
+ KC_8, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [9] = LAYOUT_ortho(
+ KC_9, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, MO(10), KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [10] = LAYOUT_ortho(
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS,
+ TO(7), TO(8), TO(9), KC_TRNS,
+ TO(4), TO(5), TO(6), KC_TRNS,
+ KC_TRNS, TO(1), TO(2), TO(3), KC_TRNS,
+ KC_TRNS, KC_TRNS, TO(0), KC_TRNS, KC_TRNS
+ ),
+
+
+
+};
+
+/* byte map for the goblin logo, knob goblin text, and level text */
+static void render_goblin_logo(void) {
+ static const char PROGMEM my_logo[] = {
+ 0x00, 0xe0, 0x40, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0xc0, 0x60, 0x20, 0x10, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x10, 0x20, 0x60, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x40, 0xe0, 0x00,
+ 0x00, 0x03, 0x06, 0x3c, 0x49, 0x91, 0x21, 0x00, 0x40, 0x80, 0x80, 0x80, 0x80, 0x00, 0x60, 0x00,
+ 0x00, 0x60, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 0x21, 0x91, 0x49, 0x3c, 0x06, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x60, 0x40, 0xc0, 0x06, 0x0e, 0x0f, 0x67, 0x50, 0xc0,
+ 0xc0, 0x50, 0x67, 0x0f, 0x0e, 0x06, 0xc0, 0x40, 0x60, 0x1f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x7b, 0xc7, 0x8e, 0x1e, 0x3e, 0x3e,
+ 0x3e, 0x3e, 0x1e, 0x8e, 0xc7, 0x7b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x04,
+ 0x04, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x83, 0x03, 0x03, 0x03, 0x83, 0x03, 0x83, 0x03, 0x03, 0x03, 0x83,
+ 0x03, 0x03, 0x83, 0x83, 0x83, 0x03, 0x03, 0x83, 0x83, 0x83, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x06, 0x09, 0x10, 0x00, 0x1f, 0x03, 0x06, 0x0c, 0x1f,
+ 0x00, 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x00, 0x1f, 0x12, 0x12, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x78, 0xfc, 0x84, 0xa4, 0xa4, 0x68, 0x00, 0x78, 0x84, 0x84, 0x84, 0x78, 0x00, 0xfc, 0x94,
+ 0x94, 0x68, 0x00, 0xfc, 0x80, 0x80, 0x80, 0x00, 0xfc, 0x00, 0xfc, 0x18, 0x30, 0x60, 0xfc, 0x00,
+ 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x50, 0x50, 0x50, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0, 0x50, 0x50, 0x50, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x00, 0x03, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02,
+ 0x01, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x00, 0x03, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00
+ };
+ oled_write_raw_P(my_logo, sizeof(my_logo));
+}
+
+void oled_task_user(void) {
+
+ render_goblin_logo();
+
+ oled_set_cursor(0,11);
+
+ switch (get_highest_layer(layer_state)) {
+ case 0:
+ oled_write_P(PSTR(" NUM\n"), false);
+ break;
+ case 1:
+ oled_write_P(PSTR(" NAV\n"), false);
+ break;
+ case 2:
+ oled_write_P(PSTR(" CODE\n"), false);
+ break;
+ case 3:
+ oled_write_P(PSTR(" GDB\n"), false);
+ break;
+ case 4:
+ oled_write_P(PSTR(" OBS\n"), false);
+ break;
+ default:
+ oled_write_P(PSTR(" NONE\n"), false);
+ break;
+ }
+}
diff --git a/keyboards/knobgoblin/keymaps/moults31/readme.md b/keyboards/knobgoblin/keymaps/moults31/readme.md
new file mode 100644
index 00000000000..f137c78c3ab
--- /dev/null
+++ b/keyboards/knobgoblin/keymaps/moults31/readme.md
@@ -0,0 +1,3 @@
+# Ortho Knob Goblin Layout
+
+Via functionality for the Knob Goblin. Ortho layout.
\ No newline at end of file
diff --git a/keyboards/knobgoblin/keymaps/moults31/rules.mk b/keyboards/knobgoblin/keymaps/moults31/rules.mk
new file mode 100644
index 00000000000..533af592e52
--- /dev/null
+++ b/keyboards/knobgoblin/keymaps/moults31/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = YES
+LTO_ENABLE = YES
+BOOTLOADER = atmel-dfu
diff --git a/keyboards/knobgoblin/keymaps/via/keymap.c b/keyboards/knobgoblin/keymaps/via/keymap.c
index afe3226bb0b..4631dccd0ab 100644
--- a/keyboards/knobgoblin/keymaps/via/keymap.c
+++ b/keyboards/knobgoblin/keymaps/via/keymap.c
@@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_MPLY, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_MUTE, MO(1), KC_P0, KC_PDOT, KC_PENT
),
-
+
[1] = LAYOUT_ortho(
KC_ESC, KC_TRNS, KC_TRNS, KC_TRNS,
KC_HOME, KC_TRNS, KC_PGUP, KC_TRNS,
@@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_SPC,
KC_TRNS, KC_TRNS, KC_BSPC, KC_DEL, KC_TRNS
),
-
+
[2] = LAYOUT_ortho(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
-
+
[3] = LAYOUT_ortho(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -50,4 +50,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
-};
\ No newline at end of file
+};
diff --git a/users/moults31/gdb.c b/users/moults31/gdb.c
new file mode 100644
index 00000000000..42f5513eca1
--- /dev/null
+++ b/users/moults31/gdb.c
@@ -0,0 +1,59 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include "gdb.h"
+
+bool process_record_gdb(uint16_t keycode, keyrecord_t *record) {
+ bool rv = true;
+ switch (keycode) {
+ case M_GDB_PLAY:
+ if (record->event.pressed) {
+ SEND_STRING(SS_TAP(X_F5));
+ }
+ break;
+ case M_GDB_PAUSE:
+ if (record->event.pressed) {
+ SEND_STRING(SS_TAP(X_F6));
+ }
+ break;
+ case M_GDB_STEPOVER:
+ if (record->event.pressed) {
+ SEND_STRING(SS_TAP(X_F10));
+ }
+ break;
+ case M_GDB_STEPIN:
+ if (record->event.pressed) {
+ SEND_STRING(SS_TAP(X_F11));
+ }
+ break;
+ case M_GDB_STEPOUT:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_F11)));
+ }
+ break;
+ case M_GDB_RESTART:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LSFT(SS_TAP(X_F5))));
+ }
+ break;
+ case M_GDB_STOP:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_F5)));
+ }
+ break;
+ }
+
+ return rv;
+}
diff --git a/users/moults31/gdb.h b/users/moults31/gdb.h
new file mode 100644
index 00000000000..385825692e0
--- /dev/null
+++ b/users/moults31/gdb.h
@@ -0,0 +1,21 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include QMK_KEYBOARD_H
+#include "moults31.h"
+
+bool process_record_gdb(uint16_t keycode, keyrecord_t *record);
diff --git a/users/moults31/moults31.c b/users/moults31/moults31.c
new file mode 100644
index 00000000000..0dbaed0bb07
--- /dev/null
+++ b/users/moults31/moults31.c
@@ -0,0 +1,114 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include "moults31.h"
+
+bool moults31_tap_custom_code(uint16_t keycode) {
+ keyrecord_t record = {
+ .event = {
+ .pressed = 1,
+ },
+ };
+ return process_record_user(keycode, &record);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ bool rv = true;
+ switch (keycode) {
+ case M_MST_CODEBLOCK:
+ if (record->event.pressed) {
+ SEND_STRING("```");
+ }
+ break;
+
+ case M_VSC_TERMFOCUS:
+ case M_VSC_SIDEBARFOCUS:
+ case M_VSC_SIDEBARCLOSE:
+ case M_VSC_FILECLOSE:
+ case M_VSC_FILENXT:
+ case M_VSC_FILEPRV:
+ case M_VSC_DBGCNSLFOCUS:
+ case M_VSC_MVEDTRNXTGRP:
+ case M_VSC_MVEDTRPRVGRP:
+ case M_VSC_EDGRPNXT:
+ case M_VSC_EDGRPPRV:
+ case M_VSC_VIEWSIZEINC:
+ case M_VSC_VIEWSIZEDEC:
+ rv = process_record_vsc(keycode, record);
+ break;
+
+ case M_GDB_PLAY:
+ case M_GDB_PAUSE:
+ case M_GDB_STEPOVER:
+ case M_GDB_STEPIN:
+ case M_GDB_STEPOUT:
+ case M_GDB_RESTART:
+ case M_GDB_STOP:
+ rv = process_record_gdb(keycode, record);
+ break;
+
+ case M_OBS_BRB:
+ case M_OBS_GAME:
+ case M_OBS_JSTCHT:
+ case M_OBS_DSKT_MUTE:
+ case M_OBS_DSKT_UNMUTE:
+ case M_OBS_VOICE_MUTE:
+ case M_OBS_VOICE_UNMUTE:
+ case M_OBS_MOOSIC_MUTE:
+ case M_OBS_MOOSIC_UNMUTE:
+ rv = process_record_obs(keycode, record);
+ break;
+ }
+ return rv;
+};
+
+#ifdef ENCODER_ENABLE
+__attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) {
+ const layer_state_t curr_layer = get_highest_layer(layer_state);
+ if (index == 1) { /* Bottom encoder */
+ if(curr_layer == 2 || curr_layer == 3) {
+ if (clockwise) {
+ moults31_tap_custom_code(M_VSC_FILENXT);
+ } else {
+ moults31_tap_custom_code(M_VSC_FILEPRV);
+ }
+ }
+ else {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ }
+ if (index == 0) { /* Top encoder */
+ if(curr_layer == 2 || curr_layer == 3) {
+ if (clockwise) {
+ moults31_tap_custom_code(M_VSC_VIEWSIZEINC);
+ } else {
+ moults31_tap_custom_code(M_VSC_VIEWSIZEDEC);
+ }
+ }
+ else {
+ if (clockwise) {
+ tap_code(KC_MNXT);
+ } else {
+ tap_code(KC_MPRV);
+ }
+ }
+ }
+ return false;
+}
+#endif
diff --git a/users/moults31/moults31.h b/users/moults31/moults31.h
new file mode 100644
index 00000000000..60e317b7840
--- /dev/null
+++ b/users/moults31/moults31.h
@@ -0,0 +1,61 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+#include "vscode.h"
+#include "obs.h"
+#include "gdb.h"
+
+bool moults31_tap_custom_code(uint16_t keycode);
+
+enum custom_keycodes {
+ // VSCode keycodes
+ M_VSC_TERMFOCUS = SAFE_RANGE,
+ M_VSC_SIDEBARFOCUS,
+ M_VSC_SIDEBARCLOSE,
+ M_VSC_DBGCNSLFOCUS,
+ M_VSC_EDGRPNXT,
+ M_VSC_EDGRPPRV,
+ M_VSC_MVEDTRNXTGRP,
+ M_VSC_MVEDTRPRVGRP,
+ M_VSC_VIEWSIZEINC,
+ M_VSC_VIEWSIZEDEC,
+ M_VSC_FILECLOSE,
+ M_VSC_FILENXT,
+ M_VSC_FILEPRV,
+ // GDB keycodes (for vscode debugger)
+ M_GDB_PLAY,
+ M_GDB_PAUSE,
+ M_GDB_STEPOVER,
+ M_GDB_STEPIN,
+ M_GDB_STEPOUT,
+ M_GDB_RESTART,
+ M_GDB_STOP,
+ // MS Teams keycodes
+ M_MST_CODEBLOCK,
+ // OBS keycodes
+ M_OBS_BRB,
+ M_OBS_GAME,
+ M_OBS_JSTCHT,
+ M_OBS_DSKT_MUTE,
+ M_OBS_DSKT_UNMUTE,
+ M_OBS_VOICE_MUTE,
+ M_OBS_VOICE_UNMUTE,
+ M_OBS_MOOSIC_MUTE,
+ M_OBS_MOOSIC_UNMUTE,
+};
diff --git a/users/moults31/obs.c b/users/moults31/obs.c
new file mode 100644
index 00000000000..0ae5f3deb49
--- /dev/null
+++ b/users/moults31/obs.c
@@ -0,0 +1,80 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include "obs.h"
+
+bool process_record_obs(uint16_t keycode, keyrecord_t *record) {
+ // Apply all 4 mods for custom OBS macros
+ register_code(KC_LSHIFT);
+ register_code(KC_LCTL);
+ register_code(KC_LALT);
+ register_code(KC_LGUI);
+
+ switch (keycode) {
+ case M_OBS_BRB:
+ if (record->event.pressed) {
+ SEND_STRING("1");
+ }
+ break;
+ case M_OBS_GAME:
+ if (record->event.pressed) {
+ SEND_STRING("2");
+ }
+ break;
+ case M_OBS_JSTCHT:
+ if (record->event.pressed) {
+ SEND_STRING("3");
+ }
+ break;
+ case M_OBS_DSKT_MUTE:
+ if (record->event.pressed) {
+ SEND_STRING("4");
+ }
+ break;
+ case M_OBS_DSKT_UNMUTE:
+ if (record->event.pressed) {
+ SEND_STRING("5");
+ }
+ break;
+ case M_OBS_VOICE_MUTE:
+ if (record->event.pressed) {
+ SEND_STRING("6");
+ }
+ break;
+ case M_OBS_VOICE_UNMUTE:
+ if (record->event.pressed) {
+ SEND_STRING("7");
+ }
+ break;
+ case M_OBS_MOOSIC_MUTE:
+ if (record->event.pressed) {
+ SEND_STRING("8");
+ }
+ break;
+ case M_OBS_MOOSIC_UNMUTE:
+ if (record->event.pressed) {
+ SEND_STRING("9");
+ }
+ break;
+ }
+
+ // Unpress all 4 mods for custom OBS macros
+ unregister_code(KC_LSHIFT);
+ unregister_code(KC_LCTL);
+ unregister_code(KC_LALT);
+ unregister_code(KC_LGUI);
+
+ return true;
+}
diff --git a/users/moults31/obs.h b/users/moults31/obs.h
new file mode 100644
index 00000000000..2a2973f8029
--- /dev/null
+++ b/users/moults31/obs.h
@@ -0,0 +1,21 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include QMK_KEYBOARD_H
+#include "moults31.h"
+
+bool process_record_obs(uint16_t keycode, keyrecord_t *record);
diff --git a/users/moults31/readme.md b/users/moults31/readme.md
new file mode 100644
index 00000000000..3a5badbe5b7
--- /dev/null
+++ b/users/moults31/readme.md
@@ -0,0 +1,5 @@
+# moults31 Userspace
+
+## Features
+
+- Custom macros for VScode, OBS, GDB (Visual)
diff --git a/users/moults31/rules.mk b/users/moults31/rules.mk
new file mode 100644
index 00000000000..af7c11d9f8b
--- /dev/null
+++ b/users/moults31/rules.mk
@@ -0,0 +1,10 @@
+SRC += moults31.c
+
+# Custom macro sources
+SRC += vscode.c
+SRC += obs.c
+SRC += gdb.c
+
+ifneq ($(PLATFORM),CHIBIOS)
+ LTO_ENABLE = yes # Enable link time optimization
+endif
diff --git a/users/moults31/vscode.c b/users/moults31/vscode.c
new file mode 100644
index 00000000000..a2fcf062dca
--- /dev/null
+++ b/users/moults31/vscode.c
@@ -0,0 +1,90 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include "vscode.h"
+
+bool process_record_vsc(uint16_t keycode, keyrecord_t *record) {
+ bool rv = true;
+
+ switch (keycode) {
+ case M_VSC_TERMFOCUS:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL("`"));
+ }
+ break;
+ case M_VSC_SIDEBARFOCUS:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL("0"));
+ }
+ break;
+ case M_VSC_SIDEBARCLOSE:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL("b"));
+ }
+ break;
+ case M_VSC_FILECLOSE:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL("w"));
+ }
+ break;
+ case M_VSC_FILENXT:
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_K) SS_TAP(X_PGDOWN) SS_UP(X_LCTRL));
+ }
+ break;
+ case M_VSC_FILEPRV:
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_K) SS_TAP(X_PGUP) SS_UP(X_LCTRL));
+ }
+ break;
+ case M_VSC_DBGCNSLFOCUS:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_D))));
+ }
+ break;
+ case M_VSC_MVEDTRNXTGRP:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_RIGHT))));
+ }
+ break;
+ case M_VSC_MVEDTRPRVGRP:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_LEFT))));
+ }
+ break;
+ case M_VSC_EDGRPNXT:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_L))));
+ }
+ break;
+ case M_VSC_EDGRPPRV:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_K))));
+ }
+ break;
+ case M_VSC_VIEWSIZEINC:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_P))));
+ }
+ break;
+ case M_VSC_VIEWSIZEDEC:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_O))));
+ }
+ break;
+ }
+
+ return rv;
+}
diff --git a/users/moults31/vscode.h b/users/moults31/vscode.h
new file mode 100644
index 00000000000..7e88b6591a2
--- /dev/null
+++ b/users/moults31/vscode.h
@@ -0,0 +1,21 @@
+/* Copyright 2021 moults31
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include QMK_KEYBOARD_H
+#include "moults31.h"
+
+bool process_record_vsc(uint16_t keycode, keyrecord_t *record);