SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • Offizieller Beitrag
    Zitat

    Dafür braucht es keine zusätzlichen lua scripte

    Schon klar, für jene, die diesen Weg nutzen ist das Skript ja auch nicht gedacht (ich verstehe auch nicht, warum man sich abwertend zu etwas äußert, für das man selbst keine Verwendung hat). Aber all jene, die im geöffneten SciTE ein neues Skript erstellen wollen mit der eingefügten Option, ist es eine Hilfe.

  • Ich lade in SciTe ein Script, in dem die Option "Opt('MustDeclareVars', 1)" nicht gesetzt ist. Nun ändere ich ein paar Zeilen und speichere die Änderungen, wobei die Option "Opt('MustDeclareVars', 1)" nicht eingefügt wird.

    Nun wähle ich im Menü Datei "Kopie speichern unter..." oder "Speichern unter..." aus... und dann wird dein Lua-Script ausgeführt... und fügt die Option "Opt('MustDeclareVars', 1)" in beide Scripte ein... sollte es aber eigentlich nicht. ;)

    • Offizieller Beitrag

    Sorry Bitnugger , dass du jetzt hier schon über ein Jahr in dem Thread auf mich warten musst. ;)

    Das von dir geschilderte Verhalten ist natürlich unerwünscht aber dem Event geschuldet, auf das das Lua Skript reagiert (OnBeforeSave). Ist auch etwas eine Sackgasse, da es ja recht viele Ausnahmebedingungen in unterschiedlichen Konstellationen gibt.

    Ich habe mir jetzt mal eine Notlösung gebastelt, dass ich bei aktiver Option für das gerade offene Skript das Einfügen verhindere. Dazu füge ich (irgendwo im Skript) den Kommentar ;[mdv0] ein. Hier in der Funktion Zeilen 6,7

    Aber ich werde mir mal weiter Gedanken machen, ob sich das anders gestalten lässt. Hauptproblem ist beim Speichern: Woher soll ich wissen ob das der erste Speichervorgang (und somit die Erfordernis zum Einfügen der Option) ist oder ich auf ein existierendes Skript zugreife. Sicher geht das nur über irgendeine Kennzeichnung (wie meine momentane Lösung). Bin da aber völlig offen für Ideen.

  • Wie wäre es den mit einer einfachen Prüfung, ob die Datei schon existiert? Welche Möglichkeiten gibt es denn? "Save", "Save as", "Save a copy", ? In allen Fällten wird im Editor der Pfad angezeigt, wenn die Datei schon existiert, und "(Untitled) *" wenn nicht.

    Oder habe ich das Problem falsch verstanden? :/

    Gruß,

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Das passiert ja, aber es ist nicht in allen Fällen aussagekräftig:

    - Options-Flag: nur bei neuen Dateien Option einfügen

    - Datei ohne Option ist offen und soll gespeichert werden als Kopie (da z.B. schreibgeschützte Datei)

    --> die Kopie existiert noch nicht, somit wird die Option eingetragen (will ich in dem Moment ja nicht)


    Das Problem ist, dass das Ereignis (OnBeforeSave) mir nicht mitteilt, welcher Menübefehl davor gestartet wurde (save, saveAs, savAsCopy). Somit sind nicht alle Szenarien durchspielbar. Eventuell werde ich den Zugriff mit Alien erweitern, aber das schaue ich mir noch in Ruhe an.

  • - Datei ohne Option ist offen und soll gespeichert werden als Kopie (da z.B. schreibgeschützte Datei)

    --> die Kopie existiert noch nicht, somit wird die Option eingetragen (will ich in dem Moment ja nicht)

    Das habe ich auch so gemeint. Man hat eine Datei geöffnet und will sie speichern als Kopie. Also existiert die Quell-Datei schon und man kann davon ausgehen, dass die Option NICHT eingefügt werden soll. If Quell-Datei exists Then lass-die-Finger-von-Kopie

    Hat man ein neues Dokument geöffnet, weiß man nicht, ob es eine au3 werden soll, und es gibt es noch keinen Pfad. Also kann beim wie auch immer gewählten Speichern-Punkt die Option eingefügt werden, falls es eine au3 wird.

    Das erschlägt vielleicht nicht alle Eventualitäten, aber besser als nichts, oder? ;)

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Man hat eine Datei geöffnet und will sie speichern als Kopie. Also existiert die Quell-Datei schon und man kann

    Ich frage ja ab: if mustdeclare == 1 and shell.fileexists(fname) then return end.

    Das greift aber nicht bei Dateien, die mit "Speichern-Als", "Speichere Kopie" gesichert werden sollen. Denn die Zieldateien existieren ja nicht, somit sind es Neudateien und die Option wird eingefügt.

    Das eigentlich Paradoxe ist, dass bei "Speichern-Als", "Speichere Kopie" AUCH in die Quelldatei, die bisher keine Option hatte, diese eingefügt wird. Anscheinend wird aus der Quelldatei zuerst die Zieldatei erstellt (durch umbenennen? - Quelle existiert dann nicht mehr). Danach wird die Quelle neu erstellt, was für uns nicht weiter sichtbar ist, da sie ihren alten Namen trägt. Zum Zeitpunkt des Speicherns ist sie dann aber AUCH neu und die Option wird eingefügt. - Das wäre zumindest für mich eine plausible Erklärung. Bleibt jetzt die Frage, wie man an diese Ereignisse kommt. Deshalb mein Verweis auf Alien, damit kann ich die WinAPI für Lua nutzbar machen.

  • Das greift aber nicht bei Dateien, die mit "Speichern-Als", "Speichere Kopie" gesichert werden sollen. Denn die Zieldateien existieren ja nicht, somit sind es Neudateien und die Option wird eingefügt.

    Warum sollte das den nicht greifen? Die Quell-Datei existiert doch und kann geprüft werden. Wenn die Quell-Datei existiert, war sich schon gespeichert. Ist keine Option (mustdeclarevars) drin, kann davon ausgeganen werden, dass sie auch beim Speichern nicht eingefügt werden soll.

    Ich habe tatsächlich alle Beiträge dieses Threads gelesen und will gerne helfen, aber so ganz verstehe ich die Aufgabenstellung nicht. Kannst du bitte mal eine kleine Liste machen, wie deine Szenarien und Wunschergebnisse aussehen? Zum Beispiel:

    • Datei wird in SciTE neu erstellt => Beim Speichern Option einfügen.
    • Datei wird von Festplatte in SciTE geladen => Beim Speichern soll Option nicht einfügt werden.
    • usw.

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Warum sollte das den nicht greifen? Die Quell-Datei existiert doch und kann geprüft werden. Wenn die Quell-Datei existiert, war sich schon gespeichert. Ist keine Option (mustdeclarevars) drin, kann davon ausgeganen werden, dass sie auch beim Speichern nicht eingefügt werden soll.

    Die Aussage von mir war keine Vermutung, sondern eine durch mein Skript (das die Prüfung ja vornimmt) validierte Beschreibung des Ist-Zustandes.

    Noch mal:

    Wenn die Option NUR bei NEUER Datei eingefügt werden soll, ist aktuell folgendes Verhalten:

    Wenn das Bevor-Speichern Ereignis ausgelöst wird, erfolgt im Ereignis-Handler die Abfrage, ob die Datei, deren Name zum Speichern übergeben wird, bereits existiert. Dabei ist NICHT ersichtlich ob es vielleicht eine Datei identischen Inhalts gibt. Existiert die Datei, wird die Funktion verlassen.

    <Speichern> einer bereits existierenden Datei

    Die Abfrage auf Existenz ist wahr und die Funktion wird verlassen. --> OK

    <Speichern-Als> einer existierenden Datei unter neuem Namen

    Es wird der Datei-Speichern-Unter-Dialog aufgerufen. Der Dateiname aus dem Dialog wird verwendet. Der Name ist neu und somit wird die Option eingefügt. Beim Speichern unter wird mit Schliessen des Dialogfensters der Tab mit der Quelldatei geschlossen. Es kann auf dem Weg nicht festgestellt werden, ob die (zuletzt offene Datei) inhaltlich mit der Zieldatei übereinstimmt und somit nur umbenannt wird.

    <Speichere Kopie>

    Ist analog, wie bei <Speichern-Als>


    Das vermutliche interne Verhalten, woraus das resultiert, habe ich in meinem letzten Post beschrieben.

    Eine Abfrage der Existenz der Quelldatei im Falle von <Speichern-Als>/<Speichern Kopie> ist somit nicht realisierbar, da der Name der jeweiligen Datei zum Ereignis-Moment NICHT abfragbar ist.

    Ist keine Option (mustdeclarevars) drin, kann davon ausgeganen werden, dass sie auch beim Speichern nicht eingefügt werden soll.

    Dann funktioniert ja die ganze Einfügeautomatik, die ich ja bei neuen Skripten WILL nicht mehr. Und ich kann alles einfach von Hand eintragen.

  • Dann funktioniert ja die ganze Einfügeautomatik, die ich ja bei neuen Skripten WILL nicht mehr. Und ich kann alles einfach von Hand eintragen.

    Das hast du aus dem Zusammenhang gerissen. Ich hatte nicht von neuen Skripten geschrieben, sondern von vorhandenen:

    Wenn die Quell-Datei existiert, war sich schon gespeichert. Ist keine Option (mustdeclarevars) drin, kann davon ausgeganen werden, dass sie auch beim Speichern nicht eingefügt werden soll.

    Wenn die Option NUR bei NEUER Datei eingefügt werden soll, ist aktuell folgendes Verhalten:

    Wenn das Bevor-Speichern Ereignis ausgelöst wird, erfolgt im Ereignis-Handler die Abfrage, ob die Datei, deren Name zum Speichern übergeben wird, bereits existiert. Dabei ist NICHT ersichtlich ob es vielleicht eine Datei identischen Inhalts gibt. Existiert die Datei, wird die Funktion verlassen.

    <Speichern-Als> einer existierenden Datei unter neuem Namen

    Es wird der Datei-Speichern-Unter-Dialog aufgerufen. Der Dateiname aus dem Dialog wird verwendet. Der Name ist neu und somit wird die Option eingefügt.

    Was hindert dich daran, statt dem Ziel-Namen den Namen der Quell-Datei im Editor zu prüfen?

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Eine Abfrage der Existenz der Quelldatei im Falle von <Speichern-Als>/<Speichern Kopie> ist somit nicht realisierbar, da der Name der jeweiligen Datei zum Ereignis-Moment NICHT abfragbar ist.

    Kannst du da nicht den Fenstertitel abfragen? Beim "Speichern als" "...Kopie" ist es auf jeden Fall das aktive Fenster.

    Ich habe es gerade probiert: Bei "Save as copy" bleibt der Titel im aktiven Editor unverändert. Bei "Save as" ändert sich der Titel des aktiven Editors nach dem Speichern. Da wäre es nun notwendig zu erfahren, zu welchem Zeitpunkt genau das OnBeforeSave Event eintritt. Tritt es ein bevor der Save-Dialog erscheint, ist der Editor-Titel noch unverändert der zur Quell-Datei passende.

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Deswegen ich zitiere mich selber

    Zitat

    Deshalb mein Verweis auf Alien, damit kann ich die WinAPI für Lua nutzbar machen.

    Alles was du ansprichst bedarf zusätzlicher Module in Lua, wenn ich es in reinem Lua lösen will.

    Ich denke wir machen dann erst mal ein Break an dieser Stelle.

  • Mir ist aufgefallen, dass die folgende Zeile aus deinem Lua-Script nur dann korrekt funktioniert, wenn die Datei ohne Inhalt gespeichert wird, bzw. auch mit *, der dann ja von AutoStampSaveVersion.lua durch einen Time Stamp ersetzt wird.

    local a, e = fileread:find(';%-%- TIME_STAMP.*\r\n')

    Werden vor dem ersten Speichern der Datei aber noch einige Zeilen Code eingeben und die Zeilenumbrüche in dem Script bestehen aus CRLF, wird Opt('MustDeclareVars', 1) an der falschen Stelle eingefügt.

    So funktioniert es aber:

    local a, e = fileread:find(';%-%- TIME_STAMP.*%d+\r\n')

    Wobei man jetzt natürlich noch meckern könnte, dass die Datei durch den Time Stamp nun gemischte Zeilenumbrüche hat... Au3OptMustDeclareVars[0.2].lua hat übrigens nur LF als Zeilenumbrüche, alle anderen Lua-Scripte von dir aber CRLF!?

    In den Zeilen mit editor:InsertText(...) habe ich zudem noch vor dem "Opt" ein \n eingefügt...

    Einmal editiert, zuletzt von Bitnugger (30. April 2020 um 21:12)