; Context Sensitive Help in Any Editor (based on the v1 script by Rajat)
; https://www.autohotkey.com
; This script makes Ctrl+2 (or another hotkey of your choice) show the help file
; page for the selected AutoHotkey function or keyword. If nothing is selected,
; the function name will be extracted from the beginning of the current line.

; The hotkey below uses the clipboard to provide compatibility with the maximum
; number of editors (since ControlGet doesn't work with most advanced editors).
; It restores the original clipboard contents afterward, but as plain text,
; which seems better than nothing.

$^2::
{
    ; The following values are in effect only for the duration of this hotkey thread.
    ; Therefore, there is no need to change them back to their original values
    ; because that is done automatically when the thread ends:
    SetWinDelay 10
    SetKeyDelay 0

    C_ClipboardPrev := A_Clipboard
    A_Clipboard := ""
    ; Use the highlighted word if there is one (since sometimes the user might
    ; intentionally highlight something that isn't a function):
    Send "^c"
    if !ClipWait(0.1)
    {
        ; Get the entire line because editors treat cursor navigation keys differently:
        Send "{home}+{end}^c"
        if !ClipWait(0.2)  ; Rare, so no error is reported.
        {
            A_Clipboard := C_ClipboardPrev
            return
        }
    }
    C_Cmd := Trim(A_Clipboard)  ; This will trim leading and trailing tabs & spaces.
    A_Clipboard := C_ClipboardPrev  ; Restore the original clipboard for the user.
    Loop Parse, C_Cmd, "`s"  ; The first space is the end of the function.
    {
        C_Cmd := A_LoopField
        break ; i.e. we only need one interation.
    }
    if !WinExist("AutoHotkey Help")
    {
        ; Determine AutoHotkey's location:
        try
            ahk_dir := RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey", "InstallDir")
        catch  ; Not found, so look for it in some other common locations.
        {
            if A_AhkPath
                SplitPath A_AhkPath,, ahk_dir
            else if FileExist("..\..\AutoHotkey.chm")
                ahk_dir := "..\.."
            else if FileExist(A_ProgramFiles "\AutoHotkey\AutoHotkey.chm")
                ahk_dir := A_ProgramFiles "\AutoHotkey"
            else
            {
                MsgBox "Could not find the AutoHotkey folder."
                return
            }
        }
        Run ahk_dir "\AutoHotkey.chm"
        WinWait "AutoHotkey Help"
    }
    ; The above has set the "last found" window which we use below:
    WinActivate
    WinWaitActive
    C_Cmd := StrReplace(C_Cmd, "#", "{#}")
    Send "!n{home}+{end}" C_Cmd "{enter}"
}
