È possibile digitare caratteri speciali in AppleScript?

6

Il bug:

Per alcuni caratteri e simboli speciali, AppleScript non riuscirà a keystroke del carattere effettivo e invece digiterà semplicemente la lettera a .

Un esempio:

Il seguente codice AppleScript:

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

digita la seguente stringa di testo (indipendentemente dall'applicazione in cui mi trovo):

a a a a a

Soluzione alternativa:

Si può efficace "digitare" il testo posizionando i caratteri speciali negli appunti e quindi incollando gli appunti, in questo modo:

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

Evito di usare il metodo sopra riportato per mettere il testo negli Appunti in AppleScript, perché converte necessariamente gli appunti nel rich text, nel processo.

Preferisco usare il metodo fornito qui , per garantire che il testo semplice venga inserito negli Appunti. Ma questo metodo converte caratteri speciali in mojibake.

Ad esempio, usando la stessa stringa come sopra, questo metodo mette il seguente testo negli appunti:

² ³ é ½ ₭

Tuttavia, puoi gestire manualmente questo problema aggiungendo una dichiarazione replace_chars per ogni carattere speciale.

La domanda:

C'è un modo per digitare caratteri speciali tramite AppleScript, senza che devono coinvolgere gli appunti?

Ad esempio, c'è un modo in cui posso aggiungere i caratteri speciali desiderati a un "banco" o un file di sistema da qualche parte, in modo che l'applicazione System Events li conosca?

posta rubik's sphere 02.07.2017 - 03:36
fonte

4 risposte

5

È possibile con CoreGraphics ( CGEventPost ), è un'API C (non funziona in un Cocoa-AppleScript), ma è possibile chiamare un eseguibile da un AppleScript.

Ecco il metodo per creare l'eseguibile con Xcode (versione 8.3.3):

Puoi farlo da solo (puoi scaricare Xcode da App Store ) o chiedere a una persona fidata di creare l'eseguibile.

1 - Apri Xcode, seleziona il menu " File " - > " Nuovo " - > " Progetto ..."

2-SelezionamacOSeStrumentodarigadicomando,faiclicsulpulsante" Avanti ".

3-chiamaloTypeCharacters,selezionaObjective-Ccomelingua,faiclicsulpulsante" Avanti ".

4-salvailprogettonellacartelladesiderata.

5-NellafinestradiXcode,selezional'iconamain.m,cancellailtestonellafinestraeincollaunodiquestiduecodici:

Ilcodicehabisognodiunloopacausadiunbug,ilmetodoCGEventKeyboardSetUnicodeString()troncaunastringachesuperaiventicaratteri,oèunlimite(nondocumentato).

Questocodiceutilizzauncicloperdigitareunelencodicaratteriaogniiterazione,l'elencopuòconteneredaunoaventicaratteri.(Èveloce,1secondoperdigitare2400caratteriinundocumentodiTextEditsulmiocomputer.)

#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;}

Questocodiceusauncicloperdigitareuncarattereadogniiterazione(èpiùlentodelprimocodice).

#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:questocodicefunzionasumacOSSierraedovrebbefunzionaresuElCapitan,manonsuunsistemaoperativoprecedente.

6-Selezionailmenu" Prodotto " - > " Crea ".

7 - Seleziona l'icona TypeCharacters nella cartella Prodotto , fai clic con il pulsante destro del mouse e seleziona il menu " Mostra nel Finder " in il menu contestuale.

8-DalFinder,spostailfile" TypeCharacters " nella cartella desiderata, esci Xcode , questo è tutto.

Da un AppleScript , chiama l'eseguibile, come questo

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

Una soluzione alternativa (con gli appunti):

1 - Puoi utilizzare un metodo di cacao da una 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
    
risposta data 06.07.2017 - 16:45
fonte
3

Per keystroke di un personaggio, quel personaggio deve essere mappato su un tasto effettivo sulla tastiera selezionata.

Ad esempio, posso keystroke é e ² bene, perché sto usando il layout di tastiera French - PC . Tuttavia, una tastiera QWERTY americana standard non dispone di quelle chiavi e non sarà in grado di keystroke di esse.

    
risposta data 02.07.2017 - 04:50
fonte
2

Puoi definire tutti i tuoi set di caratteri speciali come variabili, come questo

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

Alcuni caratteri speciali digitano correttamente il tasto quando li si imposta come variabili. Tutti i caratteri speciali che imposti come variabili che non eseguono correttamente la digitazione, puoi aggiungere "sostituzioni di testo" nelle preferenze di sistema per la tua tastiera.

Assicurati di selezionare tutti gli elementi e trascinali sul desktop o ovunque. Questo creerà un file .plist che sarà un backup delle impostazioni originali. Puoi trascinare questo file in qualsiasi momento.

QuindiinScriptEditor,assicuratidiaverelesostituzioniditestoabilitatenelsottomenu"sostituzioni" del menu di modifica.

    
risposta data 03.07.2017 - 08:13
fonte

Leggi altre domande sui tag