Beiträge von Professor Bernd

    Ich nutze die Gelegenheit mal, um auch die Frage nach Forum Smileys hier zu "speichern". Da wurde mal in der Shoutbox gefragt, (lang, lang ist's her,) welche Smileys man noch aufnehmen könnte. Hier mal ein paar Ideen:

    • Geistesblitz Smiley (z. B. mit einer Glühbirne über'm Kopf)
    • Günes biggrin
    • Rot-werd Smiley
    • Winken
    • und natürlich ein Prof Bernd Smiley! 8o
    • Musashi: <3:!::?: in GELB wären auch ganz nett. ^^

    Neue Version PSPad4AutoIt3 v1.2.0 beta (2020-08-03).  Download in Posting #1


    Die Highlights der neuen Features:


    Improvement Kit


    Die größte Neuerung ist das "Killerfeature" CallTips für OUDFs.


    Der CallTipViewer hat bisher nur Au3Api Funktionen angezeigt, nun sind CallTips auch für OUDFs implementiert!


    Au3Api Funktionen sind die offiziellen AutoIt Funktionen, die entweder "eingebaut" sind, oder mit AutoIt ausgeliefert werden. Kurz gesagt, alle Funktionen, die in der au3.api oder der AutoIt Hilfe zu finden sind.


    OUDF steht für "eigene benutzerdefinierte Funktion", die man NICHT in der AutoIt Hilfe findet, sondern die sich in einem Au3 Script befindet, mit dem man gerade arbeitet, oder die sich in inkludierten Au3 Scripts befinden. Dabei kann es sich um Funktionen handeln, die man selbst oder jemand anderes geschrieben hat, alles was nicht in der AutoIt Hilfe steht wird im CallTipViewer als OUDF angezeigt. Sogar volatile Funktionen werden angezeigt.


    Anzeige im CallTip


    Ein CallTip hat zwei Zeilen. Bei den Au3Api Funktionen wird in der ersten Zeile die Syntax der entsprechenden Funktion angezeigt, in der zweiten Zeile eine Beschreibung dieser Funktion. Bei den OUDFs wird in der ersten Zeile ebenfalls die Syntax der entsprechenden Funktion angezeigt, aber in der zweiten Zeile der Pfad zum Au3 Script, in dem sich diese Funktion befindet.


    Ungültige Funktionen


    Gültige Funktionen und auch die meisten ungültigen Funktionen werden im CallTip angezeigt. Es gibt nur ein paar Kriterien, mit denen ungültige Funktionen ausgefiltert werden und somit kein CallTip angezeigt wird. Es wird z. B. geprüft, ob es zu einem Funktions-Kopf einen zugehörigen Funktions-Fuß gibt und ob es nach dem Funktions-Namen eine öffnende und eine zugehörige schließende runde Klammer gibt. Aber keine Sorge, der Compiler kümmert sich um ungültige Funktionen! 8o


    Monitoring


    CallTips für OUDFs werden nur für gespeicherte Dateien angezeigt! Das heißt, wenn man in einem Script arbeitet und z. B. gerade eine neue Funktion geschrieben hat, wird sie erst im CallTip angezeigt, wenn man das Script gespeichert hat. Das kommt von daher, dass die Dateien per Folder Monitoring auf Änderungen überwacht werden. Dadurch werden die CallTips automatisch aktualisiert, wenn eine Datei gespeichert wird, sogar live* während ein CallTip gerade sichtbar ist. (* Verzögerung durch Windows ShellChangeNotify von etwa 1 Sekunde.) Auch externe Änderungen, also außerhalb von PSPad, werden erfasst. Dadurch sind die CallTips für OUDFs immer aktuell!


    Color Scheme "auto"


    Das Color Scheme des CallTips wird nun automatisch an die derzeitigen PSPad Skins angepasst. Wird eine helle Skin gewählt, wird auch der CallTip mit dem hellen Color Scheme gezeigt, wird eine dunkle Skin gewählt, wird der CallTip automatisch mit dunklem Color Scheme gezeigt.


    Und wie immer: Ich würde mich freuen, wenn ihr euch das Programm anseht und eure Meinung dazu schreibt. Lob, Kritik, Ideen, Tipps und Hinweise auf Bugs sind willkommen. Viel Spaß mit den neuen Features! :)


    Prof Bernd.

    Leute, Leute, Leute, ich bin begeistert! :party:


    BugFix Danke für die genialen Beschreibungen und Erklärungen! Damit habe ich überhaupt erst den Einstieg gefunden, um die Flags sinnvoll erkunden zu können und sie auch zu verstehen. (siehe meine zuerst falsche Interpretation von $STR_REGEXPARRAYFULLMATCH in Posting #19. :thumbup:


    Tweaky Danke für dein Beispiel und deinen unermüdlichen Einsatz, die DE AutoIt Hilfe auf Vordermann zu bringen. Und dass du uns immer wieder motivierst, dazu beizutragen, sie zu verbessern. :thumbup: (Auch wenn es naturgemäß kaum Feedback für gute Leistung geben wird, werden sich doch viele Anfänger und fortgeschrittene Anfänger (wie ich) 8o über eine hochwertige DE AutoIt Hilfe freuen!)


    autoiter Danke fürs Anschubsen des Threads! :thumbup:


    Prof. Bernd.

    Was haltet ihr davon.

    Ich finde es prima und habe es ein wenig ergänzt.


    • $STR_REGEXPARRAYFULLMATCH
    Im Ergebnisarray wird an [0] der gesamte erste Match ausgegeben, an [1..n] folgen die SubMatches des ersten Matches

    Ich habe den Eindruck, mit $STR_REGEXPARRAYFULLMATCH wird im Ergebnisarray an [0] der gesamte erste Match ausgegeben, an [1] der erste SubMatch des ersten Matches, aber nichts weiter. Zum Testen schreibe mal in deinem Code aus Posting #5 noch zwei Zahlen dazu.


    $sTest1 = "Das ist ein Text mit den Zahlen 1 und 2 und 3 und 4 und 18 und 1 und 1."


    Die Ausgabe bleibt unverändert: 1 1.


    Vergiss es, bin wohl zu müde. :sleeping: Du hast natürlich recht, das oben Beschriebene tritt nur auf, wenn es keine weitern SubMatches gibt. Gibt es weitere SubMatches, wie im Beispiel von Tweaky aus Posting #18 , werden auch diese ausgegeben.

    BugFix Großartig! Wirklich gute Beschreibung. :thumbup:


    Jetzt ohne Witz, über solche Erklärungen freue ich mich! Als Profi denkt man oft: "Das ergibt sich doch aus diesem und jenem." Aber als Hilfesuchender denkt man oft: "Häh, ... wie jetzt!?" Der Profi weiß, dass man zusätzliche Infos in den Bemerkungen findet, der Anfänger denkt: "Boah, wenn ich das bis hierhin schon nicht kapiere, brauch ich gar nicht erst weiter zu lesen."


    Damit will ich sagen, wenn man an ein Thema rangeht, das einem NICHT bekannt ist, ist man für klare Forumlierungen dankbar, so wie in deiner Beschreibung. Dabei ist es einem nicht nur recht, wenn sich Begriffe in der Beschreibung wiederholen, sondern man ist dankbar dafür. Beispiel


    Statt

    "In den Parametern werden Werte für die Art der Anzeige und die Anzahl der Elemente angegeben. Diese können A bis F und 1 bis 10 enthalten."

    besser

    "In den Parametern werden Werte für die Art der Anzeige und die Anzahl der Elemente angegeben. Die Optionen können die Werte A bis F für die Art der Anzeige enthalten und 1 bis 10 für die Anzahl der Elemente."


    In meinem Beispiel sieht das vielleicht übertrieben aus, aber als Anfänger ist man wirklich froh, wenn Aussagen quasi überdeutlich formuliert werden. :rock:

    BugFix Deinen Beitrag "Reguläre Ausdrücke übersichtlich darstellen" im Thread "Reguläre Ausdrücke Sammlung" finde ich klasse! Ebenso die Beispiele, die du hier im Thread gepostet hast! :thumbup:


    Damit der Sammlungs-Thread schön sauber bleibt, hier eine Frage: Im zweiten Beispiel-Code, also nach "Für die Verwendung weisen wir das dann einer Variablen zu:" wofür sind da die @CRLFs? Nur zur Optik, wenn man die Variable ausgeben will, oder haben die eine Bedeutung für das Pattern? ... OK, gerade wird mir klar, dass der Kommentar wahrscheinlich bis Zeilenende geht, und wenn da kein @CRLF stünde, würde der Rest des Patterns als Kommentar gesehen.


    Edit: Auch habe ich gerade den Hinweis von AspirinJunkie in der Shoutbox zur Option x gelesen, die meine Erkenntnis nahelegt:

    Zitat von AspirinJunkie in der Shoutbox

    Und um seine Pattern übersichtlicher zu formatieren ist das wichtigste die Option (?x) am Anfang. Mit der werden Leerzeichen und Zeilenumbrüche nicht als Teil des Patterns erkannt. Sprich: Man kann das Pattern vernünftig formatieren wie man es mit jedem anderen Quellcode auch tun würde.


    Auch falls ich mir meine Frage selbst beantwortet habe, poste ich das mal, vielleicht hilfts jemand anderem. :saint:

    AspirinJunkie


    Es haben sich Bugs gezeigt.



    Das Problem scheint mit unbalancierten Quotes zu tun zu haben, die auch eine oder mehrere Zeilen vorher auftreten können. Mehrere Pattern haben einen Teil, der nur findet, wenn das Gesuchte NICHT in Quotes steht. Bei den einfacheren Pattern konnte ich ein \R einsetzen, was Abhilfe geschaft hat für das Problem der fehlenden Quotes vor und hinter Klammern (Screenshot). Aber das Monster-Pattern aus Posting #21 habe ich nicht hingekriegt (Screenshot - vermischen von Funktionen).

    Im Anhang ist ein Demo-Script mit deinem Pattern aus Posting #21 und eine Test-Datei bei der die Bugs aufgetreten ist. Das Demo Script enthält noch nicht meinen Workaround, damit die Voraussetzungen nicht verfälscht werden.


    Ich vermute, das Problem hat mit den von dir erwähnten lookarounds zu tun. Kann man die Suche nach unbalancierten Quotes so begrenzen, dass sie nur innerhalb 1 Zeile gewertet werden?


    Edit: Im Demo-Script werden für besseres Debugging die @CRLFs im Ausgabe-Fenster als Zeichenfolge CRLF angezeigt.

    RegExp ist in letzter Zeit ein wichtiges Thema für mich. Dabei ist es einerseits wirklich anstrengend, andererseits hat es aber auch (Geschwindigkeits-)Vorteile. Am Anfang, als ich mich einlesen wollte, wurde mir fast schlecht von dem kryptischen Zeugs. Zum Glück gibt es in der AutoIt Hilfe wirklich hilfreiche Informationen und das gleich "seitenweise"! Derjenige, der das geschrieben hat, verdient meinen vollen Respekt, denn er hat das komplexe Thema auf ein verständliches Maß der wichtigsten Informationen heruntergebrochen.


    Nichtsdestotrotz gibt es ein paar Dinge zu verbessern, z. B. die Erklärung des Flag. Für Flag gibt es die Werte $STR_REGEXPMATCH (0), $STR_REGEXPARRAYMATCH (1), $STR_REGEXPARRAYFULLMATCH (2), $STR_REGEXPARRAYGLOBALMATCH (3) und $STR_REGEXPARRAYGLOBALFULLMATCH (4). Und was sind z. B. globale Übereinstimmungen?


    Die Erklärungen sind jedoch unvollständig bis fehlerhaft. Zur Veranschaulichung habe ich die DE Hilfe und die EN Hilfe in einem Screenshot einander gegenüber gestellt.


    Ich habe das Problem nicht im Fehler-Melde-Thread sondern hier gespostet, damit wir nach herzenslust diskutieren können, ohne den anderen Thread aufzublähen. Falls wir zu einem Konsens gelangen, kann er dort gepostet werden.


    Die Hinweise im Screenshot resultieren aus meinen Überlegungen, NICHT aus Wissen. Da sind andere weit besser informiert. Mein Wunsch wäre, dass jemand mit mehr RegEx Wissen den Flag-Bereich vielleich komplett neu erklärt. Das kann dann in die EN Hilfe übernommen werden, die scheinbar auch Fehler enthält. Wie gesagt, ich kann das allerdings nicht genau beurteilen, da ich mein Wissen er vor kurzem aufgestockt habe und den Rest habe ich mir über Tests zusammengereimt.


    Das alles sind Gründe dafür, dass in der Hilfe mal Fakten von RegEx-perten dargestellt werden, aber so, dass es ein Dummy wie ich auch versteht. Da sind bestimmt noch viele andere froh drüber! Was haltet ihr davon?


    Prof. Bernd.

    Meine Erklärung war falsch da ich mal wieder lookbehind mit lookahead verwechselt habe.

    Meine heile Welt liegt in Scherben ... ;(8o


    Streng genommen schaut es ob an der aktuellen Stelle noch das direkt folgt was du im lookahead angibst.

    Also das was davor steht wird nur gematcht wenn das dahinter folgt.

    Schon besser, meine Welt fängt wieder an zu heilen! :saint:


    Jetzt schwirrt mir der Kopf, muss ich erstmal verdauen. :)

    Funktion StringRegExp

    (?=X) Positiv Folgend: Findet, wenn das Untermuster X an der aktuellen Abfrageposition übereinstimmt.

    Das (positive) Lookbehind (das (?=...) wirkt im Grunde so: behandele den Teil ganz normal aber lasse ihn nicht Teil des Matches werden.

    Vielen Dank für diese Erklärung! Oben die Erklärung aus der AutoIt Hilfe. Ganz ehrlich, die Hilfe zu StringRegExp sollte überarbeitet werden. Deine Erklärung finde ich viel verständlicher. 8)


    So, dann seh'n wir mal, was wir draus machen. :saint:

    Du bist mein Held der Woche! :rock: Dein neues Pattern funktioniert wie gewünscht, die Leerzeilen werden entfernt.


    Dein Pattern übersteigt meine RegExp Fähigkeiten zwar um etwa 2 "Fähigkeitsklassen", aber mit all den Informationen blicke ich ein wenig durch. Ich habe dein neues Pattern minimal geändert, sodass das Leerzeichen hinter der (ausbalancierten) schließenden Klammer erhalten bleibt.


    Dein neues Pattern aus dem letzen Post und darunter meine Mini-Änderung:


    (?mi)^\h*Func\h+((?(DEFINE)(?<brackets>\((?|''(?>[^'']+|'''')*''|"(?>[^"]+|"")*"|[^\(\)\r\n"'']*|(?&brackets))*\)))\w+\h*(?&brackets)(?=\h*\R\h*EndFunc))

    (?mi)^\h*Func\h+((?(DEFINE)(?<brackets>\((?|''(?>[^'']+|'''')*''|"(?>[^"]+|"")*"|[^\(\)\r\n"'']*|(?&brackets))*\)))\w+\h*(?&brackets)\h*(?=\R\h*EndFunc))


    Im Test funktioniert es, aber das heißt ja nicht unbedingt, dass es immer so funktioniert. Deshalb die Frage: Ist das so richtig, oder hat das noch andere Auswirkungen?


    Vielen Dank für deine Mühe! :thumbup:

    Wow, wieder mal Respekt! :rock:Es funktioniert schon fast richtig, es gibt lediglich noch ungewollte Leerzeilen im Ergebnis.


    Screenshots.

    - Der erste enthält die ungültigen Funktions-Köpfe, die OHNE dein Pattern durchrutschen.

    - Der zweite zeigt das gewünschte Ergebnis.

    - Der dritte zeigt das Ergebnis MIT deinem Pattern, das noch Leerzeilen enthält.



    Ich habe mich auch daran wieder eine halbe Stunde erfolglos versucht. :( Wie kriegt man die weg? (Eine Testdatei mit gültigen und ungültigen Funktionen habe ich in den Anhang gepackt.)


    AspirinJunkie Edit: In der Eile habe ich das Demo-Script vergessen, es befindet sich nun im Anhang. Dein Pattern soll an die Stelle, wo das einzige aktive "StringRegExp" steht. Alle anderen sind entweder "StringRegExpReplace" oder auskommentiert.


    Prof. Bernd.

    AspirinJunkie


    Ich bastele nun schon eine Weile daran und kriegs nicht hin, dass das Pattern NICHT matchen soll, wenn nach den ausbalancierten Klammern bis Zeilenende noch was kommt außer Space und in der nächsten Zeile "EndFunc". Als Pseudo-Pattern würde ich es so beschreiben (die ganzen Space's dazwischen habe ich für bessere Übersicht weggelassen):


    Matche: "Func" + FuncName + ausbalancierte Klammern mit allem dazwischen + nichts außer Space bis Zeilenende + "EndFunc" in der nächsten Zeile


    Wenn du dafür ein Pattern erstellen kannst, wäre prima, aber mach dir bitte nicht zuviel Mühe. Der vorhandene Code funktioniert soweit, und dieser zusätzliche Filter dient nur der Bequemlichkeit des Users. Wie BugFix schon sagte, wäre es overdressed, da noch viel Arbeit reinzustecken.


    Anders ausgedrückt: Wenn du ein entsprechendes Pattern in 10 Minuten hinkriegst, ist's gut. Alles was länger dauert, ist nicht notwendig. Dann gehen wie lieber ein virutelles:theke: