1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
local SLOTS = 6
local MOD_NAMES = {
"Ctrl+Alt",
"Ctrl+Shift",
"Alt+Shift",
"Ctrl+Alt+Shift",
"Cmd/Win+Alt",
"Cmd/Win+Shift",
}
local MODS = {
["Ctrl+Alt"] = { ctrl = true, alt = true },
["Ctrl+Shift"] = { ctrl = true, shift = true },
["Alt+Shift"] = { alt = true, shift = true },
["Ctrl+Alt+Shift"] = { ctrl = true, alt = true, shift = true },
["Cmd/Win+Alt"] = { win = true, alt = true },
["Cmd/Win+Shift"] = { win = true, shift = true },
}
local schema = {
modifier = UI.Select(
"Ctrl+Alt",
MOD_NAMES,
{ label = "Modifier held with every slot key", tab = "Settings" }
),
dateFormat = UI.Text("%Y-%m-%d", {
label = "{date} format",
placeholder = "%Y-%m-%d",
tab = "Settings",
}),
timeFormat = UI.Text("%H:%M", {
label = "{time} format",
placeholder = "%H:%M",
tab = "Settings",
}),
}
for n = 1, SLOTS do
schema[`key{n}`] =
UI.Keybind(tostring(n), { label = "Key", tab = `Slot {n}` })
schema[`text{n}`] = UI.Text("", {
label = "Text",
placeholder = "Thanks, {date}. Use \\n for a new line.",
maxLength = 2000,
tab = `Slot {n}`,
})
end
local cfg = UI.Schema(schema)
local function chordHeld()
local want = MODS[cfg.modifier] or {}
local have = Input.GetModifiers()
for _, m in { "ctrl", "alt", "shift", "win" } do
if (want[m] == true) ~= have[m] then
return false
end
end
return true
end
local function expand(text)
local tokens = {
date = os.date(cfg.dateFormat),
time = os.date(cfg.timeFormat),
datetime = os.date(cfg.dateFormat .. " " .. cfg.timeFormat),
}
local out = text:gsub("{(%w+)}", function(name)
return tokens[name]
end)
return (out:gsub("\\n", "\n"))
end
local function insert(n)
Run(function()
local waited = 0
while waited < 1000 do
local m = Input.GetModifiers()
if not (m.ctrl or m.alt or m.shift or m.win) then
break
end
Sleep(10)
waited += 10
end
if waited >= 1000 then
UI.Notify("Release the modifier keys to insert", "warning")
return
end
local text = cfg[`text{n}`]
if text == "" then
UI.Notify(`Slot {n} has no text`, "warning")
return
end
local ok, err = pcall(System.TypeText, expand(text))
if not ok then
Log.Error(`slot {n}: {err}`)
UI.Notify(`Slot {n} could not be typed`, "error")
end
end)
end
for n = 1, SLOTS do
Bind(cfg[`key{n}`], {
when = chordHeld,
action = function()
return nil
end,
release = function()
insert(n)
end,
})
end
function OnStart()
Log.Info(
`{cfg.modifier} + slot key types the slot. Change keys, then restart the script.`
)
end