Estoy escribiendo un libro y tratando de agregar un servicio para proporcionar resaltado de sintaxis al texto seleccionado en Pages con Automator. Tengo un servicio que acepta el texto seleccionado y lo ejecuta a través de un comando de shell ( pygmentize ) que lo convierte en RTF resaltado en sintaxis.
El problema es que cuando se devuelve el texto, Automator lo trata como texto sin formato y me devuelve un galimatías. He intentado cambiar las aceptaciones de ida y vuelta entre rico y simple y no hace ninguna diferencia. Intenté canalizar la salida a través de textutil sin éxito.
Mi única solución por ahora es hacer que el comando de shell se copie en el portapapeles con pbcopy y luego usar un Automator para tomar el contenido del portapapeles. Prefiero encontrar una manera de hacer esto sin tener que borrar el portapapeles, ¿alguna sugerencia para que Automator trate la salida de mis comandos de shell como texto enriquecido?
¿Hay alguna forma de hacer que esto funcione con AppleScript?
Usualmente uso scripts como este en lugar de los servicios de Automator:
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
trabajar con caracteres que no fueran ASCII.set the clipboard to old
, a veces se ejecutaría antes de que se pegara el texto.Posible condición de carrera
Estoy aprendiendo mucho de la respuesta de @Lauri Ranta, pero creo que la respuesta aún se puede mejorar.
Creo que su guión tiene lo que se llama una "condición de carrera". Una condición de carrera puede ser un problema porque es una "carrera" para ver qué proceso terminará primero. Está el proceso de pbcopy que puede tomar diferentes cantidades de tiempo, dependiendo de cuánto texto se esté copiando, y luego está el proceso de retraso en AppleScript que se detiene por la misma cantidad de tiempo, pero puede que no sea suficiente. Tal vez una condición de carrera es la razón por la cual se necesitaba la demora para evitar que ocurriera un error, no estoy seguro, pero podría ser un problema.
Para las condiciones de carrera, no desea hacer una pausa demasiado larga y ralentizar todo, y no desea pausar demasiado y causar una posible pérdida de datos, como la restauración del portapapeles anterior cuando pbcopy todavía se está copiando.
Creo que sería bueno llamar al comando de Unix llamado "esperar" como parte del script de shell para esperar a que finalice el pbcopy y luego eliminar la llamada a "retrasar" en la parte de AppleScript. Eso se siente mejor para mí.
set the clipboard to old
se ejecutó antes de que el texto se pegara.
tmm1
tmm1