Short Press Shortcut Do One Action, Long Press Do Something Else

www.​regular-expressions​.info is very good, but if a regex doesn’t work as expected in KM don’t forget to look up at the ICU page, since this is the regex flavor used in KM.

I know I thought they would have released the Time Machine API by now, you know they have one. How else did they get so crazy rich in such a short time?!

Thank you very much Tom, good to know. So if I understand right anything on this page should work in Keyboard Maestro ICU User Guide | ICU Documentation

Hi Peter,

Since KM recognized pauses between taps is so critical to using this feature, is there any way you could program the actions into a downloadable macro? Using the fastest, most reliable actions? I understand the "pause" timing has to be set individually based on your circumstances. It's just I see all kinds of ways of doing this, some very complex like this:

[Like this, although maybe this was earlier versions?]
(MACRO: HotKey Multi-Press Template (Double-Press, Triple-Press, Etc.))

There are examples of using this variable counting keystrokes, text variable, all kinds of stuff.

Seems like this could be programmed into KM's tap trigger itself. Next to tap (once, twice, thrice) another data field, "wait x number seconds before execution" to allow another tap. You could always leave it blank or enter 0 if didn't want a delay.

Here is what you wrote:

Trigger: tapped once
Set Do First to 1
If variable Do First is 1 then
Macro A

Trigger: tapped twice
Set Do First to 0
Set Do Second to 1
If variable Do Second is 1 then
Macro B

Trigger: tapped thrice
Set Do Second to 0
Set Do Third to 1
Macro C

I'd be using an xKeys. Which "actions" are you using to program this? I'm confused about the second "second". Do you mean "Third"? Is there a pause in that one?

What's the simplest way to

  1. Tap once on an xKeys, have KM pause for like .2 seconds, if no other tap occurs, do Macro A
  2. If another tap occurs, wait .2 seconds, if no other tap occurs, do Macro B,
  3. Wait .2 seconds, if no other tap occurs, do Macro C


There is no one valid time.

Currently, the defaults for the down time is [NSEvent doubleClickInterval] and the up time defaults to twice that, and they can be configured with private preferences as described in the manual.

Currently there is no function to return [NSEvent doubleClickInterval], though that is on the todo list, but you could use some other way to determine that value (such as via JXA). This value is adjustable in the system preferences.

So in theory the correct pause would be three times that value, but in practice it would have to either be more than that by “enough” to ensure that the second macro really had a chance to execute those various actions required, or you would have to add more logic to the macros to ensure that if the first macro had fired the second one did not run.

Keyboard Maestro is not a real time operating system, so getting the minimum amount of pause without going over is not really going to be possible without a reasonable allowance for variability.

Hey guys,

I made this macro after reading through this thread. I trigger it with Stream Deck buttons and it allows the following for multiple keystrokes:

1 tap = Action A
2 taps = Action B
3 taps or longer press (selected in macro) = Action C

In my case, actions A, B an C output different keystrokes to trigger assignments in nAc, which is the companion app for nOb Control (which I use primarily in Logic Pro).

F Keys Multi-Tap : Long Press.kmmacros (114.8 KB)

It works great and the only things I haven't been able to figure out are:

  • The long press detection seems to have to come first, but it slows down the multi-tap detection. This might be just the way it has to be.
  • If I hold the key beyond the length of time it takes to run through the macro and perform the actions, the trigger keystroke leaks through to Logic Pro and causes a screen-flash error response. Perhaps there's a way to prevent this?
  • F11 and F12 don't seem to work so I've limited it to F1 to F10. There may be some keystroke conflict I'm not aware of, perhaps due to the modifiers being used.

Yes, noticed that. KM doesn’t know if you finished, so it needs to wait for the long press first.
Thanks for sharing!

1 Like

Okay, I like this, but suppose I want the Long Press key to be the letter "j" and it will trigger an action if I leave it press for .5 seconds, otherwise it would just type the letter "j"? I tried it and it didn't work.

Can't be done reliably.


I don't know about the current version of the engine, but when I first started using KM, I had managed to get it to work. But only in certain circumstances, and I was never sure what those circumstances were. Which is why I said "reliably". :joy:

I'm out of my league here but wanted to let folks know what I was doing....

I actually do this 'sort' of thing.
By using Dan's marvelous HotKey Multi-Press macro, you just can't use the 'single' or one-time press on the key, the single press needs to be cancelled. (for my uses)
You can multi-press the control key (2-5 times set in the macro itself) to trigger different macros OR you can long press the control key and then follow it with any other modifier to trigger different macros. very powerful....
If you long press, the single multi press is cancelled and the long press takes over.

Long press.kmmacros (8.5 KB)

Multi Left ⌃ Control VARIOUS K0020 copy.kmmacros (34 KB)


TBD psuedo long press if J key is held down Macro (v10.0)

TBD psuedo long press if J key is held down.kmmacros (3.5 KB)

1 Like

Edit: see simplified version, a few comments below. It works better while typing quickly.

This works very reliably for me.

Type "J" or Do Something Else.kmmacros (88 KB)

Macro screenshot

Based on the hotkey version of THIS.

1 Like

This is nice. The macro is reliable in itself, but the problem is always the same. It fails when writing fast.

Instead of "jeep" it types "ejep".

1 Like

Yep, confirmed. Hadn't thought of typing fast. Ah well.

The reason for this, seems clear to me. The command "j" (short pressed) would have to be given at "pressed", not at "released". And be deleted again if the key is held longer. This is the "logical" solution, but probably not doable in practice. :man_shrugging: Or what do you think?

The reason, as I see it, is that the processes in the previous macro I posted take too long and interrupt fast typing. That's because I used the full version of the macro, which has all sorts of other options. Here's a version with all that stuff stripped away, and it seems to work well when typing "jeep" as fast as my fingers can manage it.

Type "J" or Do Something Else.kmmacros (47 KB)

Macro screenshot

Let me try it with my fingers :slight_smile:

Sorry, no difference :frowning: I am convinced that it has something to do with "released".

Well there is a difference, but evidently not enough of one to make it bulletproof on your system.

I can't get it to trip up here, so I'm wondering if your mac runs at a different speed; I'm on a 2.4GHz i9.

I have no idea at what speed my M1 Air runs. But I learned many years ago to write fast with 10 fingers :slight_smile:

I think the problem is systemic. Because of the „if“ KM has to distinguish between two actions… Why? Typing J should not be the task of KM.

KM should only have to measure the time and perform one action when that time is exceeded.

J is pressed for less than 1 s. KM only "observes" and does nothing. J is processed by macos.

J is pressed for longer than 1 s, KM intervenes and does something.

This is of course expressed in layman's terms :slight_smile: