Skript Speichern mit TimeStamp

    • Offizieller Beitrag

    Hi,
    da bei Skripten ja keine automatische Versionsfortschreibung vorhanden ist und ich meine Skripte auf mehreren PC und Sticks hin- und herschleppe ist es manchmal etwas schwierig, die Übersicht zu behalten, welche Version denn die aktuelle ist.
    Darum habe ich mir überlegt, einfach bei Bedarf eine Funktion "Speichern mit TimeStamp" in SciTE zu nutzen.
    Sieht dann so aus, dass am Skriptanfang eine Region eingefügt wird:

    [autoit]

    #Region - TimeStamp
    ; 2011-04-21 14:17:49
    #EndRegion

    [/autoit]

    bzw. wenn schon vorhanden wird die Zeit aktualisiert.

    2 Probleme habe ich derzeit noch:
    1.
    Ist das zu speichernde Skript vorher editiert wurden erscheint eine Sicherheitsabfrage zum Speichern. Sicher könnte ich das Fenster abfangen und automatisiert klicken, aber das kanns ja nicht sein. Schließlich popt das Fenster ja beim händischen Speichern auch nicht auf und ich greife direkt auf das Scintilla-Menü: Speichern zu.

    Bevor ich überhaupt auf das aktuelle Skript zugreifen kann, MUSS es gespeichert werden über die Anweisung "command.save.before.40.*.au3=1"
    Dann kann ich mir auch das Speichern am Anfang meines Skriptes sparen. ;)
    2.
    Alle Versuche die Parameter für den zu selektierenden Bereich zu setzen bleiben ohne Erfolg. Wenn bereits ein Zeitstempel vorhanden ist, muß ich die Zeile selektieren und die Selektion mit der neuen Zeit ersetzen.
    Im Moment löse ich das so, dass ich in die entsprechende Zeile wechsle an Spalte 1 und dort die neue Zeit einfüge. Anschließen steht der Cursor am Ende des eingefügten Inhalts - vor der alten Zeit. Mithilfe von Send() :wacko: markiere ich nun den Rest und lösche. Finde ich allerdings wenig prickelnd.

    Mit Hilfe von Jos gelöst.

    Falls ihr Ideen habt - immer her damit.

    Einbindung wieder über die SciTEUser.properties

    Code
    # END => DO NOT CHANGE ANYTHING BEFORE THIS LINE  #-#-#-#-#-#
    #40 Save With Time Stamp
    command.40.*.au3="$(autoit3dir)\autoit3.exe" "C:\SHARE\Code_AutoIt\TEST\SaveWithTimeStamp.au3" 
    command.name.40.*.au3=SaveWithTimeStamp
    command.save.before.40.*.au3=1
    command.is.filter.40.*.au3=1
    command.shortcut.40.*.au3=Ctrl+Shift+Alt+T

    Pfad und Nummer natürlich anpassen.

    Spoiler anzeigen
    [autoit]


    #cs ==== Aufruf über SciTE Menü (SciTEUser.properties entry:) ===

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

    #40 Save With Time Stamp
    command.40.*.au3="$(autoit3dir)\autoit3.exe" "C:\SHARE\Code_AutoIt\TEST\SaveWithTimeStamp.au3"
    command.name.40.*.au3=SaveWithTimeStamp
    command.save.before.40.*.au3=1
    command.is.filter.40.*.au3=1
    command.shortcut.40.*.au3=Ctrl+Shift+Alt+T

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

    #ce ==============================================================

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

    Opt("WinSearchChildren", 1)
    Global Const $WM_COPYDATA = 74, $IDM_SAVE = 106
    Global $My_Hwnd, $Scite_hwnd, $My_Dec_Hwnd, $SciTECmd, $sReceive = ''
    Local $sFile, $sSelection, $iLine

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

    _StartUpSciTEInterface()

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

    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "goto:1,1")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "find:#Region - TimeStamp")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "askproperty:CurrentSelection")
    $sSelection = StringRegExp($sReceive, '(?::\d+:macro:stringinfo:)(.*)', 1)
    If @error Then Exit

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

    If $sSelection[0] <> "#Region - TimeStamp" Then
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "insert:" & _
    "#Region - TimeStamp\n" & _
    "; " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "\n" & _
    "#EndRegion\n\n" & $sSelection[0])
    Else
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "askproperty:SelectionStartLine")
    $iLine = StringRegExp($sReceive, '(?::\d+:macro:stringinfo:)(\d+)', 1)
    If @error Then Exit
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "goto:" & $iLine[0] +1 & ",1")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "extender:dostring editor:LineDelete()")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "insert:" & _
    "; " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & '\n')
    EndIf

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

    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "menucommand:" & $IDM_SAVE)

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

    Func _StartUpSciTEInterface()
    $Scite_hwnd = WinGetHandle("DirectorExtension")
    $My_Hwnd = GUICreate("SciTE interface", 400, 600, 10, 10)
    $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2))
    GUIRegisterMsg($WM_COPYDATA, "MY_WM_COPYDATA")
    EndFunc

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

    Func SendSciTE_Command($My_Hwnd, $Scite_hwnd, $sCmd)
    $sCmd = ":" & $My_Dec_Hwnd & ":" & $sCmd
    ConsoleWrite('-->SendSciTE_Command >' & $sCmd & @LF)
    Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
    DllStructSetData($CmdStruct, 1, $sCmd)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
    DllStructSetData($COPYDATA, 1, 1)
    DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
    DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
    'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
    'Ptr', DllStructGetPtr($COPYDATA))
    EndFunc ;==>SendSciTE_Command

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

    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
    $SciTECmdLen = DllStructGetData($COPYDATA, 2)
    Local $CmdStruct = DllStructCreate('Char[255]', DllStructGetData($COPYDATA, 3))
    $SciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $SciTECmdLen)
    If StringInStr($SciTECmd, ":macro:stringinfo:", 1) Or _
    StringInStr($SciTECmd, ":filename:", 1) Then
    If $sReceive <> $SciTECmd Then $sReceive = $SciTECmd
    EndIf
    ConsoleWrite('<--Receive' & $SciTECmd & @LF)
    EndFunc ;==>MY_WM_COPYDATA

    [/autoit]

    Edit 22.04.11: Habe auch mal eine Anfrage im EN-Forum gepostet. ==> brachte die Lösung :thumbup:

  • Schöne Idee :thumbup:.
    Eine mögliche LUA Lösung. Zugegeben, sehr simpel gehalten.

    &quot;C:\Program Files\AutoIt3\SciTE\LUA\SaveWithTimestamp.lua&quot;
    &quot;an C:\Program Files\AutoIt3\SciTE\LUA\SciTEStartup.lua anhängen&quot;
    Code
    LoadLuaFile("SaveWithTimestamp.lua")

    edit: SciTE danach neu starten.

    • Offizieller Beitrag

    BugFix , dein Script funzt einwandfrei :thumbup:

    i2c. Dein Luascript hat bei mir keine Funktion 8|

    • Offizieller Beitrag

    Ja, habe ich. Mehrfach sogar.

    Edit:
    Gibt es eigentlich einen Befehl, damit ich aus dem LuaScript heraus in die Console schreiben kann?

  • Hab's nocin einer frischen AutoIt Installation getestet, funktioniert. ?(

    - das Skriptmuss im UNterordner LUA liegen
    - das Skript muss mit dem selben Namen in die SciTEStartup.lua am Ende eingetragen werden
    - das Skript reagiert nur auf Speicherereignisse von .au3 Dateien
    - bestehende Timestamps werden ersetzt. Gibt es keinen, wird einer am Dateianfang gesetzt.

    Zitat

    Gibt es eigentlich einen Befehl, damit ich aus dem LuaScript heraus in die Console schreiben kann?


    print("Hallo Welt")

    • Offizieller Beitrag

    Habe alles so gamacht wie beschrieben, funzt aber trotzdem nicht. :wacko:

    Ich installiere mal ein frisches Scite und teste damit.... melde mich später noch mal.

    Entweder bin ich zu dumm dazu, oder es funzt unter Win7 nicht.
    Habe jetzt eine jungfräuliche Scite Installation und es geht immer noch nicht. 8|


    Edit:

    Zitat von i2c

    - das Skript muss mit dem selben Namen in die SciTEStartup.lua am Ende eingetragen werden


    Wer lesen kann ist klar im Vorteil, hatte es vor

    Code
    EventClass:BeginEvents()


    eingefügt :whistling:

    Läuft jetzt einwandfrei :thumbup:

    • Offizieller Beitrag

    Ich habe das Skript von i2c etwas erweitert, damit der Cursor nach dem TimeStamp setzen in der vorher aktuellen Zeile verbleibt und diese sichtbar ist.
    Ist doch etwas lästig, wenn jedes mal der Cursor in Zeile 1 landet. ;)

    SaveWithTimeStamp.lua
    • Offizieller Beitrag

    Ich habe mir noch überlegt, dass es vielleicht sinnvoll ist über die properties zu regeln, ob mit oder ohne TimeStamp gespeichert wird.
    Da ich adhoc nicht gefunden habe, wo die Parameter aus der properties Datei deklariert werden, habe ich einen Umweg über Datei Lesen genommen - was aber ebenso super funktioniert ;)

    Also in die "SciTEGlobale.properties" folgenden Block einfügen (Position nach Deklaration "SciteStartup.lua")

    Code
    # Globals
    ext.lua.startup.script=$(SciteDefaultHome)/Lua/SciTEStartup.lua
    #~ ext.lua.auto.reload
    #~ ext.lua.reset
    
    
    #~ TimeStamp beim Speichern Ja/Nein (1/0)
    SetTimeStamp=1


    Nun die

    geänderte SaveWithTimeStamp.lua

    abspeichern und dann noch folgendes Einfügen in die "SciTEStartup.lua" nach der Zeile "LoadLuaFileList = { }"

    Code
    --------------------------------------------------------------------------------
    -- TimeStamp Variable erzeugen, Wert aus "SciTEGlobal.properties" lesen
    --------------------------------------------------------------------------------
    SetTimeStamp = 1                                                       -- Globale Variable erstellen
    local pathSciTE = props["SciteDefaultHome"]		               -- Pfad SciTE4AutoIt
    local fin = assert(io.open(pathSciTE .. "\\SciTEGlobal.properties"))   -- Datei zum Lesen öffnen
    local sRead = fin:read("*a")                                           -- Datei einlesen
    assert(fin:close())		                                       -- Datei schließen
    local r1, r2 = string.find(sRead, "SetTimeStamp=%d")                   -- TimeStamp-Anweisung suchen
    SetTimeStamp = tonumber(string.sub(sRead, r2, r2))                     -- Wert auslesen und setzen (1/0 = J/N)


    Nach einem SciTE-Neustart gilt der Wert aus den properties.