Files
hyprland/config/hypr/configs/keybinds.lua
T
2026-07-20 22:12:19 +05:45

166 lines
5.7 KiB
Lua

local mainMod = "SUPER"
local terminal = "kitty"
local browser = "zen-browser"
local file_manager = "thunar"
-- Generates layout specific binds to avoid error warnings
local function layout_bind(bind_table)
return function()
local layout = hl.get_active_workspace().tiled_layout
if bind_table[layout] then
hl.dispatch(bind_table[layout])
end
end
end
local layouts = { "scrolling", "dwindle", "monocle" }
-- Cycles through layouts for the current workspace
local function cycle_layout(dir)
return function()
local ws = hl.get_active_workspace()
local i = 1
for idx, l in ipairs(layouts) do
if l == ws.tiled_layout then
i = idx
break
end
end
local target = layouts[(dir == "prev" and (i - 2) % #layouts or i % #layouts) + 1]
if hl.workspace_rule then
hl.workspace_rule({ workspace = tostring(ws.id), layout = target })
end
local display_name = target:sub(1, 1):upper() .. target:sub(2)
hl.dispatch(
hl.dsp.exec_cmd(
string.format(
"notify-send -u low -t 1200 -a 'Hyprland' -i 'preferences-desktop-display' 'Workspace %s' 'Layout: %s'",
ws.name,
display_name
)
)
)
end
end
-- apps launch
hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd("uwsm app -- " .. terminal))
hl.bind("ALT + SHIFT + Return", hl.dsp.exec_cmd("uwsm app -- " .. terminal, { float = true }))
hl.bind("ALT + E", hl.dsp.exec_cmd("uwsm app -- " .. file_manager))
hl.bind(mainMod .. " + B", hl.dsp.exec_cmd("uwsm app -- " .. browser))
hl.bind("ALT + P", hl.dsp.exec_cmd("grimblast save screen"))
-- Cycle Layout in Specific workspace
hl.bind(mainMod .. " + Tab", cycle_layout("next"))
hl.bind(mainMod .. " + SHIFT + Tab", cycle_layout("prev"))
-- Increases / Decreases active window by x, y relatively
hl.bind("ALT + SHIFT + Z", hl.dsp.window.resize({ x = -80, y = -75, relative = true }))
hl.bind("ALT + SHIFT + C", hl.dsp.window.resize({ x = 80, y = 75, relative = true }))
hl.bind(mainMod .. " + C", hl.dsp.window.close())
hl.bind(mainMod .. " + SHIFT + C", hl.dsp.window.kill())
-- Toggle fullscreen and center floating window
hl.bind(mainMod .. " + SHIFT + F", hl.dsp.window.fullscreen({ action = "toggle" }))
hl.bind(mainMod .. " + F", function()
hl.dispatch(hl.dsp.window.float({ action = "toggle" }))
hl.dispatch(hl.dsp.window.center())
end)
hl.bind(mainMod .. " + CTRL + P", hl.dsp.exec_cmd("systemctl poweroff")) -- poweroff
hl.bind(mainMod .. " + CTRL + R", hl.dsp.exec_cmd("systemctl reboot")) -- reboot
hl.bind(mainMod .. " + P", hl.dsp.window.pseudo()) -- pseudo tiling
-- Layout column resize
for key, dir in pairs({
["ALT + SHIFT + F"] = "+conf", -- If scrolling layout, set next column width from config
[mainMod .. " + SHIFT + W"] = "-conf", -- Scrolling: set previous column width from config
}) do
hl.bind(key, layout_bind({ scrolling = hl.dsp.layout("colresize " .. dir) }))
end
-- Multi-layout specific binds
for key, val in pairs({
H = { "swapcol l", "swapsplit", "cycleprev" },
L = { "swapcol r", "togglesplit", "cyclenext" },
}) do
hl.bind(
mainMod .. " + SHIFT + " .. key,
layout_bind({
scrolling = hl.dsp.layout(val[1]),
dwindle = hl.dsp.layout(val[2]),
monocle = hl.dsp.layout(val[3]),
master = hl.dsp.layout(val[3]),
})
)
end
-- Minimize active window
hl.bind("SUPER + Q", function()
hl.dispatch(hl.dsp.workspace.toggle_special("minimize"))
hl.dispatch(hl.dsp.window.move({ workspace = "+0" }))
hl.dispatch(hl.dsp.workspace.toggle_special("minimize"))
hl.dispatch(hl.dsp.window.move({ workspace = "special:minimize" }))
hl.dispatch(hl.dsp.workspace.toggle_special("minimize"))
end)
-- Cycle workspaces and Scrolling / Layout
for key, val in pairs({
D = { "e+1", "+col" },
A = { "e-1", "-col" },
}) do
hl.bind("ALT + SHIFT + " .. key, hl.dsp.focus({ workspace = val[1] })) -- Cycle workspace
hl.bind("ALT + " .. key, hl.dsp.layout("move " .. val[2])) -- Scrolling
end
-- Move, Focus and Resize windows
for key, val in pairs({
H = { "left", 70, 0 },
L = { "right", -70, 0 },
K = { "up", 0, -70 },
J = { "down", 0, 70 },
}) do
hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ direction = val[1] })) -- Move
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ direction = val[1] })) -- Focus
hl.bind("ALT + SHIFT + " .. key, hl.dsp.window.resize({ x = val[2], y = val[3], relative = true })) -- Resize
end
-- Switch workspaces with mainMod + [0-10]
-- Move active window to a workspace with mainMod + SHIFT + [0-10]
local workspaces = 10
for i = 1, workspaces do
local key = i % 10
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i }))
hl.bind("ALT + SHIFT + " .. key, hl.dsp.window.move({ workspace = i, follow = false }))
hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
end
-- Move/resize windows with SUPER + LMB/RMB and dragging
hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind("SUPER + mouse:273", hl.dsp.window.resize(), { mouse = true })
hl.bind("xf86Sleep", hl.dsp.exec_cmd("systemctl suspend"), { locked = true })
-- Playerctl
for key, cmd in pairs({
AudioNext = "next",
AudioPause = "play-pause",
AudioPlay = "play-pause",
AudioPrev = "previous",
}) do
hl.bind("XF86" .. key, hl.dsp.exec_cmd("playerctl " .. cmd), { locked = true })
end
for key, cmd in pairs({
["ALT + F12"] = 'notify-send \'Test notification\' "Here\'s a really long message to test truncation and wrapping\\nYou can middle click or flick this notification to dismiss it!" -a \'terminal\' -A "Test1=I got it!" -A "Test2=Another action"',
["ALT + Equal"] = "notify-send 'hmm' ${SLURP_ARGS}",
["SHIFT + ALT + N"] = 'notify-send "Hello" "FIRE IN THE HOLE‼️🗣️🔥🕳️" -i "/home/sankalp/.face.icon" -A "🗣️" -A "🔥" -A "🕳️" -a "Source Code"',
}) do
hl.bind(key, hl.dsp.exec_cmd(cmd))
end