Hammerspoon, make finder in the front
[dotfiles.git] / hammerspoon / init.lua
index 9c0de3f..2228bdc 100644 (file)
@@ -1,4 +1,213 @@
+-- Sample Hello World 
 hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
   hs.notify.new({title="Hammerspoon", informativeText="Hello World"}):send()
 --  hs.alert.show("Hello World!")
 end)
+
+-- Reload configuration
+hs.hotkey.bind({"cmd", "alt", "ctrl"}, "R", function()
+  hs.reload()
+end)
+hs.alert.show("Config loaded")
+
+-- Reacting to application events
+-- Move all Finder in front
+function applicationWatcher(appName, eventType, appObject)
+    if (eventType == hs.application.watcher.activated) then
+        if (appName == "Finder") then
+            -- Bring all Finder windows forward when one gets activated
+            appObject:selectMenuItem({"Window", "Bring All to Front"})
+        end
+    end
+end
+appWatcher = hs.application.watcher.new(applicationWatcher)
+appWatcher:start()
+
+
+
+---- Sample - Drawing on the screen - http://www.hammerspoon.org/go/#simplereload
+--mouseCircle = nil
+--mouseCircleTimer = nil
+--function mouseHighlight()
+--    -- Delete an existing highlight if it exists
+--    if mouseCircle then
+--        mouseCircle:delete()
+--        if mouseCircleTimer then
+--            mouseCircleTimer:stop()
+--        end
+--    end
+--    -- Get the current co-ordinates of the mouse pointer
+--    mousepoint = hs.mouse.getAbsolutePosition()
+--    -- Prepare a big red circle around the mouse pointer
+--    mouseCircle = hs.drawing.circle(hs.geometry.rect(mousepoint.x-40, mousepoint.y-40, 80, 80))
+--    mouseCircle:setStrokeColor({["red"]=1,["blue"]=0,["green"]=0,["alpha"]=1})
+--    mouseCircle:setFill(false)
+--    mouseCircle:setStrokeWidth(5)
+--    mouseCircle:show()
+--
+--    -- Set a timer to delete the circle after 3 seconds
+--    mouseCircleTimer = hs.timer.doAfter(3, function() mouseCircle:delete() end)
+--end
+--hs.hotkey.bind({"cmd","alt","shift"}, "D", mouseHighlight)
+--
+--
+---- window movement
+--hs.hotkey.bind({"cmd", "alt", "ctrl"}, "H", function()
+--  local win = hs.window.focusedWindow()
+--  local f = win:frame()
+--
+--  f.x = f.x - 10
+--  win:setFrame(f)
+--end)
+
+-- Window Movement
+-- https://andrich.blog/2016/11/20/hammerspoon-an-awesome-tool-to-automate-your-mac/
+-- CTRL + ALT + Left - Move current window to the left half of the screen.
+-- CTRL + ALT + Right - Move current window to the right half of the screen.
+-- CTRL + ALT + Up - Go "fullscreen".
+-- CTRL + ALT + Down - Center window, covering 2/3 of screen size.
+--
+function move_window(direction)
+    return function()
+        local win      = hs.window.focusedWindow()
+        local app      = win:application()
+        local app_name = app:name()
+        local f        = win:frame()
+        local screen   = win:screen()
+        local max      = screen:frame()
+        if direction == "left" then
+           f.x = max.x
+            f.y = max.y
+           f.w = max.w / 2
+            f.h = max.h
+        elseif direction == "right" then
+            f.x = max.x + (max.w / 2)
+            f.y = max.y
+            f.w = max.w / 2
+            f.h = max.h
+        elseif direction == "up" then
+            f.x = max.x
+            f.y = max.y 
+            f.w = max.w
+            f.h = max.h / 2
+        elseif direction == "down" then
+            f.x = max.x 
+            f.y = max.y + (max.h / 2)
+            f.w = max.w 
+            f.h = max.h / 2
+        elseif direction == "max" then
+           if f.w > (max.w * 3/4) and f.h > (max.h * 3/4) then
+                f.x = max.x + (max.w / 6)
+                f.y = max.y + (max.h / 6)
+                f.w = max.w * 2 / 3
+                f.h = max.h * 2 / 3
+           else
+                f.x = max.x 
+                f.y = max.y
+                f.w = max.w 
+                f.h = max.h
+           end
+        else
+            hs.alert.show("move_window(): Freaky parameter received " .. direction)
+        end
+        win:setFrame(f, 0)
+    end
+end
+local hyper = {"ctrl", "alt"}
+hs.hotkey.bind(hyper, "h", move_window("left"))
+hs.hotkey.bind(hyper, "l", move_window("right"))
+hs.hotkey.bind(hyper, "k", move_window("up"))
+hs.hotkey.bind(hyper, "j", move_window("down"))
+hs.hotkey.bind(hyper, "m", move_window("max"))
+
+-- Search and dictionary
+-- Past and copy
+-- App quick startup
+
+-- Use SpoonInstall,
+-- http://zzamboni.org/post/using-spoons-in-hammerspoon/
+-- https://github.com/Hammerspoon/Spoons/raw/master/Spoons/SpoonInstall.spoon.zip
+if hs.spoons == nil then
+   hs.spoons=require('hs.spoons')
+end
+
+
+hs.loadSpoon ("SpoonInstall")
+spoon.SpoonInstall.use_syncinstall = true
+INSTALL = spoon.SpoonInstall
+
+--------------------------------------------------------------------------------
+-- MouseCircle  http://www.hammerspoon.org/Spoons/MouseCircle.html
+INSTALL:andUse("MouseCircle",
+                {
+                   disable = false,
+                   config = {
+                      color = hs.drawing.color.x11.rebeccapurple
+                   },
+                   hotkeys = {
+                      show = { {"cmd", "alt", "ctrl"}, "m"}
+                   }
+                }
+)
+
+--------------------------------------------------------------------------------
+-- TextClipboardHistory
+INSTALL:andUse("TextClipboardHistory",
+               {
+                  config = {
+                     show_in_menubar = false,
+                  },
+                  hotkeys = {
+                     toggle_clipboard = { { "cmd", "shift" }, "v"}
+                  },
+                  start = true;
+               }
+)
+
+
+--------------------------------------------------------------------------------
+-- Seal -- http://www.hammerspoon.org/Spoons/Seal.html
+INSTALL:andUse("Seal",
+               {
+                  hotkeys = { show = { {"cmd", "ctrl", "alt"}, "space" } },
+                  fn = function(s)
+                     s:loadPlugins({"apps", "calc", "safari_bookmarks", "screencapture", "useractions"})
+                     s.plugins.safari_bookmarks.always_open_with_safari = false
+                     s.plugins.useractions.actions =
+                        {
+                           ["Hammerspoon docs webpage"] = {
+                              url = "http://hammerspoon.org/docs/",
+                              icon = hs.image.imageFromName(hs.image.systemImageNames.ApplicationIcon),
+                              -- hotkey = { hyper, "h" }
+                           },
+                           ["Leave corpnet"] = {
+                              fn = function()
+                                 spoon.WiFiTransitions:processTransition('foo', 'corpnet01')
+                              end,
+                              icon = swisscom_logo,
+                           },
+                           ["Arrive in corpnet"] = {
+                              fn = function()
+                                 spoon.WiFiTransitions:processTransition('corpnet01', 'foo')
+                              end,
+                              icon = swisscom_logo,
+                           },
+                           ["Translate using Leo"] = {
+                              url = "http://dict.leo.org/ende/index_de.html#/search=${query}",
+                              icon = 'favicon',
+                              keyword = "leo",
+                           },
+                           ["Tell me something"] = {
+                              keyword = "tellme",
+                              fn = function(str) hs.alert.show(str) end,
+                           }
+                        }
+                     s:refreshAllCommands()
+                  end,
+                  start = true,
+               }
+)