Swiftpack.co - JanX2/ShortcutRecorder as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by JanX2.
JanX2/ShortcutRecorder v2.6
A user interface control to record key combinations. For Mac OS X, uses Cocoa.
⭐️ 112
🕓 1 year ago
.package(url: "https://github.com/JanX2/ShortcutRecorder.git", from: "v2.6")

CC BY 4.0 macOS 10.11 Mac App Store Approved

CocoaPods Compatible Carthage Compatible

Coverage Build Status



The best control to record shortcuts on macOS

  • Objective-C framework developed with Swift in mind
  • Easily stylable
  • Translated into 22 languages
  • Supports macOS Accessibility
  • Thoroughly documented and tested
  • Global and Local shortcuts for both key up and key down actions
  • Mac App Store approved
  • End-to-end Interface Builder integration

What is inside

The framework comes with:

  • SRRecorderControl to render and capture user input
  • SRRecorderControlStyle for custom styling
  • SRShortcut that represents a shortcut model
  • SRGlobalShortcutMonitor to turn the shortcut into an action by registering a global hot key
  • SRAXGlobalShortcutMonitor to handle any kind of keyboard event via Accessibility
  • SRLocalShortcutMonitor for manual handling in the responder chain and NSEvent monitors
  • SRShortcutController for smooth Cocoa Bindings and seamless Interface Builder integration
  • SRShortcutValidator to check validity of the shortcut against Cocoa key equivalents and global hot keys
  • NSValueTransformer and NSFormatter subclasses for custom alterations

In Swift:

import ShortcutRecorder

let defaults = NSUserDefaultsController.shared
let keyPath = "values.shortcut"
let options = [NSBindingOption.valueTransformerName: .keyedUnarchiveFromDataTransformerName]

let beepAction = ShortcutAction(keyPath: keyPath, of: defaults) { _ in
    return true
GlobalShortcutMonitor.shared.addAction(beepAction, forKeyEvent: .down)

let recorder = RecorderControl()
recorder.bind(.value, to: defaults, withKeyPath: keyPath, options: options)

recorder.objectValue = Shortcut(keyEquivalent: "⇧⌘A")

In Objective-C:

#import <ShortcutRecorder/ShortcutRecorder.h>

NSUserDefaultsController *defaults = NSUserDefaultsController.sharedUserDefaultsController;
NSString *keyPath = @"values.shortcut";
NSDictionary *options = @{NSValueTransformerNameBindingOption: NSKeyedUnarchiveFromDataTransformerName};

SRShortcutAction *beepAction = [SRShortcutAction shortcutActionWithKeyPath:keyPath
                                                             actionHandler:^BOOL(SRShortcutAction *anAction) {
    return YES;
[[SRGlobalShortcutMonitor sharedMonitor] addAction:beepAction forKeyEvent:SRKeyEventTypeDown];

SRRecorderControl *recorder = [SRRecorderControl new];
[recorder bind:NSValueBinding toObject:defaults withKeyPath:keyPath options:options];

recorder.objectValue = [SRShortcut shortcutWithKeyEquivalent:@"⇧⌘A"];


The framework supports module maps, explicit linking is not required: simply import ShortcutRecorder / #import <ShortcutRecorder/ShortcutRecorder.h>

Swift Package Manager

.package(url: "git://github.com/Kentzo/ShortcutRecorder.git", from: "3.3.0")


pod 'ShortcutRecorder', '~> 3.3.0'


github "Kentzo/ShortcutRecorder" ~> 3.3.0

Prebuilt frameworks are available via GitHub releases.

Git Submodule

git submodule add git://github.com/Kentzo/ShortcutRecorder.git

Then drag'n'drop into Xcode workspace of your project.

Next Steps

  • The Documentation playground covers all parts of the framework (see in Xcode)
  • The Inspector app is useful during development of custom styles
  • Read about Styling and special notes regarding Cocoa's Key Equivalents.


Still have questions? Create an issue.

Paid Support

Paid support is available for custom alterations, help with integration and general advice regarding development for Apple's platforms.


Stars: 112
Last commit: 4 weeks ago
jonrohan Something's broken? Yell at me @ptrpavlik. Praise and feedback (and money) is also welcome.

Related Packages

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics