1
Fork 0
mirror of https://github.com/RGBCube/random-scripts synced 2025-05-14 02:54:58 +00:00
random-scripts/hammerspoon-copyboard.lua
2025-05-06 15:36:49 +03:00

97 lines
2.4 KiB
Lua

-- The file to search. Relative to home directory.
local location = "lalamo.txt"
-- Modifiers necessary to trigger the prompt.
local modifier = {"cmd", "ctrl"}
-- The key after the modifiers nescessary to trigger the prompt.
local key = "p"
-- The separator used to split entries in the location.
local entry_separator = "%%%"
-- The duration of the "Copied!" alert. Set to a 0 to disable.
local copy_alert_duration = 0.5
_G.hs = _G.hs or {}
---@diagnostic disable: cast-local-type
local _split = function(text, pattern, plain)
local splitStart, length = 1, #text
return function ()
if splitStart then
local sepStart, sepEnd = string.find(text, pattern, splitStart, plain)
local ret
if not sepStart then
ret = string.sub(text, splitStart)
splitStart = nil
elseif sepEnd < sepStart then
ret = string.sub(text, splitStart, sepStart)
if sepStart < length then
splitStart = sepStart + 1
else
splitStart = nil
end
else
ret = sepStart > splitStart and string.sub(text, splitStart, sepStart - 1) or ''
splitStart = sepEnd + 1
end
return ret
end
end
end
local split = function(text, pattern, plain)
local ret = {}
for match in _split(text, pattern, plain) do
table.insert(ret, match)
end
return ret
end
local trim = function(string)
return string:match("^%s*(.-)%s*$")
end
local read = function(path)
local file = io.open(path, "r")
if not file then return nil end
local content = file:read("*all")
file:close()
return content
end
local search = function()
local content = read(os.getenv("HOME") .. "/" .. location)
if not content then
hs.alert.show("Could not read ~/" .. location)
return
end
local entries = split(content, entry_separator, true)
if #entries == 0 then
hs.alert.show("~/" .. location .. " is empty")
return
end
local chooser = hs.chooser.new(function(choice)
if choice then
hs.pasteboard.setContents(choice.text)
if copy_alert_duration ~= 0 then
hs.alert.show("Copied!", {}, hs.screen.mainScreen(), copy_alert_duration)
end
end
end)
local choices = {}
for i, entry in ipairs(entries) do
table.insert(choices, {
id = i,
text = trim(entry),
})
end
chooser:choices(choices)
chooser:show()
end
hs.hotkey.bind(modifier, key, search)