A lightweight Swift package for user-customizable local keyboard shortcuts on macOS. Unlike global hotkey libraries, shortcuts are matched inside keyDown via NSEvent β no system registration required.
- macOS 12+
- Swift 5.9+
Add the package in Xcode via File β Add Package Dependencies β Add Local and select the LocalHotKeys folder.
import LocalHotKeys
extension LocalHotKeys.Shortcut {
static let navigateLeft = Shortcut("navigateLeft", default: .leftBracket, modifiers: .command)
static let navigateRight = Shortcut("navigateRight", default: .rightBracket, modifiers: .command)
}override func keyDown(with event: NSEvent) {
if event.matches(.navigateLeft) { handleLeft(); return }
if event.matches(.navigateRight) { handleRight(); return }
super.keyDown(with: event)
}import SwiftUI
import LocalHotKeys
struct ShortcutsView: View {
var body: some View {
Form {
LocalHotKeys.Recorder("Navigate Left", shortcut: .navigateLeft)
LocalHotKeys.Recorder("Navigate Right", shortcut: .navigateRight)
}
}
}- Default binding β each
Shortcutis initialized with a default key + modifiers. - User override β when the user records a new binding via
Recorder, it's saved toUserDefaultsunderLocalHotKeys_<id>_keyCodeandLocalHotKeys_<id>_modifiers. - Matching β
event.matches(_:)compares the event'skeyCodeand relevant modifier flags against the shortcut's current binding (override if set, otherwise default). - Reset β pressing Delete in the recorder (or calling
shortcut.reset()) removes the override and restores the default.
Shortcut(_ id: String, default key: Key?, modifiers: NSEvent.ModifierFlags = [])
shortcut.key // current key (override ?? default)
shortcut.modifiers // current modifiers (override ?? default)
shortcut.displayString // e.g. "β["
shortcut.set(key:modifiers:) // save user override
shortcut.reset() // clear override, restore defaultCommon keys available as static constants:
.leftBracket, .rightBracket, .leftArrow, .rightArrow,
.upArrow, .downArrow, .space, .return, .escape, .tab,
.a ... .z (letters), .zero ... .nine (numbers), .f1 ... .f12event.matches(.navigateLeft) // true if keyCode + modifiers matchLocalHotKeys.Recorder("Label", shortcut: .myShortcut)Click the field to record a new shortcut. Press Escape to cancel, Delete to clear.