¿Es posible presionar los caracteres especiales en AppleScript?

6

El error:

Para ciertos caracteres y símbolos especiales, AppleScript no podrá keystroke el carácter real, y en su lugar simplemente escribirá la letra a .

Un ejemplo:

El siguiente código de AppleScript:

tell application "System Events" to keystroke "² ³ é ½ ₭"

escribe la siguiente cadena de texto (sin importar en qué aplicación esté):

a a a a a

Una solución alternativa:

Uno puede efectivamente "escribir" el texto colocando los caracteres especiales en el portapapeles, y luego pegando el portapapeles, así:

set the clipboard to "² ³ é ½ ₭"
tell application "System Events" to keystroke "v" using command down

Evito usar el método anterior para colocar texto en el portapapeles en AppleScript, ya que necesariamente convierte el portapapeles en texto enriquecido, en el proceso.

Prefiero emplear el método que se proporciona aquí , para garantizar que el texto sin formato se coloque en el portapapeles. Pero, este método convierte caracteres especiales a mojibake.

Por ejemplo, utilizando la misma cadena que la anterior, este método coloca el siguiente texto en el portapapeles:

² ³ é ½ ₭

Puede explicar este problema manualmente, sin embargo, agregando la declaración replace_chars para cada personaje especial.

La pregunta:

¿Hay alguna forma de escribir caracteres especiales a través de AppleScript, sin tener que involucrar al portapapeles?

Por ejemplo, ¿hay alguna manera de que pueda agregar los caracteres especiales deseados a un "banco" o archivo de sistema en algún lugar, para que la aplicación System Events esté familiarizada con ellos?

pregunta rubik's sphere 02.07.2017 - 03:36

4 respuestas

5

Es posible con CoreGraphics ( CGEventPost ), es una API C (no funciona en un Cacao-AppleScript), pero es posible llamar a un ejecutable desde un AppleScript.

Aquí está el método para crear el ejecutable con Xcode (versión 8.3.3):

Puede hacerlo usted mismo (puede descargar Xcode de App Store ), o pedir a una persona de confianza que cree el archivo ejecutable.

1- Abre Xcode, selecciona el menú " Archivo " - > " Nuevo " - > " Proyecto ..."

2-SeleccionemacOSyHerramientadelíneadecomandos,hagaclicenelbotón" Siguiente ".

3-LlámaloTypeCharacters,seleccionaObjective-CcomoIdioma,hazclicenelbotón" Siguiente ".

4-Guardaelproyectoenlacarpetadeseada.

5-EnlaventanadeXcode,seleccioneeliconomain.m,borreeltextodelaventanaypegueunodeestosdoscódigos:

Elcódigonecesitaunbucledebidoaunerror,elmétodoCGEventKeyboardSetUnicodeString()truncaunacadenaqueexcedelosveintecaracteres,oesunlímite(nodocumentado).

Estecódigoutilizaunbucleparaescribirunalistadecaracteresencadaiteración,lalistapuedecontenerdeunoaveintecaracteres.(Esrápido,1segundoparaescribir2400caracteresenundocumentodeTextEditenmicomputadora).

#import<Foundation/Foundation.h>intmain(intargc,constchar*argv[]){@autoreleasepool{if(argc>1){NSString*theString=[NSStringstringWithUTF8String:argv[1]];NSUIntegerlen=[theStringlength];NSUIntegern,i=0;CGEventRefkeyEvent=CGEventCreateKeyboardEvent(nil,0,true);unicharuChars[20];while(i<len){n=i+20;if(n>len){n=len;}[theStringgetCharacters:uCharsrange:NSMakeRange(i,n-i)];CGEventKeyboardSetUnicodeString(keyEvent,n-i,uChars);CGEventPost(kCGHIDEventTap,keyEvent);//keydownCGEventSetType(keyEvent,kCGEventKeyUp);CGEventPost(kCGHIDEventTap,keyEvent);//keyup(type20charactersmaximum)CGEventSetType(keyEvent,kCGEventKeyDown);i=n;[NSThreadsleepForTimeInterval:0.004];//wait4/1000ofsecond,0.002it'sOKonmycomputer,Iuse0.004tobesafe,increaseitIfyoustillhaveissues}CFRelease(keyEvent);}}return0;}

Estecódigoutilizaunbucleparaescribiruncarácterencadaiteración(esmáslentoqueelprimercódigo).

#import<Foundation/Foundation.h>intmain(intargc,constchar*argv[]){@autoreleasepool{if(argc>1){NSString*theString=[NSStringstringWithUTF8String:argv[1]];UniCharuChar;CGEventRefkeyEvent=CGEventCreateKeyboardEvent(nil,0,true);for(inti=0;i<[theStringlength];i++){uChar=[theStringcharacterAtIndex:i];CGEventKeyboardSetUnicodeString(keyEvent,1,&uChar);CGEventPost(kCGHIDEventTap,keyEvent);//keydownCGEventSetType(keyEvent,kCGEventKeyUp);CGEventPost(kCGHIDEventTap,keyEvent);//keyup(typethecharacter)CGEventSetType(keyEvent,kCGEventKeyDown);[NSThreadsleepForTimeInterval:0.001];//wait1/1000ofsecond,noneedofthislineonmycomputer,Iuse0.001tobesafe,increaseitIfyoustillhaveissues}CFRelease(keyEvent);}}return0;}

Nota:estecódigofuncionaenmacOSSierraydeberíafuncionarenElCapitan,peronoenunaversiónanteriorOS.

6-Seleccioneelmenú" Producto " - > " Construir ".

7- Seleccione el icono TypeCharacters en la carpeta Producto , haga clic con el botón derecho y seleccione el menú " Mostrar en Finder " en el menú contextual.

8-DesdeelFinder,muevaelarchivo" TypeCharacters " a la carpeta deseada, salga de Xcode , eso es todo.

Desde un AppleScript , llama al ejecutable, de esta manera

set myString to "ùéèà ² ³ é ½ ₭ "
do shell script "'/full path/of/TypeCharacters' " & quoted form of myString
    
respondido por el jackjr300 06.07.2017 - 18:36
4

Una solución alternativa (con el portapapeles):

1 - Puedes usar un método de cacao desde un shell:

set tString to "² ³ é ½ ₭"
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    do shell script "/usr/bin/python -c 'import sys;from AppKit import NSPasteboard, NSPasteboardTypeString; cb=NSPasteboard.generalPasteboard();cb.declareTypes_owner_([NSPasteboardTypeString], None);cb.setString_forType_(sys.argv[1].decode(\"utf8\"), NSPasteboardTypeString)' " & quoted form of t1
end stringToClipboard

2 - O un applet Cocoa-AppleScript:

use framework "AppKit"
use scripting additions
set tString to "² ³ é ½ ₭"
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    set ca to current application
    set cb to ca's NSPasteboard's generalPasteboard()
    cb's declareTypes:{ca's NSPasteboardTypeString} owner:(missing value)
    cb's setString:t1 forType:(ca's NSPasteboardTypeString)
end stringToClipboard
    
respondido por el jackjr300 06.07.2017 - 16:45
3

Para keystroke a character, ese carácter debe asignarse a una tecla real en el teclado seleccionado.

Por ejemplo, puedo keystroke é y ² simplemente bien, porque estoy usando la distribución de teclado French - PC . Sin embargo, un teclado QWERTY estadounidense estándar no presenta esas teclas y no podrá keystroke ellas.

    
respondido por el user11633 02.07.2017 - 04:50
2

Puede definir todos sus conjuntos de caracteres especiales como variables, como esto

on specialKeys(input)
    tell application "System Events"
        keystroke input
    end tell
end specialKeys


set characterSet1 to "²³é½₭ "
set characterSet2 to "³ "
set characterSet3 to "é "
set characterSet4 to "¬Ω "
set characterSet5 to "₭ "
set characterSet6 to characterSet1 & characterSet2 & characterSet3 & characterSet4 & characterSet5

specialKeys(characterSet1)
-- ² ³ é ½ ₭ is the result from calling specialKeys(characterSet1) After adding the text replacement for “a a a a a” in my keyboard preferences

Algunos caracteres especiales pulsan correctamente cuando los configura como variables. Cualquiera de los caracteres especiales que establezca como variables que no pulsen correctamente, puede agregar "reemplazos de texto" en las preferencias del sistema para su teclado.

Asegúrese de seleccionar todos los elementos y arrástrelos a su escritorio o donde sea. Esto creará un archivo .plist que será una copia de seguridad de su configuración original. Puedes arrastrar este archivo en cualquier momento.

Luego,enScriptEditor,asegúratedetenerlosreemplazosdetextohabilitadosenelsubmenú"sustituciones" del menú de edición.

    
respondido por el wch1zpink 03.07.2017 - 08:13

Lea otras preguntas en las etiquetas