• Hi,
    wie bereits hier habe ich ein kleines Programm erstellt was die selbst erstellten Funktionen und Parameter in einer Liste aufführt.

    Easy Func List in SciTE installieren:
    -SciTE öffnen
    -User Options File öffnen (Options -> Open User Options File)
    -Folgenden Code am Ende anfügen

    Code
    # 43 Easy Func List
    command.43.*="$(SciteDefaultHome)\EasyFuncList.exe" "$(WindowID)"
    command.name.43.*=Easy Func List
    command.shortcut.43.*=Ctrl+E

    -EasyFuncList.exe in das SciTE Verzeichnis kopieren (bei mir ist das C:\Program Files\AutoIt3\SciTE)

    Wenn man dann Easy Func List erfolgreich installiert hat braucht man nur noch Strg und E drücken und mann erhält eine Liste der Funktionsnamen (links) und deren Parameter (rechts).
    Außerdem unterstützt Easy Func List mehrere offene Tabs in SciTE und es aktualisiert sich von selbst. Mit einem Doppelklick auf eine Funktion in der Liste wird in SciTE zu ihr gesprungen.
    autoit.de/wcf/attachment/12905/


    Viel Spaß damit

  • ~~Update 1.1~~
    -mit einem Doppelklick auf eine Funktion in der Liste wird in SciTE zu ihr gesprungen. (bevor ihr springt bitte speichern, weil sonst nur an den Punkt gesprungen wird an dem die Funktion in der alten Datei war)
    -Status Bar mit Datei Analyse Fortschrittsanzeige

    //Edit: Der Tab Switch Bug ist auch behoben

    //Edit²: Ich vergaß zu sagen das ihr noch die SciTE Propertys anpassen müsst (siehe startpost) ich musste da was verändern

    • Offizieller Beitrag

    Ganz praktisch dein Script.

    Wenn ein neues Script geladen wird, dann wird auch die Liste aktualisiert.
    Bei Tabwechsel geschieht das aber nicht. Wäre praktisch wenn sich beim Tabwechsel auch dei Liste aktualisieren würde.

    • Offizieller Beitrag

    Da traut man 1 mal einer EXE und Pustekuchen. :P

    Nee, Scherz beiseite. Hab es jetzt neu Compiliert, auf einen Tabwechsel reagiert dein Script nur spuradisch.
    Mal geht es, mal nicht. Nach 10-15 Wechsel regiert dein Script gar nicht mehr drauf.


    Teste es gerade auf Scite 2.25, ob es daran liegt kann ich jetzt nicht sagen. Die anderen Rechner sind gerade mit Backups beschäftigt.

    • Offizieller Beitrag

    So, ich habe es jetzt auf Scite 1.79 probiert, das Selbe Resultat.

    Habe den Fehler aber gefunden, prüfe mal bitte nach ob es bei dir auch funzt.

    Spoiler anzeigen
    [autoit]

    Func Update()
    Local Static $OldTab
    Local Static $RegExp_FindFileNameInTitle = "((?:\\\\[^`~!@#\$%\^&\*\(\)=\+_\[\]\{\}\\\|;:'" & '",<>\/]+\\(?:\\?[^\\\/:\*\?<>\|]*\\)+|\w:\\(?:\\?[^\\\/:\*\?<>\|]+\\)*)[^\\\/:\*\?<>\|]+)\s(?:\-|\*)\sSciTE'
    Local $iInList = -1
    $sTitle = WinGetTitle($hSciTEWin)
    $sFile = StringRegExp($sTitle, $RegExp_FindFileNameInTitle, 3)
    If @error Then Return
    ;Prüfen ob Datei bereits in Liste
    For $x = 0 To UBound($aCheckSums) - 1
    If $aCheckSums[$x][0] = $sFile[0] Then
    $iInList = $x
    ExitLoop
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Switch $iInList
    Case -1
    ReDim $aCheckSums[UBound($aCheckSums) + 1][2]
    $aCheckSums[UBound($aCheckSums) - 1][0] = $sFile[0]
    $aCheckSums[UBound($aCheckSums) - 1][1] = _Crypt_HashFile($sFile[0], $CALG_MD5)
    Case Else
    $sHash = _Crypt_HashFile($sFile[0], $CALG_MD5)
    If $aCheckSums[$iInList][1] = $sHash And $OldTab = $sFile[0] Then
    Return
    Else
    $aCheckSums[$iInList][1] = $sHash
    EndIf
    EndSwitch
    $OldTab = $sFile[0]

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlStatusBar_SetText($hStatusBar, "Datei hat sich verändert. Analysiere.", 0)

    [/autoit] [autoit][/autoit] [autoit]

    $aData = FileRead($sFile[0])
    If Not @extended Then
    _GUICtrlStatusBar_SetText($hStatusBar, "Fehler beim Einlesen der Datei.", 0)
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $aData = StringSplit($aData, @CRLF, 1)
    If $aData[0] = 0 Then
    _GUICtrlStatusBar_SetText($hStatusBar, "Bereit.", 0)
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_BeginUpdate($hListView)
    _GUICtrlListView_DeleteAllItems($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 1 To $aData[0]
    GUICtrlSetData($cPhraseProcess, (($x + 1) * 100) / ($aData[0] + 1))
    $aRet = StringRegExp($aData[$x], "(?i)Func\s*(((?:\s*ByRef\s+)?[_\w][\w\d_]*)\s*\(.*\))", 3)
    If @error Then ContinueLoop
    If Mod(UBound($aRet), 2) Then ContinueLoop

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $iID = _GUICtrlListView_AddItem($hListView, $aRet[1])
    _GUICtrlListView_SetItemParam($hListView, $iID, $x)

    [/autoit] [autoit][/autoit] [autoit]

    $aVars = StringRegExp($aRet[0], "(?i)((?:\s*ByRef\s+)?\$[_\w][\w\d_]*(?:\s*=[^\)]+)?)", 3)
    If @error Then
    _GUICtrlListView_AddSubItem($hListView, $iID, "-", 1)
    ContinueLoop
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_AddSubItem($hListView, $iID, StringStripWS(_ArrayToString($aVars, ","), 4), 1)
    Next
    _GUICtrlListView_SetColumnWidth($hListView, 1, 238)
    _GUICtrlListView_EndUpdate($hListView)
    _GUICtrlStatusBar_SetText($hStatusBar, "Bereit.", 0)
    GUICtrlSetData($cPhraseProcess, 0)
    EndFunc ;==>Update

    [/autoit]

    Das Problem liegt in deinem Quellcode:

    [autoit]

    If $aCheckSums[$iInList][1] = $sHash Then
    Return

    [/autoit]


    Wenn sich die Datei nicht ändert und das tut sie auch bei einem Tabwechsel, dann verläßt du die Update Funktion und es werden
    auch nicht die entsprechenden Funktionen im ListView angezeigt.

    • Offizieller Beitrag

    Scheint jetzt alles zu klappen, teste aber erst mal weiter.

    Haddu gut gemacht. :thumbup:

  • Hi,


    Sehr gute Arbeit!

    Habe etwas gehackt:

    [autoit]

    Opt("WinTitleMatchMode", 3)
    If WinExists("[TITLE:Easy Func List]") Then
    WinActivate("Easy Func List")
    Exit
    EndIf

    [/autoit]

    unter _Crypt_Startup() in Zeile 60 eingefügt, führt dazu, dass man mit erneutem Strg+E das Fenster wieder aktivieren kann.

    Hat jemand noch einen Patch, damit eine Auswahl mit Enter auch zur Funktion springt und den Fokus wieder auf SciTE setzt?


    elchimforum

    Einmal editiert, zuletzt von elchimforum (26. März 2011 um 11:52)

    • Offizieller Beitrag

    Hi,

    Ein paar weitere Fixes:
    - Tastatursteuerung (Enter zur Auswahl)
    - Fenster vergrößerbar, klebt trotzdem weiter sauber an SciTE (das ist klasse gemacht, Sprenger!)
    - Automatisches Reaktivieren von SciTE nach Funktionsauswahl
    - Kein Verschieben von SciTE mehr am Anfang, stilles Andocken
    - Kein mehrfacher Start (siehe Post von elchimforum), stattdessen aktiviert Strg+E beim zweiten Mal das Fenster zur Funktionsauwahl per Pfeiltasten

    Installationsanweisungen wie im ersten Post :).

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #AutoIt3Wrapper_Outfile=EasyFuncList.exe
    #AutoIt3Wrapper_Icon=EasyFuncList.ico
    #AutoIt3Wrapper_UseX64=n
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <GUIListView.au3>
    #include <Crypt.au3>
    #include <GUIStatusBar.au3>
    #include <SendMessage.au3>
    ;by Sprenger120
    ;Icon by Blume
    Global $iWidth = 400, $iHeight = 600, $aOldToolPos[4], $aOldSciTEWinPos[4], $iRahmen, $aOldGUIWinPos[4], $bMoved = False, $aCheckSums[1][2]

    [/autoit] [autoit][/autoit] [autoit]

    Switch $CMDLINE[0]
    Case 1
    ShellExecute(@ScriptFullPath, $CMDLINE[1] & " -nk")
    Exit
    Case 2
    Case Else
    MsgBox(16, "Easy Func List", "Bitte nur mit SciTe ausführen!")
    Exit
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    $hSciTEWin = WinGetHandle("[REGEXPTITLE:[[:print:]]+\s[\-\*]\sSciTE]")
    If @error Then
    MsgBox(16, "UserDef Func List", "SciTE läuft nicht.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;thx 2 prog@andy
    $hWndDirector = HWnd($CMDLINE[1])
    ; Check whether we got a valid Director Window
    $WMU_GETSCITEDIRECTOR = _WinAPI_RegisterWindowMessage("SciTEDirectorInterface")
    If Not $hWndDirector Or $WMU_GETSCITEDIRECTOR <> _WinAPI_SendMessageTimeout($hWndDirector, $WMU_GETSCITEDIRECTOR) Then
    MsgBox(0, '', "No valid director interface given")
    Exit
    EndIf
    ; Find Scintilla window for direct access without DirectorInterface
    $iSciTe = WinGetProcess($hWndDirector)
    Opt("WinSearchChildren", 1)
    $aList = WinList("[CLASS:Scintilla; INSTANCE:1]")
    $hScintilla = 0
    For $i = 1 To $aList[0][0]
    If WinGetProcess($aList[$i][1]) = $iSciTe Then
    $hScintilla = $aList[$i][1]
    ExitLoop
    EndIf
    Next
    If $hScintilla = 0 Then
    MsgBox(16, "Easy Func List", "Konnte keine Verbindung zu Scintilla herstellen!")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _Crypt_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Opt("WinTitleMatchMode", 3)
    If WinExists("[TITLE:Easy Func List]") Then
    WinActivate("Easy Func List")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Position gleich an SciTE ausrichten, sonst verschiebt sich SciTE dann gleich
    $aSciTEPos = WinGetPos($hSciTEWin)
    $hGUI = GUICreate("Easy Func List", $iWidth, $iHeight + 20, $aSciTEPos[0] - $iWidth + 0, $aSciTEPos[1], $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    $cListView = GUICtrlCreateListView("", 0, 0, $iWidth - 3, $iHeight - 1, $LVS_SINGLESEL, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    $hListView = GUICtrlGetHandle($cListView)
    $cPhraseProcess = GUICtrlCreateProgress(0, 0)
    _GUICtrlListView_AddColumn($hListView, "Name der Funktion", 150)
    _GUICtrlListView_AddColumn($hListView, "Parameter", 238)
    Dim $aParts[2] = [190, 260]
    $hStatusBar = _GUICtrlStatusBar_Create($hGUI, $aParts)
    _GUICtrlStatusBar_EmbedControl($hStatusBar, 1, GUICtrlGetHandle($cPhraseProcess))
    _GUICtrlStatusBar_SetText($hStatusBar, "Bereit.")
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    [/autoit] [autoit][/autoit] [autoit]

    $btnJump = GUICtrlCreateDummy()
    Dim $AccelKeys[1][2] = [["{ENTER}", $btnJump]]
    GUISetAccelerators($AccelKeys)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister("Update", 1000)
    Update()
    While True
    Switch GUIGetMsg()
    Case $btnJump
    _jump()
    Case -3
    Exit
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    $aSciTEPos = WinGetPos($hSciTEWin)
    $aToolPos = WinGetPos($hGUI)
    If @error Then Exit
    ;Wenn sich die Coordinaten/Größe verändert haben
    If ($aToolPos[2] <> $aOldToolPos[2]) Or ($aSciTEPos[0] <> $aOldSciTEWinPos[0]) Or ($aSciTEPos[1] <> $aOldSciTEWinPos[1]) Or ($aSciTEPos[3] <> $aOldSciTEWinPos[3]) Then
    WinMove($hGUI, "", $aSciTEPos[0] - $aToolPos[2] + 0, $aSciTEPos[1])
    $aOldSciTEWinPos = $aSciTEPos
    $aOldToolPos = $aToolPos
    $bMoved = True
    _GUICtrlStatusBar_Resize($hStatusBar) ;Damit die statusbar nicht verschwindet
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Update()
    Local Static $RegExp_FindFileNameInTitle = "((?:\\\\[^`~!@#\$%\^&\*\(\)=\+_\[\]\{\}\\\|;:'" & '",<>\/]+\\(?:\\?[^\\\/:\*\?<>\|]*\\)+|\w:\\(?:\\?[^\\\/:\*\?<>\|]+\\)*)[^\\\/:\*\?<>\|]+)\s(?:\-|\*)\sSciTE'
    Local $iInList = -1
    Local Static $LastFile = -1
    $sTitle = WinGetTitle($hSciTEWin)
    $sFile = StringRegExp($sTitle, $RegExp_FindFileNameInTitle, 3)
    If @error Then Return

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aCheckSums) - 1
    If $aCheckSums[$x][0] = $sFile[0] Then
    $iInList = $x
    ExitLoop
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $sHash = _Crypt_HashFile($sFile[0], $CALG_MD5)
    ;Wenn eine andere datei ausgwählt wurde | oder die datei noch nicht in der liste ist | oder die datei gleich geblieben ist aber der hash sich verändert hat
    If $sFile[0] <> $LastFile Or $iInList = -1 Or ($sFile[0] = $LastFile And $aCheckSums[$iInList][1] <> $sHash) Then
    ;Prüfen ob Datei bereits in Liste
    If $iInList = -1 Then
    ReDim $aCheckSums[UBound($aCheckSums) + 1][2]
    $aCheckSums[UBound($aCheckSums) - 1][0] = $sFile[0]
    $aCheckSums[UBound($aCheckSums) - 1][1] = $sHash
    Else
    $aCheckSums[$iInList][1] = $sHash
    EndIf
    Else
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlStatusBar_SetText($hStatusBar, "Datei hat sich verändert. Analysiere.", 0)

    [/autoit] [autoit][/autoit] [autoit]

    $aData = FileRead($sFile[0])
    If Not @extended Then
    _GUICtrlStatusBar_SetText($hStatusBar, "Fehler beim Einlesen der Datei.", 0)
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $aData = StringSplit($aData, @CRLF, 1)
    If $aData[0] = 0 Then
    _GUICtrlStatusBar_SetText($hStatusBar, "Bereit.", 0)
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_BeginUpdate($hListView)
    _GUICtrlListView_DeleteAllItems($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 1 To $aData[0]
    GUICtrlSetData($cPhraseProcess, (($x + 1) * 100) / ($aData[0] + 1))
    $aRet = StringRegExp($aData[$x], "(?i)Func\s*(((?:\s*ByRef\s+)?[_\w][\w\d_]*)\s*\(.*\))", 3)
    If @error Then ContinueLoop
    If Mod(UBound($aRet), 2) Then ContinueLoop

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $iID = _GUICtrlListView_AddItem($hListView, $aRet[1])
    _GUICtrlListView_SetItemParam($hListView, $iID, $x)

    [/autoit] [autoit][/autoit] [autoit]

    $aVars = StringRegExp($aRet[0], "(?i)((?:\s*ByRef\s+)?\$[_\w][\w\d_]*(?:\s*=[^\)]+)?)", 3)
    If @error Then
    _GUICtrlListView_AddSubItem($hListView, $iID, "-", 1)
    ContinueLoop
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_AddSubItem($hListView, $iID, StringStripWS(_ArrayToString($aVars, ","), 4), 1)
    Next
    _GUICtrlListView_SetColumnWidth($hListView, 1, 238)
    _GUICtrlListView_EndUpdate($hListView)
    _GUICtrlStatusBar_SetText($hStatusBar, "Bereit.", 0)
    GUICtrlSetData($cPhraseProcess, 0)
    $LastFile = $sFile[0]
    EndFunc ;==>Update

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case -4
    MsgBox(0, "", 'ENTER' & @CRLF)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
    ;http://www.autoitscript.com/forum/topic/30…372#entry221372
    Local $tagNMHDR, $event
    $tagNMHDR = DllStructCreate("int;int;int", $lParam);hwnd, id, code
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)

    [/autoit] [autoit][/autoit] [autoit]

    If DllStructGetData($tagNMHDR, 1) = $hListView And $event = $NM_DBLCLK Then
    _jump()
    EndIf ;==>WM_NOTIFY

    [/autoit] [autoit][/autoit] [autoit]

    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOVE($hWndGUI, $MsgID, $wParam, $lParam)
    If $bMoved Then
    $bMoved = False
    Return $GUI_RUNDEFMSG
    EndIf
    $aGUIPos = WinGetPos($hGUI)
    If ($aGUIPos[0] <> $aOldGUIWinPos[0]) Or ($aGUIPos[1] <> $aOldGUIWinPos[1]) Or ($aGUIPos[2] <> $aOldGUIWinPos[2]) Then
    WinMove($hSciTEWin, "", $aGUIPos[0] + $aGUIPos[2] - 0, $aGUIPos[1])
    $aOldGUIWinPos = $aGUIPos
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_MOVE

    [/autoit] [autoit][/autoit] [autoit]

    Func Sci_SetCurrentLine($Sci, $Line)
    ;http://www.autoitscript.com/forum/topic/51547-scilexer-udf/
    Local $SCI_GOTOLINE = 2024
    _SendMessageA($Sci, $SCI_GOTOLINE, $Line - 1, 0, 0, "int", "int", "long")
    If @error Then
    Return 0
    Else
    Return 1
    EndIf
    EndFunc ;==>Sci_SetCurrentLine

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _jump()
    $aSelect = _GUICtrlListView_GetSelectedIndices($hListView, True)
    If $aSelect[0] <> 0 Then Sci_SetCurrentLine($hScintilla, _GUICtrlListView_GetItemParam($hListView, $aSelect[1]))
    WinActivate($hSciTEWin)
    EndFunc ;==>_jump

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinAPI_SendMessageTimeout($hWnd, $iMessage, $wParam = 0, $lParam = 0, $iTimeout = 1000, $iFlags = 0)
    ; Author: Yashied
    Local $Ret = DllCall('user32.dll', 'lresult', 'SendMessageTimeoutW', 'hwnd', $hWnd, 'uint', $iMessage, 'wparam', $wParam, 'lparam', $lParam, 'uint', $iFlags, 'uint', $iTimeout, 'dword_ptr*', 0)

    [/autoit] [autoit][/autoit] [autoit]

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, -1)
    EndIf
    Return $Ret[7]
    EndFunc ;==>_WinAPI_SendMessageTimeout

    [/autoit]

    Happy Coding!
    Johannes

    • Offizieller Beitrag

    Sauber gemacht, peethebee.

    Jetzt stehen die beiden Fenster auch auf der selben Höhe. :D

    [autoit]

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    [/autoit]


    und die dazugehörige Funktion sind aber überflüssig ;)