Scoot, a MacOS Cursor Actuator
Scoot is a Mac app that helps you move your mouse cursor, using keyboard shortcuts.
When I started building the first prototype, I didn’t expect it to actually work (technically or practically, but especially the latter). From an early version of the project’s README:
Scoot is experimental. Is it possible to craft a keyboard-driven mouse movement utility that’s actually efficient? Something that you’ll actually want to use? This is going to take some trial and error.
Quick backstory: I had been experiencing pain in my ulnar nerve. I was making a lot of changes to get that under control, but during the process I noticed that mouse and trackpad usage exacerbated all the symptoms. As it happens, I had recently started using the excellent avy Emacs package, and it occurred to me that those ideas could be brought to the OS level.
I couldn’t find any prior art, so I opened up Xcode and started hacking around.
Let’s take a quick tour…
Scoot provides two primary navigation modes.
In grid-based navigation mode, Scoot subdivides the screen into a grid of equally-sized cells, and assigns each a unique character sequence. Type that character sequence, and your mouse cursor immediately moves to that location.
If multiple displays are connected, Scoot extends the grid across each screen:
My personal favourite, though, is the element-based navigation mode. In this mode, Scoot acts like a screen reader, finding UI elements (buttons, links, etc.) on screen, and assigning each a unique key sequence. Type the character sequence associated with a UI element, and your mouse cursor will immediately move there.
When Scoot is active, you can also move the mouse cursor using keyboard shortcuts that you’re likely already familiar with for editing text.2 Scoot supports standard MacOS text editing shortcuts, as well as Emacs and vi keybindings. These shortcuts work regardless of which mode is active.
to nudge the cursor up by a partial “step”, press the
↑key on your keyboard (equivalent to
C-pwith Emacs bindings, and
kwith vi bindings)
to nudge the cursor up a larger amount (a full “step”), press
M-awith Emacs bindings, and
C-kwith vi bindings)
to move the cursor to the top of the screen, press
M-<with Emacs bindings, and
⇧-kwith vi bindings)
These are, of course, only a small subset of movement commands. For the full list, see the usage documentation.
In addition to cursor movement, Scoot also provides keyboard shortcuts for scrolling, left clicking, double clicking, clicking the middle and right mouse buttons, and even for holding the left mouse button down (which enables drag-and-drop, all from the comfort of your keyboard).
Scoot helps reduce my reliance on my mouse and trackpad, especially when I’m at my desk. I use a split mechanical keyboard3 with a modified Miryoku keyboard layout. Miryoku puts every key within reach without needing to move my hands – and with Scoot, I don’t need to move my hands to “actuate” the cursor either. Huge win in comfort (and efficiency).4
That being said, it’s important to note that Scoot is not intended to replace physical pointing devices, but rather to augment them. (Replacing hardware entirely is not possible for a variety of reasons. For example, the OS–and many apps–rely heavily on gestures, which Scoot cannot simulate,5 among other challenges.6)
And sometimes it’s just easier to grab a mouse and move it where you want it to go.
If this sounds remotely interesting, give Scoot a spin, and let me know what you think. You can download the latest release here, and refer to the documentation for installation instructions and a usage guide.
(Scoot is fully open source, and MIT licensed.)
I know this only because people tell me. There’s no tracking or analytics of any kind… Scoot isn’t even allowed to access the network. ↩
Scoot adapts existing keyboard shortcuts – intended for navigating around in a document – to instead control movement on a 2-dimensional grid. Some liberties have been taken with this mapping, but (hopefully) the results are intuitive. ↩
I find myself using Scoot a lot less when I’m on my laptop; trackpads these days are humungous, and easily accessible with my thumbs, even when I’m typing with both hands. ↩
Apple doesn’t provide any APIs for simulating gestures. And to the best of my knowledge, no one has put in the reverse engineering work required to figure out how to synthesize them. If any reader is interested in tackling this challenge, gesture support would make for a lovely addition to the app. ↩
Scoot is able to interact with most UI elements, but not all. For example, Scoot can’t dismiss system notifications. ↩