Uncommon tips & tricks
Remapping Caps Lock
You can customize the behavior of the Caps Lock key using kb_options.
To view all available options related to Caps Lock, run:
grep 'caps' /usr/share/X11/xkb/rules/base.lstFor example, to remap Caps lock to Ctrl:
hl.config({
input = {
kb_options = "ctrl:nocaps",
},
})You can find additional kb_options unrelated to Caps Lock in /usr/share/X11/xkb/rules/base.lst.
Minimize windows using special workspaces
This approach uses special workspaces to mimic the “minimize window” function, by using a single keybind to toggle the minimized state. Note that one keybind can only handle one window.
hl.bind("SUPER + X", 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)Toggle animations/blur/etc hotkey
For less distractions at a keypress, or battery saving on a laptop
Add the following to your hyprland config:
hl.bind("SUPER + F1", function ()
local game_mode = (hl.get_config("animations.enabled") == false)
if game_mode then
hl.exec_cmd("hyprctl reload")
return
end
hl.config({
general = {
gaps_in = 0, gaps_out = 0, -- Disable gaps
border_size = 0,
},
animations = {
enabled = false, -- Disable animations
},
-- Disable blur, shadow and window rounding
decoration = {
shadow = { enabled = false },
blur = { enabled = false },
rounding = 0,
}
})
end)Edit to your liking of course. If animations are enabled, it disables all the pretty stuff. Otherwise, the script reloads your config to grab your defaults.
Per workspace layouts
You can use workspace rules to set per-workspace layouts:
hl.workspace_rule({ workspace = "2", layout = "scrolling" })
hl.workspace_rule({ workspace = "3", layout = "dwindle" })Cycle layout for current workspace
To change layout for current workspace you can use this bind:
hl.bind("SUPER + tab", function ()
local layouts = { "scrolling", "dwindle", "master", "monocle" }
local workspace = hl.get_active_workspace()
local next_layout = "dwindle"
if not workspace then
return
end
for i = 1, #layouts do
if layouts[i] == workspace.tiled_layout then
local next_layout_idx = (i % #layouts) + 1
next_layout = layouts[next_layout_idx]
break
end
end
hl.workspace_rule({ workspace = workspace.name, layout = next_layout })
end)Per layout bindings
Use this one to bind different actions to the same key binding based on current layout:
local function layout_bind(bind_table)
return function ()
local workspace = hl.get_active_special_workspace() or
hl.get_active_workspace()
if not workspace then
return
end
local layout = workspace.tiled_layout
if bind_table[layout] then
hl.dispatch(bind_table[layout])
end
end
end
hl.bind("SUPER + A", layout_bind({
scrolling = hl.dsp.layout("swapcol l"), -- Scrolling: swap column with left one
dwindle = hl.dsp.layout("swapsplit"), -- Dwindle: swap window split
monocle = hl.dsp.layout("cycleprev"), -- Monocle and master: cycle prev window
master = hl.dsp.layout("cycleprev"),
}))
hl.bind("SUPER + D", layout_bind({
scrolling = hl.dsp.layout("swapcol r"), -- Scrolling: swap column with right one
dwindle = hl.dsp.layout("togglesplit"), -- Dwindle: toggle window split
monocle = hl.dsp.layout("cyclenext"), -- Monocle and master: cycle next window
master = hl.dsp.layout("cyclenext"),
}))Config versioning
Some updates add breaking changes, which can be anticipated by looking at the hyprland version.
You can make your configs conditional using hl.version(), e.g.:
if hl.version() == "0.55.2" then
hl.config({
general = {
changed_property = "value"
}
})
else
hl.notification.create({
text = "Youre using: ".. hl.version(),
timeout = 10000
})
endGlass magnifier zoom
Bind to use cursor zoom like a glass magnifier
local MAX_ZOOM = 3
local MIN_ZOOM = 1
local ZOOM_TOGGLE_FACTOR = 1.5
---@param offset number
---@return nil
local function zoom(offset)
local current = hl.get_config("cursor.zoom_factor")
if offset ~= nil then
current = current + offset
elseif current ~= MIN_ZOOM then
current = MIN_ZOOM
else
current = ZOOM_TOGGLE_FACTOR
end
current = math.max(MIN_ZOOM, math.min(MAX_ZOOM, current))
hl.config({ cursor = { zoom_factor = current } })
end
hl.bind("SUPER + Z", zoom)
hl.bind("SUPER + KP_ADD", function()
zoom(0.5)
end)
hl.bind("SUPER + minus", function()
zoom(-0.5)
end)