Skip to content

Instantly share code, notes, and snippets.

@szupie
Last active November 4, 2024 21:51
AutoHotkey script: numpad with lctrl, ctrl+QWERTY layout, and OS X style diacritic input, rctrl -> escape
#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