1# neferwl config: one `key = value` per line, # starts a comment.
2# Every value below is the default; a missing file means defaults.
3# Changes apply live. An invalid line logs a warning and keeps the default.
4
5# Keyboard (xkb names, e.g. layout = fr, options = caps:escape).
6keyboard.layout =
7keyboard.variant =
8keyboard.options =
9keyboard.repeat-rate = 25
10keyboard.repeat-delay = 600
11# Which modifier `cmd` means in binds: super, alt or ctrl.
12keyboard.cmd = super
13
14# Command for spawn-terminal: terminal, then $TERMINAL, then foot.
15# Automatically open once on the initial numbered workspace (first), on every
16# visible empty workspace (all), or never (off). --no-terminal overrides this.
17# terminal = foot
18terminal.auto-open = first
19
20# Commands run once when the session starts; separate several with `;` or
21# use one line each. Like spawn, a command runs without a shell: see
22# "Running commands" in docs/desktop.md.
23# Programs get WAYLAND_DISPLAY and NEFERWL_STATE.
24# startup = waybar; mako
25# startup = wl-paste --watch cliphist store
26
27background = #111111
28
29# Separator lines between tiled windows (tmux style), in logical pixels.
30# The lines along the focused window use active; width 0 disables them,
31# empty inactive draws only the focused lines. Floats get a full border.
32border.width = 2
33# Corner radius in logical pixels (0 to 64): floats always, tiles only with gaps.
34border.radius = 0
35border.active = #808080
36border.inactive = #111111
37
38# Black veil over tiles and lower layers when a float is visible (0 to 1).
39floating.dim = 0.3
40
41# on: toggle-stash-visible on an empty stash opens the terminal in it.
42stash.spawn-terminal = on
43
44layout.gaps = 0
45# Columns sharing the screen equally before the overflow applies: one cell is
46# a max-columns-th of the width, and columns, rules and slots are sized in
47# cells. A lone column fills the screen without separators.
48layout.max-columns = 2
49# Past max-columns: cascade starts a new band of columns below, scrolling
50# vertically; scroll opens columns to the right; fixed keeps everything on
51# screen, each new window splitting the newest one (spiral).
52layout.overflow = cascade
53
54# Touchpad. A three-finger swipe up or down slides between workspaces, left
55# or right scrolls the columns (cascade swaps the two axes). natural-scroll
56# = on moves the content with the fingers, for scroll and swipes. tap = on
57# clicks on a tap: one finger left, two right, three middle.
58touchpad.natural-scroll = off
59touchpad.tap = on
60# Pointer speed from -1 to 1; adaptive speeds up quick moves, flat does not.
61touchpad.accel-speed = 0
62touchpad.accel-profile = adaptive
63# left-handed = on swaps the left and right buttons.
64touchpad.left-handed = off
65# Two-finger scroll distance multiplier.
66touchpad.scroll-factor = 1
67
68# Mouse. natural-scroll = on moves the content with the wheel; speed and
69# profile work as for the touchpad.
70mouse.natural-scroll = off
71mouse.accel-speed = 0
72mouse.accel-profile = adaptive
73mouse.left-handed = off
74
75# Hide the pointer cursor after this long without motion (100ms to 1h, or
76# off); the next motion shows it.
77cursor.hide-after = 5s
78
79# on: moving a column or window to another workspace shows that workspace.
80focus.follow-move = off
81# Experimental, off by default.
82# on: windows and the view move with springs, windows fade in and out as
83# they open, close or leave with the stash, the overview zooms its cards;
84# off: every change is instant and three-finger swipes act when the
85# fingers lift.
86# speed: slow, normal, fast, or a number from 0.1 (10x slower) to 10
87# (10x faster).
88animations = off
89animations.speed = normal
90# Focus flash: a brief inner border on the window, column or output an
91# action just changed. Width in logical pixels (1 to 8), starting opacity
92# (0.1 to 1), fade duration (50ms to 1s, not scaled by animations.speed),
93# color #rrggbb (empty: border.active).
94focus.flash = on
95focus.flash-width = 2
96focus.flash-opacity = 0.6
97focus.flash-duration = 200ms
98focus.flash-color =
99# Hint mode is experimental and off: turn it on here (restart required).
100# hint.enable = off
101# Hint mode finds its targets with the nefer-hints detector (restart required).
102# hint.detector = nefer-hints
103# hint.model = ~/.local/share/nefer-hints/models
104# Unset or empty uses the model threshold (model.json), else the runner default.
105# Set 0.01..0.99 to override it.
106# hint.threshold =
107# Show the labels in screenshots and screencasts taken by clients.
108# hint.capture = off
109
110# Named workspaces are outside the numbered list and require a bind. The bind
111# shows one; pressing it again returns to the previous workspace.
112# max-columns and overflow override the layout.* values.
113# workspace.web.max-columns = 3
114# workspace.web.overflow = fixed
115#
116# Slots: column.N = <cells>, <command> (1-16). neferwl starts each command in the
117# background and puts its first window in column N, without taking focus.
118# A closed slot stays empty until the workspace is shown again. Apps that
119# reuse a running instance need a new-instance flag.
120# workspace.dev.monitor = DP-2
121# workspace.dev.column.1 = 2, code --new-window
122# workspace.dev.column.2 = 1, foot
123# bind.cmd+d = workspace dev
124
125# Window rules place an app's windows when they first open, without moving
126# the focus or the view. app-id is a regular expression matching the whole
127# app ID (see `neferwl state`); matching rules merge, a later one winning.
128# floating = on|off, workspace = N or a declared name, monitor = DP-2 or a
129# monitor key, width = cells (1-16).
130# rule.games.app-id = steam_app_.*
131# rule.games.workspace = 3
132# rule.games.monitor = DP-2
133# rule.calc.app-id = org\.gnome\.Calculator
134# rule.calc.floating = on
135
136# Displays (drm backend): WxH, WxH@Hz, preferred or off.
137# The first listed display that is connected and not off is used.
138# output.DP-2 = 5120x2160@165.058
139# output.HDMI-A-1 = off
140# Scale (HiDPI), 1 to 4, like 1.5 or 4/3. Default 1. scale-up and scale-down
141# step through the scales where the display divides into whole pixels and
142# save the result here.
143# output.DP-2.scale = 4/3
144
145render.direct-scanout = on
146# Games asking for tearing flip without waiting for vblank, and variable
147# refresh runs; both only while a fullscreen window is scanned out directly.
148render.tearing = on
149render.vrr = on
150
151# Run output and input threads with SCHED_RR when permitted.
152performance.realtime = on
153
154# log.level: debug, info, warn or error. log.debug: components or all.
155log.level = info
156log.debug =
157
158# Binds: bind.<keys> = <action>. Modifiers: cmd, shift, ctrl, alt, super.
159# code:N is a physical key (evdev code), the same key on every layout:
160# code:2 to code:10 are the digit row 1 to 9, code:12 and code:13 the two
161# keys right of 0 (- and = on US).
162# Keys are what your layout prints (cmd+é on AZERTY). Write = # and space
163# by name: cmd+equal, cmd+numbersign, cmd+space. `none` removes a default.
164# `spawn <command>` runs a program; arguments split on spaces, `;` starts
165# another command, no shell (pipes and variables go in a script: see
166# "Running commands" in docs/desktop.md).
167bind.cmd+return = spawn-terminal
168bind.cmd+left = focus-column-left
169bind.cmd+right = focus-column-right
170bind.cmd+up = focus-window-up
171bind.cmd+down = focus-window-down
172bind.cmd+shift+left = move-column-left
173bind.cmd+shift+right = move-column-right
174# Vim keys: every arrow bind also works with h j k l.
175bind.cmd+h = focus-column-left
176bind.cmd+l = focus-column-right
177bind.cmd+k = focus-window-up
178bind.cmd+j = focus-window-down
179bind.cmd+shift+h = move-column-left
180bind.cmd+shift+l = move-column-right
181# A window alone in its column joins the neighbor column; a stacked one
182# leaves for a new column. A full fixed workspace stacks it into the
183# neighbor column instead, past the edge on the neighbor monitor.
184bind.cmd+bracketleft = consume-or-expel-window-left
185bind.cmd+bracketright = consume-or-expel-window-right
186# Reorder the focused window inside its column.
187bind.cmd+shift+up = move-window-up
188bind.cmd+shift+down = move-window-down
189bind.cmd+shift+k = move-window-up
190bind.cmd+shift+j = move-window-down
191# Resize a column by N cells (+N or -N, 1-16), a window by a step of the
192# usable height (+N% or -N%, 1-100).
193bind.cmd+alt+left = set-column-width -1
194bind.cmd+alt+right = set-column-width +1
195bind.cmd+alt+up = set-window-height -10%
196bind.cmd+alt+down = set-window-height +10%
197bind.cmd+alt+h = set-column-width -1
198bind.cmd+alt+l = set-column-width +1
199bind.cmd+alt+k = set-window-height -10%
200bind.cmd+alt+j = set-window-height +10%
201# A tile becomes a free floating window, or returns to its column.
202bind.cmd+shift+space = toggle-floating
203# Grow the focused column by one cell, then back to equal shares.
204bind.cmd+r = cycle-column-width
205bind.cmd+f = maximize-column
206bind.cmd+shift+f = toggle-fullscreen
207bind.cmd+s = toggle-stash-visible
208bind.cmd+shift+s = toggle-window-stash
209bind.cmd+o = toggle-overview
210# Label the links and buttons on screen and click one by typing its label.
211# bind.cmd+g = hint
212bind.cmd+q = close-window
213bind.ctrl+alt+backspace = quit
214bind.ctrl+cmd+space = spawn fuzzel
215
216# Workspaces stack vertically (side by side with cascade); numbers follow
217# their order. An empty one always waits after the last. cmd+up/down past the
218# column edge also switch workspace.
219bind.cmd+pageup = focus-workspace-prev
220bind.cmd+pagedown = focus-workspace-next
221# move-column-to-workspace moves the whole column; move-window-to-workspace
222# (N, -prev, -next) moves only the focused window and has no default bind.
223bind.cmd+shift+pageup = move-column-to-workspace-prev
224bind.cmd+shift+pagedown = move-column-to-workspace-next
225# Reorder workspaces: swap the current one with its neighbor.
226bind.cmd+ctrl+shift+up = move-workspace-prev
227bind.cmd+ctrl+shift+down = move-workspace-next
228bind.cmd+ctrl+shift+k = move-workspace-prev
229bind.cmd+ctrl+shift+j = move-workspace-next
230bind.cmd+code:2 = focus-workspace 1
231bind.cmd+code:3 = focus-workspace 2
232bind.cmd+code:4 = focus-workspace 3
233bind.cmd+code:5 = focus-workspace 4
234bind.cmd+code:6 = focus-workspace 5
235bind.cmd+code:7 = focus-workspace 6
236bind.cmd+code:8 = focus-workspace 7
237bind.cmd+code:9 = focus-workspace 8
238bind.cmd+code:10 = focus-workspace 9
239bind.cmd+shift+code:2 = move-column-to-workspace 1
240bind.cmd+shift+code:3 = move-column-to-workspace 2
241bind.cmd+shift+code:4 = move-column-to-workspace 3
242bind.cmd+shift+code:5 = move-column-to-workspace 4
243bind.cmd+shift+code:6 = move-column-to-workspace 5
244bind.cmd+shift+code:7 = move-column-to-workspace 6
245bind.cmd+shift+code:8 = move-column-to-workspace 7
246bind.cmd+shift+code:9 = move-column-to-workspace 8
247bind.cmd+shift+code:10 = move-column-to-workspace 9
248
249# Monitors, left to right: focus the neighbor, or move the workspace there.
250bind.cmd+ctrl+left = focus-monitor-left
251bind.cmd+ctrl+right = focus-monitor-right
252bind.cmd+ctrl+h = focus-monitor-left
253bind.cmd+ctrl+l = focus-monitor-right
254bind.cmd+ctrl+shift+left = move-workspace-to-monitor-left
255bind.cmd+ctrl+shift+right = move-workspace-to-monitor-right
256bind.cmd+ctrl+shift+h = move-workspace-to-monitor-left
257bind.cmd+ctrl+shift+l = move-workspace-to-monitor-right
258
259# Zoom: the whole display, live.
260bind.cmd+code:13 = scale-up
261bind.cmd+code:12 = scale-down
262
263# Media keys have no default. Bind them by their exact xkb keysym name
264# (case-sensitive; `wev` shows it) to your own tools:
265# bind.XF86AudioRaiseVolume = spawn wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+
266# bind.XF86AudioLowerVolume = spawn wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
267# bind.XF86AudioMute = spawn wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
268# bind.XF86AudioMicMute = spawn wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
269# bind.XF86MonBrightnessUp = spawn brightnessctl set +5%
270# bind.XF86MonBrightnessDown = spawn brightnessctl set 5%-
271# bind.XF86AudioPlay = spawn playerctl play-pause