This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
AppleScript [2015/12/16 13:10] ccstone created |
AppleScript [2019/03/28 14:41] (current) JMichaelTX ADD tell block to first example. |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== AppleScript Tips and Tricks for Keyboard Maestro ====== | + | ====== Using AppleScript to Get and Set Keyboard Maestro Variables ====== |
- | \\ | + | |
- | ==== Create Keyboard Maestro variable using AppleScript. ==== | + | Keyboard Maestro Version 7.1 introduced a streamlined way to Get and Set Keyboard Maestro Variables from AppleScript. |
- | # Keyboard Maestro — Create variable "<variable name>" | + | In AppleScript, you can tell the application "Keyboard Maestro Engine" to: |
- | <code> | + | ```applescript |
tell application "Keyboard Maestro Engine" | tell application "Keyboard Maestro Engine" | ||
- | make new variable with properties {name:"MyVariableName", value:MyVariableValue} | + | getvariable <KM Variable Name> |
+ | setvariable <KM Variable Name> to <New Value> | ||
end tell | end tell | ||
- | </code> | + | ``` |
- | Note that the name MUST be a string, although you can hold that string in a varible: | + | where both the `<KM Variable Name>` and `<New Value>` are text values. |
- | <code> | + | **For more details, see:** |
- | set someVariable to "MyVariableName" | + | - [[manual:Scripting|Scripting article in the Manual Section]]. |
- | make new variable with properties {name:someVariable, value:MyVariableValue} | + | - [[action:Execute_an_AppleScript|Execute AppleScript Action]]. |
- | </code> | + | |
- | ==== Set Keyboard Maestro variable using AppleScript. ==== | + | ===== Global Variables ===== |
- | <code> | + | Global Variables (available in //all// macros) may be got and set like this: |
- | # Keyboard Maestro — Set value of variable "<variable name>" | + | |
- | # Requires KM7.0.2 or higher. | + | ```applescript |
- | set myText to "whatever" | + | ### Requires Keyboard Maestro 7.1+ ### |
+ | |||
+ | --- Set AppleScript Variables to KM Variable Name and Value --- | ||
+ | set myKMVar to "My KM Var Name" | ||
+ | set myASVar to "TBD" -- default value of KM variable, will be updated | ||
tell application "Keyboard Maestro Engine" | tell application "Keyboard Maestro Engine" | ||
- | if variable "myKMVariableName" exists then | + | |
- | set value of variable "myKMVariableName" to myText | + | ### GET ### |
- | else | + | -- IF KM Variable does NOT exist, the AS Variable will be set to empty string -- |
- | make new variable with properties {name:"myKMVariableName", value:myText} | + | |
- | end if | + | -- Use Explicit Quoted Text -- |
+ | set myASVar to getvariable "My KM Var Name" | ||
+ | -- OR, Use Previously Defined AppleScript Variables -- | ||
+ | set myASVar to getvariable myKMVar | ||
+ | |||
+ | |||
+ | |||
+ | ### SET ### | ||
+ | -- IF KM Variable does NOT exist, it will be created -- | ||
+ | |||
+ | -- Use Explicit Quoted Text -- | ||
+ | setvariable "My KM Var Name" to "A new value" | ||
+ | -- OR, Use Previously Defined AppleScript Variables -- | ||
+ | setvariable myKMVar to myASVar | ||
+ | | ||
end tell | end tell | ||
- | </code> | + | ``` |
- | ==== Get Keyboard Maestro variable using AppleScript. ==== | + | **Real-World Example** |
+ | |||
+ | Normally, you would not have both a GET and a SET variable within the same AppleScript tell block.\\ | ||
+ | Here's a real-world example, but with the error checking removed to simplify. | ||
+ | |||
+ | ```applescript | ||
+ | ### Requires Keyboard Maestro 7.1+ ### | ||
+ | |||
+ | --- GET REQUIRED KM VARIABLES --- | ||
- | <code> | ||
- | # Keyboard Maestro — Get value of variable "<variable name>" | ||
- | # Requires KM7.0.2 or higher. | ||
tell application "Keyboard Maestro Engine" | tell application "Keyboard Maestro Engine" | ||
- | if variable "myKMVariableName" exists then | + | set mainStr to getvariable "SCPT__MainString" |
- | set myAppleScriptVariableName to value of variable "myKMVariableName" | + | set subStr to getvariable "SCPT__StringToFind" |
- | end if | + | |
end tell | end tell | ||
- | </code> | + | |
+ | --- PROCESS THESE KM VARIABLES --- | ||
+ | |||
+ | --- Get Start of StringToFind --- | ||
+ | set posSubStr to offset of subStr in mainStr | ||
+ | |||
+ | --- SET OUTPUT KM VARIABLE --- | ||
+ | |||
+ | tell application "Keyboard Maestro Engine" to setvariable "SCPT__PosSubStr" to posSubStr | ||
+ | ``` | ||
+ | |||
+ | ===== Local & Instance Variables ===== | ||
+ | |||
+ | |||
+ | To get or set [[manual:Variables#Instance_Variables_v8|Local or Instance Variables]], you must pass the macro execution instance to the `getvariable` or `setvariable` command. The instance is passed in to your script via the KMINSTANCE environment variable (v8.0.3+). | ||
+ | |||
+ | * //Local Variables// are denoted by a Variable with the prefix of "Local". | ||
+ | * //Instance Variables// are denoted by a Variable with the prefix of "Instance". | ||
+ | |||
+ | ```applescript | ||
+ | ### Requires Keyboard Maestro 8.0.3+ ### | ||
+ | |||
+ | set kmInst to system attribute "KMINSTANCE" | ||
+ | tell application "Keyboard Maestro Engine" | ||
+ | set kmLocalVar1 to getvariable "Local__SomeLocalVariable" instance kmInst | ||
+ | setvariable "Local__FromAS" instance kmInst to "Variable set in AppleScript." | ||
+ | end tell | ||
+ | |||
+ | log kmLocalVar1 | ||
+ | ``` | ||
+ | |||
+ | |||
+ | ===== Dictionary Values ===== | ||
+ | |||
+ | You can read and write [[manual:Dictionaries|Dictionary]] values from AppleScript. | ||
+ | |||
+ | ```applescript | ||
+ | ### Requires Keyboard Maestro 8.0+ ### | ||
+ | |||
+ | tell application "Keyboard Maestro Engine" | ||
+ | set kmDictList to name of dictionaries | ||
+ | set dictKeyList to dictionary keys of dictionary "First Names" | ||
+ | |||
+ | set value of dictionary key "P" of dictionary "First Names" to "Fred" | ||
+ | end tell | ||
+ | ``` | ||
+ | |||
+ | ===== Prior to Ver 7.1 ===== | ||
+ | |||
+ | * All of the below scripts were designed for use with Keyboard Maestro prior to version 7.1, but they will still work with the latest version. | ||
+ | * They present an alternate method. | ||
+ | |||
+ | ==== Set Variable ==== | ||
+ | (will be created if necessary) | ||
+ | |||
+ | ```applescript | ||
+ | my setKMVar("MY_KM_Variable", "some new value") | ||
+ | |||
+ | on setKMVar(pKMVarNameStr, pValueStr) | ||
+ | |||
+ | --- Compatible with Keyboard Maestro 6+ --- | ||
+ | -- • Creates the KM Variable if does not exist (just like KM 7 setvariable) | ||
+ | -- • Returns true if new Variable was created | ||
+ | |||
+ | set varCreatedBool to false | ||
+ | |||
+ | tell application "Keyboard Maestro Engine" | ||
+ | try | ||
+ | set value of variable pKMVarNameStr to pValueStr | ||
+ | |||
+ | on error errMsg number errNum | ||
+ | if (errNum = -10006) then --- KM Variable Does NOT Exist --- | ||
+ | |||
+ | --- Create & Set KM Variable --- | ||
+ | make new variable with properties {name:pKMVarNameStr, value:pValueStr} | ||
+ | set varCreatedBool to true | ||
+ | |||
+ | else | ||
+ | error ("Error " & errNum & ": " & errMsg) | ||
+ | end if | ||
+ | -- END on error | ||
+ | |||
+ | end try | ||
+ | end tell | ||
+ | |||
+ | return varCreatedBool | ||
+ | |||
+ | end setKMVar | ||
+ | ``` | ||
+ | |||
+ | |||
+ | ==== Get Variable ==== | ||
+ | (returns empty string "" if Variable does //not// exist) | ||
+ | |||
+ | ```applescript | ||
+ | |||
+ | set myKMVar to my getKMVar("MY_KM_Variable") | ||
+ | |||
+ | on getKMVar(pKMVarNameStr) | ||
+ | |||
+ | --- Compatible with Keyboard Maestro 6+ --- | ||
+ | -- • Returns "" if variable is not found (just like KM 7 getvariable) | ||
+ | |||
+ | tell application "Keyboard Maestro Engine" | ||
+ | try | ||
+ | set kmVar to value of variable pKMVarNameStr | ||
+ | |||
+ | on error errMsg number errNum | ||
+ | if (errNum = -1728) then | ||
+ | --- KM Variable NOT Found --- | ||
+ | set kmVar to "" | ||
+ | else | ||
+ | error errMsg | ||
+ | end if | ||
+ | -- END on error | ||
+ | |||
+ | end try | ||
+ | end tell | ||
+ | |||
+ | return kmVar | ||
+ | |||
+ | end getKMVar | ||
+ | ``` |