feat: convert NeoVim configuration to Lua

This commit is contained in:
Stefan Imhoff
2022-07-08 14:07:53 +02:00
parent c82d85d87f
commit 9c81e94e1f
114 changed files with 4977 additions and 4249 deletions

View File

@@ -1,20 +1,20 @@
-- Replace Caffeine.app with 18 lines of Lua :D
local caffeine = hs.menubar.new()
function setCaffeineDisplay(state)
local result
if state then
result = caffeine:setIcon("~/.hammerspoon/icons/sun.pdf")
else
result = caffeine:setIcon("~/.hammerspoon/icons/moon.pdf")
end
function SetCaffeineDisplay(state)
local result
if state then
result = caffeine:setIcon("~/.hammerspoon/icons/sun.pdf")
else
result = caffeine:setIcon("~/.hammerspoon/icons/moon.pdf")
end
end
function caffeineClicked()
setCaffeineDisplay(hs.caffeinate.toggle("displayIdle"))
function CaffeineClicked()
SetCaffeineDisplay(hs.caffeinate.toggle("displayIdle"))
end
if caffeine then
caffeine:setClickCallback(caffeineClicked)
setCaffeineDisplay(hs.caffeinate.get("displayIdle"))
caffeine:setClickCallback(CaffeineClicked)
SetCaffeineDisplay(hs.caffeinate.get("displayIdle"))
end

View File

@@ -5,124 +5,122 @@
-- Get list of screens and refresh that list whenever screens are plugged or unplugged:
local screens = hs.screen.allScreens()
local screenwatcher = hs.screen.watcher.new(function()
screens = hs.screen.allScreens()
screens = hs.screen.allScreens()
end)
screenwatcher:start()
-- Move a window a number of pixels in x and y
function nudge(xpos, ypos)
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x + xpos
f.y = f.y + ypos
win:setFrame(f)
function Nudge(xpos, ypos)
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x + xpos
f.y = f.y + ypos
win:setFrame(f)
end
-- Resize a window by moving the bottom
function yank(xpixels, ypixels)
local win = hs.window.focusedWindow()
local f = win:frame()
function Yank(xpixels, ypixels)
local win = hs.window.focusedWindow()
local f = win:frame()
f.w = f.w + xpixels
f.h = f.h + ypixels
win:setFrame(f)
f.w = f.w + xpixels
f.h = f.h + ypixels
win:setFrame(f)
end
-- Resize window for chunk of screen.
-- For x and y: use 0 to expand fully in that dimension, 0.5 to expand halfway
-- For w and h: use 1 for full, 0.5 for half
function push(x, y, w, h)
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
function Push(x, y, w, h)
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x + (max.w*x)
f.y = max.y + (max.h*y)
f.w = max.w*w
f.h = max.h*h
win:setFrame(f)
f.x = max.x + (max.w * x)
f.y = max.y + (max.h * y)
f.w = max.w * w
f.h = max.h * h
win:setFrame(f)
end
-- Move to monitor x. Checks to make sure monitor exists, if not moves to last monitor that exists
function moveToMonitor(x)
local win = hs.window.focusedWindow()
local newScreen = nil
while not newScreen do
newScreen = screens[x]
x = x-1
end
function MoveToMonitor(x)
local win = hs.window.focusedWindow()
local newScreen = nil
while not newScreen do
newScreen = screens[x]
x = x - 1
end
win:moveToScreen(newScreen)
win:moveToScreen(newScreen)
end
-- Move to next screen
local function moveToNextScreen(win)
win = win or window.focusedWindow()
win:moveToScreen(win:screen():next())
win = win or window.focusedWindow()
win:moveToScreen(win:screen():next())
end
-- Move to previous screen
local function moveToPreviousScreen(win)
win = win or window.focusedWindow()
win:moveToScreen(win:screen():previous())
win = win or window.focusedWindow()
win:moveToScreen(win:screen():previous())
end
-- This places a red circle around the mouse pointer
local mouseCircle = nil
local 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.get()
-- 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()
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.get()
-- 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(2, function() mouseCircle:delete() end)
-- Set a timer to delete the circle after 3 seconds
mouseCircleTimer = hs.timer.doAfter(2, function()
mouseCircle:delete()
end)
end
-- Get all valid windows
function getAllValidWindows()
local allWindows = hs.window.allWindows()
local windows = {}
local index = 1
for i = 1, #allWindows do
local w = allWindows[i]
if w:screen() then
windows[index] = w
index = index + 1
end
end
return windows
function GetAllValidWindows()
local allWindows = hs.window.allWindows()
local windows = {}
local index = 1
for i = 1, #allWindows do
local w = allWindows[i]
if w:screen() then
windows[index] = w
index = index + 1
end
end
return windows
end
-- Auto Reload Config
function reloadConfig(files)
doReload = false
for _,file in pairs(files) do
if file:sub(-4) == ".lua" then
doReload = true
end
end
if doReload then
hs.reload()
end
function ReloadConfig(files)
DoReload = false
for _, file in pairs(files) do
if file:sub(-4) == ".lua" then
DoReload = true
end
end
if DoReload then
hs.reload()
end
end
hs.pathwatcher.new(os.getenv("HOME") .. "/.hammerspoon/", reloadConfig):start()
hs.pathwatcher.new(os.getenv("HOME") .. "/.hammerspoon/", ReloadConfig):start()
hs.alert.show("Hammerspoon")

View File

@@ -2,12 +2,11 @@ require("functions")
require("caffeine")
local application = hs.application
local window = hs.window
local layout = hs.layout
local screen = hs.screen
local hotkey = hs.hotkey
local hints = hs.hints
local window = hs.window
local layout = hs.layout
local screen = hs.screen
local hotkey = hs.hotkey
local hints = hs.hints
-------------------
-- Configuration --
@@ -17,8 +16,8 @@ local hints = hs.hints
window.animationDuration = 0
-- Hints
hints.fontName = "Helvetica-Bold"
hints.fontSize = 18
hints.fontName = "Helvetica-Bold"
hints.fontSize = 18
hints.showTitleThresh = 0
-- hints.style = "vimperator" -- Buggy, gets slow after a while
@@ -30,28 +29,28 @@ application.enableSpotlightForNameSearches(true)
------------
-- Keys
local KEY_AM = { "", "" }
local KEY_CA = { "", "" }
local KEY_CAM = { "", "", "" }
local KEY_CM = { "", "" }
local KEY_SAM = { "", "", "" }
local KEY_SC = { "", "" }
local KEY_SCA = { "", "", "" }
local KEY_AM = { "", "" }
local KEY_CA = { "", "" }
local KEY_CAM = { "", "", "" }
local KEY_CM = { "", "" }
local KEY_SAM = { "", "", "" }
local KEY_SC = { "", "" }
local KEY_SCA = { "", "", "" }
local KEY_SCAM = { "", "", "", "" }
local KEY_SCM = { "", "", "" }
local KEY_SCM = { "", "", "" }
-- Displays
local DISPLAY_PRIMARY = screen.primaryScreen()
local DISPLAY_NOTEBOOK = "Color LCD"
-- Sizes
local LEFT_MOST = hs.geometry.unitrect(0, 0, 0.6, 1)
local LEFT_LESS = hs.geometry.unitrect(0, 0, 0.4, 1)
local LEFT_MOST = hs.geometry.unitrect(0, 0, 0.6, 1)
local LEFT_LESS = hs.geometry.unitrect(0, 0, 0.4, 1)
local RIGHT_MOST = hs.geometry.unitrect(0.4, 0, 0.6, 1)
local RIGHT_LESS = hs.geometry.unitrect(0.6, 0, 0.4, 1)
local FULLSCREEN = hs.geometry.unitrect(0, 0, 1, 1)
local RIGHT_HALF = hs.geometry.unitrect(0.5, 0, 0.5, 1)
local LEFT_HALF = hs.geometry.unitrect(0, 0, 0.5, 1)
local LEFT_HALF = hs.geometry.unitrect(0, 0, 0.5, 1)
-------------
-- Layouts --
@@ -62,44 +61,44 @@ local LEFT_HALF = hs.geometry.unitrect(0, 0, 0.5, 1)
-- One Monitor and Notebook
local LAYOUT_DUAL = {
{"Brave Browser", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Calendar", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Code", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"DEVONthink 3", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Element", nil, DISPLAY_NOTEBOOK, RIGHT_HALF, nil, nil},
{"Firefox Developer Edition", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Mail", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Messages", nil, DISPLAY_PRIMARY, RIGHT_HALF, nil, nil},
{"Microsoft Outlook", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Music", nil, DISPLAY_NOTEBOOK, FULLSCREEN, nil, nil},
{"Obsidian", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Slack", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Sonos", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Telegram", nil, DISPLAY_PRIMARY, LEFT_HALF, nil, nil},
{"Things", nil, DISPLAY_NOTEBOOK, FULLSCREEN, nil, nil},
{"iA Writer", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"kitty", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{ "Brave Browser", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Calendar", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Code", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "DEVONthink 3", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Element", nil, DISPLAY_NOTEBOOK, RIGHT_HALF, nil, nil },
{ "Firefox Developer Edition", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Mail", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Messages", nil, DISPLAY_PRIMARY, RIGHT_HALF, nil, nil },
{ "Microsoft Outlook", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Music", nil, DISPLAY_NOTEBOOK, FULLSCREEN, nil, nil },
{ "Obsidian", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Slack", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Sonos", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Telegram", nil, DISPLAY_PRIMARY, LEFT_HALF, nil, nil },
{ "Things", nil, DISPLAY_NOTEBOOK, FULLSCREEN, nil, nil },
{ "iA Writer", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "kitty", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
}
-- One Monitor
local LAYOUT_SINGLE = {
{"Brave Browser", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Calendar", nil, DISPLAY_PRIMARY, LEFT_MOST, nil, nil},
{"Code", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"DEVONthink 3", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Element", nil, DISPLAY_PRIMARY, RIGHT_HALF, nil, nil},
{"Firefox Developer Edition", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Mail", nil, DISPLAY_PRIMARY, RIGHT_MOST, nil, nil},
{"Messages", nil, DISPLAY_PRIMARY, RIGHT_LESS, nil, nil},
{"Microsoft Outlook", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Music", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Obsidian", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Slack", nil, DISPLAY_PRIMARY, LEFT_MOST, nil, nil},
{"Sonos", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"Telegram", nil, DISPLAY_PRIMARY, LEFT_MOST, nil, nil},
{"Things", nil, DISPLAY_PRIMARY, RIGHT_LESS, nil, nil},
{"iA Writer", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{"kitty", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil},
{ "Brave Browser", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Calendar", nil, DISPLAY_PRIMARY, LEFT_MOST, nil, nil },
{ "Code", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "DEVONthink 3", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Element", nil, DISPLAY_PRIMARY, RIGHT_HALF, nil, nil },
{ "Firefox Developer Edition", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Mail", nil, DISPLAY_PRIMARY, RIGHT_MOST, nil, nil },
{ "Messages", nil, DISPLAY_PRIMARY, RIGHT_LESS, nil, nil },
{ "Microsoft Outlook", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Music", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Obsidian", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Slack", nil, DISPLAY_PRIMARY, LEFT_MOST, nil, nil },
{ "Sonos", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "Telegram", nil, DISPLAY_PRIMARY, LEFT_MOST, nil, nil },
{ "Things", nil, DISPLAY_PRIMARY, RIGHT_LESS, nil, nil },
{ "iA Writer", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
{ "kitty", nil, DISPLAY_PRIMARY, FULLSCREEN, nil, nil },
}
------------------
@@ -113,36 +112,44 @@ local LAYOUT_SINGLE = {
-- hotkey.bind(KEY_AM, "left", function() nudge(-100, 0) end)
-- Resize hotkeys
hotkey.bind(KEY_SAM, "up", function() yank(0, -100) end)
hotkey.bind(KEY_SAM, "down", function() yank(0, 100) end)
hotkey.bind(KEY_SAM, "right", function() yank(100, 0) end)
hotkey.bind(KEY_SAM, "left", function() yank(-100, 0) end)
hotkey.bind(KEY_SAM, "up", function()
Yank(0, -100)
end)
hotkey.bind(KEY_SAM, "down", function()
Yank(0, 100)
end)
hotkey.bind(KEY_SAM, "right", function()
Yank(100, 0)
end)
hotkey.bind(KEY_SAM, "left", function()
Yank(-100, 0)
end)
-- Push to screen edge (Moved to Raycast -- keep for later)
-- hotkey.bind(KEY_CAM, "left", function() push(0, 0, 0.5, 1) end)
-- hotkey.bind(KEY_CAM, "right", function() push(0.5, 0, 0.5, 1) end)
-- hotkey.bind(KEY_CAM, "up", function() push(0, 0, 1, 0.5) end)
-- hotkey.bind(KEY_CAM, "down", function() push(0, 0.5, 1, 0.5) end)
-- hotkey.bind(KEY_CAM, "left", function() Push(0, 0, 0.5, 1) end)
-- hotkey.bind(KEY_CAM, "right", function() Push(0.5, 0, 0.5, 1) end)
-- hotkey.bind(KEY_CAM, "up", function() Push(0, 0, 1, 0.5) end)
-- hotkey.bind(KEY_CAM, "down", function() Push(0, 0.5, 1, 0.5) end)
-- Centered window with some room to see the desktop (Moved to Raycast -- keep for later)
-- hotkey.bind(KEY_SCM, "l", function() push(0.05, 0.05, 0.9, 0.9) end)
-- hotkey.bind(KEY_SCM, "m", function() push(0.1, 0.1, 0.8, 0.8) end)
-- hotkey.bind(KEY_SCM, "s", function() push(0.15, 0.15, 0.7, 0.7) end)
-- hotkey.bind(KEY_SCM, "l", function() Push(0.05, 0.05, 0.9, 0.9) end)
-- hotkey.bind(KEY_SCM, "m", function() Push(0.1, 0.1, 0.8, 0.8) end)
-- hotkey.bind(KEY_SCM, "s", function() Push(0.15, 0.15, 0.7, 0.7) end)
-- Fullscreen (Moved to Raycast -- keep for later)
-- hotkey.bind(KEY_CAM, "0", function() push(0, 0, 1, 1) end)
-- hotkey.bind(KEY_CAM, "0", function() Push(0, 0, 1, 1) end)
-- Quarter Screens (Moved to Raycast -- keep for later)
-- hotkey.bind(KEY_CAM, "q", function() push(0, 0, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "w", function() push(0.5, 0, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "a", function() push(0, 0.5, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "s", function() push(0.5, 0.5, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "q", function() Push(0, 0, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "w", function() Push(0.5, 0, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "a", function() Push(0, 0.5, 0.5, 0.5) end)
-- hotkey.bind(KEY_CAM, "s", function() Push(0.5, 0.5, 0.5, 0.5) end)
-- Part Screens (Moved to Raycast -- keep for later)
-- hotkey.bind(KEY_CAM, "4", function() push(0, 0, 0.6, 1) end)
-- hotkey.bind(KEY_CAM, "5", function() push(0, 0, 0.4, 1) end)
-- hotkey.bind(KEY_CAM, "6", function() push(0.4, 0, 0.6, 1) end)
-- hotkey.bind(KEY_CAM, "7", function() push(0.6, 0, 0.4, 1) end)
-- hotkey.bind(KEY_CAM, "4", function() Push(0, 0, 0.6, 1) end)
-- hotkey.bind(KEY_CAM, "5", function() Push(0, 0, 0.4, 1) end)
-- hotkey.bind(KEY_CAM, "6", function() Push(0.4, 0, 0.6, 1) end)
-- hotkey.bind(KEY_CAM, "7", function() Push(0.6, 0, 0.4, 1) end)
-- Move a window between monitors (preserve size)
-- hotkey.bind(KEY_CM, "1", function() window.focusedWindow():moveOneScreenNorth() end)
@@ -189,10 +196,12 @@ hotkey.bind(KEY_SAM, "left", function() yank(-100, 0) end)
-- hotkey.bind(KEY_SCAM, "Y", function() application.launchOrFocus("Music") end)
-- Place red circle around mouse
hotkey.bind(KEY_SCAM, "space", mouseHighlight)
hotkey.bind(KEY_SCAM, "space", MouseHighlight)
-- Manual config reloading (from getting started guide):
hotkey.bind(KEY_CAM, "delete", function() hs.reload() end)
hotkey.bind(KEY_CAM, "delete", function()
hs.reload()
end)
-- Focus (Moved to Raycast -- keep for later)
-- hotkey.bind(KEY_CAM, 'k', function() window.focusedWindow():focusWindowNorth() end)
@@ -201,8 +210,14 @@ hotkey.bind(KEY_CAM, "delete", function() hs.reload() end)
-- hotkey.bind(KEY_CAM, 'h', function() window.focusedWindow():focusWindowWest() end)
-- Hints
hotkey.bind(KEY_CAM, "space", function() hints.windowHints(getAllValidWindows()) end)
hotkey.bind(KEY_CAM, "space", function()
hints.windowHints(GetAllValidWindows())
end)
-- Layouts
hotkey.bind(KEY_SCAM, "1", function() layout.apply(LAYOUT_SINGLE) end)
hotkey.bind(KEY_SCAM, "2", function() layout.apply(LAYOUT_DUAL) end)
hotkey.bind(KEY_SCAM, "1", function()
layout.apply(LAYOUT_SINGLE)
end)
hotkey.bind(KEY_SCAM, "2", function()
layout.apply(LAYOUT_DUAL)
end)