SciTE-Interface, Problem bei mehreren SciTE Instanzen

  • Mittels: SciTE-Interface

    _MenuCmd($IDM_CLEAROUTPUT)

    Sehr schön... funktioniert allerdings nicht korrekt, wenn man mehrere SciTE-Instanzen benutzt, denn dann hat die falsche Instanz den Fokus.

    Bsp.: In SciTE-Instanz #1 wird dein Script mit _MenuCmd($IDM_CLEAROUTPUT) ausgeführt und in SciTE-Instanz #2 wird der Output gelöscht.


    EDIT BugFix: [Verschoben in eigenen Thread]

    Link SciTE-Interface

    • Offizieller Beitrag

    Gib bitte mal ein Skriptbsp. & Beschreibung (welche Instanz hat Fokus, in welcher Instanz läuft das Skript).

    Ich habe es so probiert:

    - 2 offene Instanzen

    - in Instanz #2 ein Skript ausgeführt mit _MenuCmd($IDM_CLEAROUTPUT)

    - Output in Instanz #2 wird gelöscht

    Da dies in Ausführung einer Au3 passiert, wird natürlich nach Skriptende in die Konsole geschrieben:

    Code
    +>08:57:59 AutoIt3.exe ended.rc:0
    +>08:57:59 AutoIt3Wrapper Finished.
    >Exit code: 0    Time: 0.6022
  • Siehe Bild... SciTE-Instanz #1 hat den Fokus und darin wird auch das Script SciTE_Interface_Bsp.au3 ausgeführt, was allein schon an den Ausgaben von ConsoleWrite zu erkennen ist.


    Die Ausgaben im output panel der SciTE-Instanz #2 sollten im output panel der SciTE-Instanz #1 zu sehen sein und auch die Änderung in Zeile 28 (EINFÜGEWERT) sollte im input panel der SciTE-Instanz #1 zu sehen sein.


    Der Fehler ist in der Funktion SendSciTE_Command... denn dort ermittelst du das falsche Handle für "DirectorExtension", denn bei zwei SciTE-Instanzen gibt es ja auch zwei DirectorExtensions.

    Local $Scite_hwnd = WinGetHandle("DirectorExtension") ; Get SciTE DIrector Handle

    Hiermit wird immer die zuerst erstellte DirectorExtension gefunden, wobei völlig egal ist, welche SciTE-Instanz gerade aktiv ist.


    Weil ich mein SciTE auf UTF-8 umgestellt habe, werden die Umlaute z.B. bei EINFÜGEWERT verstümmelt.

    Code: SciTeUser.properties
    # Internationalisation
    # Unicode
    code.page=65001
    output.code.page=65001

    Ich korrigiere die Ausgaben dann normalerweise immer mit _WinAPI_WideCharToMultiByte($vUnicode, $iCodePage) ; $vUnicode = "EINFÜGEWERT", $iCodePage = 65001


    Die falsche Zeile (28) ergibt sich dadurch, dass der TIME_STAMP jetzt nur noch eine Zeile hat und nicht wie vorher drei (mit #Region).


    Die Aufgabe liegt nun darin, das richtige Handle für die DirectorExtension zu ermitteln... und evtl. sollte man noch prüfen, ob das Script un-kompiliert aus SciTE heraus gestartet wurde.



    • Offizieller Beitrag

    Der Fehler ist in der Funktion SendSciTE_Command

    OK, das hatte ich so von Jos übernommen.

    Hier die Version mit zusätzlicher Funktion um das richtige DirectorExtension-Hwnd zu bekommen:

  • Hier die Version mit zusätzlicher Funktion um das richtige DirectorExtension-Hwnd zu bekommen:

    Sehr schön!

    Func SendSciTE_Command($_sCmd) ;, $Wait_For_Return_Info = 0)

    Hehe... $Wait_For_Return_Info wird doch für _GetCurrentFile() und _GetProperty($_sProperty) benötigt... wobei der Parameter in der Funktion gar nicht ausgewertet wurde!


    Ich habe die Funktion SendSciTE_Command() nun entsprechend erweitert und auch zwei neue Funktionen hinzugefügt: _GetCurrentTabNumber() und _SetCurrentTabNumber($iTabNumber).


    Zudem habe ich noch mindestens einen weiteren Fehler behoben und die Ausgaben mit _WinAPI_WideCharToMultiByte() auf UTF-8 umgestellt, damit die Sonderzeichen korrekt dargestellt werden, wenn code.page und/oder output.code.page in SciTE auf 65001 (UTF-8) gesetzt wurde, was bei mir der Fall ist.


    Ein spezieller Fall ist übrigens _OutputToConsole()... denn wenn direkt davor ein ConsoleWrite() ausgeführt wurde und danach nicht ein wenig gewartet wird (das Sleep() in Zeile 76), erscheint die Ausgabe von _OutputToConsole() vor der Ausgabe von ConsoleWrite()! ;)


    Schaue es dir bitte mal an und sage was dazu...

    • Offizieller Beitrag

    Hehe... $Wait_For_Return_Info wird doch für _GetCurrentFile() und _GetProperty($_sProperty) benötigt... wobei der Parameter in der Funktion gar nicht ausgewertet wurde!

    Weil er nicht ausgewertet wird, hatte ich das auskommentiert. Für die Funktionalität ist der Parameter nicht erforderlich (habe ihn bisher nicht vermisst).

    Die codepage Sachen sind praktisch. :thumbup:

    Das Aktivieren der Tabs mittels Send() ist sicher nicht die optimale Lösung. Im Extension Interface gibt es die Funktion ActivateBuffer(index). Ich habe aber bisher keine Möglichkeit gefunden diese Funktion aufzurufen.

    Ein spezieller Fall ist übrigens _OutputToConsole()... denn wenn direkt davor ein ConsoleWrite() ausgeführt wurde und danach nicht ein wenig gewartet wird (das Sleep() in Zeile 76), erscheint die Ausgabe von _OutputToConsole() vor der Ausgabe von ConsoleWrite()! ;)

    Ja, das ist ein bekanntes Verhalten. Wenn man mit dem Interface arbeitet, sollte man ausschliesslich über das Interface in die Konsole schreiben. ConsoleWrite wird wohl irgendwie in die Output-Pane geleitet, wenn das Interface gerade nicht beschäftigt ist (vermute ich).

  • Für die Funktionalität ist der Parameter nicht erforderlich (habe ihn bisher nicht vermisst).

    Das kann aber schwer ins Auge gehen, denn wenn SciTE gerade stark beschäftigt ist, kann es mit der Antwort ein paar ms dauern.


    Die codepage Sachen sind praktisch.

    Ja, vor allem weil man so auch UTF-8-Zeichen in SciTE und in der Eingabeaufforderung ausgeben kann. Da (s. Post #6) hatte ich übrigens noch ein paar Fehler drin, die ich nun aber korrigiert habe.


    Das Aktivieren der Tabs mittels Send() ist sicher nicht die optimale Lösung. Im Extension Interface gibt es die Funktion ActivateBuffer(index). Ich habe aber bisher keine Möglichkeit gefunden diese Funktion aufzurufen.

    Ja, Send() ist nur eine Notlösung.


    Extension Interface.

    ...

    Die Methoden InitBuffer, ActivateBuffer und RemoveBuffer stellen die erforderlichen Hooks bereit, sodass Erweiterungen über einen Mechanismus verfügen, um Daten mit einem bestimmten Puffer zu verknüpfen, ähnlich wie SciTE die Monospace-Einstellung jedes Puffers selbst speichert. InitBuffer wird aufgerufen, wenn ein neues Dokument in einem bestimmten Puffer geöffnet wird. Der Puffer kann ein neu zugewiesener Puffer sein oder er kann wiederverwendet werden, wenn die maximale Anzahl von Puffern erreicht wurde. Sobald der Puffer initialisiert wurde, ist er der aktive Puffer. Danach wird ActivateBuffer aufgerufen, wenn der Benutzer zu einem anderen geladenen Puffer wechselt. RemoveBuffer wird aufgerufen, wenn ein vorhandener Puffer geschlossen wird. Danach werden die Indizes der Puffer, die nach dem entfernten Puffer kommen, um eins nach unten verschoben. Nach RemoveBuffer erhält die Erweiterung einen InitBuffer oder ActivateBuffer, um den neuen aktiven Puffer einzurichten.

    ...


    Der erste Satz... hm, ganz so einfach wird das wohl nicht werden.


    Mit "enumproperties" komme ich aber irgendwie nicht klar... bei enumproperties:user hätte ich weit mehr Einträge erwartet.


    • Offizieller Beitrag

    Es gibt eine interne Bufferverwaltung, damit werden ja die Tabs mit Index versehen und auch (irgendwo) gespeichert, denn nach Neustart SciTE sind die Buffer in gleicher Reihenfolge geöffnet, ohne eine Session zu speichern.

    Alternativ kann man natürlich eine eigene Bufferverwaltung erstellen, die Events für Öffnen, Schließen, Löschen, Verschieben liefert SciTE. Smarter wäre aber, wenn man das vorhandene nutzen könnte. Wenn ich etwas Muße habe, werde ich mal einen Blick in die Scintilla Source werfen. Vielleicht kann ich da etwas finden.

    • Offizieller Beitrag

    Da (s. Post #6) hatte ich übrigens noch ein paar Fehler drin, die ich nun aber korrigiert habe.

    Und neue eingebaut. :whistling: Das Auslesen der properties (_GetProperty) führt jetzt immer zum Ergebnis "0" und _GetCurrentFile bringt kein Ergebnis. _WinAPI_MultiByteToWideChar ist dort also nicht sinnvoll, da es das Ergebnis "frisst".

  • Es gibt eine interne Bufferverwaltung, damit werden ja die Tabs mit Index versehen und auch (irgendwo) gespeichert, denn nach Neustart SciTE sind die Buffer in gleicher Reihenfolge geöffnet, ohne eine Session zu speichern.

    SciTE speichert beim Beenden doch immer automatisch die Session ab... zumindest bei mir... in: $(SciteUserHome)\SciTE.session


    Und neue eingebaut. :whistling: Das Auslesen der properties (_GetProperty) führt jetzt immer zum Ergebnis "0" und _GetCurrentFile bringt kein Ergebnis. _WinAPI_MultiByteToWideChar ist dort also nicht sinnvoll, da es das Ergebnis "frisst".

    Habe die Dateien in Post #6 nochmals überarbeitet und noch eine Funktion (_GetLineCount) hinzugefügt. Bei mir funktioniert es. Wenn es bei dir immer noch nicht geht, dann liegt es wohl an der verwendeten Codepage. Hast du bei dir die Props code.page und output.code.page auf 65001 gesetzt? Man könnte auch anhand der Props bestimmen, ob und wie die Strings konvertiert werden...

    • Offizieller Beitrag

    Ja, Send() ist nur eine Notlösung.

    Oh man, den Wald vor lauter Bäumen nicht gesehen.

    Die Tab-UDF tut's doch.

    C
    Func _SetCurrentTabNumber($iTabNumber) ; $iTabNumber (0 basierter Index)
        Local $hActive = WinGetHandle('[ACTIVE]')
        Local $hTab = ControlGetHandle($hActive, '', '[CLASS:SciTeTabCtrl; INSTANCE:1]')
        If $iTabNumber > _GUICtrlTab_GetItemCount($hTab) -1 Then $iTabNumber = _GUICtrlTab_GetItemCount($hTab) -1
        _GUICtrlTab_SetCurFocus($hTab, $iTabNumber)
    EndFunc
  • Oh man, den Wald vor lauter Bäumen nicht gesehen.

    Die Tab-UDF tut's doch.

    Hehe... sehr gut... da bin aber auch schon drauf gekommen. ;)

    Code
    Func _SetCurrentTabNumber($iTabNumber) ; $iTabNumber (0 basierter Index)
        Local $hTab = ControlGetHandle(WinGetHandle('[ACTIVE]'), '', '[CLASS:SciTeTabCtrl; INSTANCE:1]')
        If IsHWnd($hTab) Then
            Local $iLastItem = _SendMessage($hTab, $TCM_GETITEMCOUNT) -1
            _SendMessage($hTab, $TCM_SETCURFOCUS, $iTabNumber > $iLastItem ? $iLastItem : $iTabNumber)
        EndIf
    EndFunc  ;==>_GetCurrentTabNumber