2

So I have a simple AppleScript that I think should type a bunch of keys, but the period character doesn't print in VMware Fusion's virtual machines. This is odd because my period key (.) enters a period like normal in those VMs.

MCVE

Here is my latest version that I tried:

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

I built this as a service in Automator. I run this by going to my application, then in the Title bar I select Services -> quicktype.

Expected Behavior

It should just type the text this another test: ... hello .... In many application, it does exactly that.

True Behavior

In a FreeBSD VM, pressing . renders a period at the shell (like normal). When the above script runs, however, the periods look like backspaces. End result: FreeBSD after running script

In a Windows VM, . renders a period in Notepad (like normal). When the above script runs, however, the periods seem to be ignored completely. End result: Windows Notepad after running script

Questions

Is there a way to truly emulate pressing the keys from a string of characters in AppleScript? Because clearly the above way isn't doing that.

Does anyone know why the behavior I described above is happening? Why does this work in TextMate and Terminal, and other mac apps, but not in Fusion VMs?

  • If by chance something, somewhere in the VM is changing the three consecutive periods: . . . into an ellipsis: ... it would explain the backspace behavior in the BSD shell. Try two periods instead of three, or separate them with spaces. (As it happens, I had to separate the three periods in this post with spaces to prevent them from turning into an ellipsis.) – Doc G. Apr 10 '18 at 3:45
  • @DocG. I did already; I used a bunch of different test strings. My original string was u = Address.first. I used vim to write everything so it wasn't converting anything like some word processors do. – Greg Schmit Apr 10 '18 at 3:47
1

I don't understand why this isn't working, however I do have a fix. I figured out that doing tell application "System Events" to key code 47 sends a period correctly.

So, I wrapped my read into a conditional like this:

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
| improve this answer | |

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .