ListIncludes(script_file, delim="|") { if !(attr := FileExist(script_file)) or InStr(attr,"D") return wd := A_WorkingDir SplitPath, script_file,, script_dir SetWorkingDir, %script_dir% ; ListIncludes_Recursive() uses auto-trim. atrim := A_AutoTrim AutoTrim, On ; Start the list with this file. list := ListIncludes_GetFullPathName(script_file) ; Recursively read and build a list of script files. ListIncludes_Recursive(list, script_file, script_dir, delim) SetWorkingDir, %script_dir% ; Resolve automatic includes (from the function library.) VarSetCapacity(temp_file, 260, 0) DllCall("GetTempFileName", "str", script_dir, "str", "lib", "uint", 0, "str", temp_file) RunWait, "%A_AhkPath%" /iLib "%temp_file%" "%script_file%" if (FileExist(temp_file)) { ListIncludes_Recursive(list, temp_file, script_dir, delim) FileDelete, %temp_file% } ; Restore previous auto-trim setting and working directory. AutoTrim, %atrim% SetWorkingDir, %wd% return list } ListIncludes_Recursive(ByRef list, script_file, script_dir, delim) { FileRead, script, %script_file% ; Remove any text which may contain false #includes. script := RegExReplace(script , "ms`a)^\s*/\*.*?^\s*\*/\s*" ; multi-line comments . "|\s*(?