From a1f616e01e1140ebed00fa68d27e05c2c5a9ee27 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Mon, 23 Apr 2018 23:41:19 +0100 Subject: [PATCH] Toggle applications via global hotkeys in Hammerspoon --- hammerspoon/app_toggle.lua | 38 ++++++++++++++++++++++++++++++++++++++ hammerspoon/init.lua | 36 +++++++++++++++++++++++++++++------- 2 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 hammerspoon/app_toggle.lua diff --git a/hammerspoon/app_toggle.lua b/hammerspoon/app_toggle.lua new file mode 100644 index 0000000..d620172 --- /dev/null +++ b/hammerspoon/app_toggle.lua @@ -0,0 +1,38 @@ +-- luacheck: read_globals hs + +local obj = {} + +function obj:bind (mods, key, name, path) + hs.hotkey.bind(mods, key, self:toggleFn(name, path)) +end + +function obj:toggleFn (name, path) + return function () + self:toggle(name, path) + end +end + +function obj:toggle (name, path) + local app = self.findRunningApp(name, path) + + if app == nil then + return hs.application.open(path or name) + end + + if app == hs.application.frontmostApplication() then + return app:hide() + end + + return app:activate() +end + +function obj.findRunningApp (name, path) + for _, app in ipairs(hs.application.runningApplications()) do + if app:name() == name and (path == nil or path == app:path()) then + return app + end + end +end + +-- the end +return obj diff --git a/hammerspoon/init.lua b/hammerspoon/init.lua index 523a833..d2d46bc 100644 --- a/hammerspoon/init.lua +++ b/hammerspoon/init.lua @@ -15,12 +15,6 @@ hs.menuIcon(true) hs.console.alpha(0.90) hs.console.behaviorAsLabels { 'moveToActiveSpace' } --------------------------------------------------------------------------------- --- Require modules --------------------------------------------------------------------------------- - -require('window_management'):init() - -------------------------------------------------------------------------------- -- Load Spoons -------------------------------------------------------------------------------- @@ -34,6 +28,34 @@ hs.loadSpoon('HeadphoneAutoPause') spoon.HeadphoneAutoPause.autoResume = false spoon.HeadphoneAutoPause:start() +-------------------------------------------------------------------------------- +-- Application toggles +-------------------------------------------------------------------------------- --- the end +local apptoggle = require('app_toggle') + +apptoggle:bind({'cmd', 'alt', 'ctrl'}, 'A', 'Activity Monitor') +apptoggle:bind({'cmd', 'ctrl'}, '4', 'Skitch') +apptoggle:bind({'cmd', 'ctrl'}, 'A', 'YakYak') +apptoggle:bind({'cmd', 'ctrl'}, 'B', 'Postico') +apptoggle:bind({'cmd', 'ctrl'}, 'C', 'Medis') +apptoggle:bind({'cmd', 'ctrl'}, 'D', 'Wavebox') +apptoggle:bind({'cmd', 'ctrl'}, 'E', 'Emacs') +apptoggle:bind({'cmd', 'ctrl'}, 'F', 'Messenger') +apptoggle:bind({'cmd', 'ctrl'}, 'G', 'Stride') +apptoggle:bind({'cmd', 'ctrl'}, 'S', 'Skype') +apptoggle:bind({'cmd', 'ctrl'}, 'T', 'IRCCloud') +apptoggle:bind({'cmd', 'ctrl'}, 'W', 'WhatsApp') +apptoggle:bind({'cmd', 'ctrl'}, 'X', 'Calendar') +apptoggle:bind({'cmd', 'ctrl'}, 'Z', 'Slack') + +-------------------------------------------------------------------------------- +-- Window management +-------------------------------------------------------------------------------- + +require('window_management'):init() + +-------------------------------------------------------------------------------- +-- The End +-------------------------------------------------------------------------------- hs.alert.show('Hammerspoon loaded')