Ich schreibe ein Buch und versuche, einen Dienst hinzuzufügen, um Syntaxhervorhebung für Text bereitzustellen, der in Pages mit Automator ausgewählt wurde. Ich habe einen Dienst, der ausgewählten Text akzeptiert und ihn durch einen Shell-Befehl ( pygmentize ) führt, der ihn in RTF mit Syntaxhervorhebung konvertiert.
Das Problem ist, dass Automator den zurückgegebenen Text als reinen Text behandelt und ich Kauderwelsch zurückbekomme. Ich habe versucht, die Akzepte zwischen reich und einfach hin und her zu ändern, und es macht keinen Unterschied. Ich habe versucht, die Ausgabe erfolglos über textutil zu leiten.
Meine einzige Lösung besteht im Moment darin, den Shell-Befehl mit pbcopy in die Zwischenablage kopieren zu lassen und dann einen Automator zu verwenden, um den Inhalt der Zwischenablage abzurufen. Ich würde lieber einen Weg finden, dies zu tun, ohne die Zwischenablage löschen zu müssen. Gibt es Vorschläge, wie Automator dazu gebracht werden kann, meine Shell-Befehlsausgabe als Rich-Text zu behandeln?
Gibt es irgendwie, um dies mit AppleScript zum Laufen zu bringen?
Normalerweise verwende ich solche Skripte anstelle von Automator-Diensten:
try
set old to the clipboard as record
end try
tell application "System Events" to keystroke "c" using command down
do shell script "export LC_CTYPE=UTF-8; pbpaste | /usr/local/bin/pygmentize -g -f rtf | pbcopy"
tell application "System Events" to keystroke "v" using command down
delay 0.05
try
set the clipboard to old
end try
pygmentize -f rtf
mit Nicht-ASCII-Zeichen arbeiten.set the clipboard to old
würde manchmal ausgeführt werden, bevor der Text eingefügt würde.Mögliche Rennbedingung
Ich lerne viel aus der Antwort von @Lauri Ranta, aber ich denke, dass die Antwort noch verbessert werden kann.
Ich glaube, dass ihr Drehbuch eine sogenannte "Race-Condition" hat. Eine Race-Condition kann ein Problem sein, weil es ein "Wettlauf" ist, um zu sehen, welcher Prozess zuerst beendet wird. Es gibt den pbcopy-Prozess, der unterschiedlich lange dauern kann, je nachdem, wie viel Text kopiert wird, und dann gibt es den Verzögerungsprozess in AppleScript, der für die gleiche Zeit pausiert, aber möglicherweise nicht genug Zeit. Vielleicht war eine Rennbedingung der Grund, warum die Verzögerung erforderlich war, um das Auftreten eines Fehlers zu verhindern, ich bin mir nicht sicher, aber es könnte ein Problem sein.
Für Rennbedingungen möchten Sie nicht zu lange anhalten und alles verlangsamen, und Sie möchten nicht zu wenig anhalten und einen möglichen Datenverlust verursachen, z. B. dass die alte Zwischenablage wiederhergestellt wird, während pbcopy noch kopiert.
Ich glaube, dass es gut wäre, den Unix-Befehl "wait" als Teil des Shell-Skripts aufzurufen, um zu warten, bis pbcopy beendet ist, und dann den Aufruf von "delay" im AppleScript-Teil zu beseitigen. Das fühlt sich für mich einfach besser an.
set the clipboard to old
wurde ausgeführt, bevor der Text tatsächlich eingefügt wurde.
tmm1
tmm1