commit 56651d275205eb9d12dd3098431724a933449ddc
parent 684d31094c664cd9c95b6d91ae2bd5433946610d
Author: Vineet Kumar <git@vineetk.net>
Date: Thu, 26 Mar 2026 11:24:52 -0400
keyboards/ferris: add current keymap
Diffstat:
3 files changed, 127 insertions(+), 0 deletions(-)
diff --git a/keyboards/ferris/keymaps/mine/config.h b/keyboards/ferris/keymaps/mine/config.h
@@ -0,0 +1,17 @@
+#pragma once
+
+/* Handedness */
+#define MASTER_LEFT
+
+/* Home Row Mods Configuration */
+#define TAPPING_TERM 200
+#define QUICK_TAP_TERM 0 // auto repeat isn't good for HRM
+
+/* don't enable yet until I get more comfortable with HRM */
+//#define PERMISSIVE_HOLD
+
+/* Native QMK Chordal Hold Logic (previously the acchordion extension) */
+#define CHORDAL_HOLD // enables the opposite hands rule
+
+/* caps word is a better caps lock */
+#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD
diff --git a/keyboards/ferris/keymaps/mine/keymap.c b/keyboards/ferris/keymaps/mine/keymap.c
@@ -0,0 +1,109 @@
+#include QMK_KEYBOARD_H
+
+// Layer Definitions
+enum layers {
+ _BASE,
+ _NUM,
+ _SYM,
+ _NAV,
+ _ADJ
+};
+
+// --- Workman Home Row Mods (GACS) ---
+// Left Hand
+#define MT_A_GUI LGUI_T(KC_A)
+#define MT_S_ALT LALT_T(KC_S)
+#define MT_H_CTL LCTL_T(KC_H)
+#define MT_T_SFT LSFT_T(KC_T)
+
+// Right Hand
+#define MT_N_SFT RSFT_T(KC_N)
+#define MT_E_CTL RCTL_T(KC_E)
+#define MT_O_ALT RALT_T(KC_O)
+#define MT_I_GUI RGUI_T(KC_I)
+
+// --- Keymap ---
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT(
+ KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN,
+ MT_A_GUI, MT_S_ALT, MT_H_CTL, MT_T_SFT, KC_G, KC_Y, MT_N_SFT, MT_E_CTL, MT_O_ALT, MT_I_GUI,
+ KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH,
+ KC_BSPC, LT(_NAV, KC_SPC), LT(_SYM, KC_ENT), LT(_NUM, KC_TAB)
+ ),
+
+ [_NUM] = LAYOUT(
+ XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ KC_DOT, KC_4, KC_5, KC_6, KC_0, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI,
+ KC_COMM, KC_1, KC_2, KC_3, KC_ASTR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ ),
+
+ /* symbol layer is for those not accessed by shift+num */
+ [_SYM] = LAYOUT(
+ XXXXXXX, KC_BSLS, KC_QUOT, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ KC_GRV, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI,
+ KC_TILD, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ ),
+
+ [_NAV] = LAYOUT(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_END, XXXXXXX, XXXXXXX,
+ KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC,
+ _______, _______, _______, _______
+ ),
+
+ [_ADJ] = LAYOUT(
+ KC_F12, KC_F7, KC_F8, KC_F9, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ KC_F11, KC_F4, KC_F5, KC_F6, KC_DEL, XXXXXXX, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI,
+ KC_F10, KC_F1, KC_F2, KC_F3, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______
+ )
+};
+
+// --- Layer Logic ---
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _NAV, _NUM, _ADJ);
+}
+
+// --- Chordal Hold Implementation (Replaces Achordion) ---
+
+/** * Define Handedness:
+ * Sweep usually has 5 columns per side.
+ * Cols 0-4 are Left, 5-9 are Right.
+ */
+char chordal_hold_handedness(keypos_t key) {
+ return key.col < 5 ? 'L' : 'R';
+}
+
+/**
+ * Define Logic:
+ * Return true = Allow Hold (Logic is satisfied, or exception granted)
+ * Return false = Force Tap (Same hand detected, deny hold)
+ */
+bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record,
+ uint16_t other_keycode, keyrecord_t* other_record) {
+
+ // 1. Emacs M-DEL Exception
+ // Left Alt (Ring) + Backspace (Outer Thumb)
+ // Both are on Left hand, but we return TRUE to allow the hold.
+ if (tap_hold_keycode == MT_S_ALT && other_keycode == KC_BSPC) {
+ return true;
+ }
+
+ // 2. Emacs C-w Exception (Kill Region)
+ // Left Ctrl (Middle) + W (Index Top)
+ if (tap_hold_keycode == MT_H_CTL && other_keycode == KC_W) {
+ return true;
+ }
+
+ // 3. Emacs C-g Exception (Quit/Cancel)
+ // Left Ctrl (Middle) + G (Index Inner)
+ if (tap_hold_keycode == MT_H_CTL && other_keycode == KC_G) {
+ return true;
+ }
+
+ // Default: Defer to the standard Opposite Hands rule
+ // (If same hand -> Tap. If opposite hand -> Hold).
+ return get_chordal_hold_default(tap_hold_record, other_record);
+}
diff --git a/keyboards/ferris/keymaps/mine/rules.mk b/keyboards/ferris/keymaps/mine/rules.mk
@@ -0,0 +1 @@
+CONVERT_TO = rp2040_ce