Punkt ('.') kann nicht von einfachem AppleScript auf virtuelle VMware Fusion-Maschine gedruckt werden

Ich habe also ein einfaches AppleScript, von dem ich denke, dass es eine Reihe von Tasten eingeben sollte, aber das Punktzeichen wird in den virtuellen Maschinen von VMware Fusion nicht gedruckt. Das ist seltsam, weil mein Periodenschlüssel ( .) in diesen VMs wie gewohnt einen Punkt eingibt.

MCVE

Hier ist meine neueste Version, die ich ausprobiert habe:

on run {input, parameters}

    set file_text to "this another test: ... hello ..."
    delay 0.3
    repeat with ch in file_text
        tell application "System Events" to keystroke ch
        delay 0.1
    end repeat

    return input
end run

Ich habe dies als Dienst in Automator erstellt. Ich führe dies aus, indem ich zu meiner Anwendung gehe und dann in der Titelleiste Dienste -> Quicktype auswähle.

Erwartetes Verhalten

Es sollte nur den Text eingeben this another test: ... hello .... In vielen Anwendungen tut es genau das.

Wahres Verhalten

In einer FreeBSD-VM wird durch Drücken von .ein Punkt auf der Shell gerendert (wie normal). Wenn das obige Skript ausgeführt wird, sehen die Punkte jedoch wie Backspaces aus. Endresultat:FreeBSD nach Ausführung des Skripts

Rendert in einer Windows-VM .einen Punkt im Editor (wie normal). Wenn das obige Skript ausgeführt wird, scheinen die Punkte jedoch vollständig ignoriert zu werden. Endresultat:Windows Notepad nach dem Ausführen des Skripts

Fragen

Gibt es eine Möglichkeit, das Drücken der Tasten aus einer Zeichenfolge in AppleScript wirklich zu emulieren? Denn der obige Weg tut das eindeutig nicht.

Weiß jemand, warum das oben beschriebene Verhalten auftritt? Warum funktioniert das in TextMate und Terminal und anderen Mac-Apps, aber nicht in Fusion-VMs?

Wenn zufällig etwas, irgendwo in der VM die drei aufeinanderfolgenden Perioden ändert: . . . in eine Ellipse: ... es würde das Backspace-Verhalten in der BSD-Shell erklären. Versuchen Sie es mit zwei statt drei Punkten oder trennen Sie sie durch Leerzeichen. (Zufälligerweise musste ich die drei Punkte in diesem Beitrag durch Leerzeichen trennen, um zu verhindern, dass sie zu Auslassungspunkten werden.)
@DocG. Ich habe es schon gemacht; Ich habe ein paar verschiedene Testsaiten verwendet. Meine ursprüngliche Saite war u = Address.first. Früher habe ich vimalles geschrieben, also musste ich nichts umwandeln, wie es manche Textverarbeitungsprogramme tun.

Antworten (1)

Ich verstehe nicht, warum das nicht funktioniert, aber ich habe eine Lösung. Ich habe herausgefunden, dass das Ausführen tell application "System Events" to key code 47einen Punkt korrekt sendet.

Also wickelte ich meinen Lesevorgang in eine Bedingung wie diese ein:

on run {input, parameters}

    #set input_file to "/path/to/file"
    #set file_text to read input_file
    set file_text to "test: ... hello ..."
    delay 0.3
    repeat with ch in file_text
        if ch as string = "." then
            tell application "System Events" to key code 47
        else
            tell application "System Events" to keystroke ch
        end if
        delay 0.1
    end repeat

    return input
end run