changelog shortlog graph tags branches files raw help

Mercurial > infra > home / changeset: moonlander concessions

changeset 95: f69061a590da
parent 94: 978ce75e54af
child 96: 9ef2c2cbfdfd
author: Richard Westhaver <ellis@rwest.io>
date: Sat, 07 Sep 2024 22:40:44 -0400
files: .config/kbd/moonlander/50-zsa.rules .config/kbd/moonlander/config.h .config/kbd/moonlander/keymap.c .config/kbd/moonlander/rules.mk .emacs.d/ellis.el .offlineimaprc .stash/scripts/qmk-flash-moonlander.sh .stash/scripts/rec.sh .stash/scripts/sc.sh .stumpwm.d/init.lisp .xinitrc
description: moonlander concessions
     1.1--- a/.config/kbd/moonlander/50-zsa.rules	Fri Aug 30 17:07:30 2024 -0400
     1.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3@@ -1,2 +0,0 @@
     1.4-# Keymapp / Wally Flashing rules for the Moonlander and Planck EZ
     1.5-SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666", SYMLINK+="stm32_dfu"
     1.6\ No newline at end of file
     2.1--- a/.config/kbd/moonlander/config.h	Fri Aug 30 17:07:30 2024 -0400
     2.2+++ b/.config/kbd/moonlander/config.h	Sat Sep 07 22:40:44 2024 -0400
     2.3@@ -2,12 +2,23 @@
     2.4   Set any config.h overrides for your specific keymap here.
     2.5   See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
     2.6 */
     2.7-#pragma once
     2.8 #define ORYX_CONFIGURATOR
     2.9+#define IGNORE_MOD_TAP_INTERRUPT
    2.10+#undef TAPPING_TERM
    2.11+#define TAPPING_TERM 174
    2.12+
    2.13+#undef RGB_DISABLE_TIMEOUT
    2.14+#define RGB_DISABLE_TIMEOUT 600000
    2.15+
    2.16 #define USB_SUSPEND_WAKEUP_DELAY 0
    2.17-#define FIRMWARE_VERSION u8"xbJpL/AaEdK"
    2.18+#undef MOUSEKEY_INTERVAL
    2.19+#define MOUSEKEY_INTERVAL 12
    2.20+
    2.21+#define AUTO_SHIFT_TIMEOUT 174
    2.22+#define CAPS_LOCK_STATUS
    2.23+#define FIRMWARE_VERSION u8"PDwV9/9yMR3"
    2.24 #define RAW_USAGE_PAGE 0xFF60
    2.25 #define RAW_USAGE_ID 0x61
    2.26 #define LAYER_STATE_8BIT
    2.27+
    2.28 #define RGB_MATRIX_STARTUP_SPD 60
    2.29-
     3.1--- a/.config/kbd/moonlander/keymap.c	Fri Aug 30 17:07:30 2024 -0400
     3.2+++ b/.config/kbd/moonlander/keymap.c	Sat Sep 07 22:40:44 2024 -0400
     3.3@@ -46,21 +46,24 @@
     3.4 #define SE_SECT_MAC ALGR(KC_6)
     3.5 #define MOON_LED_LEVEL LED_LEVEL
     3.6 
     3.7-enum layers {
     3.8-  MAIN,
     3.9+enum custom_keycodes {
    3.10+  RGB_SLD = ML_SAFE_RANGE,
    3.11 };
    3.12 
    3.13-enum custom_keycodes {
    3.14-  VRSN = SAFE_RANGE,
    3.15-  HSV_0_245_245,
    3.16-  HSV_74_255_206,
    3.17-  HSV_152_255_255,
    3.18+enum tap_dance_codes {
    3.19+  DANCE_0,
    3.20+  DANCE_1,
    3.21+  DANCE_2,
    3.22+  DANCE_3,
    3.23+  DANCE_4,
    3.24+  DANCE_5,
    3.25+  DANCE_6,
    3.26+  DANCE_7,
    3.27+  DANCE_8,
    3.28 };
    3.29 
    3.30-
    3.31-
    3.32 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    3.33-  [MAIN] = LAYOUT_moonlander(
    3.34+  [0] = LAYOUT_moonlander(
    3.35     // 1			  
    3.36     KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL,
    3.37     KC_GRAVE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
    3.38@@ -74,25 +77,471 @@
    3.39     KC_LSFT, KC_Z ,KC_X, KC_C, KC_V, KC_B,  
    3.40     KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_BSPC,
    3.41     // 5
    3.42-    KC_UP, KC_DOWN, KC_LBRC, KC_LPRN, KC_SPC, LCTL,
    3.43-    LALT, KC_SPC, KC_RPRN, KC_RBRC, KC_LEFT, KC_RIGHT,
    3.44+    KC_UP, KC_DOWN, KC_LBRC, KC_LPRN, KC_SPC, KC_LCTL,
    3.45+    KC_LALT, KC_SPC, KC_RPRN, KC_RBRC, KC_LEFT, KC_RIGHT,
    3.46     // 6
    3.47     A(KC_X), C(KC_C), KC_LGUI,
    3.48     ALT_T(KC_PASTE), RGB_MODE_FORWARD, QK_LOCK
    3.49   ),
    3.50+  [1] = LAYOUT_moonlander(
    3.51+    KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,                                 KC_PSCREEN,     KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, 
    3.52+    KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,                                 KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, 
    3.53+    KC_ESCAPE,      KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,                                                                 KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, 
    3.54+    KC_LSHIFT,      KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,                                 KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_RSHIFT,      
    3.55+    TT(2),          TD(DANCE_6),    KC_9,           KC_0,           KC_ENTER,       MO(4),                                                                                                          LT(4,KC_ENTER), KC_LEFT,        KC_DOWN,        KC_UP,          KC_RIGHT,       TT(3),          
    3.56+    KC_LALT,        KC_SPACE,       KC_LCTRL,                       KC_DELETE,      KC_SPACE,       KC_BSPACE
    3.57+  ),
    3.58+  [2] = LAYOUT_moonlander(
    3.59+    KC_NUMLOCK,     KC_F1,          KC_F2,          KC_F3,          KC_F4,          KC_F5,          KC_F6,                                          KC_TRANSPARENT, KC_NUMLOCK,     KC_KP_SLASH,    KC_KP_ASTERISK, KC_NO,          KC_SCROLLLOCK,  KC_PAUSE,       
    3.60+    KC_KP_DOT,      KC_KP_ASTERISK, KC_KP_PLUS,     KC_KP_7,        KC_KP_8,        KC_KP_9,        KC_F7,                                          KC_TRANSPARENT, KC_KP_7,        KC_KP_8,        KC_KP_9,        KC_KP_MINUS,    KC_PGUP,        KC_PGDOWN,      
    3.61+    KC_TRANSPARENT, KC_KP_SLASH,    KC_KP_MINUS,    KC_KP_4,        KC_KP_5,        KC_KP_6,        KC_F8,                                                                          KC_TRANSPARENT, KC_KP_4,        KC_KP_5,        KC_KP_6,        KC_KP_PLUS,     KC_HOME,        KC_END,         
    3.62+    TD(DANCE_7),    KC_F11,         KC_F12,         KC_KP_1,        KC_KP_2,        KC_KP_3,                                        KC_KP_1,        KC_KP_2,        KC_KP_3,        KC_KP_ENTER,    KC_TRANSPARENT, TD(DANCE_8),    
    3.63+    KC_TRANSPARENT, KC_INSERT,      KC_F9,          KC_F10,         KC_KP_0,        KC_KP_ENTER,                                                                                                    CAPS_WORD,      KC_KP_0,        KC_KP_DOT,      KC_EQUAL,       KC_TRANSPARENT, TO(0),          
    3.64+    MT(MOD_LALT, KC_PGUP),KC_SPACE,       MT(MOD_LCTL, KC_PGDOWN),                KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
    3.65+  ),
    3.66+  [3] = LAYOUT_moonlander(
    3.67+    KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_ACCEL0,   KC_MS_ACCEL1,   KC_MS_ACCEL2,   KC_TRANSPARENT, KC_TRANSPARENT,                                 KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_MUTE,  KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, RESET,          
    3.68+    KC_TRANSPARENT, KC_MS_BTN5,     KC_MS_WH_LEFT,  KC_MS_UP,       KC_MS_WH_RIGHT, KC_MS_WH_UP,    KC_TRANSPARENT,                                 KC_MS_WH_LEFT,  KC_TRANSPARENT, KC_AUDIO_VOL_DOWN,KC_AUDIO_VOL_UP,KC_TRANSPARENT, KC_MEDIA_PREV_TRACK,KC_MEDIA_NEXT_TRACK,
    3.69+    KC_TRANSPARENT, KC_MS_BTN4,     KC_MS_LEFT,     KC_MS_DOWN,     KC_MS_RIGHT,    KC_MS_WH_DOWN,  KC_TRANSPARENT,                                                                 KC_MS_WH_RIGHT, LCTL(LSFT(KC_LEFT)),LCTL(KC_LEFT),  LCTL(KC_RIGHT), LCTL(LSFT(KC_RIGHT)),KC_MEDIA_STOP,  KC_MEDIA_PLAY_PAUSE,
    3.70+    MT(MOD_LSFT, KC_LBRACKET),KC_TRANSPARENT, KC_MS_BTN1,     KC_MS_BTN3,     KC_MS_BTN2,     KC_TRANSPARENT,                                 KC_TRANSPARENT, LCTL(LSFT(KC_T)),LCTL(KC_PGUP),  LCTL(KC_PGDOWN),KC_TRANSPARENT, MT(MOD_RSFT, KC_RBRACKET),
    3.71+    TO(0),          TO(1),          LGUI(LCTL(KC_LEFT)),LGUI(LCTL(KC_RIGHT)),KC_TRANSPARENT, KC_ASTG,                                                                                                        KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, 
    3.72+    KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,                 MT(MOD_RCTL, KC_INSERT),KC_SPACE,       KC_TRANSPARENT
    3.73+  ),
    3.74+  [4] = LAYOUT_moonlander(
    3.75+    KC_INSERT,      KC_LCBR,        KC_RCBR,        KC_LBRACKET,    KC_RBRACKET,    KC_MINUS,       KC_EQUAL,                                       KC_GRAVE,       KC_1,           KC_2,           KC_3,           KC_4,           KC_5,           KC_6,           
    3.76+    KC_DELETE,      KC_Y,           KC_U,           KC_I,           KC_O,           KC_P,           KC_BSLASH,                                      KC_TAB,         KC_Q,           KC_W,           KC_E,           KC_R,           KC_T,           KC_7,           
    3.77+    KC_BSPACE,      KC_H,           KC_J,           KC_K,           KC_L,           KC_SCOLON,      KC_QUOTE,                                                                       KC_ESCAPE,      KC_A,           KC_S,           KC_D,           KC_F,           KC_G,           KC_8,           
    3.78+    KC_RSPC,        KC_N,           KC_M,           KC_COMMA,       KC_DOT,         KC_SLASH,                                       KC_Z,           KC_X,           KC_C,           KC_V,           KC_B,           KC_LSPO,        
    3.79+    KC_ENTER,       KC_LEFT,        KC_DOWN,        KC_UP,          KC_RIGHT,       TO(0),                                                                                                          TO(0),          KC_LGUI,        KC_9,           KC_0,           KC_HOME,        KC_END,         
    3.80+    OSM(MOD_LALT),  KC_SPACE,       OSM(MOD_LCTL),                  OSM(MOD_LCTL),  KC_SPACE,       OSM(MOD_LALT)
    3.81+                          ),
    3.82   // [MACRO]
    3.83   // [LISP]
    3.84   // [CTL]
    3.85   // [CMD]
    3.86 };
    3.87 
    3.88+extern rgb_config_t rgb_matrix_config;
    3.89+
    3.90+void keyboard_post_init_user(void) {
    3.91+  rgb_matrix_enable();
    3.92+}
    3.93+
    3.94+
    3.95+const uint8_t PROGMEM ledmap[][DRIVER_LED_TOTAL][3] = {
    3.96+    [0] = { {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {152,255,255}, {7,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {152,255,255}, {25,255,255}, {152,255,255}, {7,255,255} },
    3.97+
    3.98+    [1] = { {188,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {0,245,245}, {102,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {25,255,255}, {25,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {0,245,245}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {0,245,245}, {102,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {25,255,255} },
    3.99+
   3.100+    [2] = { {41,255,255}, {102,255,255}, {0,0,0}, {188,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {25,255,255}, {188,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {188,255,255}, {188,255,255}, {0,0,255}, {151,255,255}, {0,0,255}, {151,255,255}, {188,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {0,0,0}, {151,255,255}, {41,255,255}, {188,255,255}, {25,255,255}, {25,255,255}, {188,255,255}, {151,255,255}, {188,255,255}, {25,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {102,255,255}, {102,255,255}, {102,255,255}, {41,255,255}, {102,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {102,255,255}, {102,255,255}, {0,0,255}, {151,255,255}, {0,0,255}, {151,255,255}, {41,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {41,255,255} },
   3.101+
   3.102+    [3] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {151,255,255}, {0,0,0}, {25,255,255}, {25,255,255}, {0,0,0}, {25,255,255}, {0,245,245}, {188,255,255}, {74,255,255}, {25,255,255}, {188,255,255}, {0,245,245}, {74,255,255}, {74,255,255}, {25,255,255}, {188,255,255}, {0,245,245}, {188,255,255}, {74,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {41,255,255}, {41,255,255}, {0,245,245}, {0,245,245}, {0,0,0}, {152,255,255}, {0,0,0}, {0,245,245}, {255,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {151,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {41,255,255}, {74,255,255}, {25,255,255}, {0,0,0}, {41,255,255}, {41,255,255}, {74,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {151,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {151,255,255}, {0,0,0} },
   3.103+
   3.104+    [4] = { {188,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {25,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {25,255,255}, {25,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {25,255,255}, {151,255,255}, {25,255,255}, {25,255,255} },
   3.105+
   3.106+};
   3.107+
   3.108+void set_layer_color(int layer) {
   3.109+  for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
   3.110+    HSV hsv = {
   3.111+      .h = pgm_read_byte(&ledmap[layer][i][0]),
   3.112+      .s = pgm_read_byte(&ledmap[layer][i][1]),
   3.113+      .v = pgm_read_byte(&ledmap[layer][i][2]),
   3.114+    };
   3.115+    if (!hsv.h && !hsv.s && !hsv.v) {
   3.116+        rgb_matrix_set_color( i, 0, 0, 0 );
   3.117+    } else {
   3.118+        RGB rgb = hsv_to_rgb( hsv );
   3.119+        float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
   3.120+        rgb_matrix_set_color( i, f * rgb.r, f * rgb.g, f * rgb.b );
   3.121+    }
   3.122+  }
   3.123+}
   3.124+
   3.125+void rgb_matrix_indicators_user(void) {
   3.126+  if (rawhid_state.rgb_control) {
   3.127+      return;
   3.128+  }
   3.129+  if (keyboard_config.disable_layer_led) { return; }
   3.130+  switch (biton32(layer_state)) {
   3.131+    case 0:
   3.132+      set_layer_color(0);
   3.133+      break;
   3.134+    case 1:
   3.135+      set_layer_color(1);
   3.136+      break;
   3.137+    case 2:
   3.138+      set_layer_color(2);
   3.139+      break;
   3.140+    case 3:
   3.141+      set_layer_color(3);
   3.142+      break;
   3.143+    case 4:
   3.144+      set_layer_color(4);
   3.145+      break;
   3.146+   default:
   3.147+    if (rgb_matrix_get_flags() == LED_FLAG_NONE)
   3.148+      rgb_matrix_set_color_all(0, 0, 0);
   3.149+    break;
   3.150+  }
   3.151+}
   3.152+
   3.153 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
   3.154-    if (record->event.pressed) {
   3.155-        switch (keycode) {
   3.156-        case VRSN:
   3.157-            SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
   3.158+  switch (keycode) {
   3.159+
   3.160+    case RGB_SLD:
   3.161+        if (rawhid_state.rgb_control) {
   3.162             return false;
   3.163         }
   3.164+        if (record->event.pressed) {
   3.165+            rgblight_mode(1);
   3.166+        }
   3.167+        return false;
   3.168+  }
   3.169+  return true;
   3.170+}
   3.171+
   3.172+
   3.173+typedef struct {
   3.174+    bool is_press_action;
   3.175+    uint8_t step;
   3.176+} tap;
   3.177+
   3.178+enum {
   3.179+    SINGLE_TAP = 1,
   3.180+    SINGLE_HOLD,
   3.181+    DOUBLE_TAP,
   3.182+    DOUBLE_HOLD,
   3.183+    DOUBLE_SINGLE_TAP,
   3.184+    MORE_TAPS
   3.185+};
   3.186+
   3.187+static tap dance_state[9];
   3.188+
   3.189+uint8_t dance_step(qk_tap_dance_state_t *state);
   3.190+
   3.191+uint8_t dance_step(qk_tap_dance_state_t *state) {
   3.192+    if (state->count == 1) {
   3.193+        if (state->interrupted || !state->pressed) return SINGLE_TAP;
   3.194+        else return SINGLE_HOLD;
   3.195+    } else if (state->count == 2) {
   3.196+        if (state->interrupted) return DOUBLE_SINGLE_TAP;
   3.197+        else if (state->pressed) return DOUBLE_HOLD;
   3.198+        else return DOUBLE_TAP;
   3.199     }
   3.200-    return true;
   3.201+    return MORE_TAPS;
   3.202+}
   3.203+
   3.204+
   3.205+void on_dance_0(qk_tap_dance_state_t *state, void *user_data);
   3.206+void dance_0_finished(qk_tap_dance_state_t *state, void *user_data);
   3.207+void dance_0_reset(qk_tap_dance_state_t *state, void *user_data);
   3.208+
   3.209+void on_dance_0(qk_tap_dance_state_t *state, void *user_data) {
   3.210+    if(state->count == 3) {
   3.211+        tap_code16(LCTL(KC_GRAVE));
   3.212+        tap_code16(LCTL(KC_GRAVE));
   3.213+        tap_code16(LCTL(KC_GRAVE));
   3.214+    }
   3.215+    if(state->count > 3) {
   3.216+        tap_code16(LCTL(KC_GRAVE));
   3.217+    }
   3.218+}
   3.219+
   3.220+void dance_0_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.221+    dance_state[0].step = dance_step(state);
   3.222+    switch (dance_state[0].step) {
   3.223+        case SINGLE_TAP: register_code16(LCTL(KC_GRAVE)); break;
   3.224+        case SINGLE_HOLD: register_code16(LCTL(KC_V)); break;
   3.225+        case DOUBLE_TAP: register_code16(LCTL(KC_GRAVE)); register_code16(LCTL(KC_GRAVE)); break;
   3.226+        case DOUBLE_SINGLE_TAP: tap_code16(LCTL(KC_GRAVE)); register_code16(LCTL(KC_GRAVE));
   3.227+    }
   3.228+}
   3.229+
   3.230+void dance_0_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.231+    wait_ms(10);
   3.232+    switch (dance_state[0].step) {
   3.233+        case SINGLE_TAP: unregister_code16(LCTL(KC_GRAVE)); break;
   3.234+        case SINGLE_HOLD: unregister_code16(LCTL(KC_V)); break;
   3.235+        case DOUBLE_TAP: unregister_code16(LCTL(KC_GRAVE)); break;
   3.236+        case DOUBLE_SINGLE_TAP: unregister_code16(LCTL(KC_GRAVE)); break;
   3.237+    }
   3.238+    dance_state[0].step = 0;
   3.239+}
   3.240+void on_dance_1(qk_tap_dance_state_t *state, void *user_data);
   3.241+void dance_1_finished(qk_tap_dance_state_t *state, void *user_data);
   3.242+void dance_1_reset(qk_tap_dance_state_t *state, void *user_data);
   3.243+
   3.244+void on_dance_1(qk_tap_dance_state_t *state, void *user_data) {
   3.245+    if(state->count == 3) {
   3.246+        tap_code16(KC_9);
   3.247+        tap_code16(KC_9);
   3.248+        tap_code16(KC_9);
   3.249+    }
   3.250+    if(state->count > 3) {
   3.251+        tap_code16(KC_9);
   3.252+    }
   3.253+}
   3.254+
   3.255+void dance_1_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.256+    dance_state[1].step = dance_step(state);
   3.257+    switch (dance_state[1].step) {
   3.258+        case SINGLE_TAP: register_code16(KC_9); break;
   3.259+        case SINGLE_HOLD: register_code16(LCTL(KC_X)); break;
   3.260+        case DOUBLE_TAP: register_code16(KC_9); register_code16(KC_9); break;
   3.261+        case DOUBLE_SINGLE_TAP: tap_code16(KC_9); register_code16(KC_9);
   3.262+    }
   3.263+}
   3.264+
   3.265+void dance_1_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.266+    wait_ms(10);
   3.267+    switch (dance_state[1].step) {
   3.268+        case SINGLE_TAP: unregister_code16(KC_9); break;
   3.269+        case SINGLE_HOLD: unregister_code16(LCTL(KC_X)); break;
   3.270+        case DOUBLE_TAP: unregister_code16(KC_9); break;
   3.271+        case DOUBLE_SINGLE_TAP: unregister_code16(KC_9); break;
   3.272+    }
   3.273+    dance_state[1].step = 0;
   3.274+}
   3.275+void on_dance_2(qk_tap_dance_state_t *state, void *user_data);
   3.276+void dance_2_finished(qk_tap_dance_state_t *state, void *user_data);
   3.277+void dance_2_reset(qk_tap_dance_state_t *state, void *user_data);
   3.278+
   3.279+void on_dance_2(qk_tap_dance_state_t *state, void *user_data) {
   3.280+    if(state->count == 3) {
   3.281+        tap_code16(KC_0);
   3.282+        tap_code16(KC_0);
   3.283+        tap_code16(KC_0);
   3.284+    }
   3.285+    if(state->count > 3) {
   3.286+        tap_code16(KC_0);
   3.287+    }
   3.288+}
   3.289+
   3.290+void dance_2_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.291+    dance_state[2].step = dance_step(state);
   3.292+    switch (dance_state[2].step) {
   3.293+        case SINGLE_TAP: register_code16(KC_0); break;
   3.294+        case SINGLE_HOLD: register_code16(LCTL(KC_C)); break;
   3.295+        case DOUBLE_TAP: register_code16(KC_0); register_code16(KC_0); break;
   3.296+        case DOUBLE_SINGLE_TAP: tap_code16(KC_0); register_code16(KC_0);
   3.297+    }
   3.298+}
   3.299+
   3.300+void dance_2_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.301+    wait_ms(10);
   3.302+    switch (dance_state[2].step) {
   3.303+        case SINGLE_TAP: unregister_code16(KC_0); break;
   3.304+        case SINGLE_HOLD: unregister_code16(LCTL(KC_C)); break;
   3.305+        case DOUBLE_TAP: unregister_code16(KC_0); break;
   3.306+        case DOUBLE_SINGLE_TAP: unregister_code16(KC_0); break;
   3.307+    }
   3.308+    dance_state[2].step = 0;
   3.309+}
   3.310+void on_dance_3(qk_tap_dance_state_t *state, void *user_data);
   3.311+void dance_3_finished(qk_tap_dance_state_t *state, void *user_data);
   3.312+void dance_3_reset(qk_tap_dance_state_t *state, void *user_data);
   3.313+
   3.314+void on_dance_3(qk_tap_dance_state_t *state, void *user_data) {
   3.315+    if(state->count == 3) {
   3.316+        tap_code16(LALT(KC_SPACE));
   3.317+        tap_code16(LALT(KC_SPACE));
   3.318+        tap_code16(LALT(KC_SPACE));
   3.319+    }
   3.320+    if(state->count > 3) {
   3.321+        tap_code16(LALT(KC_SPACE));
   3.322+    }
   3.323+}
   3.324+
   3.325+void dance_3_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.326+    dance_state[3].step = dance_step(state);
   3.327+    switch (dance_state[3].step) {
   3.328+        case SINGLE_TAP: register_code16(LALT(KC_SPACE)); break;
   3.329+        case SINGLE_HOLD: register_code16(KC_LGUI); break;
   3.330+        case DOUBLE_TAP: register_code16(LALT(KC_SPACE)); register_code16(LALT(KC_SPACE)); break;
   3.331+        case DOUBLE_SINGLE_TAP: tap_code16(LALT(KC_SPACE)); register_code16(LALT(KC_SPACE));
   3.332+    }
   3.333+}
   3.334+
   3.335+void dance_3_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.336+    wait_ms(10);
   3.337+    switch (dance_state[3].step) {
   3.338+        case SINGLE_TAP: unregister_code16(LALT(KC_SPACE)); break;
   3.339+        case SINGLE_HOLD: unregister_code16(KC_LGUI); break;
   3.340+        case DOUBLE_TAP: unregister_code16(LALT(KC_SPACE)); break;
   3.341+        case DOUBLE_SINGLE_TAP: unregister_code16(LALT(KC_SPACE)); break;
   3.342+    }
   3.343+    dance_state[3].step = 0;
   3.344+}
   3.345+void on_dance_4(qk_tap_dance_state_t *state, void *user_data);
   3.346+void dance_4_finished(qk_tap_dance_state_t *state, void *user_data);
   3.347+void dance_4_reset(qk_tap_dance_state_t *state, void *user_data);
   3.348+
   3.349+void on_dance_4(qk_tap_dance_state_t *state, void *user_data) {
   3.350+    if(state->count == 3) {
   3.351+        tap_code16(LGUI(KC_2));
   3.352+        tap_code16(LGUI(KC_2));
   3.353+        tap_code16(LGUI(KC_2));
   3.354+    }
   3.355+    if(state->count > 3) {
   3.356+        tap_code16(LGUI(KC_2));
   3.357+    }
   3.358 }
   3.359+
   3.360+void dance_4_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.361+    dance_state[4].step = dance_step(state);
   3.362+    switch (dance_state[4].step) {
   3.363+        case SINGLE_TAP: register_code16(LGUI(KC_2)); break;
   3.364+        case SINGLE_HOLD: layer_on(4); break;
   3.365+        case DOUBLE_TAP: register_code16(LGUI(KC_2)); register_code16(LGUI(KC_2)); break;
   3.366+        case DOUBLE_SINGLE_TAP: tap_code16(LGUI(KC_2)); register_code16(LGUI(KC_2));
   3.367+    }
   3.368+}
   3.369+
   3.370+void dance_4_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.371+    wait_ms(10);
   3.372+    switch (dance_state[4].step) {
   3.373+        case SINGLE_TAP: unregister_code16(LGUI(KC_2)); break;
   3.374+        case SINGLE_HOLD: layer_off(4); break;
   3.375+        case DOUBLE_TAP: unregister_code16(LGUI(KC_2)); break;
   3.376+        case DOUBLE_SINGLE_TAP: unregister_code16(LGUI(KC_2)); break;
   3.377+    }
   3.378+    dance_state[4].step = 0;
   3.379+}
   3.380+void on_dance_5(qk_tap_dance_state_t *state, void *user_data);
   3.381+void dance_5_finished(qk_tap_dance_state_t *state, void *user_data);
   3.382+void dance_5_reset(qk_tap_dance_state_t *state, void *user_data);
   3.383+
   3.384+void on_dance_5(qk_tap_dance_state_t *state, void *user_data) {
   3.385+    if(state->count == 3) {
   3.386+        tap_code16(KC_PSCREEN);
   3.387+        tap_code16(KC_PSCREEN);
   3.388+        tap_code16(KC_PSCREEN);
   3.389+    }
   3.390+    if(state->count > 3) {
   3.391+        tap_code16(KC_PSCREEN);
   3.392+    }
   3.393+}
   3.394+
   3.395+void dance_5_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.396+    dance_state[5].step = dance_step(state);
   3.397+    switch (dance_state[5].step) {
   3.398+        case SINGLE_TAP: register_code16(KC_PSCREEN); break;
   3.399+        case SINGLE_HOLD: register_code16(LGUI(LSFT(KC_S))); break;
   3.400+        case DOUBLE_TAP: register_code16(KC_PSCREEN); register_code16(KC_PSCREEN); break;
   3.401+        case DOUBLE_SINGLE_TAP: tap_code16(KC_PSCREEN); register_code16(KC_PSCREEN);
   3.402+    }
   3.403+}
   3.404+
   3.405+void dance_5_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.406+    wait_ms(10);
   3.407+    switch (dance_state[5].step) {
   3.408+        case SINGLE_TAP: unregister_code16(KC_PSCREEN); break;
   3.409+        case SINGLE_HOLD: unregister_code16(LGUI(LSFT(KC_S))); break;
   3.410+        case DOUBLE_TAP: unregister_code16(KC_PSCREEN); break;
   3.411+        case DOUBLE_SINGLE_TAP: unregister_code16(KC_PSCREEN); break;
   3.412+    }
   3.413+    dance_state[5].step = 0;
   3.414+}
   3.415+void dance_6_finished(qk_tap_dance_state_t *state, void *user_data);
   3.416+void dance_6_reset(qk_tap_dance_state_t *state, void *user_data);
   3.417+
   3.418+void dance_6_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.419+    dance_state[6].step = dance_step(state);
   3.420+    switch (dance_state[6].step) {
   3.421+        case SINGLE_TAP: layer_move(0); break;
   3.422+        case SINGLE_HOLD: layer_on(4); break;
   3.423+        case DOUBLE_TAP: layer_move(0); break;
   3.424+        case DOUBLE_SINGLE_TAP: layer_move(0); break;
   3.425+    }
   3.426+}
   3.427+
   3.428+void dance_6_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.429+    wait_ms(10);
   3.430+    switch (dance_state[6].step) {
   3.431+        case SINGLE_HOLD: layer_off(4); break;
   3.432+    }
   3.433+    dance_state[6].step = 0;
   3.434+}
   3.435+void on_dance_7(qk_tap_dance_state_t *state, void *user_data);
   3.436+void dance_7_finished(qk_tap_dance_state_t *state, void *user_data);
   3.437+void dance_7_reset(qk_tap_dance_state_t *state, void *user_data);
   3.438+
   3.439+void on_dance_7(qk_tap_dance_state_t *state, void *user_data) {
   3.440+    if(state->count == 3) {
   3.441+        tap_code16(KC_LCBR);
   3.442+        tap_code16(KC_LCBR);
   3.443+        tap_code16(KC_LCBR);
   3.444+    }
   3.445+    if(state->count > 3) {
   3.446+        tap_code16(KC_LCBR);
   3.447+    }
   3.448+}
   3.449+
   3.450+void dance_7_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.451+    dance_state[7].step = dance_step(state);
   3.452+    switch (dance_state[7].step) {
   3.453+        case SINGLE_TAP: register_code16(KC_LCBR); break;
   3.454+        case SINGLE_HOLD: register_code16(KC_LSHIFT); break;
   3.455+        case DOUBLE_TAP: register_code16(KC_LCBR); register_code16(KC_LCBR); break;
   3.456+        case DOUBLE_SINGLE_TAP: tap_code16(KC_LCBR); register_code16(KC_LCBR);
   3.457+    }
   3.458+}
   3.459+
   3.460+void dance_7_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.461+    wait_ms(10);
   3.462+    switch (dance_state[7].step) {
   3.463+        case SINGLE_TAP: unregister_code16(KC_LCBR); break;
   3.464+        case SINGLE_HOLD: unregister_code16(KC_LSHIFT); break;
   3.465+        case DOUBLE_TAP: unregister_code16(KC_LCBR); break;
   3.466+        case DOUBLE_SINGLE_TAP: unregister_code16(KC_LCBR); break;
   3.467+    }
   3.468+    dance_state[7].step = 0;
   3.469+}
   3.470+void on_dance_8(qk_tap_dance_state_t *state, void *user_data);
   3.471+void dance_8_finished(qk_tap_dance_state_t *state, void *user_data);
   3.472+void dance_8_reset(qk_tap_dance_state_t *state, void *user_data);
   3.473+
   3.474+void on_dance_8(qk_tap_dance_state_t *state, void *user_data) {
   3.475+    if(state->count == 3) {
   3.476+        tap_code16(KC_RCBR);
   3.477+        tap_code16(KC_RCBR);
   3.478+        tap_code16(KC_RCBR);
   3.479+    }
   3.480+    if(state->count > 3) {
   3.481+        tap_code16(KC_RCBR);
   3.482+    }
   3.483+}
   3.484+
   3.485+void dance_8_finished(qk_tap_dance_state_t *state, void *user_data) {
   3.486+    dance_state[8].step = dance_step(state);
   3.487+    switch (dance_state[8].step) {
   3.488+        case SINGLE_TAP: register_code16(KC_RCBR); break;
   3.489+        case SINGLE_HOLD: register_code16(KC_RSHIFT); break;
   3.490+        case DOUBLE_TAP: register_code16(KC_RCBR); register_code16(KC_RCBR); break;
   3.491+        case DOUBLE_SINGLE_TAP: tap_code16(KC_RCBR); register_code16(KC_RCBR);
   3.492+    }
   3.493+}
   3.494+
   3.495+void dance_8_reset(qk_tap_dance_state_t *state, void *user_data) {
   3.496+    wait_ms(10);
   3.497+    switch (dance_state[8].step) {
   3.498+        case SINGLE_TAP: unregister_code16(KC_RCBR); break;
   3.499+        case SINGLE_HOLD: unregister_code16(KC_RSHIFT); break;
   3.500+        case DOUBLE_TAP: unregister_code16(KC_RCBR); break;
   3.501+        case DOUBLE_SINGLE_TAP: unregister_code16(KC_RCBR); break;
   3.502+    }
   3.503+    dance_state[8].step = 0;
   3.504+}
   3.505+
   3.506+qk_tap_dance_action_t tap_dance_actions[] = {
   3.507+        [DANCE_0] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_0, dance_0_finished, dance_0_reset),
   3.508+        [DANCE_1] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_1, dance_1_finished, dance_1_reset),
   3.509+        [DANCE_2] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_2, dance_2_finished, dance_2_reset),
   3.510+        [DANCE_3] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_3, dance_3_finished, dance_3_reset),
   3.511+        [DANCE_4] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_4, dance_4_finished, dance_4_reset),
   3.512+        [DANCE_5] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_5, dance_5_finished, dance_5_reset),
   3.513+        [DANCE_6] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_6_finished, dance_6_reset),
   3.514+        [DANCE_7] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_7, dance_7_finished, dance_7_reset),
   3.515+        [DANCE_8] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_8, dance_8_finished, dance_8_reset),
   3.516+};
     4.1--- a/.config/kbd/moonlander/rules.mk	Fri Aug 30 17:07:30 2024 -0400
     4.2+++ b/.config/kbd/moonlander/rules.mk	Sat Sep 07 22:40:44 2024 -0400
     4.3@@ -2,8 +2,9 @@
     4.4 # See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file
     4.5 CONSOLE_ENABLE = no
     4.6 COMMAND_ENABLE = no
     4.7+AUTO_SHIFT_ENABLE = yes
     4.8 ORYX_ENABLE = yes
     4.9-RAW_ENABLE = yes
    4.10-SPACE_CADET_ENABLE = no
    4.11+RGB_MATRIX_CUSTOM_KB = yes
    4.12+TAP_DANCE_ENABLE = yes
    4.13 CAPS_WORD_ENABLE = yes
    4.14 SRC = matrix.c
     5.1--- a/.emacs.d/ellis.el	Fri Aug 30 17:07:30 2024 -0400
     5.2+++ b/.emacs.d/ellis.el	Sat Sep 07 22:40:44 2024 -0400
     5.3@@ -112,12 +112,12 @@
     5.4    notmuch-show-logo nil
     5.5    notmuch-search-oldest-first nil
     5.6    notmuch-hello-hide-tags '("kill")
     5.7-   notmuch-saved-searches '((:name "inbox" :query "tag:inbox" :key "i")
     5.8-                            (:name "unread" :query "tag:unread" :key "u")
     5.9+   notmuch-saved-searches '((:name "unread" :query "tag:unread" :key "u")
    5.10+                            (:name "inbox" :query "tag:inbox" :key "i")
    5.11                             (:name "new" :query "tag:new" :key "n")
    5.12+                            (:name "drafts" :query "tag:draft" :key "d")
    5.13                             (:name "sent" :query "tag:sent" :key "e")
    5.14-                            (:name "drafts" :query "tag:draft" :key "d")
    5.15-                            (:name "all mail" :query "*" :key "a")
    5.16+                            (:name "all" :query "*" :key "a")
    5.17                             (:name "todo" :query "tag:todo" :key "t")))
    5.18   :config
    5.19   ;;;###autoload
    5.20@@ -187,8 +187,6 @@
    5.21     ("http://arxiv.org/rss/econ" econ rnd)
    5.22     ;; John Wiegley
    5.23     ("http://newartisans.com/rss.xml" dev blog)
    5.24-    ;; comp
    5.25-    ;; ("https://lab.rwest.io/comp.atom?feed_token=pHu9qwLkjy4CWJHx9rrJ" comp vc)
    5.26     ("https://www.reddit.com/r/listentothis/.rss" music reddit)
    5.27     ("https://www.ftc.gov/feeds/press-release-consumer-protection.xml" gov ftc)
    5.28     ("https://api2.fcc.gov/edocs/public/api/v1/rss/" gov fcc)
    5.29@@ -269,10 +267,11 @@
    5.30   (setq
    5.31    org-timeline-insert-before-text "›"
    5.32    org-timeline-beginning-of-day-hour 8
    5.33+   org-timeline-default-duration 30
    5.34    org-timeline-keep-elapsed 2
    5.35-   org-timeline-start-hour 5
    5.36+   org-timeline-start-hour 8
    5.37    org-timeline-show-text-in-blocks t
    5.38-   org-timeline-prepend t))
    5.39+   org-timeline-prepend nil))
    5.40 
    5.41 ;;; IRC
    5.42 (setq erc-format-nick-function 'erc-format-@nick)
    5.43@@ -339,7 +338,7 @@
    5.44       (while (< (point) end)
    5.45         (cond
    5.46          ;; Ignore comments.
    5.47-         ((or (org-in-commented-line) (org-at-table-p))
    5.48+         ((or (org-at-comment-p) (org-at-table-p))
    5.49           nil)
    5.50          ;; Ignore hyperlinks. But if link has a description, count
    5.51          ;; the words within the description.
    5.52@@ -353,7 +352,7 @@
    5.53          ((looking-at org-any-link-re)
    5.54           (goto-char (match-end 0)))
    5.55          ;; Ignore source code blocks.
    5.56-         ((org-in-regexps-block-p "^#\\+BEGIN_SRC\\W" "^#\\+END_SRC\\W")
    5.57+         ((org-between-regexps-p "^#\\+BEGIN_SRC\\W" "^#\\+END_SRC\\W")
    5.58           nil)
    5.59          ;; Ignore inline source blocks, counting them as 1 word.
    5.60          ((save-excursion
    5.61@@ -393,8 +392,8 @@
    5.62              (t
    5.63               (cl-incf wc))))))
    5.64         (re-search-forward "\\w+\\W*")))
    5.65-    (message (format "%d words in %s." wc
    5.66-                     (if mark-active "region" "buffer")))))
    5.67+    (format "%d words in %s." wc
    5.68+            (if mark-active "region" "buffer"))))
    5.69 
    5.70 (defun org-check-misformatted-subtree ()
    5.71   "Check misformatted entries in the current buffer."
    5.72@@ -505,15 +504,15 @@
    5.73 
    5.74 (require 'mm-url) ; to include mm-url-decode-entities-string
    5.75 
    5.76-(defun org-insert-link-with-title ()
    5.77-  "Insert org link where default description is set to html title."
    5.78-  (interactive)
    5.79-  (let* ((url (read-string "URL: "))
    5.80-         (title (get-html-title-from-url url)))
    5.81-    (org-insert-link nil url title)))
    5.82+(cl-defun get-first-url (&optional (match (rx bol "http" (optional "s") "://")))
    5.83+  "Return URL in clipboard, or first URL in the `kill-ring' matching MATCH."
    5.84+  (cl-loop for item in (cons (current-kill 0) kill-ring)
    5.85+           when (and item (string-match-p match item))
    5.86+           return item))
    5.87 
    5.88 (defun get-html-title-from-url (url)
    5.89   "Return content in <title> tag."
    5.90+  (interactive (list (get-first-url)))
    5.91   (let (x1 x2 (download-buffer (url-retrieve-synchronously url)))
    5.92     (save-excursion
    5.93       (set-buffer download-buffer)
    5.94@@ -523,6 +522,17 @@
    5.95       (setq x2 (search-backward "<"))
    5.96       (mm-url-decode-entities-string (buffer-substring-no-properties x1 x2)))))
    5.97 
    5.98+(defun org-insert-link-with-title (url)
    5.99+  "Insert org link where default description is set to html title."
   5.100+  (interactive (list (get-first-url match)))
   5.101+  (let ((title (get-html-title-from-url url)))
   5.102+    (org-insert-link nil url title)))
   5.103+
   5.104+(defun org-insert-so-link (url)
   5.105+  (interactive (list (get-first-url (rx bol "https://" (* anychar) "stackoverflow.com"))))
   5.106+  (let ((title (get-html-title-from-url url)))
   5.107+    (org-insert-link nil url title)))
   5.108+
   5.109 (defun org-remove-empty-propert-drawers ()
   5.110   "*Remove all empty property drawers in current file."
   5.111   (interactive)
   5.112@@ -585,6 +595,8 @@
   5.113 (defvar org-agenda-extensions '(".org")
   5.114   "List of extensions of agenda files")
   5.115 
   5.116+(setq org-agenda-default-appointment-duration 30)
   5.117+(setq org-agenda-span 5)
   5.118 (defun org-set-agenda-files ()
   5.119   (interactive)
   5.120   (setq org-agenda-files
   5.121@@ -597,6 +609,28 @@
   5.122 (with-eval-after-load 'org
   5.123   (org-set-agenda-files))
   5.124 
   5.125+;; org-agenda-auto-update
   5.126+(defvar org-agenda-update-interval 300)
   5.127+(defvar org-agenda-update-timer nil)
   5.128+(defvar org-agenda-update-idle t)
   5.129+
   5.130+(defun org-agenda-update ()
   5.131+  (org-agenda-redo-all t))
   5.132+
   5.133+(defun org-agenda-auto-update ()
   5.134+  (when org-agenda-update-timer
   5.135+    (setq org-agenda-update-timer
   5.136+          (cancel-timer org-agenda-update-timer)))
   5.137+  (setq org-agenda-update-timer
   5.138+        (if org-agenda-update-idle
   5.139+            (run-with-idle-timer org-agenda-update-interval t 'org-agenda-update)
   5.140+          ;; when we refresh the org-agenda buffer, also reset the timer
   5.141+          (add-hook 'org-agenda-finalize-hook 'org-agenda-auto-update)
   5.142+          (run-with-timer org-agenda-update-interval org-agenda-update-interval 'org-agenda-update))))
   5.143+
   5.144+(with-eval-after-load 'org-agenda
   5.145+  (org-agenda-auto-update))
   5.146+
   5.147 ;;; Skel Config
   5.148 (use-package skel
   5.149   :requires skel
   5.150@@ -754,7 +788,15 @@
   5.151   (skt-register-auto-insert ".*[.]lisp" #'skt-template-lisp-head)
   5.152   (skt-register-auto-insert ".*[.].rs" #'skt-template-rust-head)
   5.153   (auto-insert-mode t)
   5.154-  (keymap-set skel-minor-mode-map "C-<return>" 'company-tempo))
   5.155+  ;; (keymap-set skel-minor-mode-map "C-<return>" 'company-tempo)
   5.156+  )
   5.157+
   5.158+;;; ical2org
   5.159+;; go install github.com/rjhorniii/ical2org@latest
   5.160+(defun ical2org (file)
   5.161+  "Convert ics FILE to an org-mode heading."
   5.162+  (interactive "ffile: ")
   5.163+  (shell-command (format "ical2org %s -a %s" file org-inbox-file)))
   5.164 
   5.165 ;;; glossary
   5.166 ;; (with-eval-after-load 'org-glossary
     6.1--- a/.offlineimaprc	Fri Aug 30 17:07:30 2024 -0400
     6.2+++ b/.offlineimaprc	Sat Sep 07 22:40:44 2024 -0400
     6.3@@ -1,5 +1,6 @@
     6.4 [general]
     6.5-accounts = ellis, demon, postmaster
     6.6+accounts = ellis, demon
     6.7+# postmaster
     6.8 pythonfile = ~/.config/offlineimap/get_pass.py
     6.9 
    6.10 [Account ellis]
    6.11@@ -47,26 +48,26 @@
    6.12 folderfilter = lambda foldername: foldername in ['[Gmail]/All Mail']
    6.13 nametrans = lambda foldername: re.sub('^\[Gmail\]/All Mail$', 'all',foldername)
    6.14 
    6.15-[Account postmaster]
    6.16-synclabels = yes
    6.17-localrepository = postmaster
    6.18-remoterepository = postmaster-imap
    6.19-postsynchook = ~/.config/offlineimap/postsync.sh
    6.20+# [Account postmaster]
    6.21+# synclabels = yes
    6.22+# localrepository = postmaster
    6.23+# remoterepository = postmaster-imap
    6.24+# postsynchook = ~/.config/offlineimap/postsync.sh
    6.25 
    6.26-[Repository postmaster]
    6.27-type = Maildir
    6.28-localfolders = ~/mail/postmaster
    6.29+# [Repository postmaster]
    6.30+# type = Maildir
    6.31+# localfolders = ~/mail/postmaster
    6.32 
    6.33-[Repository postmaster-imap]
    6.34-type = IMAP
    6.35-remotepasseval = get_authinfo_password("mail.compiler.company", "postmaster", 993)
    6.36-remotehost = mail.compiler.company
    6.37-remoteuser = postmaster@compiler.company
    6.38-# Necessary to work around https://github.com/OfflineIMAP/offlineimap/issues/573 (versions 7.0.12, 7.2.1)
    6.39-# macos only
    6.40-#sslcacertfile = /opt/local/etc/openssl/cert.pem
    6.41-#ssl_version = tls1_2
    6.42-# linux only
    6.43-sslcacertfile = /etc/ssl/certs/ca-certificates.crt
    6.44-#folderfilter = lambda foldername: foldername in ['[Gmail]/All Mail']
    6.45-#nametrans = lambda foldername: re.sub('^\[Gmail\]/All Mail$', 'all',foldername)
    6.46+# [Repository postmaster-imap]
    6.47+# type = IMAP
    6.48+# remotepasseval = get_authinfo_password("mail.compiler.company", "postmaster", 993)
    6.49+# remotehost = mail.compiler.company
    6.50+# remoteuser = postmaster@compiler.company
    6.51+# # Necessary to work around https://github.com/OfflineIMAP/offlineimap/issues/573 (versions 7.0.12, 7.2.1)
    6.52+# # macos only
    6.53+# #sslcacertfile = /opt/local/etc/openssl/cert.pem
    6.54+# #ssl_version = tls1_2
    6.55+# # linux only
    6.56+# sslcacertfile = /etc/ssl/certs/ca-certificates.crt
    6.57+# #folderfilter = lambda foldername: foldername in ['[Gmail]/All Mail']
    6.58+# #nametrans = lambda foldername: re.sub('^\[Gmail\]/All Mail$', 'all',foldername)
     7.1--- a/.stash/scripts/qmk-flash-moonlander.sh	Fri Aug 30 17:07:30 2024 -0400
     7.2+++ b/.stash/scripts/qmk-flash-moonlander.sh	Sat Sep 07 22:40:44 2024 -0400
     7.3@@ -1,3 +1,4 @@
     7.4 #!/bin/sh
     7.5-cp -rf ~/.config/kbd/moonlander/* ~/qmk_firmware/keyboards/moonlander/keymaps/ellis/
     7.6+cd ~/.stash/qmk_firmware
     7.7+cp -rf ~/.config/kbd/moonlander/* keyboards/moonlander/keymaps/ellis/
     7.8 qmk flash -kb moonlander -km ellis
     8.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2+++ b/.stash/scripts/rec.sh	Sat Sep 07 22:40:44 2024 -0400
     8.3@@ -0,0 +1,4 @@
     8.4+#!/usr/bin/env bash
     8.5+slop=$(slop -f "%x %y %w %h %g %i") || exit 1
     8.6+read -r X Y W H G ID <<< $slop
     8.7+ffmpeg -f x11grab -s "$W"x"$H" -i :0.0+$X,$Y ${1:-"${HOME}/$(date +%s).gif"}
     9.1--- a/.stash/scripts/sc.sh	Fri Aug 30 17:07:30 2024 -0400
     9.2+++ b/.stash/scripts/sc.sh	Sat Sep 07 22:40:44 2024 -0400
     9.3@@ -1,4 +1,4 @@
     9.4-#!/usr/local/env bash
     9.5+#!/usr/bin/env bash
     9.6 import png:- >> ${1:-"$(date +%s).png"}
     9.7 # take screenshot of current window on sway
     9.8 # swaymsg -t get_tree | jq -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | grim -g - ${1:-"$(date +%s).png"}
    10.1--- a/.stumpwm.d/init.lisp	Fri Aug 30 17:07:30 2024 -0400
    10.2+++ b/.stumpwm.d/init.lisp	Sat Sep 07 22:40:44 2024 -0400
    10.3@@ -5,7 +5,12 @@
    10.4 (stumpwm:set-prefix-key (kbd "s-SPC"))
    10.5 
    10.6 (ignore-errors
    10.7- (ql:quickload '(:std :core :prelude :user)))
    10.8+ (ql:quickload '(:std :core :prelude :user :swank)))
    10.9+
   10.10+(defcommand quickload (system)
   10.11+  ((:rest "System: "))
   10.12+  "Load a system with QL:QUICKLOAD"
   10.13+  (ql:quickload system))
   10.14 
   10.15 (defcommand load-std () ()
   10.16   (ql:quickload :std))
   10.17@@ -39,7 +44,7 @@
   10.18 (unless swm-golden-ratio:*golden-ratio-on*
   10.19   (swm-golden-ratio:toggle-golden-ratio))
   10.20 
   10.21-;; (load-module "stumptray")
   10.22+(load-module "screenshot")
   10.23 (load-module "cpu")
   10.24 (load-module "hostname")
   10.25 (load-module "mpd")
   10.26@@ -51,8 +56,6 @@
   10.27 
   10.28 (ql:quickload :xml-emitter)
   10.29 (ql:quickload :dbus)
   10.30-(load-module "notify")
   10.31-(notify:notify-server-toggle)
   10.32 
   10.33 (set-fg-color "#ffffff")
   10.34 (set-bg-color "#000000")
    11.1--- a/.xinitrc	Fri Aug 30 17:07:30 2024 -0400
    11.2+++ b/.xinitrc	Sat Sep 07 22:40:44 2024 -0400
    11.3@@ -2,6 +2,7 @@
    11.4 xrdb .Xresources &
    11.5 xset r rate 200 40 &
    11.6 xset s off -dpms &
    11.7+systemctl --user import-environment DISPLAY
    11.8 case $session in
    11.9   sway              ) exec sway;;
   11.10   stumpwm           ) /usr/local/bin/stumpwm;;