/keyboard-remap.ahk Secret
Last active
November 4, 2024 21:51
AutoHotkey script: numpad with lctrl, ctrl+QWERTY layout, and OS X style diacritic input, rctrl -> escape
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#UseHook | |
;hold lctrl for jkl/123 numpad | |
LCtrl & SC034::SendInput, {NumpadDot} | |
LCtrl & SC032::SendInput, {Numpad0} | |
LCtrl & SC024::SendInput, {Numpad1} | |
LCtrl & SC025::SendInput, {Numpad2} | |
LCtrl & SC026::SendInput, {Numpad3} | |
LCtrl & SC016::SendInput, {Numpad4} | |
LCtrl & SC017::SendInput, {Numpad5} | |
LCtrl & SC018::SendInput, {Numpad6} | |
LCtrl & SC008::SendInput, {Numpad7} | |
LCtrl & SC009::SendInput, {Numpad8} | |
LCtrl & SC00A::SendInput, {Numpad9} | |
LCtrl & SC035::SendInput, {NumpadAdd} | |
LCtrl & SC027::SendInput, {NumpadSub} | |
LCtrl & SC019::SendInput, {NumpadMult} | |
LCtrl & SC00B::SendInput, {NumpadDiv} | |
LCtrl & SC00C::SendInput, = | |
;Use QUERTY layout for Ctrl shortcuts | |
^*SC029::SendInput, {Blind}^{vkDFsc029} ; Ctrl+` | |
^*SC002::SendInput, {Blind}^{vk31sc002} ; Ctrl+1 | |
^*SC003::SendInput, {Blind}^{vk32sc003} ; Ctrl+2 | |
^*SC004::SendInput, {Blind}^{vk33sc004} ; Ctrl+3 | |
^*SC005::SendInput, {Blind}^{vk34sc005} ; Ctrl+4 | |
^*SC006::SendInput, {Blind}^{vk35sc006} ; Ctrl+5 | |
^*SC007::SendInput, {Blind}^{vk36sc007} ; Ctrl+6 | |
^*SC008::SendInput, {Blind}^{vk37sc008} ; Ctrl+7 | |
^*SC009::SendInput, {Blind}^{vk38sc009} ; Ctrl+8 | |
^*SC00A::SendInput, {Blind}^{vk39sc00A} ; Ctrl+9 | |
^*SC00B::SendInput, {Blind}^{vk30sc00B} ; Ctrl+0 | |
^*SC00C::SendInput, {Blind}^{vkBDsc00C} ; Ctrl+- | |
^*SC00D::SendInput, {Blind}^{vkBBsc00D} ; Ctrl+= | |
^*SC010::SendInput, {Blind}^{vk51sc010} ; Ctrl+q | |
^*SC011::SendInput, {Blind}^{vk57sc011} ; Ctrl+w | |
^*SC012::SendInput, {Blind}^{vk45sc012} ; Ctrl+e | |
^*SC013::SendInput, {Blind}^{vk52sc013} ; Ctrl+r | |
^*SC014::SendInput, {Blind}^{vk54sc014} ; Ctrl+t | |
^*SC015::SendInput, {Blind}^{vk59sc015} ; Ctrl+y | |
^*SC016::SendInput, {Blind}^{vk55sc016} ; Ctrl+u | |
^*SC017::SendInput, {Blind}^{vk49sc017} ; Ctrl+i | |
^*SC018::SendInput, {Blind}^{vk4Fsc018} ; Ctrl+o | |
^*SC019::SendInput, {Blind}^{vk50sc019} ; Ctrl+p | |
^*SC01A::SendInput, {Blind}^{vkDBsc01A} ; Ctrl+[ | |
^*SC01B::SendInput, {Blind}^{vkDDsc01B} ; Ctrl+] | |
^*SC02B::SendInput, {Blind}^{vkDCsc02B} ; Ctrl+\ | |
^*SC01E::SendInput, {Blind}^{vk41sc01E} ; Ctrl+a | |
^*SC01F::SendInput, {Blind}^{vk53sc01F} ; Ctrl+s | |
^*SC020::SendInput, {Blind}^{vk44sc020} ; Ctrl+d | |
^*SC021::SendInput, {Blind}^{vk46sc021} ; Ctrl+f | |
^*SC022::SendInput, {Blind}^{vk47sc022} ; Ctrl+g | |
^*SC023::SendInput, {Blind}^{vk48sc023} ; Ctrl+h | |
^*SC024::SendInput, {Blind}^{vk4Asc024} ; Ctrl+j | |
^*SC025::SendInput, {Blind}^{vk4Bsc025} ; Ctrl+k | |
^*SC026::SendInput, {Blind}^{vk4Csc026} ; Ctrl+l | |
^*SC027::SendInput, {Blind}^{vkBAsc027} ; Ctrl+; | |
^*SC028::SendInput, {Blind}^{vkC0sc028} ; Ctrl+' | |
^*SC02C::SendInput, {Blind}^{vk5Asc02C} ; Ctrl+z | |
^*SC02D::SendInput, {Blind}^{vk58sc02D} ; Ctrl+x | |
^*SC02E::SendInput, {Blind}^{vk43sc02E} ; Ctrl+c | |
^*SC02F::SendInput, {Blind}^{vk56sc02F} ; Ctrl+v | |
^*SC030::SendInput, {Blind}^{vk42sc030} ; Ctrl+b | |
^*SC031::SendInput, {Blind}^{vk4Esc031} ; Ctrl+n | |
^*SC032::SendInput, {Blind}^{vk4Dsc032} ; Ctrl+m | |
^*SC033::SendInput, {Blind}^{vkBCsc033} ; Ctrl+, | |
^*SC034::SendInput, {Blind}^{vkBEsc034} ; Ctrl+. | |
^*SC035::SendInput, {Blind}^{vkBFsc035} ; Ctrl+/ | |
#*SC029::SendInput, {Blind}#{vkDFsc029} ; Win+` | |
#*SC002::SendInput, {Blind}#{vk31sc002} ; Win+1 | |
#*SC003::SendInput, {Blind}#{vk32sc003} ; Win+2 | |
#*SC004::SendInput, {Blind}#{vk33sc004} ; Win+3 | |
#*SC005::SendInput, {Blind}#{vk34sc005} ; Win+4 | |
#*SC006::SendInput, {Blind}#{vk35sc006} ; Win+5 | |
#*SC007::SendInput, {Blind}#{vk36sc007} ; Win+6 | |
#*SC008::SendInput, {Blind}#{vk37sc008} ; Win+7 | |
#*SC009::SendInput, {Blind}#{vk38sc009} ; Win+8 | |
#*SC00A::SendInput, {Blind}#{vk39sc00A} ; Win+9 | |
#*SC00B::SendInput, {Blind}#{vk30sc00B} ; Win+0 | |
#*SC00C::SendInput, {Blind}#{vkBDsc00C} ; Win+- | |
#*SC00D::SendInput, {Blind}#{vkBBsc00D} ; Win+= | |
#*SC010::SendInput, {Blind}#{vk51sc010} ; Win+q | |
#*SC011::SendInput, {Blind}#{vk57sc011} ; Win+w | |
#*SC012::SendInput, {Blind}#{vk45sc012} ; Win+e | |
#*SC013::SendInput, {Blind}#{vk52sc013} ; Win+r | |
#*SC014::SendInput, {Blind}#{vk54sc014} ; Win+t | |
#*SC015::SendInput, {Blind}#{vk59sc015} ; Win+y | |
#*SC016::SendInput, {Blind}#{vk55sc016} ; Win+u | |
#*SC017::SendInput, {Blind}#{vk49sc017} ; Win+i | |
#*SC018::SendInput, {Blind}#{vk4Fsc018} ; Win+o | |
#*SC019::SendInput, {Blind}#{vk50sc019} ; Win+p | |
#*SC01A::SendInput, {Blind}#{vkDBsc01A} ; Win+[ | |
#*SC01B::SendInput, {Blind}#{vkDDsc01B} ; Win+] | |
#*SC02B::SendInput, {Blind}#{vkDCsc02B} ; Win+\ | |
#*SC01E::SendInput, {Blind}#{vk41sc01E} ; Win+a | |
#*SC01F::SendInput, {Blind}#{vk53sc01F} ; Win+s | |
#*SC020::SendInput, {Blind}#{vk44sc020} ; Win+d | |
#*SC021::SendInput, {Blind}#{vk46sc021} ; Win+f | |
#*SC022::SendInput, {Blind}#{vk47sc022} ; Win+g | |
#*SC023::SendInput, {Blind}#{vk48sc023} ; Win+h | |
#*SC024::SendInput, {Blind}#{vk4Asc024} ; Win+j | |
#*SC025::SendInput, {Blind}#{vk4Bsc025} ; Win+k | |
#*SC026::SendInput, {Blind}#{vk4Csc026} ; Win+l | |
#*SC027::SendInput, {Blind}#{vkBAsc027} ; Win+; | |
#*SC028::SendInput, {Blind}#{vkC0sc028} ; Win+' | |
#*SC02C::SendInput, {Blind}#{vk5Asc02C} ; Win+z | |
#*SC02D::SendInput, {Blind}#{vk58sc02D} ; Win+x | |
#*SC02E::SendInput, {Blind}#{vk43sc02E} ; Win+c | |
#*SC02F::SendInput, {Blind}#{vk56sc02F} ; Win+v | |
#*SC030::SendInput, {Blind}#{vk42sc030} ; Win+b | |
#*SC031::SendInput, {Blind}#{vk4Esc031} ; Win+n | |
#*SC032::SendInput, {Blind}#{vk4Dsc032} ; Win+m | |
#*SC033::SendInput, {Blind}#{vkBCsc033} ; Win+, | |
#*SC034::SendInput, {Blind}#{vkBEsc034} ; Win+. | |
#*SC035::SendInput, {Blind}#{vkBFsc035} ; Win+/ | |
#UseHook off | |
;!$::SendInput, ^{vkDFsc029} ; Ctrl+` | |
;os x style diacritic input | |
toDiacritic(regular, diacritic) { | |
if (regular = "a") { | |
accented := "àáâä" | |
} else if (regular = "A") { | |
accented := "ÀÁÂÄ" | |
} else if (regular = "e") { | |
accented := "èéêë" | |
} else if (regular = "E") { | |
accented := "ÈÉÊË" | |
} else if (regular = "i") { | |
accented := "ìíîï" | |
} else if (regular = "I") { | |
accented := "ÌÍÎÏ" | |
} else if (regular = "o") { | |
accented := "òóôö" | |
} else if (regular = "O") { | |
accented := "ÒÓÔÖ" | |
} else if (regular = "u") { | |
accented := "ùúûü" | |
} else if (regular = "U") { | |
accented := "ÙÚÛÜ" | |
} else { | |
return | |
} | |
charactersArray := StrSplit(accented) | |
if (diacritic = "grave") { | |
return charactersArray[1] | |
} else if (diacritic = "acute") { | |
return charactersArray[2] | |
} else if (diacritic = "circum") { | |
return charactersArray[3] | |
} else if (diacritic = "umlaut") { | |
return charactersArray[4] | |
} | |
} | |
composeDiacritic(diacritic) { | |
KeyWait Alt, T1 | |
Input, regularKey, L1, {enter}, a,e,i,o,u | |
diacriticCharacter := toDiacritic(regularKey, diacritic) | |
if (diacriticCharacter) { | |
SendInput, {Text}%diacriticCharacter% | |
} else { | |
SendInput, {Text}%regularKey% | |
} | |
} | |
!e:: | |
composeDiacritic("acute") | |
return | |
!SC00D:: ; Alt+# | |
composeDiacritic("grave") | |
return | |
!i:: | |
composeDiacritic("circum") | |
return | |
!u:: | |
composeDiacritic("umlaut") | |
return | |
![::SendInput, {Text}‘ | |
!]::SendInput, {Text}’ | |
!+[::SendInput, {Text}“ | |
!+]::SendInput, {Text}” | |
!a::SendInput, {Text}å | |
!+a::SendInput, {Text}Å | |
!'::SendInput, {Text}æ | |
!+'::SendInput, {Text}Æ | |
!o::SendInput, {Text}ø | |
!+o::SendInput, {Text}Ø | |
!q::SendInput, {Text}œ | |
!+q::SendInput, {Text}Œ | |
!c::SendInput, {Text}ç | |
!+c::SendInput, {Text}Ç | |
!-::SendInput, {Text}– | |
!+-::SendInput, {Text}— | |
!x::SendInput, {Text}× | |
;rctrl to escape (I pair this with a separate registry remapping of capslock to rctrl using SharpKeys) | |
~RCtrl:: | |
ctrlStartTime := A_TickCount | |
ctrlClicked := false | |
KeyWait, RCtrl | |
If (A_PriorKey = "RControl") && (A_TickCount - ctrlStartTime < 300) && (!ctrlClicked) { | |
SendInput, {Esc} | |
} | |
Return | |
RCtrl & LButton:: | |
ctrlClicked := true | |
Click | |
Return |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment