Automatisches Sichern

Es gab unter Automatisches Sichern (alt) eine Diskussion zu diesem Thema.
Aufgrund einer Supportanfrage habe ich mir das angeschaut und ein aktuelles AppleScript geschrieben, dass diese Funktionalität für RagTime 6.6 unterstützt.

Update 29. Jun 2018:
Ich habe nun das Skript überarbeitet, da sich gezeigt hat, dass die ursprüngliche Version beim arbeiten mit mehreren Dokumenten nicht gut funktioniert.

Dieses Skript arbeitet nun so, dass alle geöffneten Dokumente geprüft und gesichert werden. Dabei wird eine modifizierte Datei einfach nur gespeichert und beim 10. mal ("saveCopy" im Skript) wird eine Kopie im Backup-Ordner ("backupPath" im Skript) angelegt. Dabei wie der Namen durch einen Zeitstempel ergänzt. Falls nur Kopien gesichert werden sollen, kann man "saveCopy" auf 1 setzen.

Anmerkung: Ältere Backup-Dateien werden nicht gelöscht. Daher sollte der Backup-Ordner regelmäßig geprüft werden.

Update 26. Mai 2020:
Ab RagTime 6.6.6 werden die alten Pfade in der Form "Macintosh HD:backups:" nicht mehr unterstützt!
Somit muss immer ein UNIX Pfad verwendet werden. Dadurch ergibt sich folgende Änderung im unten stehenden Skript

-- ****************************************************************
-- ENTER YOUR BACKUP PATH HERE
property backupPath : "/Volumes/Macintosh HD/backups/" as string
-- ****************************************************************

Ich werde das Skript nicht ändern, damit es auch noch in älteren RagTime Versionen funktioniert.
Der Pfad muss immer mit einem "/" enden!

(*
AutoSave App for RagTime 6.6
English:
	This script must be saved in "Script Editor" as "Application" and the
	option "Stay open after run handler" must be enabled.
Deutsch:
	Dieses Skript muss im "Skript-Editor" als "Programm" gesichert werden.
	Die Option "Nach run-Handler anzeigen" muss eingeschaltet sein
*)
property saveTime : 300 -- number of seconds between executing a save
property saveCopy : 10  -- each "saveCopy" times save a duplicate, else just save the file
property saveCounter : 0

-- ****************************************************************
-- ENTER YOUR BACKUP PATH HERE
-- Use either then old colon based path or the UNIX path as shown below
--      a "/" at the end of a POSIX path is needed (at least on OS X 10.7)
--  	property backupPath : "Macintosh HD:backups:"  
-- 	property backupPath : POSIX file "/Volumes/Macintosh HD/backups/" as string
property backupPath : POSIX file "/Volumes/Macintosh HD/backups/" as string
-- ****************************************************************

-- get a "file name friendly" timestring without a colon
on dateStamp()
	set cd to current date
	set ds to year of cd as string
	set ds to ds & "-" & ((month of cd as number) as string)
	set ds to ds & "-" & ((day of cd as number) as string)
	set AppleScript's text item delimiters to {":"}
	set ts to every text item of time string of cd
	set AppleScript's text item delimiters to {""}
	set ds to ds & "-" & ts
	return ds
end dateStamp

-- build a new file name by appending date time
on getSaveName(orgName)
	set fName to orgName
	set fLen to count fName
	if text (fLen - 3) thru fLen of fName is ".rtd" then set fName to text 1 thru (fLen - 4) of fName
	return fName & "-" & dateStamp() & ".rtd"
end getSaveName

-- the idle handler is called each time after "idle time"
on idle
	try
		tell application "System Events" to set RTinFront to (frontmost of (process 1 whose bundle identifier is "de.ragtime.ragtime"))
	on error -- RagTime is not open
		return saveTime
	end try
	if RTinFront then
		set docCounter to 1
		set incSaveCount to true -- make sure that the counter is just increased once even if several files are saved
		repeat
			try
				tell application "RagTime 6.6" to set docName to name of document docCounter
			on error -- there is no other open document
				return saveTime
			end try
			set saveName to getSaveName(docName)
			tell application "RagTime 6.6" to tell document docName to set isModified to modified
			if isModified then
				if incSaveCount then
					set saveCounter to saveCounter + 1
					set incSaveCount to false
				end if
				if 0 = saveCounter mod saveCopy then
					tell application "RagTime 6.6" to save document docName in file (backupPath & saveName) with save a copy behavior
				else
					tell application "RagTime 6.6" to tell document docName to save
				end if
			end if
			set docCounter to docCounter + 1
		end repeat
	end if
	-- If an idle handler returns a positive number, that number becomes the rate (in seconds)
	-- at which the handler is called. If the handler returns a non-numeric value, the rate
	-- is not changed. You can return 0 to maintain the default delay of 30 seconds.	
	return saveTime
end idle

Für Feedback oder Verbesserungsvorschläge wäre ich dankbar.

Thomas Eckert
RagTime Support

Re: Automatisches Sichern

#12598 On 29 Juni, 2018 13:15 admin said,

Ich habe den ursprünglichen Forumeintrag geändert und das Skript aktualisiert. Mehr im text oben.

Thomas Eckert
RagTime Support

Re: Automatisches Sichern

#13478 On 26 Mai, 2023 07:13 Milchmeyer said,

Ich habe versucht, das script auf RagTime 7 anzupassen (MacOS 13.3.1)
Das ist mir leider nicht gelungen.
Vermutlich liegt das noch nicht einmal an RagTime, sondern am geänderten Applescript.

Durch den Scripteditor wird angemeckert:
Syntaxfehler
„into“, Variablenname, Klassenname, anderer Parametername oder Eigenschaft erwartet, aber Befehlsname gefunden.

Dazu wird auf die Zeile
"tell application "RagTime 7" to save document docName in file (backupPath & saveName) with save a copy behavior else" im script verwiesen und das jetzt fett geschriebene "save" wird dabei hervorgehoben.

Mache ich da etwas falsch oder oder muss das script weiter angepasst werden (bislang habe ich nur RagTime 6.6 durch Ragtime 7 ersetzt und den backupPath gesetzt)

Habt Ihr da eine Idee, was am script angepasst werden muss?

Noch schöner wäre es ja, diese Funktion gleich in RagTime einzubauen ;)

Mit freundlichem Gruß
Mathias Milchmeyer

Re: Automatisches Sichern

#13479 On 27 Mai, 2023 22:40 Thomas Kaegi said,

Hallo Mathias

Leider muss ich deine Beobachtung bestätigen. Ich bin aber nicht so scriptkundig, dass ich weiterhelfen könnte. Hingegen kann ich feststellen, dass im alternativen AutoSave, das Thomas Eckert damals auf meinen Wunsch hin erstellt hat, ohne Probleme funktioniert, nachdem ich "RagTime 6.6" durch "RagTime 7" ersetzt habe.

Freundliche Grüsse, Thomas

Re: Automatisches Sichern

#13480 On 28 Mai, 2023 11:04 Milchmeyer said,

Hallo Thomas,

schön von Dir zu lesen.
Danke für Deinen Abgleich.

Was da los ist, habe ich noch nicht verstanden.
Heute habe ich nicht die Zeit, das genauer zu beleuchten und auszuprobieren.
Aber vielen Dank für den Hinweis, dass das Script von Thomas Eckert funktioniert.
Meinst Du damit dieses hier: http://experts.ragtime.de/experts/node/3817/13479#13479
Das ist das script, mit dem ich es versucht habe, was bei mir jedoch nicht funktionierte mit RagTime 7.
Dann gibt es noch das hier: http://experts.ragtime.de/experts/node/1433
Das ist aber von Dir. (Und ich habe es noch nicht probiert)
Welches meinst Du?

Mit freundlichem Gruß
Mathias

Re: Automatisches Sichern

#13481 On 28 Mai, 2023 13:00 Thomas Kaegi said,

Hallo Mathias

Ich beziehe mich auf diesen Beitrag:

http://experts.ragtime.de/experts/node/3817#comment-12581

Da ist eigentlich alles gesagt, was es dazu zu sagen gibt, insbesondere ist der Unterschied der Funktionalität beschrieben. Mein Script basiert auf demjenigen von Thomas Eckert und die Änderung habe ich nur dank seiner Hilfe hingekriegt. Ich bin also nicht wirklich der Autor dieses Scripts!

Gruss, Thomas

Re: Automatisches Sichern

#13482 On 28 Mai, 2023 17:14 Milchmeyer said,

Hallo Thomas,

damit ist für mich erstmal klar, welches script gemeint ist.
Danke!

Mathias

Re: Automatisches Sichern

#12581 On 4 Mai, 2018 09:11 Thomas Kaegi said,

Das Script von Thomas Eckert sichert das RagTime-Dokument in definierbaren Intervallen jedes Mal neu, ist also eine Art Mini-TimeMachine für RagTime. Ich hab das mal probiert, finde es aber sehr nervig, nachher immer die grosse Zahl von "Backups" zu löschen, die ich eigentlich sowieso nicht brauche. Das Script bietet eine Ersatzlösung für die in RagTime fehlende Möglichkeit mehrerer Rückwärtsschritte.

Auch wenn RagTime sehr selten abstürzt, so passiert es doch - gemäss Murphy's law völlig logischerweise – immer dann, wenn ich seit langem zu sichern vergessen habe. Was ich also benötige, ist eine Erinnerung an das regelmässige Sichern in Intervallen von z.B. 5 Minuten. Aber einfach alle 5 Minuten automatisch das Sichern auszulösen, ist für RagTime eigentlich nicht empfehlenswert. Auch obiges Script von Thomas Eckert hat dieses Problem: Steckt man nämlich im Moment des Sichern mitten in der Eingabe des Inhalts einer Mehrzeiler-Rechenblattzelle, so wird vor dem Sichern zuerst die ganze Zelle ausgewählt, so dass mit der nächsten Taste der ganze bisherige Inhalt durch das neu eingegebene Zeichen ersetzt wird.

Bis OS 9 benützte ich eine AutoSave-Freeware (eine solche gibt es meines Wissens für macOS nicht), die mich in einstellbaren Intervallen fragte, ob ich sichern wolle oder nicht. War ich gerade mitten in einer derartigen Eingabe, so lehnte ich ab, oder akzeptierte, wusste dann aber, dass ich an den Schluss des bereits vorhandenen Inhalts der Rechenblattzelle klicken musste, bevor ich mit der Eingabe weiterfuhr. Ausgehend vom Script von Thomas Eckert versuchte ich, diese Funktionalität herzustellen. Das ist mir, mit seiner freundlichen Unterstützung(!), auch gelungen. In den Benutzer-Systemeinstellungen definiere ich diese Script-App als Anmeldeobjekt, so dass sie sicher läuft, wenn ich mit RagTime arbeite. Nachfolgend also mein Script. Statt auf die Buttons der Erinnerungsmeldung zu klicken, kann auch mit "Enter" für "Ja" und "esc" für "Nein" reagiert werden.

Freundliche Grüsse
Thomas
---
(*
AutoSave App for RagTime 6.6 – alternate approach

English:
This script must be saved in "Script Editor" as "Application" and the
option "Stay open after run handler" must be enabled.
When RagTime is running and the frontmost document was modified since the last save, the script will – at the specified interval – display an alert, asking whether the document should be saved. This approach eliminates the risk of loosing the contents of a table cell with the entry of the next key after an automatic save..
For use in English: Modify alert text and button texts!
Deutsch:
Dieses Skript muss im "Skript-Editor" als "Programm" gesichert werden.
Die Option "Nach run-Handler anzeigen" muss eingeschaltet sein
Bei laufendem RagTime wird im vorgegebenen Intervall – sofern das zuvorderst liegende Dokument seit dem letzten Sichern modifiziert wurde – gefragt, ob gesichert werden soll. Dieses Vorgehen vermeidet das Risiko, den bestehenden Inhalt einer Rechenblattzelle mit der nächsten Tastatureingabe nach einem automatischen Sichern zu verlieren.
*)
property saveTime : 300 -- number of seconds between executing a save

-- the idle handler is called each time after "saveTime"
on idle
try
tell application "System Events" to set RTinFront to (frontmost of (process 1 whose bundle identifier is "de.ragtime.ragtime"))
on error
-- RagTime is not open
return saveTime
end try
if RTinFront then
try
tell application "RagTime 6.6" to set docName to name of document 1
on error
-- there is no open document
return saveTime
end try
tell application "RagTime 6.6" to tell document docName to set isModified to modified
if isModified then
activate
beep
try
set SaveOK to display alert "Sichern?" buttons {"Nein", "Ja"} cancel button 1
if button returned of SaveOK = "Ja" then
tell application "RagTime 6.6" to tell document docName to save
end if
on error
-- just to allow ESC key for "Nein" button
end try
tell application "RagTime 6.6" to activate
end if
end if
return saveTime
end idle

Re: Automatisches Sichern

#12582 On 7 Mai, 2018 07:38 bauart said,

Hallo Thomas,

das von dir beschriebene Verhalten kann ich für mein Script nicht bestätigen.

Das liegt daran, dass ich nicht normal save mache. Ich speichere die nur mit Save A Copy behaviour. Also nur eine Kopie. Wie du schon sagst ist das eine Mini Time Machine.

Wenn ich also merke, dass ich was falsch gemacht habe oder mir das Programm abschmiert gehe ich in den Ordner mit den Backups und ziehe mir die entsprechende Datei raus. In der arbeite ich dann weiter.

Ich finde das sehr viel einfacher in der Handhabung, da man so auch mehrfaches zurückgehen einfach gestalten kann. In Minutenschritten.

Bei kleinen Dateien mit vorwiegend Text ist das auch alles sehr schnell und man merkt es gar nicht. Wenn die Dateien über 100mb groß werden habe ich die Abstände auf 10 Minuten geändert.

Zum aufräumen der Dateien habe ich ein kleines KalenderEvent geschrieben, dass Dateien in diesem Ordner löscht, die älter als eine Woche sind und das wird jede Woche automatisch ausgeführt. ;)

Re: Automatisches Sichern

#12599 On 29 Juni, 2018 17:51 Thomas Kaegi said,

Hallo Alex

Mir fällt kein Stein aus der Krone, wenn du den Vorschlag von Thomas Eckert für deine Anwendung besser findest als meinen. Bei mir ist es einfach so, dass ich relativ häufig Rechenblätter mit Mehrzeiler-Zellen für Textanordnung benütze. Wenn nun automatisch gesichert wird, auf welche Art auch immer, während ich Text in eine solche Zelle eingebe, so wird durch das Sichern der Eingabeprozess unterbrochen und die ganze Zelle ausgewählt. Wenn ich flink am Eintippen bin, wird deshalb mit der Eingabe des nächsten Zeichens der ganze vorher in die Zelle eingegebene Text gelöscht und ich muss die gesicherte Kopie holen gehen, damit ich dort weiterfahren kann, wo das Sichern meine Eingabe unterbrochen hat. Das finde ich sehr unpraktisch und ziehe deshalb die Lösung vor, in welcher ich periodisch gefragt werde, ob gesichert werden soll oder nicht.

Re: Automatisches Sichern

#12603 On 1 Juli, 2018 23:57 bauart said,

Hallo Thomas Kaegi,

Ich habe es jetzt mehrmals getestet. Auch bei Mehrzeilern und allem. Es wird nichts ausgewählt und nichts gelöscht. Das Script sichert im Hintergrund man kriegt nichts davon mit. Also das was ich gepostet habe nicht das von Thomas Eckert. Das speichert und sorgt für dein Verhalten.
Meins aber nicht. Das speichert nur Kopien und lässt das Original unangetastet.

Für das Löschen der überflüssigen Backups habe ich ein Automator Skript, dass alle Dateien löscht, die älter als eine Woche sind.

Muss ja auch keine benutzen ;) Finde nur wichtig, dass hier das richtige Verhalten archiviert ist.

Re: Automatisches Sichern

#12604 On 2 Juli, 2018 07:51 admin said,

Hierzu noch eine Anmerkung:
Wenn man in meinem Skript

 property saveCopy : 10

auf "1" setzt, wird auch jedes mal eine Kopie gesichert.

Thomas Eckert
RagTime Support

Re: Automatisches Sichern

#12606 On 2 Juli, 2018 08:26 Thomas Kaegi said,

OK - ich sehe ein, dass eure Lösung den von mir beobachteten Nachteil nicht hat, bzw. mit geeigneter Einstellung vermeiden kann. Trotzdem reicht mir meine Lösung mit der periodischen Erinnerung.

Gruss, Thomas

Re: Automatisches Sichern

#12608 On 3 Juli, 2018 06:31 bauart said,

Ja kann ich voll verstehen ;)

Beide Lösungen sind gut ;) Jeder kann selbst wählen.

Liebe Grüße

bauart