Skip to content

Instantly share code, notes, and snippets.

@dougmarcey
Created January 22, 2019 20:58
Show Gist options
  • Save dougmarcey/78a355c3f1eac42a1af5c245df651efc to your computer and use it in GitHub Desktop.
Save dougmarcey/78a355c3f1eac42a1af5c245df651efc to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby
def fix_keymap(km_str)
km_str.gsub!(/LALT\(LCTL\(LGUI\(LSFT\((.*?)\)\)\)\)/,'HYPR(\1)')
km_str.gsub!(/LGUI\(LSFT\((.*?)\)\)/,'SGUI(\1)')
km_str.gsub!(/LALT\(LCTL\((.*?)\)\)/,'LCA(\1)')
km_str.gsub!(/LCTL\(LGUI\(LSFT\((.*?)\)\)\)/,'LCGS(\1)')
km_str.gsub!(/LCTL\(LSFT\((.*?)\)\)/,'LCS(\1)')
km_str.gsub!(/MT\(MOD_HYPR, (.*?)\)/,'HYPR_T(\1)')
km_str.gsub!(/MT\(MOD_MEH, (.*?)\)/,'MEH_T(\1)')
km_str.gsub!(/KC_TRANSPARENT/,'_______')
km_str.gsub!(/KC_NO/,'XXXXXXX')
km_str.gsub!(/KC_ENTER/,'KC_ENT')
km_str.gsub!(/KC_ESCAPE/,'KC_ESC')
km_str.gsub!(/KC_BSPACE/,'KC_BSPC')
km_str.gsub!(/KC_SPACE/,'KC_SPC')
km_str.gsub!(/KC_MINUS/,'KC_MINS')
km_str.gsub!(/KC_EQUAL/,'KC_EQL')
km_str.gsub!(/KC_LBRACKET/,'KC_LBRC')
km_str.gsub!(/KC_RBRACKET/,'KC_RBRC')
km_str.gsub!(/KC_BSLASH/,'KC_BSLS')
km_str.gsub!(/KC_NONUS_HASH/,'KC_NUHS')
km_str.gsub!(/KC_SCOLON/,'KC_SCLN')
km_str.gsub!(/KC_QUOTE/,'KC_QUOT')
km_str.gsub!(/KC_GRAVE/,'KC_GRV')
km_str.gsub!(/KC_COMMA/,'KC_COMM')
km_str.gsub!(/KC_SLASH/,'KC_SLSH')
km_str.gsub!(/KC_NONUS_BSLASH/,'KC_NUBS')
km_str.gsub!(/KC_CAPSLOCK/,'KC_CLCK')
km_str.gsub!(/KC_CAPSLOCK/,'KC_CAPS')
km_str.gsub!(/KC_SCROLLLOCK/,'KC_SLCK')
km_str.gsub!(/KC_NUMLOCK/,'KC_NLCK')
km_str.gsub!(/KC_LOCKING_CAPS/,'KC_LCAP')
km_str.gsub!(/KC_LOCKING_NUM/,'KC_LNUM')
km_str.gsub!(/KC_LOCKING_SCROLL/,'KC_LSCR')
km_str.gsub!(/KC_PSCREEN/,'KC_PSCR')
km_str.gsub!(/KC_PAUSE/,'KC_PAUS')
km_str.gsub!(/KC_PAUSE/,'KC_BRK')
km_str.gsub!(/KC_INSERT/,'KC_INS')
km_str.gsub!(/KC_DELETE/,'KC_DEL')
km_str.gsub!(/KC_PGDOWN/,'KC_PGDN')
km_str.gsub!(/KC_RIGHT/,'KC_RGHT')
km_str.gsub!(/KC_APPLICATION/,'KC_APP')
km_str.gsub!(/KC_EXECUTE/,'KC_EXEC')
km_str.gsub!(/KC_SELECT/,'KC_SLCT')
km_str.gsub!(/KC_AGAIN/,'KC_AGIN')
km_str.gsub!(/KC_PASTE/,'KC_PSTE')
km_str.gsub!(/KC_ALT_ERASE/,'KC_ERAS')
km_str.gsub!(/KC_CLEAR/,'KC_CLR')
km_str.gsub!(/KC_KP_SLASH/,'KC_PSLS')
km_str.gsub!(/KC_KP_ASTERISK/,'KC_PAST')
km_str.gsub!(/KC_KP_MINUS/,'KC_PMNS')
km_str.gsub!(/KC_KP_PLUS/,'KC_PPLS')
km_str.gsub!(/KC_KP_ENTER/,'KC_PENT')
km_str.gsub!(/KC_KP_1/,'KC_P1')
km_str.gsub!(/KC_KP_2/,'KC_P2')
km_str.gsub!(/KC_KP_3/,'KC_P3')
km_str.gsub!(/KC_KP_4/,'KC_P4')
km_str.gsub!(/KC_KP_5/,'KC_P5')
km_str.gsub!(/KC_KP_6/,'KC_P6')
km_str.gsub!(/KC_KP_7/,'KC_P7')
km_str.gsub!(/KC_KP_8/,'KC_P8')
km_str.gsub!(/KC_KP_9/,'KC_P9')
km_str.gsub!(/KC_KP_0/,'KC_P0')
km_str.gsub!(/KC_KP_DOT/,'KC_PDOT')
km_str.gsub!(/KC_KP_EQUAL/,'KC_PEQL')
km_str.gsub!(/KC_KP_COMMA/,'KC_PCMM')
km_str.gsub!(/KC_GRAVE/,'KC_ZKHK')
km_str.gsub!(/KC_INT1/,'KC_RO')
km_str.gsub!(/KC_INT2/,'KC_KANA')
km_str.gsub!(/KC_INT3/,'KC_JYEN')
km_str.gsub!(/KC_INT4/,'KC_HENK')
km_str.gsub!(/KC_INT5/,'KC_MHEN')
km_str.gsub!(/KC_LANG1/,'KC_HAEN')
km_str.gsub!(/KC_LANG2/,'KC_HANJ')
km_str.gsub!(/KC_LCTRL/,'KC_LCTL')
km_str.gsub!(/KC_LSHIFT/,'KC_LSFT')
km_str.gsub!(/KC_LGUI/,'KC_LCMD')
km_str.gsub!(/KC_LGUI/,'KC_LWIN')
km_str.gsub!(/KC_RCTRL/,'KC_RCTL')
km_str.gsub!(/KC_RSHIFT/,'KC_RSFT')
km_str.gsub!(/KC_RALT/,'KC_ALGR')
km_str.gsub!(/KC_RGUI/,'KC_RCMD')
km_str.gsub!(/KC_RGUI/,'KC_RWIN')
km_str.gsub!(/KC_SYSTEM_POWER/,'KC_PWR')
km_str.gsub!(/KC_SYSTEM_SLEEP/,'KC_SLEP')
km_str.gsub!(/KC_SYSTEM_WAKE/,'KC_WAKE')
km_str.gsub!(/KC_AUDIO_MUTE/,'KC_MUTE')
km_str.gsub!(/KC_AUDIO_VOL_UP/,'KC_VOLU')
km_str.gsub!(/KC_AUDIO_VOL_DOWN/,'KC_VOLD')
km_str.gsub!(/KC_MEDIA_NEXT_TRACK/,'KC_MNXT')
km_str.gsub!(/KC_MEDIA_PREV_TRACK/,'KC_MPRV')
km_str.gsub!(/KC_MEDIA_STOP/,'KC_MSTP')
km_str.gsub!(/KC_MEDIA_PLAY_PAUSE/,'KC_MPLY')
km_str.gsub!(/KC_MEDIA_SELECT/,'KC_MSEL')
km_str.gsub!(/KC_MEDIA_EJECT/,'KC_EJCT')
km_str.gsub!(/KC_MAIL/,'KC_MAIL')
km_str.gsub!(/KC_CALCULATOR/,'KC_CALC')
km_str.gsub!(/KC_MY_COMPUTER/,'KC_MYCM')
km_str.gsub!(/KC_WWW_SEARCH/,'KC_WSCH')
km_str.gsub!(/KC_WWW_HOME/,'KC_WHOM')
km_str.gsub!(/KC_WWW_BACK/,'KC_WBAK')
km_str.gsub!(/KC_WWW_FORWARD/,'KC_WFWD')
km_str.gsub!(/KC_WWW_STOP/,'KC_WSTP')
km_str.gsub!(/KC_WWW_REFRESH/,'KC_WREF')
km_str.gsub!(/KC_WWW_FAVORITES/,'KC_WFAV')
km_str.gsub!(/KC_MEDIA_FAST_FORWARD/,'KC_MFFD')
km_str.gsub!(/KC_MEDIA_REWIND/,'KC_MRWD')
km_str.gsub!(/KC_BRIGHTNESS_UP/,'KC_BRIU')
km_str.gsub!(/KC_BRIGHTNESS_DOWN/,'KC_BRID')
km_str.gsub!(/KC_PAUSE/,'KC_BRMU')
km_str.gsub!(/KC_SCROLLLOCK/,'KC_BRMD')
km_str.gsub!(/KC_MS_UP/,'KC_MS_U')
km_str.gsub!(/KC_MS_DOWN/,'KC_MS_D')
km_str.gsub!(/KC_MS_LEFT/,'KC_MS_L')
km_str.gsub!(/KC_MS_RIGHT/,'KC_MS_R')
km_str.gsub!(/KC_MS_BTN1/,'KC_BTN1')
km_str.gsub!(/KC_MS_BTN2/,'KC_BTN2')
km_str.gsub!(/KC_MS_BTN3/,'KC_BTN3')
km_str.gsub!(/KC_MS_BTN4/,'KC_BTN4')
km_str.gsub!(/KC_MS_BTN5/,'KC_BTN5')
km_str.gsub!(/KC_MS_WH_UP/,'KC_WH_U')
km_str.gsub!(/KC_MS_WH_DOWN/,'KC_WH_D')
km_str.gsub!(/KC_MS_WH_LEFT/,'KC_WH_L')
km_str.gsub!(/KC_MS_WH_RIGHT/,'KC_WH_R')
km_str.gsub!(/KC_MS_ACCEL0/,'KC_ACL0')
km_str.gsub!(/KC_MS_ACCEL1/,'KC_ACL1')
km_str.gsub!(/KC_MS_ACCEL2/,'KC_ACL2')
defines = <<-END_DEFS
#define LCGS(code) LCTL(LGUI(LSFT(code)))
#define LCS(code) LCTL(LSFT(code))
END_DEFS
key_codes = km_str.scan /[A-Z][A-Z0-9_]*?(?:\(.*?\))?,/
size = key_codes.sort_by(&:length).last.length
pad = " " * size
pad8 = pad * 4
pad6 = pad8 + pad
pad7 = pad6 + pad
dent = " " * 4
ddnt = dent * 2
km_str.gsub!(/LAYOUT_ergodox\(
(?<line1>(?:[A-Z0-9_]*?(?:\(.*?\))?,){7})
(?<line2>(?:[A-Z0-9_]*?(?:\(.*?\))?,){7})
(?<line3>(?:[A-Z0-9_]*?(?:\(.*?\))?,){6})
(?<line4>(?:[A-Z0-9_]*?(?:\(.*?\))?,){7})
(?<line5>(?:[A-Z0-9_]*?(?:\(.*?\))?,){5})
(?<line6>(?:[A-Z0-9_]*?(?:\(.*?\))?,){2})
(?<line7>(?:[A-Z0-9_]*?(?:\(.*?\))?,){1})
(?<line8>(?:[A-Z0-9_]*?(?:\(.*?\))?,){3})
(?<line9>(?:[A-Z0-9_]*?(?:\(.*?\))?,){7})
(?<line10>(?:[A-Z0-9_]*?(?:\(.*?\))?,){7})
(?<line11>(?:[A-Z0-9_]*?(?:\(.*?\))?,){6})
(?<line12>(?:[A-Z0-9_]*?(?:\(.*?\))?,){7})
(?<line13>(?:[A-Z0-9_]*?(?:\(.*?\))?,){5})
(?<line14>(?:[A-Z0-9_]*?(?:\(.*?\))?,){2})
(?<line15>(?:[A-Z0-9_]*?(?:\(.*?\))?,){1})
(?<line16>(?:[A-Z0-9_]*?(?:\(.*?\))?,){2})
(?<lastkey>[A-Z0-9_]*?(?:\(.*?\))?)
\),/x, <<-END
LAYOUT_ergodox(
#{dent}// left hand
#{dent}\\k<line1>
#{dent}\\k<line2>
#{dent}\\k<line3>
#{dent}\\k<line4>
#{dent}\\k<line5>
#{dent}#{pad6}\\k<line6>
#{dent}#{pad7}\\k<line7>
#{dent}#{pad8}\\k<line8>
#{ddnt}// right hand
#{ddnt}\\k<line9>
#{ddnt}\\k<line10>
#{ddnt}#{pad}\\k<line11>
#{ddnt}\\k<line12>
#{ddnt}\\k<line13>
#{ddnt}\\k<line14>
#{ddnt}\\k<line15>
#{ddnt}\\k<line16>\\k<lastkey>
#{dent}),
END
)
km_str.gsub!(/([A-Z_][A-Z0-9_]*?(?:\(.*?\))?,)/) {|k| "%-#{size}s" % k}
km_str.gsub!(/(enum custom_keycodes)/,"#{defines}\n\1")
km_str
end
keymap = File.read(ARGV[0])
puts fix_keymap(keymap)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment