Wie bringt man Automator dazu, Text als RTF zu behandeln?

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?

Antworten (2)

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
  • Wenn die Zwischenablage leer ist, führt der Versuch, sie abzurufen, zu einem Fehler.
  • pbpaste und pbcopy verwenden ASCII, wenn die Locale-Variablen nicht gesetzt sind. Ich konnte jedoch nicht pygmentize -f rtfmit Nicht-ASCII-Zeichen arbeiten.
  • Ohne die Verzögerung set the clipboard to oldwürde manchmal ausgeführt werden, bevor der Text eingefügt würde.
Wie verwendet man dieses Skript?
Hier ist eine Schritt-für-Schritt-Anleitung: gist.github.com/lrytz/d82c1adf7337a4cecace

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.

Das Problem ist, dass der Tastendruckbefehl nur das Drücken einer Tastenkombination simuliert: Er wartet nicht darauf, dass die durch die Tastenkombination ausgelösten Aktionen abgeschlossen sind. Als ich versucht habe, die Verzögerung zu entfernen, set the clipboard to oldwurde ausgeführt, bevor der Text tatsächlich eingefügt wurde.