Skip to main content

Run AppleScripts from Plover

Project description

Plover Run AppleScript

Build Status linting: pylint

This Plover extension plugin contains a command that can load in and run external AppleScript files.

Install

  1. In the Plover application, open the Plugins Manager (either click the Plugins Manager icon, or from the Tools menu, select Plugins Manager).
  2. From the list of plugins, find plover-run-applescript
  3. Click "Install/Update"
  4. When it finishes installing, restart Plover
  5. After re-opening Plover, open the Configuration screen (either click the Configuration icon, or from the main Plover application menu, select Preferences...)
  6. Open the Plugins tab
  7. Check the box next to plover_run_applescript to activate the plugin

How To Use

One-Liners

If your AppleScript is one line long, then you can use it directly in your dictionary entry:

"{:COMMAND:APPLESCRIPT:activate application \"Google Chrome\"}"

AppleScript Files

In your dictionaries, create entry values that look like the following:

"{:COMMAND:APPLESCRIPT:/path/to/your/applescript-file.scpt}"

[!NOTE] You can compile your .applescript files into .scpt files using the osacompile tool:

osacompile -o my-file.scpt my-file.applescript

The path to your AppleScript file can contain a local $ENVIRONMENT_VARIABLE, which will get expanded. For example, if you have a line like the following in your .zshrc file:

export STENO_DICTIONARIES="$HOME/steno/steno-dictionaries"

You can use it in the command:

"{:COMMAND:APPLESCRIPT:$STENO_DICTIONARIES/path/to/applescript-file.scpt}"

[!WARNING] Due to an issue with PyXA, which this plugin relies on to talk to Apple's APIs, your AppleScript files cannot use lists (denoted by curly braces; e.g. {"one", "two"}).

So, if you have code that looks like this:

keystroke "k" using {command down, shift down}

You will have to re-write it out longhand to be able to use it with this plugin, like so:

key down command
key down shift
keystroke "k"
key up shift
key up command

Or, extract the code you have that uses lists out into script libraries. I wrote about how I did this in Sharing AppleScript Handlers.

If/when the issue gets fixed, you should be able to use lists again...

Pressing the "Disconnect and reconnect the machine" button on the Plover UI resets the AppleScript script cache. If you make any changes to any AppleScript files, make sure to press it so the file will be re-read in again.

The Problem

The following is an example of how I used to run AppleScripts from my Plover dictionaries to perform some kind of automation task that could only be done on macOS using AppleScript:

"W-D": "{:COMMAND:SHELL:bash -ci 'osascript $STENO_DICTIONARIES/src/command/text/move-one-word-forward.scpt'}"

This solution does the following:

  • uses the Plover Run Shell plugin to run a shell command from Python
  • calls bash in interactive mode (-i) so that the command can see environment variables ($STENO_DICTIONARIES in this case) outside of the Plover environment
  • gets bash to use the osascript command-line tool to load in and run the target compiled AppleScript (.scpt file)

Running AppleScripts is generally slow, and constantly running one-off commands that traverse a stack of Python->Shell->osascript made them even slower.

So, this plugin leverages PyXA to talk directly to Apple's APIs from Python, and keeps a local cache of loaded scripts to avoid needing to re-read in AppleScript files every time a command is run.

The above command now looks like this:

"W-D": "{:COMMAND:APPLESCRIPT:$STENO_DICTIONARIES/src/command/text/move-one-word-forward.scpt}"

The result is that commands at least feel like they run significantly faster, and I'm pretty sure it's because they actually are (but I don't have any hard benchmarks to objectively prove this).

Development

Clone from GitHub with git:

git clone git@github.com:paulfioravanti/plover-run-applescript.git
cd plover-run-applescript

Python Version

Plover's Python environment currently uses version 3.9 (see Plover's workflow_context.yml to confirm the current version).

So, in order to avoid unexpected issues, use your runtime version manager to make sure your local development environment also uses Python 3.9.x.

PyXA Version

This plugin depends on PyXA for all Python-to-AppleScript interoperations. The dependency is currently pinned at version 0.0.9 due to later versions of PyXA using Python 3.10 syntax (match case etc) that is too new for Plover's Python version, and causes syntax errors.

Testing

  • Pytest is used for testing in this plugin.
  • Coverage.py and pytest-cov are used for test coverage, and to run coverage within Pytest
  • Pylint is used for code quality
  • Mypy is used for static type checking

Currently, the only parts able to be tested are ones that do not rely directly on Plover or PyXA.

Run tests, coverage, and linting with the following commands:

pytest --cov --cov-report=term-missing
pylint plover_run_applescript
mypy plover_run_applescript

To get a HTML test coverage report:

coverage run --module pytest
coverage html
open htmlcov/index.html

If you get ModuleNotFoundError: No module named 'PyXA' errors, then run the following command to get PyXA available in your test environment:

pip install -e ".[test]"

Deploying Changes

After making any code changes, install the plugin into Plover with the following command:

plover -s plover_plugins install .

Where plover in the command is a reference to your locally installed version of Plover. See the Invoke Plover from the command line page for details on how to create that reference.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plover_run_applescript-0.3.1.tar.gz (23.8 kB view details)

Uploaded Source

Built Distribution

plover_run_applescript-0.3.1-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file plover_run_applescript-0.3.1.tar.gz.

File metadata

File hashes

Hashes for plover_run_applescript-0.3.1.tar.gz
Algorithm Hash digest
SHA256 44fead9d786035efc3d6a6e7b6ead39f29dc35c6b0b83e21a38eefd52f7913cc
MD5 2071c46c9689f2fac2c5a3643ac7ade9
BLAKE2b-256 0ec3bcc627ba3fe7799fac5ff88e152df038eddc0a2467ff8e38a62494086c4f

See more details on using hashes here.

File details

Details for the file plover_run_applescript-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for plover_run_applescript-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 36a14254fc4afcb39f163e89f1cc2b96362fa1ef76025541d52246dc21b69f4b
MD5 371de88ad7c8225032e5946d4152f015
BLAKE2b-256 00541b70901770ee14c4d698ed1cc4a3e1c0ab192878dd21ad3cda742999f82d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page