For all the funky key-combo ideas like keycombos, tap-dancing and so on I strongly suggest looking into keyboards that can be fully customized with say QMK firmware.
You’ll be able to do all these types of in pretty much exactly as you want it. Keys that function as one-shot keys, keys that do combos (LP), do tap-dancing (once L → Line, twice L → PolyLine), etc.
And it can be as close as to what you want without having to rely on the software doing it right (because it can’t - too many people with different ways to use that software).
(And as an added bonus programming that stuff into your keyboard meas you can bring the keyboard along and you’ll have all the customizations with you regardless of what computer you use Rhino on)
Anyway, just a thought after reading this topic from a keyboard nerd.
Some manufacturers such as ZSA, MoErgo or Dygma offer GUIs that make it so that you don’t really have to do any programming. Some are based on QMK/ZMK, others use proprietary stuff. But programming this all on your keyboard means switching layers, which can be cumbersome if you also use Grasshopper, where you need to type.
Heh, keyboard monad written in Haskell. I love it! And I will use it for general KB re-configs, like with capslock.
The downside is that it can’t detect the current application. They suggest some workarounds, but auto-switching keymaps based on the active application with AutoHotkey is quite seamless. I love it for getting around some of Rhino’s quirks:
; this is a comment
; Rhino won't pop up a toolbar if another toolbar has already popped up. I
; use half a dozen 'instant alias' toolbars, and it was frustrating to open
; the wrong one accidentally. So, I overrode Rhino's default behavior with
; one that suited me better.
; capture all middle mouse button presses
MButton::
; put the current window ID into 'Active_ID'
WinGet, Active_ID, ID, A
; put the process name for 'Active_ID' into 'Active_Process'
WinGet, Active_Process, ProcessName, ahk_id %Active_ID%
if (Active_Process = "rhino.exe")
{
; check to see if the mouse is hovering over a pop-up toolbar
MouseGetPos, , , , mouseClass
StringLeft, mouseClassTrimmed, mouseClass, 14
; the class name for a pop-up toolbar in Rhino5
if (mouseClassTrimmed = "WindowsForms10")
; press the escape key to close the current pop-up
Send {Esc}
; pop-up my display toolbar by typing 'PopupToolbar',
; followed by the toolbar name, 'emDisplay'
Send PopupToolbar{Enter}emDisplay{Enter}
; exit the command
return
}
; Otherwise, passthrough the middle mouse button like normal
Send {MButton}
return