ethan-s
4/27/2016 - 3:30 PM

AutoHotkey script to map Caps Lock to Escape when it's pressed on its own, and Ctrl when used in combination with another key, à la Steve Lo

AutoHotkey script to map Caps Lock to Escape when it's pressed on its own, and Ctrl when used in combination with another key, à la Steve Losh. Adapted from the one that does something similar with the Ctrl Key on the Vim Tips Wiki (http://vim.wikia.com/wiki/Map_caps_lock_to_escape_in_Windows?oldid=32281).

g_LastCtrlKeyDownTime := 0
g_AbortSendEsc := false
g_ControlRepeatDetected := false

*CapsLock::
    if (g_ControlRepeatDetected)
    {
        return
    }

    send,{Ctrl down}
    g_LastCtrlKeyDownTime := A_TickCount
    g_AbortSendEsc := false
    g_ControlRepeatDetected := true

    return

*CapsLock Up::
    send,{Ctrl up}
    g_ControlRepeatDetected := false
    if (g_AbortSendEsc)
    {
        return
    }
    current_time := A_TickCount
    time_elapsed := current_time - g_LastCtrlKeyDownTime
    if (time_elapsed <= 250)
    {
        SendInput {Esc}
    }
    return

~*^a::
    g_AbortSendEsc := true
    return
~*^b::
    g_AbortSendEsc := true
    return
~*^c::
    g_AbortSendEsc := true
    return
~*^d::
    g_AbortSendEsc := true
    return
~*^e::
    g_AbortSendEsc := true
    return
~*^f::
    g_AbortSendEsc := true
    return
~*^g::
    g_AbortSendEsc := true
    return
~*^h::
    g_AbortSendEsc := true
    return
~*^i::
    g_AbortSendEsc := true
    return
~*^j::
    g_AbortSendEsc := true
    return
~*^k::
    g_AbortSendEsc := true
    return
~*^l::
    g_AbortSendEsc := true
    return
~*^m::
    g_AbortSendEsc := true
    return
~*^n::
    g_AbortSendEsc := true
    return
~*^o::
    g_AbortSendEsc := true
    return
~*^p::
    g_AbortSendEsc := true
    return
~*^q::
    g_AbortSendEsc := true
    return
~*^r::
    g_AbortSendEsc := true
    return
~*^s::
    g_AbortSendEsc := true
    return
~*^t::
    g_AbortSendEsc := true
    return
~*^u::
    g_AbortSendEsc := true
    return
~*^v::
    g_AbortSendEsc := true
    return
~*^w::
    g_AbortSendEsc := true
    return
~*^x::
    g_AbortSendEsc := true
    return
~*^y::
    g_AbortSendEsc := true
    return
~*^z::
    g_AbortSendEsc := true
    return
~*^1::
    g_AbortSendEsc := true
    return
~*^2::
    g_AbortSendEsc := true
    return
~*^3::
    g_AbortSendEsc := true
    return
~*^4::
    g_AbortSendEsc := true
    return
~*^5::
    g_AbortSendEsc := true
    return
~*^6::
    g_AbortSendEsc := true
    return
~*^7::
    g_AbortSendEsc := true
    return
~*^8::
    g_AbortSendEsc := true
    return
~*^9::
    g_AbortSendEsc := true
    return
~*^0::
    g_AbortSendEsc := true
    return
~*^Space::
    g_AbortSendEsc := true
    return
~*^Backspace::
    g_AbortSendEsc := true
    return
~*^Delete::
    g_AbortSendEsc := true
    return
~*^Insert::
    g_AbortSendEsc := true
    return
~*^Home::
    g_AbortSendEsc := true
    return
~*^End::
    g_AbortSendEsc := true
    return
~*^PgUp::
    g_AbortSendEsc := true
    return
~*^PgDn::
    g_AbortSendEsc := true
    return
~*^Tab::
    g_AbortSendEsc := true
    return
~*^Return::
    g_AbortSendEsc := true
    return
~*^,::
    g_AbortSendEsc := true
    return
~*^.::
    g_AbortSendEsc := true
    return
~*^/::
    g_AbortSendEsc := true
    return
~*^;::
    g_AbortSendEsc := true
    return
~*^'::
    g_AbortSendEsc := true
    return
~*^[::
    g_AbortSendEsc := true
    return
~*^]::
    g_AbortSendEsc := true
    return
~*^\::
    g_AbortSendEsc := true
    return
~*^-::
    g_AbortSendEsc := true
    return
~*^=::
    g_AbortSendEsc := true
    return
~*^`::
    g_AbortSendEsc := true
    return
~*^F1::
    g_AbortSendEsc := true
    return
~*^F2::
    g_AbortSendEsc := true
    return
~*^F3::
    g_AbortSendEsc := true
    return
~*^F4::
    g_AbortSendEsc := true
    return
~*^F5::
    g_AbortSendEsc := true
    return
~*^F6::
    g_AbortSendEsc := true
    return
~*^F7::
    g_AbortSendEsc := true
    return
~*^F8::
    g_AbortSendEsc := true
    return
~*^F9::
    g_AbortSendEsc := true
    return
~*^F10::
    g_AbortSendEsc := true
    return
~*^F11::
    g_AbortSendEsc := true
    return
~*^F12::
    g_AbortSendEsc := true
    return