archrival Posted August 24, 2011 Share Posted August 24, 2011 Visual Studio and other IDEs have the nice ability to jump directly to a method declaration, I always wished SciTE had this. I've seen and and realized that thankfully the main work of automating SciTE had been done for me so I made my own. I heavily modified SciTE Jump and created Go To Definition. This will allow you to jump directly to the function underneath your mouse cursor by pressing F12 (or Alt-F12 for AutoIt Beta). This script looks in the current window and follows all #include directives to build a function list. It then selects the current "word" which when the cursor is over a function will select the function name and jumps directly to that function in the file it exists in.This can be added to the Tools menu by passing /install to the exe, the beta menu item can also be added by additionally passing /beta to the /install parameter.This is a first pass, but as most developers say "works for me". Hopefully it works for you as well.expandcollapse popup#NoTrayIcon #region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Compression=4 #endregion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <File.au3> #include <WinAPIEx.au3> Global $includepattern = '^#include ["<]([\w\.-]+)[">]' Global $funcpattern = '^Func ([\w]+)' Global $pathSeparator = "\" Global $autoitincludepath = "" Local $includes = ObjCreate("Scripting.Dictionary") Local $functions = ObjCreate("Scripting.Dictionary") Local $useBeta = False Local $install = False If ProcessExists("SciTE.exe") = 0 Then MsgBox(16, 'An unexpected error occurred.', 'SciTE needs to be running for ' & @AutoItExe & ' to function correctly.') Exit EndIf Global $hSciTE_Director = WinGetHandle("DirectorExtension"), $hSciTE_Window = WinGetHandle("[CLASS:SciTEWindow]") ; Get SciTE Handles. If $CmdLine[0] > 0 Then For $i = 1 To $CmdLine[0] If $CmdLine[$i] = "/beta" Then $useBeta = True ElseIf $CmdLine[$i] = "/install" Then $install = True EndIf Next EndIf If $useBeta Then $autoitincludepath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "betaInstallDir") & "\Include" Else $autoitincludepath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Include" EndIf If $install Then _AddSciTECommand(1, $useBeta) Exit EndIf $currentfile = _SciTE_GetCurrentFile() _ProcessFile($currentfile, $functions) WinWait("[CLASS:SciTEWindow; INSTANCE:1]") $hSciTE = WinGetHandle("[CLASS:SciTEWindow; INSTANCE:1]") ControlFocus($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]") ; Hackish way to select the word under the cursor ControlSend($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]", "^{LEFT}") ControlSend($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]", "^+{RIGHT}") ; Copy the text to the clipboard, unfortunately SciTE's edit window is non-standard ControlSend($hSciTE, "", "[CLASS:Scintilla; INSTANCE:1]", "^c") $selected = StringStripWS(ClipGet(), 8) ; Reset clipboard to empty, not ClipPut("") If ($functions.Exists($selected)) Then $fileandline = StringSplit($functions.Item($selected), "|", 2) ; Get file and line number of the function $thisfile = $fileandline[0] $thisline = $fileandline[1] _SciTE_Open($thisfile) _SciTE_GoToLine($thisline) EndIf Func _ProcessFile($file, ByRef $functions) Local $contents $filepath = _GetDirectoryName(FileGetLongName($file)) _FileReadToArray($file, $contents) Local $linenum = 0 For $line In $contents $fullincludefilename = "" $includematch = StringRegExp($line, $includepattern, 1) If Not @error And IsArray($includematch) And UBound($includematch) = 1 Then If FileExists(_PathCombine($filepath, $includematch[0])) Then $fullincludefilename = _PathCombine($filepath, $includematch[0]) ElseIf FileExists(_PathCombine($autoitincludepath, $includematch[0])) Then $fullincludefilename = _PathCombine($autoitincludepath, $includematch[0]) Else ConsoleWriteError("Unable to find include " & $includematch[0] & @CRLF) EndIf EndIf $functionmatch = StringRegExp($line, $funcpattern, 1) If Not @error And IsArray($functionmatch) And UBound($functionmatch) = 1 Then $functions.Item($functionmatch[0]) = $file & "|" & $linenum EndIf If IsArray($includematch) And Not $includes.Exists($fullincludefilename) Then $includes.Item($fullincludefilename) = $file _ProcessFile($fullincludefilename, $functions) EndIf $linenum += 1 Next EndFunc ;==>_ProcessFile Func _SciTE_Open($sFile) _SciTE_Send_Command(0, $hSciTE_Director, "open:" & StringReplace($sFile, "\", "\\")) EndFunc ;==>_SciTE_Open Func _SciTE_Send_Command($hWnd, $hSciTE, $sCmd) Local $tCmdStruct, $tCOPYDATA $sCmd = ":" & Dec(StringRight($hWnd, 8)) & ":" & $sCmd $tCmdStruct = DllStructCreate("Char[" & StringLen($sCmd) + 1 & "]") If @error Then Return SetError(1, 0, 0) EndIf DllStructSetData($tCmdStruct, 1, $sCmd) $tCOPYDATA = DllStructCreate("Ptr;DWord;Ptr") DllStructSetData($tCOPYDATA, 1, 1) DllStructSetData($tCOPYDATA, 2, StringLen($sCmd) + 1) DllStructSetData($tCOPYDATA, 3, DllStructGetPtr($tCmdStruct)) _SendMessage($hSciTE, $WM_COPYDATA, $hWnd, DllStructGetPtr($tCOPYDATA)) EndFunc ;==>_SciTE_Send_Command Func _EnumArray(ByRef $aArray, $iBefore = 3, $iStart = 1) $iStart = $iBefore + $iStart For $A = 0 To UBound($aArray, 1) - 1 $aArray[$A] = $iStart $iStart += 1 Next EndFunc ;==>_EnumArray Func _SciTE_GetCurrentFile() Local $sFile, $sTitle $sTitle = WinGetTitle($hSciTE_Window) If @error Then ; No Window Return SetError(1, 0, 0) EndIf If _IsEmpty($sTitle) Then ; New File. Return SetError(3, 0, 0) EndIf $sFile = StringRegExpReplace($sTitle, "(.*)\x20[-|*]\x20.*\z", "$1") ; Extract File Name, by Melba23 If FileExists($sFile) Then Return $sFile EndIf Return SetError(2, 0, 0) ; File Does Not Exist. EndFunc ;==>_SciTE_GetCurrentFile Func _GetDirectory($sFilePath) Return StringRegExpReplace($sFilePath, "(^.*\\)(.*)", "\1") EndFunc ;==>_GetDirectory Func _IsEmpty($sFile) If $sFile = "" Then Return 0 EndIf Return StringRegExp($sFile, '(?i)\(Untitled\)|\(NoFile\)|\(NoWindow\)') = 1 EndFunc ;==>_IsEmpty Func _SciTE_GoToLine($iLineNumber) _SciTE_Send_Command(0, $hSciTE_Director, "goto:" & $iLineNumber) EndFunc ;==>_SciTE_GoToLine Func _AddSciTECommand($iWrite = 1, $addBeta = False) Local $sScriptDir = StringRegExpReplace(_WinAPI_GetProcessFileName(ProcessExists("SciTE.exe")), "(^.*\\)(.*)", "\1") Local $aArray[3] = [2, @UserProfileDir & "\SciTEUser.properties", $sScriptDir & "properties\au3.properties"], $iNumber, $sWrite = -1 For $A = 1 To $aArray[0] $iNumber = _CommandNumber($aArray[$A]) If $iNumber = -1 Then ExitLoop EndIf $sWrite = _CommandWrite($iNumber, $addBeta) If @error = 0 Then ExitLoop EndIf Next If $sWrite = -1 Then Return SetError(1, 0, 0) EndIf If $iWrite Then FileCopy(@ScriptFullPath, $sScriptDir & "GoToDefinition\" & @ScriptName, 9) Return _SetFile($sWrite, $aArray[1]) EndIf Return 1 EndFunc ;==>_AddSciTECommand Func _CommandNumber($sFile) Local $aReturn, $sData $sData = _GetFile($sFile) If StringInStr($sData, @AutoItExe) Then Return SetError(2, 0, -1) EndIf $aReturn = StringRegExp(_GetFile($sFile), '(?s)(?i)command\.name\.(.*?)\.', 3) If @error Then Return SetError(1, 0, "") EndIf Return StringRegExpReplace($aReturn[UBound($aReturn) - 1], "[^0-9]", "") + 1 EndFunc ;==>_CommandNumber Func _CommandWrite($iNumber, $useBeta = False) Local $command, $commandname, $commandshortcut If $iNumber = "" Then Return SetError(1, 0, -1) EndIf If $useBeta Then $command = '.$(au3)="$(SciteDefaultHome)\GoToDefinition\GoToDefinition.exe" /beta' $commandname = '.$(au3)=Go To Definition (Beta)' $commandshortcut = '.$(au3)=Alt+F12' Else $command = '.$(au3)="$(SciteDefaultHome)\GoToDefinition\GoToDefinition.exe"' $commandname = '.$(au3)=Go To Definition' $commandshortcut = '.$(au3)=F12' EndIf Return '# ' & $iNumber & ' Go To Definition' & @CRLF & _ 'command.' & $iNumber & $command & @CRLF & _ 'command.name.' & $iNumber & $commandname & @CRLF & _ 'command.shortcut.' & $iNumber & $commandshortcut & @CRLF & _ 'command.subsystem.' & $iNumber & '.$(au3)=2' & @CRLF & _ 'command.save.before.' & $iNumber & '.$(au3)=2' & @CRLF & _ 'command.quiet.' & $iNumber & '.$(au3)=1' & @CRLF EndFunc ;==>_CommandWrite Func _SetFile($sString, $sFile, $iOverwrite = 0) Local $hFileOpen $hFileOpen = FileOpen($sFile, 1 + $iOverwrite) FileWrite($hFileOpen, $sString) FileClose($hFileOpen) If @error Then Return SetError(1, 0, $sString) EndIf Return $sString EndFunc ;==>_SetFile Func _GetFile($sFile) Local $hFileOpen, $sData $hFileOpen = FileOpen($sFile, 0) If $hFileOpen = -1 Then Return SetError(1, 0, "") EndIf $sData = FileRead($hFileOpen) FileClose($hFileOpen) Return $sData EndFunc ;==>_GetFile Func _PathCombine($path1, $path2) Local $path Local $uncpath = False ; Remove repeating slashes If StringLeft($path1, 2) = $pathSeparator & $pathSeparator Then $uncpath = True EndIf $path1 = StringRegExpReplace($path1, $pathSeparator & $pathSeparator & "+", $pathSeparator & $pathSeparator) $path2 = StringRegExpReplace($path2, $pathSeparator & $pathSeparator & "+", $pathSeparator & $pathSeparator) If $uncpath Then $path1 = $pathSeparator & $path1 EndIf ; Remove all trailing slashes While StringRight($path1, 1) = $pathSeparator $path1 = StringTrimRight($path1, 1) WEnd ; Remove all trailing slashes While StringLeft($path2, 1) = $pathSeparator $path2 = StringTrimLeft($path2, 1) WEnd If _StringIsNullOrEmpty($path1) And _StringIsNullOrEmpty($path2) Then $path = "" ElseIf Not _StringIsNullOrEmpty($path1) And Not _StringIsNullOrEmpty($path2) Then $path = $path1 & $pathSeparator & $path2 ElseIf _StringIsNullOrEmpty($path1) And Not _StringIsNullOrEmpty($path2) Then $path = $path2 Else $path = $path1 EndIf Return $path EndFunc ;==>_PathCombine Func _GetDirectoryName($path) Local $error = 0 Local $directory, $directorymatch $directorymatch = StringRegExp($path, "^(.*)\\", 1) If @error Then $error = @error Else If IsArray($directorymatch) Then $directory = $directorymatch[0] Else $error = -1 EndIf EndIf Return SetError($error, 0, $directory) EndFunc ;==>_GetDirectoryName Func _StringIsNullOrEmpty($string) Local $result = False If StringLen(StringStripWS($string, 8)) = 0 Then $result = True EndIf Return $result EndFunc ;==>_StringIsNullOrEmpty Link to comment Share on other sites More sharing options...
AdmiralAlkex Posted August 25, 2011 Share Posted August 25, 2011 (edited) So is this better than Tools > Jump to Function (CTRL+J) or ? Edited August 25, 2011 by AdmiralAlkex .Some of my scripts: ShiftER, Codec-Control, Resolution switcher for HTC ShiftSome of my UDFs: SDL UDF, SetDefaultDllDirectories, Converting GDI+ Bitmap/Image to SDL Surface Link to comment Share on other sites More sharing options...
archrival Posted August 25, 2011 Author Share Posted August 25, 2011 (edited) Haha, nope. I guess not. It appears to function the exact same way... However, it still works! Obviously I never knew the existing function existed, good thing I didn't spend too much time on it. Edited August 25, 2011 by archrival Link to comment Share on other sites More sharing options...
guinness Posted August 25, 2011 Share Posted August 25, 2011 I heavily modified SciTE Jump and created Go To Definition.I can see you liked I'm very flattered indeed, I honestly thought no one had seen this post of mine. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
MvGulik Posted August 25, 2011 Share Posted August 25, 2011 I honestly thought no one had seen this post of mine. Oww. I didn't. ... Although CTRL+J is a tough competitor to compete with. ... "Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions.""The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014) "Believing what you know ain't so" ... Knock Knock ... Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now