Write Javscript and produce .ahk scripts
This project is limited in scope to:
-
Set key bindings
-
Set keys to repeat
-
Set keys to toggle
-
A composition of the above
- Gaming. Write macros for games to fine tune bindings and reduce RSI
- Also useful for general simple desktop bindings
- Composition. Compose existing AHK scripts and arbitrary snippets to manage your scripts programmatically.
Gaming example
import { Ahk, repeatWhilePressed, toggleRepeatOnTap, toggleOnTap } from 'simple-ahk
Ahk()
.IfWinActive('ahk_class my_game')
.bind('LShift', 'Space')
.bind( '$~LButton', repeatWhilePressed({ whilePressed: 'LButton', repeatKeys: ['LButton'] }))
.bind('$~RButton', toggleRepeatOnTap({ whenTapped: 'RButton', repeatKeys: ['RButton'] }))
.bind('$x', toggleOnTap({ whenTapped: 'x', toogleKeys: ['z'] }))
.toFile('./myScript.ahk')
const myScript = Ahk()
.SingleInstance('Force')
.bind('LShift', 'Space')
.toString()
Ahk()
.raw(`
#IfWinActive, ahk_class foobar
LShift::Space
`)
.toFile('./myRawScript.ahk')
Ahk
exposes a fluid interface.- Each method call pushes lines to the stack, so order matters.
const ahk = Ahk()
ahk.IfWinActive('ahk_class my_game')
// #IfWinActive, ahk_class my_game
ahk.bind('~LShift', 'Space')
// ~LShift::Space
ahk.raw(`~LButton::RButton`)
// ~LButton::RButton
ahk.toFile('./myScript.ahk')
// Writes the script to the path, which is relative to the initial file, `dirname(require.main.filename)`
ahk.toString() // Returns the script as as string.
/*
#IfWinActive, ahk_class my_game
~LShift::Space
~LButton::RButton
*/
ahk.stack // The current stack, as [[]]
- AHK is seems like the most dominant way of producing bindings in Windows effectively
- AHK is a miserable language to work in
- It's less complex to transpile to AHK than to use AHK libs, as the scope of this project is quite focused. The transpiled code can then be audited or checked out.