summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--keyboards/durgod/k320/keymaps/moults31/config.h20
-rw-r--r--keyboards/durgod/k320/keymaps/moults31/keymap.c84
-rw-r--r--keyboards/durgod/k320/keymaps/moults31/readme.md10
-rw-r--r--keyboards/durgod/k320/keymaps/moults31/rules.mk2
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/moults31/keymap.c42
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/moults31/readme.md11
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/moults31/rules.mk1
-rw-r--r--keyboards/gmmk/pro/keymaps/moults31/keymap.c92
-rw-r--r--keyboards/knobgoblin/keymaps/moults31/keymap.c170
-rw-r--r--keyboards/knobgoblin/keymaps/moults31/readme.md3
-rw-r--r--keyboards/knobgoblin/keymaps/moults31/rules.mk3
-rw-r--r--keyboards/knobgoblin/keymaps/via/keymap.c8
-rw-r--r--users/moults31/gdb.c59
-rw-r--r--users/moults31/gdb.h21
-rw-r--r--users/moults31/moults31.c114
-rw-r--r--users/moults31/moults31.h61
-rw-r--r--users/moults31/obs.c80
-rw-r--r--users/moults31/obs.h21
-rw-r--r--users/moults31/readme.md5
-rw-r--r--users/moults31/rules.mk10
-rw-r--r--users/moults31/vscode.c90
-rw-r--r--users/moults31/vscode.h21
22 files changed, 924 insertions, 4 deletions
diff --git a/keyboards/durgod/k320/keymaps/moults31/config.h b/keyboards/durgod/k320/keymaps/moults31/config.h
new file mode 100644
index 0000000000..01f47b8c10
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..c44fe15855
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..e3a3f150f3
--- /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 0000000000..36b7ba9cbc
--- /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 0000000000..98802270a6
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..19bccf13e6
--- /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 0000000000..1e5b99807c
--- /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 0000000000..90ac428c74
--- /dev/null
+++ b/keyboards/gmmk/pro/keymaps/moults31/keymap.c
@@ -0,0 +1,92 @@
+/* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..16830bc98d
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..f137c78c3a
--- /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 0000000000..533af592e5
--- /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 afe3226bb0..4631dccd0a 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 0000000000..42f5513eca
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..385825692e
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..0dbaed0bb0
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..60e317b784
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..0ae5f3deb4
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..2a2973f802
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..3a5badbe5b
--- /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 0000000000..af7c11d9f8
--- /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 0000000000..a2fcf062dc
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..7e88b6591a
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include QMK_KEYBOARD_H
+#include "moults31.h"
+
+bool process_record_vsc(uint16_t keycode, keyrecord_t *record);