Skip to content

Instantly share code, notes, and snippets.

@ttscoff
Last active May 27, 2018 23:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ttscoff/af36bb60433b8e9ea3bd4e59f2d5c03f to your computer and use it in GitHub Desktop.
Save ttscoff/af36bb60433b8e9ea3bd4e59f2d5c03f to your computer and use it in GitHub Desktop.
A few helpers for sending keystrokes and typing strings with AppleScript
-- set the application to type into
-- you need to activate and focus a window prior to calling keyCmd
property process_name : "Finder"
on lowercase(_text)
set _output to do shell script "echo " & quoted form of (_text) & " | tr A-Z a-z"
return _output
end lowercase
(* Trigger a hotkey or character
Usage: keyCmd("hotkey to trigger")
Shortcuts:
$ : shift
~ : option
@ : command
^ : Control
Examples:
Trigger "k"
keyCmd("k")
Trigger "K"
keyCmd("K")
keyCmd("$K")
Trigger Command-down arrow
keyCmd("cmd down")
Trigger Command-I
keyCmd("cmd i")
keyCmd("@i")
Trigger Shift-Option-Command-S
keyCmd("shift opt cmd s")
keyCmd("$~@s")
*)
on keyCmd(_string)
set _mod to {}
set _codes to {{name:"left", code:123}, {name:"right", code:124}, {name:"down", code:125}, {name:"up", code:126}, {name:"escape", code:53}, {name:"esc", code:53}, {name:"pgdown", code:115}, {name:"pgup", code:119}, {name:"home", code:116}, {name:"end", code:121}, {name:"f1", code:122}, {name:"f2", code:120}, {name:"f3", code:99}, {name:"f4", code:118}, {name:"f5", code:96}, {name:"f6", code:97}, {name:"f7", code:98}, {name:"f8", code:100}, {name:"f9", code:101}, {name:"f10", code:109}, {name:"f11", code:103}, {name:"f12", code:111}, {name:"f13", code:105}, {name:"f14", code:107}, {name:"f15", code:113}, {name:"f16", code:106}, {name:"f17", code:64}, {name:"f18", code:79}, {name:"f19", code:80}, {name:"f20", code:90}, {name:"delete", code:51}, {name:"del", code:51}, {name:"tab", code:48}, {name:"return", code:36}, {name:"enter", code:76}, {name:"space", code:49}, {name:"shift", code:60}, {name:"option", code:61}, {name:"opt", code:61}, {name:"control", code:62}, {name:"ctrl", code:62}, {name:"command", code:55}, {name:"cmd", code:55}, {name:"capslock", code:48}}
if _string contains "cmd" or _string contains "command" or _string contains "⌘" or _string contains "@" then set end of _mod to command down
if _string contains "shift" or _string contains "⇧" or _string contains "$" then set end of _mod to shift down
if _string contains "opt" or _string contains "option" or _string contains "⌥" or _string contains "~" then set end of _mod to option down
if _string contains "ctrl" or _string contains "control" or _string contains "⌃" or _string contains "^" then set end of _mod to control down
log (_string)
try
set _key to last item of words of _string
on error errMsg number errNum -- errors if string is punctuation
set _key to _string
end try
if _key contains "$" or _key contains "@" or _key contains "^" or _key contains "~" then
set _key to last item of characters of _key
end if
set _code to 0
set _maybe_sys_key to my lowercase(_key)
repeat with _keycode in _codes
if name of _keycode is equal to _maybe_sys_key then
set _code to code of _keycode
end if
end repeat
log (_code)
tell application "System Events"
tell process process_name
if _code > 0 then
key code _code using _mod
else
keystroke _key using _mod
end if
end tell
end tell
end keyCmd
(* trigger a sequence of keystrokes
_sequence: Pass either a space separated string or a list of quoted keys
_delay: delay between characters, 0 for none
Usage: keySeq("character list with shortcut modifers", 0-9)
Example:
Hit ⇧⌘K and type "test"
keySeq("$@k t e s t")
keySeq({"shift cmd k","t","e","s","t")
Select two words left
keySeq({"shift opt left", "shift opt left"})
*)
on keySeq(_sequence, _delay)
if class of _sequence is not list then
set {astid, AppleScript's text item delimiters} to {AppleScript's text item delimiters, " "}
set _sequence to every text item of _sequence
set AppleScript's text item delimiters to astid
end if
repeat with _key in _sequence
if _delay > 0 then delay _delay
keyCmd(_key)
end repeat
end keySeq
(* Type a string, no modifiers, with delay
_string: characters to type
_delay: float delay (0 for none)
Usage: keyType("testing something out", 0.1)
*)
on keyType(_string, _delay)
tell application "System Events"
tell process process_name
repeat with _chr in characters of _string
if _delay > 0 then delay _delay
keystroke _key
end repeat
end tell
end tell
end keyType
-- example
set process_name to "TextEdit"
tell application process_name to activate
-- create a new doc, convert to rich text, type tab
keySeq("@n $@t tab", 1)
-- type out a sentence at a decent simulated typing speed
keyType("This is going to type out in TextEdit", 0.02)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment