Bohdan's terminal configuration
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

nix: new "playground" host for VMs; initial Niri configuration

bpavuk e6895eae 059e1c2b

+755
+3
.gitignore
··· 1 1 .aider* 2 + playground.qcow2 3 + result* 4 +
+17
flake.nix
··· 50 50 ]; 51 51 }; 52 52 53 + nixosConfigurations."playground" = nixpkgs.lib.nixosSystem { 54 + modules = [ 55 + ./nixos/hosts/playground 56 + home-manager.nixosModules.home-manager 57 + { 58 + home-manager.useGlobalPkgs = true; 59 + home-manager.useUserPackages = true; 60 + home-manager.users.bpavuk-pg = ./nixos/users/bpavuk-pg.nix; 61 + 62 + home-manager.extraSpecialArgs = { 63 + vicinae = vicinae; 64 + nix-index-database = nix-index-database; 65 + }; 66 + } 67 + ]; 68 + }; 69 + 53 70 homeConfigurations."bpavuk" = home-manager.lib.homeManagerConfiguration { 54 71 modules = [ 55 72 vicinae.homeManagerModules.default
+623
niri/config.kdl
··· 1 + // This config is in the KDL format: https://kdl.dev 2 + // "/-" comments out the following node. 3 + // Check the wiki for a full description of the configuration: 4 + // https://yalter.github.io/niri/Configuration:-Introduction 5 + 6 + // Input device configuration. 7 + // Find the full list of options on the wiki: 8 + // https://yalter.github.io/niri/Configuration:-Input 9 + input { 10 + keyboard { 11 + xkb { 12 + // You can set rules, model, layout, variant and options. 13 + // For more information, see xkeyboard-config(7). 14 + 15 + // For example: 16 + // layout "us,ru" 17 + // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" 18 + 19 + // If this section is empty, niri will fetch xkb settings 20 + // from org.freedesktop.locale1. You can control these using 21 + // localectl set-x11-keymap. 22 + } 23 + 24 + // Enable numlock on startup, omitting this setting disables it. 25 + numlock 26 + } 27 + 28 + // Next sections include libinput settings. 29 + // Omitting settings disables them, or leaves them at their default values. 30 + // All commented-out settings here are examples, not defaults. 31 + touchpad { 32 + // off 33 + tap 34 + // dwt 35 + // dwtp 36 + // drag false 37 + // drag-lock 38 + natural-scroll 39 + // accel-speed 0.2 40 + // accel-profile "flat" 41 + // scroll-method "two-finger" 42 + // disabled-on-external-mouse 43 + } 44 + 45 + mouse { 46 + // off 47 + // natural-scroll 48 + // accel-speed 0.2 49 + // accel-profile "flat" 50 + // scroll-method "no-scroll" 51 + } 52 + 53 + trackpoint { 54 + // off 55 + // natural-scroll 56 + // accel-speed 0.2 57 + // accel-profile "flat" 58 + // scroll-method "on-button-down" 59 + // scroll-button 273 60 + // scroll-button-lock 61 + // middle-emulation 62 + } 63 + 64 + // Uncomment this to make the mouse warp to the center of newly focused windows. 65 + // warp-mouse-to-focus 66 + 67 + // Focus windows and outputs automatically when moving the mouse into them. 68 + // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. 69 + // focus-follows-mouse max-scroll-amount="0%" 70 + } 71 + 72 + // You can configure outputs by their name, which you can find 73 + // by running `niri msg outputs` while inside a niri instance. 74 + // The built-in laptop monitor is usually called "eDP-1". 75 + // Find more information on the wiki: 76 + // https://yalter.github.io/niri/Configuration:-Outputs 77 + // Remember to uncomment the node by removing "/-"! 78 + /-output "eDP-1" { 79 + // Uncomment this line to disable this output. 80 + // off 81 + 82 + // Resolution and, optionally, refresh rate of the output. 83 + // The format is "<width>x<height>" or "<width>x<height>@<refresh rate>". 84 + // If the refresh rate is omitted, niri will pick the highest refresh rate 85 + // for the resolution. 86 + // If the mode is omitted altogether or is invalid, niri will pick one automatically. 87 + // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. 88 + mode "1920x1080@120.030" 89 + 90 + // You can use integer or fractional scale, for example use 1.5 for 150% scale. 91 + scale 2 92 + 93 + // Transform allows to rotate the output counter-clockwise, valid values are: 94 + // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. 95 + transform "normal" 96 + 97 + // Position of the output in the global coordinate space. 98 + // This affects directional monitor actions like "focus-monitor-left", and cursor movement. 99 + // The cursor can only move between directly adjacent outputs. 100 + // Output scale and rotation has to be taken into account for positioning: 101 + // outputs are sized in logical, or scaled, pixels. 102 + // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, 103 + // so to put another output directly adjacent to it on the right, set its x to 1920. 104 + // If the position is unset or results in an overlap, the output is instead placed 105 + // automatically. 106 + position x=1280 y=0 107 + } 108 + 109 + // Settings that influence how windows are positioned and sized. 110 + // Find more information on the wiki: 111 + // https://yalter.github.io/niri/Configuration:-Layout 112 + layout { 113 + // Set gaps around windows in logical pixels. 114 + gaps 16 115 + 116 + // When to center a column when changing focus, options are: 117 + // - "never", default behavior, focusing an off-screen column will keep at the left 118 + // or right edge of the screen. 119 + // - "always", the focused column will always be centered. 120 + // - "on-overflow", focusing a column will center it if it doesn't fit 121 + // together with the previously focused column. 122 + center-focused-column "never" 123 + 124 + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. 125 + preset-column-widths { 126 + // Proportion sets the width as a fraction of the output width, taking gaps into account. 127 + // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. 128 + // The default preset widths are 1/3, 1/2 and 2/3 of the output. 129 + proportion 0.33333 130 + proportion 0.5 131 + proportion 0.66667 132 + 133 + // Fixed sets the width in logical pixels exactly. 134 + // fixed 1920 135 + } 136 + 137 + // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. 138 + // preset-window-heights { } 139 + 140 + // You can change the default width of the new windows. 141 + default-column-width { proportion 0.5; } 142 + // If you leave the brackets empty, the windows themselves will decide their initial width. 143 + // default-column-width {} 144 + 145 + // By default focus ring and border are rendered as a solid background rectangle 146 + // behind windows. That is, they will show up through semitransparent windows. 147 + // This is because windows using client-side decorations can have an arbitrary shape. 148 + // 149 + // If you don't like that, you should uncomment `prefer-no-csd` below. 150 + // Niri will draw focus ring and border *around* windows that agree to omit their 151 + // client-side decorations. 152 + // 153 + // Alternatively, you can override it with a window rule called 154 + // `draw-border-with-background`. 155 + 156 + // You can change how the focus ring looks. 157 + focus-ring { 158 + // Uncomment this line to disable the focus ring. 159 + // off 160 + 161 + // How many logical pixels the ring extends out from the windows. 162 + width 4 163 + 164 + // Colors can be set in a variety of ways: 165 + // - CSS named colors: "red" 166 + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" 167 + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. 168 + 169 + // Color of the ring on the active monitor. 170 + active-color "#7fc8ff" 171 + 172 + // Color of the ring on inactive monitors. 173 + // 174 + // The focus ring only draws around the active window, so the only place 175 + // where you can see its inactive-color is on other monitors. 176 + inactive-color "#505050" 177 + 178 + // You can also use gradients. They take precedence over solid colors. 179 + // Gradients are rendered the same as CSS linear-gradient(angle, from, to). 180 + // The angle is the same as in linear-gradient, and is optional, 181 + // defaulting to 180 (top-to-bottom gradient). 182 + // You can use any CSS linear-gradient tool on the web to set these up. 183 + // Changing the color space is also supported, check the wiki for more info. 184 + // 185 + // active-gradient from="#80c8ff" to="#c7ff7f" angle=45 186 + 187 + // You can also color the gradient relative to the entire view 188 + // of the workspace, rather than relative to just the window itself. 189 + // To do that, set relative-to="workspace-view". 190 + // 191 + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" 192 + } 193 + 194 + // You can also add a border. It's similar to the focus ring, but always visible. 195 + border { 196 + // The settings are the same as for the focus ring. 197 + // If you enable the border, you probably want to disable the focus ring. 198 + off 199 + 200 + width 4 201 + active-color "#ffc87f" 202 + inactive-color "#505050" 203 + 204 + // Color of the border around windows that request your attention. 205 + urgent-color "#9b0000" 206 + 207 + // Gradients can use a few different interpolation color spaces. 208 + // For example, this is a pastel rainbow gradient via in="oklch longer hue". 209 + // 210 + // active-gradient from="#e5989b" to="#ffb4a2" angle=45 relative-to="workspace-view" in="oklch longer hue" 211 + 212 + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" 213 + } 214 + 215 + // You can enable drop shadows for windows. 216 + shadow { 217 + // Uncomment the next line to enable shadows. 218 + // on 219 + 220 + // By default, the shadow draws only around its window, and not behind it. 221 + // Uncomment this setting to make the shadow draw behind its window. 222 + // 223 + // Note that niri has no way of knowing about the CSD window corner 224 + // radius. It has to assume that windows have square corners, leading to 225 + // shadow artifacts inside the CSD rounded corners. This setting fixes 226 + // those artifacts. 227 + // 228 + // However, instead you may want to set prefer-no-csd and/or 229 + // geometry-corner-radius. Then, niri will know the corner radius and 230 + // draw the shadow correctly, without having to draw it behind the 231 + // window. These will also remove client-side shadows if the window 232 + // draws any. 233 + // 234 + // draw-behind-window true 235 + 236 + // You can change how shadows look. The values below are in logical 237 + // pixels and match the CSS box-shadow properties. 238 + 239 + // Softness controls the shadow blur radius. 240 + softness 30 241 + 242 + // Spread expands the shadow. 243 + spread 5 244 + 245 + // Offset moves the shadow relative to the window. 246 + offset x=0 y=5 247 + 248 + // You can also change the shadow color and opacity. 249 + color "#0007" 250 + } 251 + 252 + // Struts shrink the area occupied by windows, similarly to layer-shell panels. 253 + // You can think of them as a kind of outer gaps. They are set in logical pixels. 254 + // Left and right struts will cause the next window to the side to always be visible. 255 + // Top and bottom struts will simply add outer gaps in addition to the area occupied by 256 + // layer-shell panels and regular gaps. 257 + struts { 258 + // left 64 259 + // right 64 260 + // top 64 261 + // bottom 64 262 + } 263 + } 264 + 265 + // Add lines like this to spawn processes at startup. 266 + // Note that running niri as a session supports xdg-desktop-autostart, 267 + // which may be more convenient to use. 268 + // See the binds section below for more spawn examples. 269 + 270 + // This line starts waybar, a commonly used bar for Wayland compositors. 271 + spawn-at-startup "waybar" 272 + 273 + // To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup: 274 + // spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell" 275 + 276 + hotkey-overlay { 277 + // Uncomment this line to disable the "Important Hotkeys" pop-up at startup. 278 + // skip-at-startup 279 + } 280 + 281 + // Uncomment this line to ask the clients to omit their client-side decorations if possible. 282 + // If the client will specifically ask for CSD, the request will be honored. 283 + // Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. 284 + // This option will also fix border/focus ring drawing behind some semitransparent windows. 285 + // After enabling or disabling this, you need to restart the apps for this to take effect. 286 + // prefer-no-csd 287 + 288 + // You can change the path where screenshots are saved. 289 + // A ~ at the front will be expanded to the home directory. 290 + // The path is formatted with strftime(3) to give you the screenshot date and time. 291 + screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" 292 + 293 + // You can also set this to null to disable saving screenshots to disk. 294 + // screenshot-path null 295 + 296 + // Animation settings. 297 + // The wiki explains how to configure individual animations: 298 + // https://yalter.github.io/niri/Configuration:-Animations 299 + animations { 300 + // Uncomment to turn off all animations. 301 + // off 302 + 303 + // Slow down all animations by this factor. Values below 1 speed them up instead. 304 + // slowdown 3.0 305 + } 306 + 307 + // Window rules let you adjust behavior for individual windows. 308 + // Find more information on the wiki: 309 + // https://yalter.github.io/niri/Configuration:-Window-Rules 310 + 311 + // Work around WezTerm's initial configure bug 312 + // by setting an empty default-column-width. 313 + window-rule { 314 + // This regular expression is intentionally made as specific as possible, 315 + // since this is the default config, and we want no false positives. 316 + // You can get away with just app-id="wezterm" if you want. 317 + match app-id=r#"^org\.wezfurlong\.wezterm$"# 318 + default-column-width {} 319 + } 320 + 321 + // Open the Firefox picture-in-picture player as floating by default. 322 + window-rule { 323 + // This app-id regular expression will work for both: 324 + // - host Firefox (app-id is "firefox") 325 + // - Flatpak Firefox (app-id is "org.mozilla.firefox") 326 + match app-id=r#"firefox$"# title="^Picture-in-Picture$" 327 + open-floating true 328 + } 329 + 330 + // Example: block out two password managers from screen capture. 331 + // (This example rule is commented out with a "/-" in front.) 332 + /-window-rule { 333 + match app-id=r#"^org\.keepassxc\.KeePassXC$"# 334 + match app-id=r#"^org\.gnome\.World\.Secrets$"# 335 + 336 + block-out-from "screen-capture" 337 + 338 + // Use this instead if you want them visible on third-party screenshot tools. 339 + // block-out-from "screencast" 340 + } 341 + 342 + // Example: enable rounded corners for all windows. 343 + // (This example rule is commented out with a "/-" in front.) 344 + /-window-rule { 345 + geometry-corner-radius 12 346 + clip-to-geometry true 347 + } 348 + 349 + binds { 350 + // Keys consist of modifiers separated by + signs, followed by an XKB key name 351 + // in the end. To find an XKB name for a particular key, you may use a program 352 + // like wev. 353 + // 354 + // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt 355 + // when running as a winit window. 356 + // 357 + // Most actions that you can bind here can also be invoked programmatically with 358 + // `niri msg action do-something`. 359 + 360 + // Mod-Shift-/, which is usually the same as Mod-?, 361 + // shows a list of important hotkeys. 362 + Mod+Shift+Slash { show-hotkey-overlay; } 363 + 364 + // Suggested binds for running programs: terminal, app launcher, screen locker. 365 + Mod+T hotkey-overlay-title="Open a Terminal: alacritty" { spawn "alacritty"; } 366 + Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; } 367 + Super+Alt+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; } 368 + 369 + // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc. 370 + // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`. 371 + // For example, this is a standard bind to toggle the screen reader (orca). 372 + Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; } 373 + 374 + // Example volume keys mappings for PipeWire & WirePlumber. 375 + // The allow-when-locked=true property makes them work even when the session is locked. 376 + // Using spawn-sh allows to pass multiple arguments together with the command. 377 + // "-l 1.0" limits the volume to 100%. 378 + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; } 379 + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; } 380 + XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; } 381 + XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; } 382 + 383 + // Example media keys mapping using playerctl. 384 + // This will work with any MPRIS-enabled media player. 385 + XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; } 386 + XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; } 387 + XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; } 388 + XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; } 389 + 390 + // Example brightness key mappings for brightnessctl. 391 + // You can use regular spawn with multiple arguments too (to avoid going through "sh"), 392 + // but you need to manually put each argument in separate "" quotes. 393 + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; } 394 + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; } 395 + 396 + // Open/close the Overview: a zoomed-out view of workspaces and windows. 397 + // You can also move the mouse into the top-left hot corner, 398 + // or do a four-finger swipe up on a touchpad. 399 + Mod+O repeat=false { toggle-overview; } 400 + 401 + Mod+Q repeat=false { close-window; } 402 + 403 + Mod+Left { focus-column-left; } 404 + Mod+Down { focus-window-down; } 405 + Mod+Up { focus-window-up; } 406 + Mod+Right { focus-column-right; } 407 + Mod+H { focus-column-left; } 408 + Mod+J { focus-window-down; } 409 + Mod+K { focus-window-up; } 410 + Mod+L { focus-column-right; } 411 + 412 + Mod+Ctrl+Left { move-column-left; } 413 + Mod+Ctrl+Down { move-window-down; } 414 + Mod+Ctrl+Up { move-window-up; } 415 + Mod+Ctrl+Right { move-column-right; } 416 + Mod+Ctrl+H { move-column-left; } 417 + Mod+Ctrl+J { move-window-down; } 418 + Mod+Ctrl+K { move-window-up; } 419 + Mod+Ctrl+L { move-column-right; } 420 + 421 + // Alternative commands that move across workspaces when reaching 422 + // the first or last window in a column. 423 + // Mod+J { focus-window-or-workspace-down; } 424 + // Mod+K { focus-window-or-workspace-up; } 425 + // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } 426 + // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } 427 + 428 + Mod+Home { focus-column-first; } 429 + Mod+End { focus-column-last; } 430 + Mod+Ctrl+Home { move-column-to-first; } 431 + Mod+Ctrl+End { move-column-to-last; } 432 + 433 + Mod+Shift+Left { focus-monitor-left; } 434 + Mod+Shift+Down { focus-monitor-down; } 435 + Mod+Shift+Up { focus-monitor-up; } 436 + Mod+Shift+Right { focus-monitor-right; } 437 + Mod+Shift+H { focus-monitor-left; } 438 + Mod+Shift+J { focus-monitor-down; } 439 + Mod+Shift+K { focus-monitor-up; } 440 + Mod+Shift+L { focus-monitor-right; } 441 + 442 + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } 443 + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } 444 + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } 445 + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } 446 + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } 447 + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } 448 + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } 449 + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } 450 + 451 + // Alternatively, there are commands to move just a single window: 452 + // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } 453 + // ... 454 + 455 + // And you can also move a whole workspace to another monitor: 456 + // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; } 457 + // ... 458 + 459 + Mod+Page_Down { focus-workspace-down; } 460 + Mod+Page_Up { focus-workspace-up; } 461 + Mod+U { focus-workspace-down; } 462 + Mod+I { focus-workspace-up; } 463 + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } 464 + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } 465 + Mod+Ctrl+U { move-column-to-workspace-down; } 466 + Mod+Ctrl+I { move-column-to-workspace-up; } 467 + 468 + // Alternatively, there are commands to move just a single window: 469 + // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } 470 + // ... 471 + 472 + Mod+Shift+Page_Down { move-workspace-down; } 473 + Mod+Shift+Page_Up { move-workspace-up; } 474 + Mod+Shift+U { move-workspace-down; } 475 + Mod+Shift+I { move-workspace-up; } 476 + 477 + // You can bind mouse wheel scroll ticks using the following syntax. 478 + // These binds will change direction based on the natural-scroll setting. 479 + // 480 + // To avoid scrolling through workspaces really fast, you can use 481 + // the cooldown-ms property. The bind will be rate-limited to this value. 482 + // You can set a cooldown on any bind, but it's most useful for the wheel. 483 + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } 484 + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } 485 + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } 486 + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } 487 + 488 + Mod+WheelScrollRight { focus-column-right; } 489 + Mod+WheelScrollLeft { focus-column-left; } 490 + Mod+Ctrl+WheelScrollRight { move-column-right; } 491 + Mod+Ctrl+WheelScrollLeft { move-column-left; } 492 + 493 + // Usually scrolling up and down with Shift in applications results in 494 + // horizontal scrolling; these binds replicate that. 495 + Mod+Shift+WheelScrollDown { focus-column-right; } 496 + Mod+Shift+WheelScrollUp { focus-column-left; } 497 + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } 498 + Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } 499 + 500 + // Similarly, you can bind touchpad scroll "ticks". 501 + // Touchpad scrolling is continuous, so for these binds it is split into 502 + // discrete intervals. 503 + // These binds are also affected by touchpad's natural-scroll, so these 504 + // example binds are "inverted", since we have natural-scroll enabled for 505 + // touchpads by default. 506 + // Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; } 507 + // Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; } 508 + 509 + // You can refer to workspaces by index. However, keep in mind that 510 + // niri is a dynamic workspace system, so these commands are kind of 511 + // "best effort". Trying to refer to a workspace index bigger than 512 + // the current workspace count will instead refer to the bottommost 513 + // (empty) workspace. 514 + // 515 + // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on 516 + // will all refer to the 3rd workspace. 517 + Mod+1 { focus-workspace 1; } 518 + Mod+2 { focus-workspace 2; } 519 + Mod+3 { focus-workspace 3; } 520 + Mod+4 { focus-workspace 4; } 521 + Mod+5 { focus-workspace 5; } 522 + Mod+6 { focus-workspace 6; } 523 + Mod+7 { focus-workspace 7; } 524 + Mod+8 { focus-workspace 8; } 525 + Mod+9 { focus-workspace 9; } 526 + Mod+Ctrl+1 { move-column-to-workspace 1; } 527 + Mod+Ctrl+2 { move-column-to-workspace 2; } 528 + Mod+Ctrl+3 { move-column-to-workspace 3; } 529 + Mod+Ctrl+4 { move-column-to-workspace 4; } 530 + Mod+Ctrl+5 { move-column-to-workspace 5; } 531 + Mod+Ctrl+6 { move-column-to-workspace 6; } 532 + Mod+Ctrl+7 { move-column-to-workspace 7; } 533 + Mod+Ctrl+8 { move-column-to-workspace 8; } 534 + Mod+Ctrl+9 { move-column-to-workspace 9; } 535 + 536 + // Alternatively, there are commands to move just a single window: 537 + // Mod+Ctrl+1 { move-window-to-workspace 1; } 538 + 539 + // Switches focus between the current and the previous workspace. 540 + // Mod+Tab { focus-workspace-previous; } 541 + 542 + // The following binds move the focused window in and out of a column. 543 + // If the window is alone, they will consume it into the nearby column to the side. 544 + // If the window is already in a column, they will expel it out. 545 + Mod+BracketLeft { consume-or-expel-window-left; } 546 + Mod+BracketRight { consume-or-expel-window-right; } 547 + 548 + // Consume one window from the right to the bottom of the focused column. 549 + Mod+Comma { consume-window-into-column; } 550 + // Expel the bottom window from the focused column to the right. 551 + Mod+Period { expel-window-from-column; } 552 + 553 + Mod+R { switch-preset-column-width; } 554 + // Cycling through the presets in reverse order is also possible. 555 + // Mod+R { switch-preset-column-width-back; } 556 + Mod+Shift+R { switch-preset-window-height; } 557 + Mod+Ctrl+R { reset-window-height; } 558 + Mod+F { maximize-column; } 559 + Mod+Shift+F { fullscreen-window; } 560 + 561 + // Expand the focused column to space not taken up by other fully visible columns. 562 + // Makes the column "fill the rest of the space". 563 + Mod+Ctrl+F { expand-column-to-available-width; } 564 + 565 + Mod+C { center-column; } 566 + 567 + // Center all fully visible columns on screen. 568 + Mod+Ctrl+C { center-visible-columns; } 569 + 570 + // Finer width adjustments. 571 + // This command can also: 572 + // * set width in pixels: "1000" 573 + // * adjust width in pixels: "-5" or "+5" 574 + // * set width as a percentage of screen width: "25%" 575 + // * adjust width as a percentage of screen width: "-10%" or "+10%" 576 + // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, 577 + // set-column-width "100" will make the column occupy 200 physical screen pixels. 578 + Mod+Minus { set-column-width "-10%"; } 579 + Mod+Equal { set-column-width "+10%"; } 580 + 581 + // Finer height adjustments when in column with other windows. 582 + Mod+Shift+Minus { set-window-height "-10%"; } 583 + Mod+Shift+Equal { set-window-height "+10%"; } 584 + 585 + // Move the focused window between the floating and the tiling layout. 586 + Mod+V { toggle-window-floating; } 587 + Mod+Shift+V { switch-focus-between-floating-and-tiling; } 588 + 589 + // Toggle tabbed column display mode. 590 + // Windows in this column will appear as vertical tabs, 591 + // rather than stacked on top of each other. 592 + Mod+W { toggle-column-tabbed-display; } 593 + 594 + // Actions to switch layouts. 595 + // Note: if you uncomment these, make sure you do NOT have 596 + // a matching layout switch hotkey configured in xkb options above. 597 + // Having both at once on the same hotkey will break the switching, 598 + // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). 599 + // Mod+Space { switch-layout "next"; } 600 + // Mod+Shift+Space { switch-layout "prev"; } 601 + 602 + Print { screenshot; } 603 + Ctrl+Print { screenshot-screen; } 604 + Alt+Print { screenshot-window; } 605 + 606 + // Applications such as remote-desktop clients and software KVM switches may 607 + // request that niri stops processing the keyboard shortcuts defined here 608 + // so they may, for example, forward the key presses as-is to a remote machine. 609 + // It's a good idea to bind an escape hatch to toggle the inhibitor, 610 + // so a buggy application can't hold your session hostage. 611 + // 612 + // The allow-inhibiting=false property can be applied to other binds as well, 613 + // which ensures niri always processes them, even when an inhibitor is active. 614 + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } 615 + 616 + // The quit action will show a confirmation dialog to avoid accidental exits. 617 + Mod+Shift+E { quit; } 618 + Ctrl+Alt+Delete { quit; } 619 + 620 + // Powers off the monitors. To turn them back on, do any input like 621 + // moving the mouse or pressing any other key. 622 + Mod+Shift+P { power-off-monitors; } 623 + }
+1
niri/config.kdl.bak
··· 1 + spawn-at-startup "alacritty"
+11
nixos/desktop/niri.nix
··· 1 + { pkgs, ... }: 2 + { 3 + services.displayManager.sddm = { 4 + enable = true; 5 + wayland.enable = true; 6 + }; 7 + security.polkit.enable = true; 8 + programs.niri.enable = true; 9 + programs.xwayland.enable = true; 10 + environment.systemPackages = [ pkgs.xwayland-satellite ]; 11 + }
+10
nixos/home/life/niri.nix
··· 1 + { pkgs, ... }: 2 + { 3 + xdg.configFile."niri" = { 4 + source = ../../../niri; 5 + recursive = true; 6 + }; 7 + 8 + programs.alacritty.enable = true; 9 + } 10 +
+50
nixos/hosts/playground/default.nix
··· 1 + { pkgs, lib, ... }: 2 + 3 + { 4 + imports = [ 5 + ../common.nix 6 + # ../../desktop/kde.nix 7 + ../../desktop/niri.nix 8 + ../cachix.nix 9 + ]; 10 + 11 + networking = { 12 + hostName = "playground"; 13 + networkmanager.enable = true; 14 + }; 15 + 16 + users.users.bpavuk-pg = { 17 + isNormalUser = true; 18 + initialPassword = "password"; 19 + description = "Bohdan (Playground)"; 20 + extraGroups = [ "networkmanager" "wheel" "kvm" "libvirtd" ]; 21 + shell = pkgs.nushell; 22 + }; 23 + 24 + virtualisation.vmVariant = { 25 + virtualisation = { 26 + memorySize = 6144; # MB 27 + cores = 4; 28 + graphics = true; 29 + qemu.options = [ 30 + "-device virtio-vga-gl" 31 + "-display gtk,gl=on" 32 + ]; 33 + }; 34 + }; 35 + 36 + boot.kernelPackages = pkgs.linuxPackages_latest; 37 + 38 + system.stateVersion = "25.05"; 39 + 40 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 41 + 42 + # forced software rendering 43 + environment.variables = { 44 + # WLR_RENDERER = "pixman"; 45 + WLR_NO_HARDWARE_CURSORS = 1; 46 + }; 47 + 48 + # auto login 49 + # services.getty.autologinUser = "bpavuk-pg"; 50 + }
+39
nixos/users/bpavuk-pg.nix
··· 1 + { config, pkgs, lib, vicinae, nix-index-database, ... }: 2 + 3 + { 4 + home.username = "bpavuk-pg"; 5 + home.homeDirectory = "/home/bpavuk-pg"; 6 + home.stateVersion = "25.05"; 7 + 8 + home.keyboard = { 9 + layout = "us,ru,ua"; 10 + options = [ 11 + "grp:win_space_toggle" 12 + "caps:swapescape" 13 + ]; 14 + }; 15 + 16 + dconf.settings = { 17 + "org/gnome/desktop/input-sources" = { 18 + show-all-sources = true; 19 + sources = [ 20 + (lib.hm.gvariant.mkTuple [ "xkb" "us+altgr-intl" ]) 21 + (lib.hm.gvariant.mkTuple [ "xkb" "ru" ]) 22 + (lib.hm.gvariant.mkTuple [ "xkb" "ua" ]) 23 + ]; 24 + xkb-options = [ "caps:swapescape" "grp:win_space_toggle" ]; 25 + }; 26 + }; 27 + 28 + imports = [ 29 + vicinae.homeManagerModules.default 30 + nix-index-database.homeModules.default 31 + 32 + # (import ../home/development { inherit config pkgs lib; }) 33 + (import ../home/fonts { inherit config pkgs lib; }) 34 + (import ../home/utils.nix { inherit config pkgs lib; }) 35 + # (import ../home/life { inherit config pkgs lib zen-browser; }) 36 + (import ../home/life/niri.nix { inherit config pkgs lib; }) 37 + # (import ../home/re { inherit config pkgs lib; }) 38 + ]; 39 + }
+1
result
··· 1 + /nix/store/znaaf0rgzrirj66qx8bhk9lclvgmiahb-nixos-vm