Skip to content

Latest commit

 

History

History

AutoHotKey

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

AutoHotKey Scripts

TODO:

  • AHK Hotkey Snippet for HTML/Markdown Collapsible Details

Contents

Directory Structure

Directory Structure

Deprecated

Master Run Script

To simplify the process of running various scripts across multiple .ahk files, I consolidate the scripts into a single, unified Master.ahk script that will run at system startup.

This also aids in reducing the task bar icons to a single icon as opposed to multiple icons for each individual script, given that each of the scripts utilizes the #NoTrayIcon top-level configuration.

View Code

; ### Master Script ###

; ### Configuration ###
#NoEnv
#SingleInstance, Force
SendMode Input
SetWorkingDir, %A_ScriptDir%

; ### Global Shortcuts for Programs ###
Run, "Global-Shortcuts\Obsidian-Global-Shortcut.ahk"
Run, "Global-Shortcuts\Todoist-Global-Shortcut.ahk"
Run, "Global-Shortcuts\Keeper-Global-Shortcut.ahk"  

; ### Custom Scripts ###
Run, "Custom\Custom-Text-Expanders.ahk"
Run, "Custom\Toggle-Hidden-Files-and-Folders.ahk"  

; ### HotKeyHelp ###
Run, "HotKeyHelp\HotkeyHelp.ahk"

; ### Deprecated ###
; Run, ListHotKeys.ahk
; WinClip
; Run, "WinClip\WinClip.ahk"

Custom Scripts

Custom scripts are script I wrote and are held within the Custom folder.

Text Expansion Hot Strings

Customized Hot Strings include:

Email Address Hot Strings:

Notes:

Hot string is in the format: e.<o|g>.<1|2>. Where:

  • e stands for email
  • o for outlook or g for gmail
  • 1 for 1993 and 2 for 2011

Address Hot Strings:

  • adr. - full address
  • adr.str - street only
  • adr.zip - zip only
View Code

#NoTrayIcon
#NoEnv
#SingleInstance, Force
SendMode Input
SetWorkingDir, %A_ScriptDir%

; Email Addresses:
::e.o.1::jimbrig1993@outlook.com
::e.o.2::jimbrig2011@outlook.com
::e.g.2::jimbrig2011@gmail.com
::e.g.1::jimbrig1993@gmail.com

; Address
::adr.::2161 PEACHTREE RD NE APT 401 ATLANTA, GA 30309
::adr.str::2161 PEACHTREE RD NE APT 401
::adr.zip::30309
</p>

Toggle Hidden Files and Folders

When in File Explorer, press Ctrl + F2 to toggle hidden files and folders from the view:

View Code

#NoTrayIcon

^F2::GoSub,CheckActiveWindow ;{ <-- Toggle Hidden Files and Folders

CheckActiveWindow:
  ID := WinExist("A")
  WinGetClass,Class, ahk_id %ID%
  WClasses := "CabinetWClass ExploreWClass"
  IfInString, WClasses, %Class%
    GoSub, Toggle_HiddenFiles_Display
Return

Toggle_HiddenFiles_Display:
  RootKey = HKEY_CURRENT_USER
  SubKey = Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
  RegRead, HiddenFiles_Status, % RootKey, % SubKey, Hidden
  if HiddenFiles_Status = 2
    RegWrite, REG_DWORD, % RootKey, % SubKey, Hidden, 1
  else
    RegWrite, REG_DWORD, % RootKey, % SubKey, Hidden, 2
  PostMessage, 0x111, 41504,,, ahk_id %ID%
Return
</p>

Global Shortcut Scripts

These scripts are specific to certain programs and provide global utility hotkeys to perform certain actions within those programs.

Currently I have scripts for the following:

  • Obsidian
    • Add New Note
    • Search Notes
    • Open Note
  • Todoist
    • Open Todoist
    • Quick Add to Inbox
  • Keeper
    • Work in Progress

Obsidian Global Shortcuts

  • Ctrl + Alt + Shift + N - Add New Note
  • Ctrl + Alt + Shift + F - Search Notes
  • Ctrl + Alt + Shift + O - Open Note
View Code

#NoTrayIcon

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CtrlAltShift + N 		- Obsidian: fresh new note
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

^!+n:: ;{ <-- Obsidian: Fresh New Note
	if WinExist("Obsidian")
	{
		WinActivate Obsidian
		Sleep, 200
		WinMaximize Obsidian
	}
	else
	{
		Run, C:\Users\jimbr\AppData\Local\Obsidian\Obsidian.exe
		; Run, obsidian://vault/Engineered-Knowledge
		Sleep, 1500
		WinMaximize md - Obsidian
	}
	; close any previous note
	SendInput ^w
	; txt size
	; SendInput ^0
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; ; make full screen
	SendInput {F11}

	; check if left sidebar is open
	; and close it
	; (depends on my current theme!)
	; CoordMode, Pixel
	; PixelGetColor, color, 93, 115
	; if (color = "0x000000") ; sidebar is closed
	; {
	; 	; nothing
	; }
	; else ; sidebar is open
	; {
	; 	SendInput ^k
	; }

	; open new note
	SendInput ^n

	; move cursor from name field into file itself
	Sleep, 400
	SendInput {Tab}
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CtrlAltShift + F 		- Obsidian: search all notes
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

^!+f:: ;{ <-- Obsidian: Search All Notes
	if WinExist("md - Obsidian")
	{
		WinActivate md - Obsidian
		Sleep, 200
		WinMaximize md - Obsidian
	}
	else
	{
		Run, C:\Users\jimbr\AppData\Local\Obsidian\Obsidian.exe
		Sleep, 1500
		WinMaximize md - Obsidian
	}
	SendInput ^w
	SendInput ^0
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	; SendInput ^{=}
	SendInput ^+f
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CtrlAltShift + O 		- Obsidian: open note by name
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

^!+o:: ;{ <-- Obsidian: Open Note by Name
	if WinExist("md - Obsidian")
	{
		WinActivate md - Obsidian
		Sleep, 200
		WinMaximize md - Obsidian
	}
	else
	{
		Run, C:\Users\jimbr\AppData\Local\Obsidian\Obsidian.exe
		Sleep, 1500
		WinMaximize md - Obsidian
	}
	SendInput ^w
	SendInput ^0
	; SendInput {F11}

	CoordMode, Pixel
	PixelGetColor, color, 93, 115

	if (color = "0x000000") ; sidebar is closed
	{
		; nothing
	}
	else ; sidebar is open
	{
		SendInput ^k
	}
	SendInput ^o
return
</p>

Todoist Global Shortcuts

  • Open Todoist and Quick Add Task: Ctrl + Alt + A
  • Launch Todoist: Ctrl + Alt + T
View Code

id := "com.todoist" ; AppUserModelid
Title := "Todoist: To-Do List and Task Manager" ; Todoist window title

#NoTrayIcon
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
; SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

;----------TODOIST global shortcuts WIN10 workaround----------
; *Created on 05/07/2017 by Rick Staa - Version 1.0.0*
;
; This AutoHotkey script adds global TODOIST shortcuts to WIN 10
;     - alt+ctrl+a (Add new task)
;     - alt+ctrl+t (open todoist)
;
; For questions, issues and suggestions go to: https://rickstaa.github.io/Todoist_Global_Shortcuts_WIN10/
;
;--INSTRUCTIONS--
; 1. Download AutoHotkey from https://autohotkey.com/
; 2. Install AutoHotkey
; 3. Download the Workaround.
; 4. Unzip the Workaround file
; 5. Go to Todoist_Global_Shortcuts_WIN10\TODOIST_AHK
; 6. Drag the "WinStoreAppLinks" folder into the "Program Files Shortcut"
; 7. Drag the "Todoist_global_Shortcuts.ahk" file into the "Startup Folder Shortcut
;
;--NOTES--
; Make sure AutoHotkey is running on startup

;--SCRIPT SETTINGS--
WaitTime := 1100 ; Adjust this time if the script is not working on program startup

;!DO NOT CHANGE THE CODE AND SETTINGS BELOW UNLESS YOU KNOW WHAT YOU ARE DOING!
SetTitleMatchMode, 2 ; IfWinExist settings
DetectHiddenWindows, On

;--Shortkey code--

; Open todoist with alt+ctrl+t shortcut
!^t:: ;{ <-- Open Todoist

	; Since Windows apps are hard to run the install.vbs script first need to find your unique UserAppModelid
	if (id = ""){
		MsgBox, 4,, For the shortcuts to work you need to run the installer.vbs. Do you want to run it now?
			IfMsgBox, Yes
		try{
			Run, installer.vbs
		} catch{
			MsgBox, Hey there! It look like you either moved the AutoHotKeyScript file or you didn't install the todoist WINDOWS 10 app. Please download the workaround again and run the installer. This is needed since Windows Store Apps are hard to run due to the current Windows 10 Store Apps installation protocol.
		}
		Exit
	}

	Process, Exist, Todoist.Universal.exe
	IfWinNotExist, ahk_exe Todoist.Universal.exe
	{
		Run, shell:AppsFolder\%id%
		return
	}
	else
	{
		IfWinActive, %Title%
			WinMinimize, %Title%
		else
			Run, shell:AppsFolder\%id%
	}
return

; Open todoist and add task shortcut
!^a:: ;{ <-- Open Todoist and Add Task Shortcut

	; Since Windows apps are hard to run the install.vbs script first need to find your unique UserAppModelid
	if (id = ""){
		MsgBox, 4,, For the shortcuts to work you need to run the installer.vbs. Do you want to run it now?
			IfMsgBox, Yes
		try{
			Run, installer.vbs
		} catch{
			MsgBox, Hey there! It look like you either moved the AutoHotKeyScript file or you didn't install the todoist WINDOWS 10 app. Please download the workaround again and run the installer. This is needed since Windows Store Apps are hard to run due to the current Windows 10 Store Apps installation protocol.
		}
		Exit
	}
	Process, Exist, Todoist.Universal.exe
	IfWinNotExist, ahk_exe Todoist.Universal.exe
	{
		RunWait, shell:AppsFolder\%id%
		sleep, WaitTime ; Waits for Todoist to load
		WinActivate, %Title%
		{
			send, {q}
			return
		}
	}
	else
	{
		IfWinActive, %Title%
			WinMinimize, %Title%
		else
			Run, shell:AppsFolder\%id%
		sleep, WaitTime ; Waits for Todoist to load
		WinActivate, %Title%
		{
			send, {q}
			return
		}
	}
return
</p>

Keeper Global Shortcuts

Work In Progress Currently

Hotkey Help Script

  • Win + F1: Open HotKeyHelp:

![[Pasted image 20210721170547.png]]

View Code

; Hotkey Help
; Fanatic Guru
; 2019 01 03
;
; Inspired by Jade Dragon's Infile Hotkey Scanner
; PostMessage Information and Script Status derived from Lexikos
;
; Creates a Help Dialog that Shows Current AHK Hotkeys
;
;{-----------------------------------------------
;
; Wings around file names mean
; ===== AHK File with Hotkeys or Hotstrings =====
; ----- AHK File with no Hotkeys or Hotstrings -----
; ==o== AHK Include File with Hotkeys or Hotstrings ==o==
; --o-- AHK Include File with no Hotkeys or Hotstrings --o--
; +++++ AHK or Text File Derived from EXE File Name with Hotkeys or Hotstrings +++++
; +-+-+ AHK or Text File Derived from EXE File Name with no Hotkeys or Hotstrings +-+-+
; ?+?+? EXE File for which no AHK or Text File was Found ?+?+?
;
; May create a txt file with same name as hotkey file to be searched for help information
;}

; INITIALIZATION - ENVIROMENT
;{-----------------------------------------------
;

; #NoTrayIcon
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance force ; Ensures that only the last executed instance of script is running

;}

; INITIALIZATION - VARIABLES
;{-----------------------------------------------
;

; File Names with Out Ext Seperated by |
; Files_Excluded 	:= "Test|Debugging"
Files_Excluded 	:= " "

; File Name for Exported Help Dialog
TextOut_FileName := "HotKey Help - Dialog.txt"

; Long or Short Hotkey and Hotstring Names (Modifier Order Matters)
; Hot_Excluded 	:= "Win+Ctrl+Alt+Escape|If|IfWinActive|#a|fyi|brb"
Hot_Excluded 	:= " "

; Text File Extension List for Text Help Files
Text_Ext_List := [
(Join,
	"txt"
)]

; Spacing for Position of Information Column in Help Dialog
Pos_Info = 25

; Parse Delimiter and OmitChar.  Sometimes changing these can give better results.
Parse_Delimiter := "`n"
Parse_OmitChar := "`r"

; Default Settings if Not Changed by Ini File
Set_ShowBlank		= 1
Set_ShowBlankInclude	= 1
Set_ShowExe		= 1
Set_ShowHotkey		= 1	; Hotkeys created with the Hotkey Command Tend to be Unusal
Set_VarHotkey		= 1	; Attempt to Resolve a Variable Used in Hotkeys Definition
Set_FlagHotkey		= 1	; Flag Hotkeys created with the Hotkey Command with <HK>
Set_ShowString		= 1
Set_AhkExe		= 1
Set_AhkTxt		= 1
Set_AhkTxtOver		= 1
Set_SortInfo		= 1
Set_CapHotkey		= 1	; Set to 0 to not change Capitalization of Hotkey, 1 for Capitalization as Determined by Set_CapHotkey_Radio
Set_CapHotkey_Radio	= 1	; Set to 1 to use Title Capitalization, 2 for UPPER Capitalization
Set_HideFold		= 1
Set_TextOut		= 0	; Set to 1 to automatically create text file output of Help Dialog
Set_FindPos		= 1
Set_IniSet		= 1	; Set to 0 to Use Defaults Settings and Not Use INI File
Set_IniExcluded		= 1	; Set to 0 to Use Default Excluded Information and Not Use INI File
Set_Hotkey_Mod_Delimiter := "+"	; Delimiter Character to Display Between Hotkey Modifiers
SearchEdit.Docked := true

; Get Settings From Ini File
if Set_IniSet
	if FileExist("HotkeyHelp.ini")
{
	IniRead, Set_ShowBlank, HotkeyHelp.ini, Settings, Set_ShowBlank, %Set_ShowBlank%
	IniRead, Set_ShowBlankInclude, HotkeyHelp.ini, Settings, Set_ShowBlankInclude, %Set_ShowBlankInclude%
	IniRead, Set_ShowExe, HotkeyHelp.ini, Settings, Set_ShowExe, %Set_ShowExe%
	IniRead, Set_ShowHotkey, HotkeyHelp.ini, Settings, Set_ShowHotkey, %Set_ShowHotkey%
	IniRead, Set_VarHotkey, HotkeyHelp.ini, Settings, Set_ShowHotkey, %Set_VarHotkey%
	IniRead, Set_FlagHotkey, HotkeyHelp.ini, Settings, Set_ShowHotkey, %Set_FlagHotkey%
	IniRead, Set_ShowString, HotkeyHelp.ini, Settings, Set_ShowString, %Set_ShowString%
	IniRead, Set_AhkExe, HotkeyHelp.ini, Settings, Set_AhkExe, %Set_AhkExe%
	IniRead, Set_AhkTxt, HotkeyHelp.ini, Settings, Set_AhkTxt, %Set_AhkTxt%
	IniRead, Set_AhkTxtOver, HotkeyHelp.ini, Settings, Set_AhkTxtOver, %Set_AhkTxtOver%
	IniRead, Set_SortInfo, HotkeyHelp.ini, Settings, Set_SortInfo, %Set_SortInfo%
	IniRead, Set_CapHotkey, HotkeyHelp.ini, Settings, Set_CapHotkey, %Set_CapHotkey%
	IniRead, Set_CapHotkey_Radio, HotkeyHelp.ini, Settings, Set_CapHotkey_Radio, %Set_CapHotkey_Radio%
	IniRead, Set_HideFold, HotkeyHelp.ini, Settings, Set_HideFold, %Set_HideFold%
	IniRead, Set_TextOut, HotkeyHelp.ini, Settings, Set_TextOut, %Set_TextOut%
	IniRead, Set_FindPos, HotkeyHelp.ini, Settings, Set_FindPos, %Set_FindPos%
	IniRead, Set_IniSet, HotkeyHelp.ini, Settings, Set_IniSet, %Set_IniSet%
	IniRead, Set_IniExcluded, HotkeyHelp.ini, Settings, Set_IniExcluded, %Set_IniExcluded%
	IniRead, Set_Hotkey_Mod_Delimiter, HotkeyHelp.ini, Settings, Set_Hotkey_Mod_Delimiter, %Set_Hotkey_Mod_Delimiter%
	if Set_FindPos
	{
		IniRead, Set_FindPos_deltaX, HotkeyHelp.ini, Settings, Set_FindPos_deltaX
		IniRead, Set_FindPos_deltaY, HotkeyHelp.ini, Settings, Set_FindPos_deltaY
		IniRead, Set_FindPos_Docked, HotkeyHelp.ini, Settings, Set_FindPos_Docked
		if !Set_FindPos_deltaX
			Set_FindPos_deltaX:=0
		if !Set_FindPos_deltaY
			Set_FindPos_deltaY:=0
		SearchEdit.UnDock := {"deltaX":Set_FindPos_deltaX, "deltaY":Set_FindPos_deltaY}
		SearchEdit.Docked := Set_FindPos_Docked
	}
}

; Get Excluded Information From Ini File
if Set_IniExcluded
	if FileExist("HotkeyHelp.ini")
{
	IniRead, Files_Excluded, HotkeyHelp.ini, Excluded, Files_Excluded, %Files_Excluded%
	IniRead, Hot_Excluded, HotkeyHelp.ini, Excluded, Hot_Excluded, %Hot_Excluded%
}
;}

; INITIALIZATION - GUI
;{-----------------------------------------------
;

; Create Setting Gui
Gui, Set:Font, s10
Gui, Set:Add, Text, x120 y10 w200 h20 , Hotkey Help - Pick Settings
Gui, Set:Add, Text, x30 y40 w390 h2 0x7
Gui, Set:Add, CheckBox, x60 y50 w380 h30 vSet_ShowBlank, Show Files With No Hotkeys
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_ShowBlankInclude, Show Include Files With No Hotkeys
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_ShowExe, Show EXE Files (Help Comments Do Not Exist in EXE)
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_AhkExe, Scan AHK File with Same Name as Running EXE
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_AhkTxt, Scan Text Files with Same Name as Running Script
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_AhkTxtOver, Text File Help will Overwrite Duplicate Help
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_ShowHotkey, Show Created with Hotkey Command
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_VarHotkey, Attempt to Resolve Variables in Dynamic Hotkeys
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_FlagHotkey, Flag Hotkeys created with the Hotkey Command with <HK>
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_SortInfo, Sort by Hotkey Description (Otherwise by Hotkey Name)
Gui, Set:Add, CheckBox, x60 yp+35 w180 h30 vSet_CapHotkey, Hotkey Capitalization
Gui, Set:Add, Radio, x240 yp w80 h30 vSet_CapHotkey_Radio, Title
Gui, Set:Add, Radio, x320 yp w120 h30, UPPER
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_ShowString, Show Hotstrings
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_HideFold, Hide Fold Start `;`{  from Help Comment
Gui, Set:Add, CheckBox, x60 yp+35 w220 h30 vSet_TextOut, Automatically Export Help Dialog
Gui, Set:Add, Button, +Border x290 yp w135 h30 gButtonExportDialog, Export Help Dialog
Gui, Set:Add, CheckBox, x60 yp+35 w220 h30 vSet_FindPos, Save Undocked "Find" Position
Gui, Set:Add, Button, +Border x290 yp w135 h30 gButtonFindPos, Reset "Find" Position
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_IniSet, Use INI File to Save Settings
Gui, Set:Add, CheckBox, x60 yp+35 w380 h30 vSet_IniExcluded, Use INI File to Save Excluded Files and Hotkeys
Gui, Set:Add, ComboBox, x60 yp+35 w60 h30 R5 Choose1 vSet_Hotkey_Mod_Delimiter, "%Set_Hotkey_Mod_Delimiter%"|"+"|"-"|" + "|" - "
Gui, Set:Add, Text, x130 yp w250 h30, Delimiter to Separate Hotkey Modifiers
Gui, Set:Add, Button, Default x60 yp+35 w330 h30, Finished
GuiControl, Set:, Set_ShowBlank, %Set_ShowBlank%
GuiControl, Set:, Set_ShowBlankInclude, %Set_ShowBlankInclude%
GuiControl, Set:, Set_ShowExe, %Set_ShowExe%
GuiControl, Set:, Set_ShowHotkey, %Set_ShowHotkey%
GuiControl, Set:, Set_VarHotkey, %Set_VarHotkey%
GuiControl, Set:, Set_FlagHotkey, %Set_FlagHotkey%
GuiControl, Set:, Set_ShowString, %Set_ShowString%
GuiControl, Set:, Set_AhkExe, %Set_AhkExe%
GuiControl, Set:, Set_AhkTxt, %Set_AhkTxt%
GuiControl, Set:, Set_AhkTxtOver, %Set_AhkTxtOver%
GuiControl, Set:, Set_SortInfo, %Set_SortInfo%
GuiControl, Set:, Set_CapHotkey, %Set_CapHotkey%
GuiControl, Set:, Title, % Set_CapHotkey_Radio = 1 ? 1 : 0
GuiControl, Set:, UPPER, % Set_CapHotkey_Radio = 2 ? 1 : 0
GuiControl, Set:, Set_HideFold, %Set_HideFold%
GuiControl, Set:, Set_TextOut, %Set_TextOut%
GuiControl, Set:, Set_FindPos, %Set_FindPos%
GuiControl, Set:, Set_IniSet, %Set_IniSet%
GuiControl, Set:, Set_IniExcluded, %Set_IniExcluded%
;GuiControl, Set:, Set_Hotkey_Mod_Delimiter, %Set_Hotkey_Mod_Delimiter%

; Get Information to Display in Excluded Gui
Gui_Excluded := String_Wings(" EXCLUDED SCRIPTS AND FILES ",40) "`n" Files_Excluded "`n`n`n" String_Wings(" EXCLUDED HOTKEYS & HOTSTRINGS ",40) "`n" Hot_Excluded
StringReplace, Gui_Excluded, Gui_Excluded, |, `n, All

; Create Excluded Gui
Gui, Excluded:+MinSize400x600 +Resize
Gui, Excluded:Color, FFFFFF
Gui, Excluded:Font, s10, Courier New
Gui, Excluded:Add, Text, x10, Enter Information Below the Appropriate Headings
Gui, Excluded:Add, Text, x60, Do Not Modify Heading Lines
Gui, Excluded:Add, Button, Default x20 y60 w350 h30, Confirm Edit
Gui, Excluded:Add, Edit, x20 y100 vGui_Excluded -E0x200, %Gui_Excluded%
;}

;{-----------------------------------------------
OnExit, SaveSettings

;
;}-----------------------------------------------
; END OF AUTO-EXECUTE

; HOTKEYS
;{-----------------------------------------------
;

#f1::	;{ <--  ~ Display Help ~
Refresh:
	Help := {}				; Main Array for Storing Help Information
	Scripts_Scan := {}		; AHK Scripts to Scan
	Scripts_Include := {}	; Scripts Added with #Include
	File_Paths_Txt := {}	; File Paths of Text
	Setting_AutoTrim := A_AutoTrim
	AutoTrim, On
	Setting_WorkingDir := A_WorkingDir
	Scripts_List := AHKScripts(Scripts)	; Get Path of all AHK Scripts
	Scripts_Scan := Scripts
Recursive:
	Include_Found := false
	for index, Script in Scripts_Scan	; Loop Through AHK Script Files
	{
		Txt_Ahk := false
		SetWorkingDir, %Setting_WorkingDir%
		File_Path := Script.Path
		SplitPath, File_Path, File_Name, File_Dir, File_Ext, File_Title
		if RegExMatch(Files_Excluded,"i)(^|\|)" File_Title "($|\|)")
			continue
		Help[File_Title,"Type"] := "AHK"
		Exe_Ahk := false
		if (File_Ext = "exe")
		{
			Help[File_Title,"Type"] := "EXE_UNKNOWN"
			if Set_AhkExe
			{
				if FileExist(File_Dir "\" File_Title ".ahk")
				{
					Exe_Ahk := true
					Help[File_Title,"Type"] := "EXE2AHK"
					File_Path := File_Dir "\" File_Title ".ahk"
				}
				else if FileExist(A_ScriptDir "\" File_Title ".ahk")
				{
					Help[File_Title,"Type"] := "EXE2AHK"
					Exe_Ahk := true
					File_Path := A_ScriptDir "\" File_Title ".ahk"
				}
				else if FileExist(A_WorkingDir "\" File_Title ".ahk")
				{
					Help[File_Title,"Type"] := "EXE2AHK"
					Exe_Ahk := true
					File_Path := A_WorkingDir "\" File_Title ".ahk"
				}
			}
		}
		Txt_Ahk := false
		if Set_AhkTxt
		{
			File_Paths_Txt := {} ; Clear File Paths of Text
			for index_Text_Ext, Text_Ext in Text_Ext_List
			{
				if FileExist(File_Dir "\" File_Title "." Text_Ext)
				{
					Txt_Ahk := true
					File_Paths_Txt.Insert(File_Dir "\" File_Title "." Text_Ext)
				}
				else if FileExist(A_ScriptDir "\" File_Title "." Text_Ext)
				{
					Txt_Ahk := true
					File_Paths_Txt.Insert(A_ScriptDir "\" File_Title "." Text_Ext)
				}
				else if FileExist(A_WorkingDir "\" File_Title "." Text_Ext)
				{
					Txt_Ahk := true
					File_Paths_Txt.Insert(A_WorkingDir "\" File_Title "." Text_Ext)
				}
			}
		}
		If (Help[File_Title,"Type"] = "EXE_UNKNOWN" and Txt_Ahk)
			Help[File_Title,"Type"] := "EXE2TEXT"
		if (!Txt_Ahk and !Exe_Ahk and !(File_Ext = "ahk" or File_Ext = "ahkl"))	; No File Found to Scan
			continue
		Script_File := ""
		if !(RegExMatch(Files_Excluded,"i)(^|\|)" File_Title "($|\|)") or RegExMatch(Files_Excluded,"i)(^|\|)" File_Title "." File_Ext "($|\|)"))
			FileRead, Script_File, %File_Path%	;  Read AHK Script File into String
		if Txt_Ahk
		{
			for index_File_Path_Txt, File_Path_Txt in File_Paths_Txt
			{
				FileRead, Script_File_Txt, %File_Path_Txt%	;  Read Text File with Same Name as AHK Script File into String
				if not ErrorLevel
					Script_File .= Parse_Delimiter "� Hotkey Help Text File �" Parse_Delimiter Script_File_Txt	;  Append Txt File onto AHK File
			}
		}
		if !Script_File
			continue
		Script_File := RegExReplace(Script_File, "ms`a)^\s*/\*.*?^\s*\*/\s*|^\s*\(.*?^\s*\)\s*")	; Removes /* ... */ and ( ... ) Blocks
		Txt_Ahk_Started := false
		Loop, Parse, Script_File, %Parse_Delimiter%, %Parse_OmitChar%	; Parse Each Line of Script File
		{
			File_Line := A_LoopField
			if (File_Line = "� Hotkey Help Text File �")
			{
				Txt_Ahk_Started := true
				continue
			}
			; RegEx to Identify Hotkey Command Lines
			if (RegExMatch(File_Line, "i)^\s*hotkey,(.*?),(.*)", Match) and Set_ShowHotkey)	; Check if Line Contains Hotkey Command
			{
				if Set_VarHotkey
					if RegExMatch(Match1,"%.*%")
					Match1 := HotkeyVariable(Script.Path,Match1)
				File_Line := Match1 ":: " Match2
				Hotkey_Command := true
			}
			else
				Hotkey_Command := false
			if RegExMatch(File_Line,"::")	; Simple check for Possible Hotkey or Hotstring (for speed)
			{
				if RegExMatch(File_Line,"^\s*:[0-9\*\?BbCcKkOoPpRrSsIiEeZz]*?:(.*?)::(\s*)(`;?)(.*)",Match)				; Complex Check if Line Contains Hotstring
					{
						if (Set_ShowString and !(RegExMatch(Hot_Excluded,"i)(^|\|)\Q" Match1 "\E($|\|)")))	; Check for Excluded Hotstring
						{
							Line_Hot := "<HS> " Match1
							Line_Help := (Match3 ? Trim(Match4) : "= " Match2 Match4)
							if Txt_Ahk_Started
							{
								if (Help[File_Title,"Hot_Text",Line_Hot,"Count"] = "")
									Count := 1
								else
									Count += Help[File_Title,"Hot_Text",Line_Hot,"Count"]
								Help[File_Title,"Hot_Text",Line_Hot,"Count"] := Count
								Help[File_Title,"Hot_Text",Line_Hot,Count] := Line_Help
							}
							else
							{
								if (Help[File_Title,"Hot",Line_Hot,"Count"] = "")
									Count := 1
								else
									Count += Help[File_Title,"Hot",Line_Hot,"Count"]
								Help[File_Title,"Hot",Line_Hot,"Count"] := Count
								Help[File_Title,"Hot",Line_Hot,Count] := Line_Help
							}
						}
						else
							continue
					}
					else if RegExMatch(File_Line, "Umi)^\s*[\Q#!^+<>*~$\E]*((LButton|RButton|MButton|XButton1|XButton2|WheelDown|WheelUp|WheelLeft|WheelRight|CapsLock|Space|Tab|Enter|Return|Escape|Esc|Backspace|BS|ScrollLock|Delete|Del|Insert|Ins|Home|End|PgUp|PgDn|Up|Down|Left|Right|NumLock|Numpad0|Numpad1|Numpad2|Numpad3|Numpad4|Numpad5|Numpad6|Numpad7|Numpad8|Numpad9|NumpadDot|NumpadDiv|NumpadMult|NumpadAdd|NumpadSub|NumpadEnter|NumpadIns|NumpadEnd|NumpadDown|NumpadPgDn|NumpadLeft|NumpadClear|NumpadRight|NumpadHome|NumpadUp|NumpadPgUp|NumpadDel|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24|LWin|RWin|Control|Ctrl|Alt|Shift|LControl|LCtrl|RControl|RCtrl|LShift|RShift|LAlt|RAlt|Browser_Back|Browser_Forward|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|AppsKey|PrintScreen|CtrlBreak|Pause|Break|Help|Sleep|sc\d{1,3}|vk\d{1,2}|\S)(?<!;)|```;)(\s+&\s+((LButton|RButton|MButton|XButton1|XButton2|WheelDown|WheelUp|WheelLeft|WheelRight|CapsLock|Space|Tab|Enter|Return|Escape|Esc|Backspace|BS|ScrollLock|Delete|Del|Insert|Ins|Home|End|PgUp|PgDn|Up|Down|Left|Right|NumLock|Numpad0|Numpad1|Numpad2|Numpad3|Numpad4|Numpad5|Numpad6|Numpad7|Numpad8|Numpad9|NumpadDot|NumpadDiv|NumpadMult|NumpadAdd|NumpadSub|NumpadEnter|NumpadIns|NumpadEnd|NumpadDown|NumpadPgDn|NumpadLeft|NumpadClear|NumpadRight|NumpadHome|NumpadUp|NumpadPgUp|NumpadDel|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24|LWin|RWin|Control|Ctrl|Alt|Shift|LControl|LCtrl|RControl|RCtrl|LShift|RShift|LAlt|RAlt|Browser_Back|Browser_Forward|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|AppsKey|PrintScreen|CtrlBreak|Pause|Break|Help|Sleep|sc\d{1,3}|vk\d{1,2}|\S)(?<!;)|```;))?(\s+Up)?::") ; Complex Check if Line Contains Hotkey
						{
							Pos_Hotkey := RegExMatch(File_Line,"(.*?[:]?)::",Match)
							Match1 := Trim(Match1)
							if RegExMatch(Hot_Excluded,"i)(^|\|)\Q" Match1 "\E($|\|)")	; Check for Excluded Short Hotkey Name
								continue
							if !RegExMatch(Match1,"(Shift|Alt|Ctrl|Win)")
							{
								StringReplace, Match1, Match1, +, Shift%Set_Hotkey_Mod_Delimiter%
								StringReplace, Match1, Match1, <^>!, AltGr%Set_Hotkey_Mod_Delimiter%
								StringReplace, Match1, Match1, <, Left, All
								StringReplace, Match1, Match1, >, Right, All
								StringReplace, Match1, Match1, !, Alt%Set_Hotkey_Mod_Delimiter%
								StringReplace, Match1, Match1, ^, Ctrl%Set_Hotkey_Mod_Delimiter%
								StringReplace, Match1, Match1, #, Win%Set_Hotkey_Mod_Delimiter%
							}
							StringReplace, Match1, Match1, ```;, `;
							if RegExMatch(Hot_Excluded,"i)(^|\|)\Q" Match1 "\E($|\|)")	; Check for Excluded Long Hotkey Name
								continue
							Line_Hot := Match1
							if Set_CapHotkey
								if (Set_CapHotkey_Radio = 1)
								Line_Hot := RegExReplace(Line_Hot,"((^[^\Q" Set_Hotkey_Mod_Delimiter "\E]*|\Q" Set_Hotkey_Mod_Delimiter "\E[^\Q" Set_Hotkey_Mod_Delimiter "\E]*))","$T1")
							else
								Line_Hot := RegExReplace(Line_Hot,"((^[^\Q" Set_Hotkey_Mod_Delimiter "\E]*|\Q" Set_Hotkey_Mod_Delimiter "\E[^\Q" Set_Hotkey_Mod_Delimiter "\E]*))","$U1")
							Pos := RegExMatch(File_Line,"::.*?;(.*)",Match)
								if Set_HideFold
									if (SubStr(Match1,1,1) = "{")
									Match1 := SubStr(Match1,2)
								Line_Help := Trim(Match1)
								if Hotkey_Command
									if Set_FlagHotkey
									Line_Hot := "<HK> " Line_Hot
								if Txt_Ahk_Started
								{
									if (Help[File_Title,"Hot_Text",Line_Hot,"Count"] = "")
										Count := 1
									else
										Count += Help[File_Title,"Hot_Text",Line_Hot,"Count"]
									Help[File_Title,"Hot_Text",Line_Hot,"Count"] := Count
									Help[File_Title,"Hot_Text",Line_Hot,Count] := Line_Help
								}
								else
								{
									if (Help[File_Title,"Hot",Line_Hot,"Count"] = "")
										Count := 1
									else
										Count += Help[File_Title,"Hot",Line_Hot,"Count"]
									Help[File_Title,"Hot",Line_Hot,"Count"] := Count
									Help[File_Title,"Hot",Line_Hot,Count] := Line_Help
								}
							}
						}
						if RegExMatch(File_Line, "mi`a)^\s*#include(?:again)?(?:\s+|\s*,\s*)(?:\*i[ `t]?)?([^;\v]+[^\s;\v])", Match)	; Check for #Include
							{
								StringReplace, Match1, Match1, `%A_ScriptDir`%, %File_Dir%
								StringReplace, Match1, Match1, `%A_AppData`%, %A_AppData%
								StringReplace, Match1, Match1, `%A_AppDataCommon`%, %A_AppDataCommon%
								StringReplace, Match1, Match1,```;,;, All
								if InStr(FileExist(Match1), "D")
								{
									SetWorkingDir, %Match1%
									continue
								}
								Match1 := Get_Full_Path(Match1)
								Include_Repeat := false
								for k, val in Scripts_Include
									if (val.Path = Match1)
									Include_Repeat := true
								if !Include_Repeat
								{
									Scripts_Include.Insert({"Path":Match1})
									Include_Found := true
								}
							}
						}
					}
					if Include_Found
					{
						Scripts_Scan := Scripts_Include
						goto Recursive
					}

					; Get Count of Hot in Each File
					for File, element in Help
					{
						count = 0
						for Hot, Info in Help[File,"Hot"]
							count += 1
						for Hot_Text, Info_Text in Help[File,"Hot_Text"]
							count += 1
						Help[File,"Count"] := count
					}

					; Remove Duplicate Help Created by Text Help if Text File Overwrite Set
					if (Set_AhkTxtOver)
						for File, element in Help
						for Hot_Text, Info_Text in Help[File,"Hot_Text"]
						for Hot, Info in Help[File,"Hot"]
						if (Hot = Hot_Text or Hot = "<HK> " Hot_Text)
					{
						Removed := Help[File,"Hot"].Remove(Hot)
						Help[File,"Count"] -= 1
					}

					; Add Include Information to Help Array
					for File, element in Help
					{
						Include_Found := true
						for index, Script in Scripts
							if (File = Script.Title)
							Include_Found := false
						if Include_Found
							Help[File, "Include"] := true
						else
							Help[File, "Include"] := false
					}

					; Build Display String from Help Array
					Display := ""
					for File, element in Help
					{
						if (Help[File,"Count"] > 0 and Help[File,"Type"] = "AHK")
						{
							if Help[File,"Include"]
								Display .= "`r`n" String_Wings(" " File " ",,"==o==") "`r`n"
							else
								Display .= "`r`n" String_Wings(" " File " ") "`r`n"
							Display_Section := ""
							for Hot, Hot_Index in Help[File,"Hot"]
								for Hot_Index2, Info in Help[File,"Hot",Hot]
								if (Hot_Index2 != "Count")
								Display_Section .= Format_Line(Hot,Info,Pos_Info) "`r`n"
							for Hot_Text, Hot_Text_Index in Help[File,"Hot_Text"]
								for Hot_Text_Index2, Info_Text in Help[File,"Hot_Text",Hot_Text]
								if (Hot_Text_Index2 != "Count")
								Display_Section .= Format_Line(Hot_Text,Info_Text,Pos_Info) "`r`n"
							if Set_SortInfo
								Sort, Display_Section, P%Pos_Info%
							else
								Sort, Display_Section
							Display .= Display_Section
						}
					}
					for File, element in Help
					{
						if (Help[File,"Count"] > 0 and (Help[File,"Type"] = "EXE2AHK" or Help[File,"Type"] = "EXE2TEXT"))
						{
							Display .= "`r`n" String_Wings(" " File " ",,"+") "`r`n"
							Display_Section := ""
							for Hot, Hot_Index in Help[File,"Hot"]
								for Hot_Index2, Info in Help[File,"Hot",Hot]
								if (Hot_Index2 != "Count")
								Display_Section .= Format_Line(Hot,Info,Pos_Info) "`r`n"
							for Hot_Text, Hot_Text_Index in Help[File,"Hot_Text"]
								for Hot_Text_Index2, Info_Text in Help[File,"Hot_Text",Hot_Text]
								if (Hot_Text_Index2 != "Count")
								Display_Section .= Format_Line(Hot_Text,Info_Text,Pos_Info) "`r`n"
							if Set_SortInfo
								Sort, Display_Section, P%Pos_Info%
							else
								Sort, Display_Section
							Display .= Display_Section
						}
					}
					if Set_ShowBlank
					{
						for File, element in Help
							if (Help[File,"Count"] = 0 and Help[File,"Type"] = "EXE2AHK" and Set_ShowExe)
							Display .= "`r`n" String_Wings(" " File " ",,"+-")
						for File, element in Help
							if (Help[File,"Type"] = "EXE_UNKNOWN" and Set_ShowExe)
							Display .= "`r`n" String_Wings(" " File " ",,"?+")
						for File, element in Help
							if (Help[File,"Count"] = 0 and Help[File,"Type"] = "AHK" and !Help[File,"Include"])
							Display .= "`r`n" String_Wings(" " File " ",,"-")
						for File, element in Help
							if (Help[File,"Count"] = 0 and Help[File,"Type"] = "AHK" and Help[File,"Include"] and Set_ShowBlankInclude)
							Display .= "`r`n" String_Wings(" " File " ",,"--o--")
					}

					Display := RegExReplace(Display,"^\s*(.*)\s*$", "$1")
					if Display_CreateOnly
						return

					; Create Main Gui first time then only display unless contents change then recreate to get automatic sizing of Edit
					if Gui_Created
					{
						if !(Display == Previous_Display)
						{
							if Set_TextOut
								gosub	TextOut
							Gui, Destroy
							gosub MenuBuild
							Gui, +MinSize660x100 +Resize +hwndidDisplayWin
							Gui, Color, FFFFFF
							Gui, Font, s10, Courier New
							Gui, Menu, MenuMain
							if (StrLen(Display) < 32000)	; Gui control cannot be created with more than 32k of text directly
								Gui, Add, Edit, vGui_Display ReadOnly -E0x200 hwndidDisplay +0x100, %Display%
							else
							{
								Gui, Add, Edit, vGui_Display ReadOnly -E0x200 hwndidDisplay +0x100, % SubStr(Display,1,32000)
								ControlSetText,, %Display%, ahk_id %idDisplay%
							}
							Gui, Show, AutoSize, Hotkey Help
							Send ^{Home}
						}
						else
						{
							Gui, Show,, Hotkey Help
							Send ^{Home}
						}
					}
					else
					{
						if Set_TextOut
							gosub	TextOut
						gosub MenuBuild
						Gui, +MinSize660x100 +Resize +hwndidDisplayWin
						Gui, Color, FFFFFF
						Gui, Font, s10, Courier New
						Gui, Menu, MenuMain
						if (StrLen(Display) < 32000)	; Gui control cannot be created with more than 32k of text directly
							Gui, Add, Edit, vGui_Display ReadOnly -E0x200 hwndidDisplay +0x100, %Display%
						else
						{
							Gui, Add, Edit, vGui_Display ReadOnly -E0x200 hwndidDisplay +0x100, % SubStr(Display,1,32000)
							ControlSetText,, %Display%, ahk_id %idDisplay%
						}
						Gui, Show, AutoSize, Hotkey Help
						Send ^{Home}
						Gui_Created := true
					}
					Previous_Display := Display
					AutoTrim, %Setting_AutoTrim%
					if 	SearchEdit.Visible
						ControlFocus,, % "ahk_id " SearchEdit.GuiFindID
					return
					;}

					#!f1::	;{ <-- Settings
						Gui, Set:Show,, Hotkey Help - Settings
					return
					;}

					#^f1::	;{ <-- Excluded Files, Hotkeys, and Hotstrings
						Gui, Excluded:Show, AutoSize, Hotkey Help - Excluded
						Send ^{Home}
					return
					;}

					#!^f1::	;{ <-- Raw Hotkey List
						Scripts_List := AHKScripts(Scripts)	; Get Path of all AHK Scripts
						Raw_Hotkeys := {}
						for index, Script in Scripts	; Loop Through All AHK Script Files
						{
							File_Path := Script.Path
							SplitPath, File_Path, File_Name, File_Dir, File_Ext, File_Title
							Raw_Hotkeys[File_Title] := ScriptHotkeys(Script.Path)
						}
						Raw_Display := ""
						for Script, element in Raw_Hotkeys
						{
							Raw_Display .= "`n" String_Wings(" " Script " ",30) "`n"
							for index, Hotkey_Short in Raw_Hotkeys[Script]
							{
								Hotkey_Keys := Hotkey_Short
								StringReplace, Hotkey_Keys, Hotkey_Keys, +, Shift%Set_Hotkey_Mod_Delimiter%
								StringReplace, Hotkey_Keys, Hotkey_Keys, <^>!, AltGr%Set_Hotkey_Mod_Delimiter%
								StringReplace, Hotkey_Keys, Hotkey_Keys, <, Left, All
								StringReplace, Hotkey_Keys, Hotkey_Keys, >, Right, All
								StringReplace, Hotkey_Keys, Hotkey_Keys, !, Alt%Set_Hotkey_Mod_Delimiter%
								StringReplace, Hotkey_Keys, Hotkey_Keys, ^, Ctrl%Set_Hotkey_Mod_Delimiter%
								StringReplace, Hotkey_Keys, Hotkey_Keys, #, Win%Set_Hotkey_Mod_Delimiter%
								if Set_CapHotkey
									if (Set_CapHotkey_Radio = 1)
									Hotkey_Keys := RegExReplace(Hotkey_Keys,"((^[^\Q" Set_Hotkey_Mod_Delimiter "\E]*|\Q" Set_Hotkey_Mod_Delimiter "\E[^\Q" Set_Hotkey_Mod_Delimiter "\E]*))","$T1")
								else
									Hotkey_Keys := RegExReplace(Hotkey_Keys,"((^[^\Q" Set_Hotkey_Mod_Delimiter "\E]*|\Q" Set_Hotkey_Mod_Delimiter "\E[^\Q" Set_Hotkey_Mod_Delimiter "\E]*))","$U1")
								Raw_Display .= Hotkey_Keys "`n"
							}
						}
						Raw_Display := Trim(Raw_Display," `n")
						if Gui_Raw_Created
							if !(Raw_Display = Previous_Raw_Display)
						{
							Gui, Raw:Destroy
							Gui, Raw:+Resize
							Gui, Raw:Color, FFFFFF
							Gui, Raw:Font, s10, Courier New
							Gui, Raw:Add, Edit, vGui_Raw_Display ReadOnly -E0x200, %Raw_Display%
							Gui, Raw:Show, AutoSize, Hotkey Help
							Send ^{Home}
						}
						else
						{
							Gui, Raw:Show, AutoSize, Hotkey Help - Raw Hotkeys
							Send ^{Home}
						}
						else
						{
							Gui, Raw:+Resize
							Gui, Raw:Color, FFFFFF
							Gui, Raw:Font, s10, Courier New
							Gui, Raw:Add, Edit, vGui_Raw_Display ReadOnly -E0x200, %Raw_Display%
							Gui, Raw:Show, AutoSize, Hotkey Help - Raw Hotkeys
							Send ^{Home}
							Gui_Raw_Created := true
						}
						Previous_Raw_Display := Raw_Display
					return
					;}

					#if WinActive("ahk_id " idDisplayWin)
					^f:: ;{ <-- (Hotkey Help) : Find
					SearchEdit.Dialog(idDisplay,3+Floor(5*A_ScreenDPI/96))
				return
				#if
					;}

				;}

				; SUBROUTINES
				;{-----------------------------------------------
				;

				TextOut:
					File_TextOut := FileOpen(TextOut_FileName, "w")
					File_TextOut.Write(Display)
					File_TextOut.Close()
				return

				SaveSettings:
					if Set_IniSet and Set_FindPos
					{
						if !Set_FindPos_deltaX
							Set_FindPos_deltaX:=0
						if !Set_FindPos_deltaY
							Set_FindPos_deltaY:=0
						IniWrite, % SearchEdit.UnDock.deltaX, HotkeyHelp.ini, Settings, Set_FindPos_deltaX
						IniWrite, % SearchEdit.UnDock.deltaY, HotkeyHelp.ini, Settings, Set_FindPos_deltaY
						IniWrite, % SearchEdit.Docked, HotkeyHelp.ini, Settings, Set_FindPos_Docked
					}
				ExitApp
				return

				;}

				; SUBROUTINES - GUI
				;{-----------------------------------------------
				;

				; Default Help Gui
				GuiSize:
					NewWidth := A_GuiWidth - 20
					NewHeight := A_GuiHeight - 20
					GuiControl, Move, Gui_Display, W%NewWidth% H%NewHeight%
				return

				GuiEscape:
					Gui, Show, Hide
				return

				; Default Help Gui Menu
				ScriptStop:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					WinID := ArrayCrossRef(Scripts,"Title",A_ThisMenuItem,"hWnd")
					WinKill, ahk_id %WinID%
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
					Menu, MenuStop, Delete, %A_ThisMenuItem%
					Menu, MenuPause, Delete, %A_ThisMenuItem%
					Menu, MenuSuspend, Delete, %A_ThisMenuItem%
					Menu, MenuEdit, Delete, %A_ThisMenuItem%
					Menu, MenuReload, Delete, %A_ThisMenuItem%
					Menu, MenuOpen, Delete, %A_ThisMenuItem%
					goto Refresh
				return

				ScriptPause:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					WinID := ArrayCrossRef(Scripts,"Title",A_ThisMenuItem,"hWnd")
					PostMessage, 0x111, 65403,,, ahk_id %WinID%
					sleep 100
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
					gosub MenuBuild
				return

				ScriptSuspend:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					WinID := ArrayCrossRef(Scripts,"Title",A_ThisMenuItem,"hWnd")
					PostMessage, 0x111, 65404,,, ahk_id %WinID%
					sleep 100
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
					gosub MenuBuild
				return

				ScriptEdit:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					WinID := ArrayCrossRef(Scripts,"Title",A_ThisMenuItem,"hWnd")
					PostMessage, 0x111, 65401,,, ahk_id %WinID%
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
				return

				ScriptReload:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					WinID := ArrayCrossRef(Scripts,"Title",A_ThisMenuItem,"hWnd")
					PostMessage, 0x111, 65400,,, ahk_id %WinID%
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
				return

				ScriptOpen:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					WinID := ArrayCrossRef(Scripts,"Title",A_ThisMenuItem,"hWnd")
					PostMessage, 0x111, 65300,,, ahk_id %WinID%
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
				return

				MenuBuild:
				DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
					Menu, MenuMain, UseErrorLevel
					Menu, MenuMain, Delete
					for index, Script in Scripts
					{
						Title := Script.Title
						script_id := Script.hWnd
						; Force the script to update its Pause/Suspend checkmarks.
						SendMessage, 0x211,,,, ahk_id %script_id% ; WM_ENTERMENULOOP
						SendMessage, 0x212,,,, ahk_id %script_id% ; WM_EXITMENULOOP

						; Get script status from its main menu.
						mainMenu := DllCall("GetMenu", "uint", script_id)
						fileMenu := DllCall("GetSubMenu", "uint", mainMenu, "int", 0)
						isPaused := DllCall("GetMenuState", "uint", fileMenu, "uint", 4, "uint", 0x400) >> 3 & 1
						isSuspended := DllCall("GetMenuState", "uint", fileMenu, "uint", 5, "uint", 0x400) >> 3 & 1
						DllCall("CloseHandle", "uint", fileMenu)
						DllCall("CloseHandle", "uint", mainMenu)

						Menu, MenuStop, Add, %Title%, ScriptStop
						Menu, MenuPause, Add, %Title%, ScriptPause
						if isPaused
							Menu, MenuPause, Check, %Title%
						else
							Menu, MenuPause, UnCheck, %Title%
						Menu, MenuSuspend, Add, %Title%, ScriptSuspend
						if isSuspended
							Menu, MenuSuspend, Check, %Title%
						else
							Menu, MenuSuspend, UnCheck, %Title%
						Menu, MenuEdit, Add, %Title%, ScriptEdit
						Menu, MenuReload, Add, %Title%, ScriptReload
						Menu, MenuOpen, Add, %Title%, ScriptOpen
					}
					Menu, MenuMain, Add,% " Stop Script ", :MenuStop
					Menu, MenuMain, Add
					Menu, MenuMain, Add,% " Pause Script ", :MenuPause
					Menu, MenuMain, Add
					Menu, MenuMain, Add,% " Suspend Script ", :MenuSuspend
					Menu, MenuMain, Add
					Menu, MenuMain, Add,% " Edit Script ", :MenuEdit
					Menu, MenuMain, Add
					Menu, MenuMain, Add,% " Reload Script ", :MenuReload
					Menu, MenuMain, Add
					Menu, MenuMain, Add,% " Open Script ", :MenuOpen
					DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
				return

				; Excluded Gui
				ExcludedButtonConfirmEdit:
					Gui, Excluded:Submit
					Files_Excluded := ""
					Hot_Excluded := ""
					Loop, Parse, Gui_Excluded, `n, `r
					{
						if !A_LoopField
							continue
						if (A_LoopField = String_Wings(" EXCLUDED SCRIPTS AND FILES ",40))
						{
							Next_Section := false
							continue
						}
						if (A_LoopField = String_Wings(" EXCLUDED HOTKEYS & HOTSTRINGS ",40))
							Next_Section := true
						else
							if !Next_Section
							Files_Excluded .= "|" Trim(A_LoopField)
						else
							Hot_Excluded .= "|" Trim(A_LoopField)
					}
					Files_Excluded := SubStr(Files_Excluded, 2)
					Hot_Excluded := SubStr(Hot_Excluded, 2)
					if Set_IniExcluded
					{
						IniWrite, %Files_Excluded%, HotkeyHelp.ini, Excluded, Files_Excluded
						IniWrite, %Hot_Excluded%, HotkeyHelp.ini, Excluded, Hot_Excluded
					}
				return

				ExcludedGuiSize:
					NewWidth := A_GuiWidth - 20
					NewHeight := A_GuiHeight - 20
					GuiControl, Move, Gui_Excluded, W%NewWidth% H%NewHeight%
				return

				ExcludedGuiEscape:
					Gui, Excluded:Show, Hide
				return

				; Raw Gui
				RawGuiSize:
					NewWidth := A_GuiWidth - 20
					NewHeight := A_GuiHeight - 20
					GuiControl, Move, Gui_Raw_Display, W%NewWidth% H%NewHeight%
				return

				RawGuiEscape:
					Gui, Raw:Show, Hide
				return

				; Set Gui
				SetButtonFinished:
				SetGuiEscape:
					Gui, Set:Submit
					if Set_IniSet
					{
						IniWrite, %Set_ShowBlank%, HotkeyHelp.ini, Settings, Set_ShowBlank
						IniWrite, %Set_ShowBlankInclude%, HotkeyHelp.ini, Settings, Set_ShowBlankInclude
						IniWrite, %Set_ShowExe%, HotkeyHelp.ini, Settings, Set_ShowExe
						IniWrite, %Set_ShowHotkey%, HotkeyHelp.ini, Settings, Set_ShowHotkey
						IniWrite, %Set_VarHotkey%, HotkeyHelp.ini, Settings, Set_VarHotkey
						IniWrite, %Set_FlagHotkey%, HotkeyHelp.ini, Settings, Set_FlagHotkey
						IniWrite, %Set_ShowString%, HotkeyHelp.ini, Settings, Set_ShowString
						IniWrite, %Set_AhkExe%, HotkeyHelp.ini, Settings, Set_AhkExe
						IniWrite, %Set_AhkTxt%, HotkeyHelp.ini, Settings, Set_AhkTxt
						IniWrite, %Set_AhkTxtOver%, HotkeyHelp.ini, Settings, Set_AhkTxtOver
						IniWrite, %Set_SortInfo%, HotkeyHelp.ini, Settings, Set_SortInfo
						IniWrite, %Set_CapHotkey%, HotkeyHelp.ini, Settings, Set_CapHotkey
						IniWrite, %Set_CapHotkey_Radio%, HotkeyHelp.ini, Settings, Set_CapHotkey_Radio
						IniWrite, %Set_HideFold%, HotkeyHelp.ini, Settings, Set_HideFold
						IniWrite, %Set_TextOut%, HotkeyHelp.ini, Settings, Set_TextOut
						IniWrite, %Set_FindPos%, HotkeyHelp.ini, Settings, Set_FindPos
						IniWrite, %Set_IniSet%, HotkeyHelp.ini, Settings, Set_IniSet
						IniWrite, %Set_IniExcluded%, HotkeyHelp.ini, Settings, Set_IniExcluded
						IniWrite, %Set_Hotkey_Mod_Delimiter%, HotkeyHelp.ini, Settings, Set_Hotkey_Mod_Delimiter
					}
					Set_Hotkey_Mod_Delimiter := Trim(Set_Hotkey_Mod_Delimiter,"""")
				return
				; Export Help Dialog to Text File
				ButtonExportDialog:
					if Display
						gosub TextOut
					else
					{
						Display_CreateOnly := true
						gosub #F1
						Display_CreateOnly := false
						gosub TextOut
						Display := ""
					}
				return

				; Reset "Find" Position
				ButtonFindPos:
					SearchEdit.Docked := true
				return
				;}

				; FUNCTIONS
				;{-----------------------------------------------
				;

				; Get Value of Variable From Script Dialog
				HotkeyVariable(Script,Variable)
				{
					static
					Var := Trim(Variable," %")
					If !Script_List
						Script_List := {}
					if !Script_List[Script]
					{
						DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
							SetTitleMatchMode 2
							WinMove, %Script%,,A_ScreenWidth, A_ScreenHeight
							PostMessage, 0x111, 65407, , , %Script%
							ControlGetText, Text, Edit1, %Script%
							WinHide, %Script%
							Script_List[Script] := Text
						}
						Pos := RegExMatch(Script_List[Script], Var ".*\:(.*)",Match)
						DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
						if (Pos and Match1)
						return Match1
					else
						return Variable
				}

				; Get Hotkeys From Script Dialog
				ScriptHotkeys(Script)
				{
					DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
						SetTitleMatchMode 2
						WinMove, %Script%,,A_ScreenWidth, A_ScreenHeight
						if (Script = A_ScriptFullPath)
							ListHotkeys
						else
							PostMessage, 0x111, 65408, , , %Script%
						ControlGetText, Text, Edit1, %Script%
						WinHide, %Script%
						DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
						Result := {}
						Loop, Parse, Text, `n, `r
						{
							Pos := RegExMatch(A_LoopField,"^[(reg|k|m|2|joy)].*\t(.*)$",Match)
							if Pos
								Result.Insert(Match1)
						}
					return Result
				}

				; Expand File Path
				Get_Full_Path(path)
				{
					Loop, %path%, 1
					return A_LoopFileLongPath
				return path
			}

			; Add Character Wings to Each Side of String to Create Graphical Break
			String_Wings(String,Length:=76,Char:="=",Case:="U")
			{
				if (Case = "U")
					StringUpper, String, String
				else if (Case = "T")
					StringUpper, String, String, T
				else if (Case = "L")
					StringLower, String, String
				WingX1 := Round(((Length-StrLen(String))/2)/StrLen(Char)-.5)
				WingX2 := Round((Length-StrLen(String)-(WingX1*StrLen(Char)))/StrLen(Char)+.5)
				loop %WingX1%
					Wing_1 .= Char
				loop %WingX2%
					Wing_2 .= Char
				return SubStr(Wing_1 String Wing_2,1,Length)
			}

			; Format Spaces Between Hot Keys and Help Info to Create Columns
			Format_Line(Hot,Info,Pos_Info)
			{
				Spaces := ""
				Length := Pos_Info - StrLen(Hot) - 1
				Loop %Length%
					Spaces .= " "
				return Hot Spaces Info
			}

			; Reference One Branch of Array and Return Corrisponding Information on Cross Branch
			ArrayCrossRef(Array, Haystack, Needle, Cross)
			{
				for index, element in Array
					if (Needle = element[Haystack])
					return element[Cross]
				return
			}
			;}

			; CLASSES
			;{-----------------------------------------------
			;

			; [Class] SearchEdit - Find Text within Edit Control (Edit Control Must have +0x100 Style for Unfocused Highlights)
			class SearchEdit
			{
				Dialog(pGuiControlID, pOffset:=3, pFindInput := "")
				{
					static
					GuiControlID := pGuiControlID ; assign to static method variable
					SearchEdit.Offset := pOffset ; assign to class variable
					SearchEdit.ParentID := DllCall("GetParent", UInt, GuiControlID) ; assign to class variable
					SysGet, Area, MonitorWorkArea ; AreaLeft, AreaRight, AreaBottom, AreaTop
					if !GuiFindID
					{
						Gui SearchEdit_Dialog:Default
						Gui -Caption +HwndGuiFindID +ToolWindow +Owner%GuiControlID%
						Gui Add, Edit, x10 y3 w200 r2 gFindText_Sub vFindText_Var -VScroll
						GuiControl, Move, FindText_Var, h20
						Gui Add, StatusBar, gStatusBar, `tType Find string and press Enter
						SearchEdit.GuiFindID := GuiFindID ; assign to class variable
						if !IsObject(SearchEdit.UnDock)
							SearchEdit.Docked := true
					}
					if (pFindInput = "")
					{
						Found := false, StartingPos := 1
						WinGetPos, X, Y, W, H, % "ahk_id " SearchEdit.ParentID
						Calc := SearchEdit.Calc_Position(X, Y, W, H)
						Gui SearchEdit_Dialog:Show, % "h" Calc.H " w" Calc.W " x" Calc.X " y" Calc.Y
						SearchEdit.Visible := true
						OnMessage(0x201, ObjBindMethod(SearchEdit, "WM_LBUTTONDOWN"))
						OnMessage(0x47, ObjBindMethod(SearchEdit,"WM_WINDOWPOSCHANGED"))
					return
				}
				if (FindInput<>pFindInput)
					Found := false, StartingPos := 1
				FindInput := pFindInput
				WrapToTop:
					StartingPos := SearchEdit.FindText(FindInput, GuiControlID,, StartingPos)
					GuiControl,, FindText_Var, %FindInput%
					Send ^{Right}
					if !StartingPos
					{
						SendMessage 0xB1, -1,,, ahk_id %GuiControlID% ; EM_SETSEL ; Deselect
						if Found
						{
							Found := false, StartingPos := 1
							goto WrapToTop
						}
						MsgBox % "NOT FOUND:`n`n" FindInput
						GuiControl,, FindText_Var
						Found := false, StartingPos := 1
					}
					else
						Found := true
				return
				FindText_Sub:
					Gui SearchEdit_Dialog:Submit, NoHide
					if !(InStr(FindText_Var, "`n"))
						return
					SearchEdit.Dialog(GuiControlID, SearchEdit.Offset, Trim(FindText_Var, "`n"))
				return
				SearchEdit_DialogGuiEscape:
					Gui SearchEdit_Dialog:Hide
					SearchEdit.Visible := false
				return
				StatusBar: ; Double Click
					SearchEdit.Docked := true
					WinGetPos, X, Y, W, H, % "ahk_id " SearchEdit.ParentID
					Calc := SearchEdit.Calc_Position(X, Y, W, H)
					Gui SearchEdit_Dialog:Show, % "h" Calc.H " w" Calc.W " x" Calc.X " y" Calc.Y
				return
			}
			FindText(FindText, GuiControlID, CaseSensitive:=false, StartingPos:=1, Occurance:=1)
			{
				GuiControlGet, Text,, %GuiControlID%
				Text := RegExReplace(Text, "\R", "`r`n")
				if !(Pos := InStr(Text, FindText, CaseSensitive, StartingPos, Occurance))
				return
			StartingPos := Pos - 1
			EndingPos := StartingPos + StrLen(FindText)
			SendMessage 0xB1, StartingPos, EndingPos,, ahk_id %GuiControlID% ; EM_SETSEL
			SendMessage 0xB7, 0, 0,, ahk_id %GuiControlID% ;- EM_SCROLLCARET
			return EndingPos + 1 ; Start Position for Next Search
		}
		WM_LBUTTONDOWN() ; Private Method
		{
			If (A_Gui = "SearchEdit_Dialog")
			{
				PostMessage, 0xA1, 2,,,A
				SearchEdit.Docked := false
				Sleep 20
				WinGetPos, X, Y, W, H, % "ahk_id " SearchEdit.ParentID
				WinGetPos, gX, gY, gW, gH, % "ahk_id " SearchEdit.GuiFindID
				SearchEdit.UnDock := {"deltaX":gX-X, "deltaY":gY-Y}
			}
		}
		WM_WINDOWPOSCHANGED(wParam, lParam, msg, Hwnd) ; Private Method
		{

			if (Hwnd != SearchEdit.ParentID or !SearchEdit.Visible)
				return
			if !WinExist("ahk_id " Hwnd)
			{
				Gui SearchEdit_Dialog:Hide
				return
			}
			X := NumGet(lParam+0, A_PtrSize + A_PtrSize, "int")
			Y := NumGet(lParam+0, A_PtrSize + A_PtrSize + 4, "int")
			W := NumGet(lParam+0, A_PtrSize + A_PtrSize + 8, "int")
			H := NumGet(lParam+0, A_PtrSize + A_PtrSize + 12, "int")
			Flags := NumGet(lParam+0, A_PtrSize + A_PtrSize + 16)
			if (Flags = 6147 or Flags = 6163 or Flags = 33072 or Flags = 33060) ; Minimize/Restore
				return
			Calc := SearchEdit.Calc_Position(X, Y, W, H)
			Gui SearchEdit_Dialog:Show, % "h" Calc.H " w" Calc.W " x" Calc.X " y" Calc.Y
		}
		Calc_Position(X, Y, W, H) ; Private Method
		{
			guiO := SearchEdit.Offset ; assign Class variable for convenience
			guiH:=45, guiW:=220 ; Gui - Base Height, Base Width
			if !SearchEdit.Docked
				return {"h":guiH, "w":guiW, "x":X+SearchEdit.UnDock.deltaX, "y":Y+SearchEdit.UnDock.deltaY}
			SysGet, Area, MonitorWorkArea ; AreaLeft, AreaRight, AreaBottom, AreaTop
			scaleH := Floor(guiH*A_ScreenDPI/96), scaleW := Floor(guiW*A_ScreenDPI/96) ; Adjust for different DPI screens
			if (Y+H+scaleH-guiO < AreaBottom)
				return {"h":guiH, "w":guiW, "x":X+guiO, "y":Y+H-guiO} ; bottom under outside
			else if (X+W+scaleW-guiO < AreaRight)
				return {"h":guiH, "w":guiW, "x":X+W-guiO, "y":Y+H-guiO-scaleH} ; bottom right outside
			else if (X-scaleW > AreaLeft)
				return {"h":guiH, "w":guiW, "x":X-scaleW+guiO, "y":Y+H-scaleH-guiO} ; bottom left outside
			else
				return {"h":guiH, "w":guiW, "x":X+W-scaleW-guiO, "y":Y+H-scaleH-guiO} ; bottom right inside
		}
	}
	;}

	; FUNCTIONS - LIBRARY
	;{-----------------------------------------------
	;

	;{ AHKScripts
	; Fanatic Guru
	; 2014 03 31
	;
	; FUNCTION that will find the path and file name of all AHK scripts running.
	;
	;---------------------------------------------------------------------------------
	;
	; Method:
	;   AHKScripts(ByRef Array)
	;
	; Parameters:
	;   1) {Array} variable in which to store AHK script path data array
	;
	; Returns:
	;   String containing the complete path of all AHK scripts running
	;   One path per line of string, delimiter = `n
	;
	; ByRef:
	;   Populates {Array} passed as parameter with AHK script path data
	;     {Array}.Path
	;     {Array}.Name
	;     {Array}.Dir
	;     {Array}.Ext
	;     {Array}.Title
	;     {Array}.hWnd
	;
	; Example Code:
/*
	MsgBox % AHKScripts(Script_List)
	for index, element in Script_List
		MsgBox % "#:`t" index "`nPath:`t" element.Path "`nName:`t" element.Name "`nDir:`t" element.Dir "`nExt:`t" element.Ext "`nTitle:`t" element.Title "`nhWnd:`t" element.hWnd
	return
	*/
	AHKScripts(ByRef Array)
	{
		DetectHiddenWindows, % (Setting_A_DetectHiddenWindows := A_DetectHiddenWindows) ? "On" :
			WinGet, AHK_Windows, List, ahk_class AutoHotkey
			Array := {}
			list := ""
			Loop %AHK_Windows%
			{
				hWnd := AHK_Windows%A_Index%
				WinGetTitle, Win_Name, ahk_id %hWnd%
				File_Path := RegExReplace(Win_Name, "^(.*) - AutoHotkey v[0-9\.]+$", "$1")
				SplitPath, File_Path, File_Name, File_Dir, File_Ext, File_Title
				Array[A_Index,"Path"] := File_Path
				Array[A_Index,"Name"] := File_Name
				Array[A_Index,"Dir"] := File_Dir
				Array[A_Index,"Ext"] := File_Ext
				Array[A_Index,"Title"] := File_Title
				Array[A_Index,"hWnd"] := hWnd
				list .= File_Path "`n"

			}
			DetectHiddenWindows, %Setting_A_DetectHiddenWindows%
		return Trim(list, " `n")
	}
	;}
	;}
</p>

Links:

Sources: