0
fork

Configure Feed

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

Split out from dotfiles repo

MLC Bloeiman e91fe940

+5507
+3
.gitignore
··· 1 + 2 + # Ignore hidden Mise configuration file, use mise.toml for public config 3 + .mise.toml
+56
README.md
··· 1 + ### 1. Clone the repo 2 + 3 + Cloning the `nix` branch using `jj` from the Strawmelonjuice forge: 4 + 5 + ```bash 6 + # Temporary pre-install these required packages 7 + nix shell github:nixos/nixpkgs/nixos-unstable#jujutsu --extra-experimental-features nix-command --extra-experimental-features flakes 8 + nix shell github:nixos/nixpkgs/nixos-unstable#git --extra-experimental-features nix-command --extra-experimental-features flakes 9 + 10 + # Clone the dotfiles 11 + jj git clone https://forge.strawmelonjuice.com/strawmelonjuice/nix.git -b main --no-colocate ~/.dotfiles 12 + 13 + cd ~/.dotfiles 14 + # Set origin correctly for dotfiles 15 + jj git remote set-url origin ssh://git@forge.strawmelonjuice.com/strawmelonjuice/nix.git 16 + 17 + # Clone wallpapers. 18 + git clone https://github.com/D3Ext/aesthetic-wallpapers.git ~/.local/share/wallpapers/aesthetic-wallpapers 19 + ``` 20 + 21 + 2. Initialize a new Host 22 + If this is a brand new device (e.g., `workstation`): 23 + 24 + Create the folder: `mkdir -p hosts/workstation` (`mkdir -p hosts/$(hostname)`) 25 + 26 + Copy the installer configs: `cp /etc/nixos/*.nix ./hosts/workstation/` (`cp /etc/nixos/*.nix ./hosts/$(hostname)/`) 27 + 28 + Update flake.nix: Include the new hostname in the nixosConfigurations block. 29 + 30 + 3. Deploy 31 + Nix uses your system's hostname to determine which configuration to apply. 32 + 33 + ```Bash 34 + 35 + # Track new files so the flake can see them 36 + jj 37 + # Apply based on current hostname 38 + sudo nixos-rebuild switch --flake .#$(hostname) 39 + ``` 40 + 41 + ## Structure 42 + 43 + | Directory | For | 44 + | ----------- | ---------------------------------------------------------------------------------------------------- | 45 + | `hosts/*` | Device-specific hardware and system settings (e.g., Fennekin's convertible tweaks). | 46 + | `home/*` | Shared user environment and config | 47 + | `configs/*` | Configuration files symlinked into their programs for when configuration is too advanced for `home/` | 48 + | `fonts/*` | Fonts, imported by `home/modules/fonts.nix` | 49 + 50 + ## Hosts currently known 51 + 52 + | Name | Kind | About | Special | 53 + | -------- | ------------------ | --------------------------------------------------------- | ----------------------------------------------------------------------------- | 54 + | fennekin | Convertible laptop | My take-with-me and drawing laptop, has a nice stylus tew | Touchscreen, convertible, wifi adaptor is busted, so there's an external one. | 55 + | fennekin | Laptop | My most beefiest laptop eva! And I use it mainly as my school laptop. | Has a good graphics card. Bigger screen. | 56 + | samurott-nix | Virtual Machine; Desktop PC | - | Ultrawide screen. |
+13
configs/fish/config.fish
··· 1 + # ----------------------------------------------------- 2 + # Fish Configuration 3 + # ----------------------------------------------------- 4 + 5 + # This file is created once, you can edit here and it won't be in conflict with chezmoi 6 + 7 + set fish_greeting "" 8 + # Load modular Fish configuration files 9 + for file in ~/.config/fish/config/*.fish 10 + if test -f $file 11 + source $file 12 + end 13 + end
+63
configs/fish/config/00-init.fish
··· 1 + # Set PATH 2 + set -x PATH /usr/lib/ccache/bin /snap/bin $HOME/bin $HOME/.local/bin/mini $HOME/.bun/bin $PATH 3 + 4 + # # Set history file location 5 + # set -x fish_history "$HOME/.local/share/fish/fish_history" 6 + 7 + # Set history size 8 + set -x fish_history_size 10000 9 + 10 + # ----------------------------------------------------- 11 + # INIT 12 + # ----------------------------------------------------- 13 + 14 + # Exporting EDITOR 15 + # On Debian, add nvim to path 16 + if test -f /etc/debian_version 17 + set -x PATH $PATH /opt/nvim-linux64/bin 18 + end 19 + set -x USERTERM $TERM 20 + if test -n "$WSL_INTEROP" 21 + set -x USERTERM "$TERM-wsl" 22 + end 23 + 24 + # Heartbreaking: Mise no longer important as package manager in Nix-configs. 25 + # mise activate fish | source 26 + 27 + 28 + set -x EDITOR nvim 29 + set -x VISUAL nvim 30 + if set -q ZED_TERM 31 + set -x EDITOR zeditor 32 + set -x VISUAL zeditor 33 + set -x JJ_EDITOR 'zeditor --wait' 34 + end 35 + # # On local machines, excluding on Niri (it doesn't need Muxing) or inside toolbx (because it's going to stack) 36 + # if status is-interactive; and not set -q TOOLBOX_NAME; and not set -q NIRI_SOCKET; and not set -q SSH_CONNECTION 37 + # set ZELLIJ_AUTO_EXIT true 38 + # eval (zellij setup --generate-auto-start fish | string collect) 39 + # end 40 + 41 + # On SSH connections, we want a slightly different approach. 42 + if status is-interactive; and set -q SSH_CONNECTION 43 + set ZELLIJ_AUTO_ATTACH true 44 + set ZELLIJ_AUTO_EXIT true 45 + eval (zellij setup --generate-auto-start fish | string collect) 46 + end 47 + 48 + # Aliases 49 + alias c clear 50 + alias cls clear 51 + alias nf hyfetch 52 + alias pf hyfetch 53 + alias ff fastfetch 54 + alias hf hyfetch 55 + alias ls 'eza --icons' 56 + alias la 'eza -a --icons' 57 + alias ll 'eza -al --icons' 58 + alias lt 'eza -a --tree --level=1 --icons' 59 + alias shutdown 'systemctl poweroff' 60 + alias v '$EDITOR' 61 + alias cat bat 62 + alias wifi nmtui 63 + alias yay paru
+45
configs/fish/config/10-customization.fish
··· 1 + # ----------------------------------------------------- 2 + # Customization 3 + # ----------------------------------------------------- 4 + 5 + # Initialize Starship prompt 6 + starship init fish | source 7 + 8 + # Enhanced completion options 9 + # Fish handles completions differently, so no direct translation is needed. 10 + 11 + # Directory navigation aliases 12 + alias .. 'cd ..' 13 + alias ... 'cd ../..' 14 + alias .... 'cd ../../..' 15 + alias ..... 'cd ../../../..' 16 + 17 + # ----------------------------------------------------- 18 + # Clipboard utilities 19 + # ----------------------------------------------------- 20 + if type -q xclip 21 + alias pbcopy 'xclip -selection clipboard' 22 + alias pbpaste 'xclip -selection clipboard -o' 23 + else if type -q xsel 24 + alias pbcopy 'xsel --clipboard --input' 25 + alias pbpaste 'xsel --clipboard --output' 26 + else if type -q wl-copy 27 + alias pbcopy 'wl-copy' 28 + alias pbpaste 'wl-paste' 29 + end 30 + 31 + function copyfile 32 + if test -f $argv[1] 33 + cat $argv[1] | pbcopy 34 + echo "File $argv[1] copied to clipboard" 35 + else 36 + echo "File $argv[1] not found" 37 + end 38 + end 39 + 40 + function copybuffer 41 + echo $argv | pbcopy 42 + echo "Command line copied to clipboard" 43 + end 44 + 45 + set -x GIT_EXTERNAL_DIFF difft
+110
configs/fish/config/20-aliases.fish
··· 1 + # ----------------------------------------------------- 2 + # Aliases 3 + # ----------------------------------------------------- 4 + 5 + # General aliases 6 + alias c 'clear' 7 + alias cls 'clear' 8 + alias nf 'hyfetch' 9 + alias pf 'hyfetch' 10 + alias hf 'hyfetch' 11 + 12 + alias ff 'fastfetch' 13 + alias ls 'eza --icons' 14 + alias la 'eza -a --icons' 15 + alias ll 'eza -al --icons' 16 + alias lt 'eza -a --tree --level=1 --icons' 17 + alias shutdown 'systemctl poweroff' 18 + alias v '$EDITOR' 19 + alias bat 'bat --ignored-suffix .tmpl' 20 + alias cat 'bat -p' 21 + alias wifi 'nmtui' 22 + alias zed 'ZED_ALLOW_EMULATED_GPU=1 SHELL=$(which fish) zeditor' 23 + 24 + # Update grub alias 25 + alias update-grub 'sudo grub-mkconfig -o /boot/grub/grub.cfg' 26 + 27 + alias to-dotfiles "cd ~/.dotfiles || cd ~/dotfiles" 28 + 29 + # Rebuild nix config 30 + alias rb 'to-dotfiles && jj status && sudo nixos-rebuild switch --flake .#(hostname)' 31 + 32 + # Zellij aliases and completion 33 + zellij setup --generate-completion fish | source 34 + alias ide 'zellij --layout ide' 35 + # IDE but without the editor. 36 + alias id-e 'zellij --layout id-e' 37 + alias strider 'zellij plugin --in-place -- zellij:strider' 38 + 39 + # Cargo-related aliases 40 + alias cargock 'cargo-clean-all --keep-days 21 ~ -i' 41 + 42 + # JJ-related aliases 43 + alias jj-todo 'jj new --no-edit --insert-after @ -m' 44 + alias jje 'jj edit' 45 + alias jjs 'jj show' 46 + alias jjn 'jj next --edit' 47 + alias jj-tug 'jj tug' 48 + alias jj-catchup 'jj catchup' 49 + # jj take and push 50 + alias jj-tp 'echo "JJ: Taking this! AND I\'LL PUSH!!!!" && jj tug && jj git push' 51 + 52 + # ----------------------------------------------------- 53 + # Directory navigation and aliases 54 + # ----------------------------------------------------- 55 + zoxide init fish --cmd zox | source 56 + 57 + function zap 58 + if test -d .jj; or test -d .git 59 + clear -x 60 + set -l repo_type "" 61 + if test -d .git -a -d .jj; set repo_type "JJ (git-colocated)" 62 + else if test -d .jj; set repo_type "Jujutsu" 63 + else; set repo_type "Git" 64 + end 65 + 66 + echo "📂 Opened $repo_type repository: $(pwd)" 67 + 68 + if test -d .git; git fetch; end 69 + # Show repository line counts 70 + kc 71 + 72 + if test -d .jj; jj status; else; git status; end 73 + 74 + # Show repository filetree 75 + eza --icons -L 2 -R --tree --git-ignore 76 + 77 + # Dynamically tell user of flakes. 78 + if test -f flake.nix; and type -q nix; and not set -q IN_NIX_SHELL 79 + echo "❄️ Found flake.nix, run 'dev' to open Fish in a nix develop shell." 80 + end 81 + else 82 + eza -a --icons 83 + end 84 + end 85 + 86 + function dev --description "Start een Nix develop shell in Fish" 87 + if set -q IN_NIX_SHELL 88 + echo "⚠️ Already inside Nix shell!" 89 + return 0 90 + end 91 + if test -f flake.nix; and type -q nix 92 + nix develop --set-env-var SHELL $SHELL -c $SHELL 93 + else if not type -q nix 94 + echo "󱄅 Nix is not installed!" 95 + else 96 + echo "❌ No Flake.nix file in this directory" 97 + end 98 + end 99 + 100 + # Wrap functionality around zoxide's (bang) 101 + function banger 102 + zox $argv; and zap 103 + end 104 + 105 + function bangeri 106 + zoxi $argv; and zap 107 + end 108 + 109 + alias cd 'banger' 110 + alias cdi 'bangeri'
+94
configs/fish/config/30-autostart.fish
··· 1 + # ----------------------------------------------------- 2 + # Autostart 3 + # ----------------------------------------------------- 4 + 5 + # Hyfetch 6 + if status is-interactive 7 + if not set -q HYFETCH_DONE; and not set -q IN_NIX_SHELL 8 + # set up (cat /proc/uptime | awk '{print $1}') 9 + # set up (string split -r '.' $up)[1] 10 + # if test $up -lt 300 11 + # Alleen draaien als we niet in een subshell zitten en hyfetch nog niet is geweest 12 + 13 + set -g HYFETCH_DONE 1 14 + if test -f /etc/os-release; and grep -q '^VARIANT_ID=silverblue$' /etc/os-release 15 + # Hyfetch incorrectly sees silverblue as normal Fedora 16 + hyfetch --distro=silverblue 17 + else 18 + # On all other systems (Fedora Workstation, Ubuntu, macOS, etc.) 19 + # or if the file doesn't exist, run the default. 20 + hyfetch 21 + end 22 + end 23 + end 24 + 25 + # Bitwarden session setup 26 + # Only run in interactive shells 27 + if type -q bw && status is-interactive 28 + set BW_PASSWORD_FILE "$HOME/.bitwarden_password" 29 + set BW_SESSION_FILE "$HOME/.cache/bw-session" 30 + 31 + function bw_unlock_with_password_file 32 + if test -f "$BW_PASSWORD_FILE" 33 + set BW_SESSION "$(bw unlock --passwordfile "$BW_PASSWORD_FILE" --raw 2>/dev/null)" 34 + if test -n "$BW_SESSION" 35 + mkdir -p (dirname "$BW_SESSION_FILE") 36 + echo "$BW_SESSION" >"$BW_SESSION_FILE" 37 + chmod 600 "$BW_SESSION_FILE" 38 + set -Ux BW_SESSION "$BW_SESSION" 39 + return 0 40 + else 41 + rm -f "$BW_PASSWORD_FILE" 42 + return 1 43 + end 44 + else 45 + echo "Bitwarden password file not found. Set up automatic unlock? (y/N): " 46 + read response 47 + if test "$response" = y -o "$response" = Y 48 + echo "Enter your Bitwarden master password: " 49 + read -s -l password 50 + 51 + set BW_SESSION "$(echo "$password" | bw unlock --raw 2>/dev/null)" 52 + if test -n "$BW_SESSION" 53 + echo "$password" >"$BW_PASSWORD_FILE" 54 + chmod 600 "$BW_PASSWORD_FILE" 55 + 56 + mkdir -p (dirname "$BW_SESSION_FILE") 57 + echo "$BW_SESSION" >"$BW_SESSION_FILE" 58 + chmod 600 "$BW_SESSION_FILE" 59 + 60 + bw sync --session "$BW_SESSION" >/dev/null 2>&1 61 + 62 + set -Ux BW_SESSION "$BW_SESSION" 63 + echo "Password saved securely. Future shell sessions will unlock automatically." 64 + return 0 65 + else 66 + echo "Invalid password. Bitwarden will remain locked." 67 + return 1 68 + end 69 + else 70 + echo "Skipping Bitwarden setup." 71 + return 1 72 + end 73 + end 74 + end 75 + 76 + if test -f "$BW_SESSION_FILE" 77 + set BW_SESSION "$(cat "$BW_SESSION_FILE")" 78 + if not bw status --session "$BW_SESSION" | grep -q '"status":"unlocked"' 79 + rm -f "$BW_SESSION_FILE" 80 + set -e BW_SESSION 81 + else 82 + set -Ux BW_SESSION "$BW_SESSION" 83 + end 84 + end 85 + 86 + if test -z "$BW_SESSION" 87 + set bw_status (bw status 2>/dev/null || echo '{"status":"unauthenticated"}') 88 + if echo "$bw_status" | grep -q '"status":"locked"' 89 + bw_unlock_with_password_file 90 + else if echo "$bw_status" | grep -q '"status":"unauthenticated"' 91 + echo "Bitwarden not logged in. Run 'bw login' first." 92 + end 93 + end 94 + end
+161
configs/fish/config/40-bitwarden-functions.fish
··· 1 + # ----------------------------------------------------- 2 + # Bitwarden Shell Functions 3 + # ----------------------------------------------------- 4 + 5 + # Convenient wrapper functions for Bitwarden CLI 6 + if type -q bw 7 + # Quick Bitwarden functions 8 + function bw-get 9 + set item_name $argv[1] 10 + set field (or $argv[2] "password") 11 + 12 + if not bw-ensure-session 13 + echo "Cannot access Bitwarden vault" 14 + return 1 15 + end 16 + 17 + set item_id "$(bw list items --search "$item_name" | jq -r '.[0].id // empty')" 18 + if test -n "$item_id" 19 + bw get "$field" "$item_id" ^ /dev/null 20 + else 21 + echo "Item '$item_name' not found in Bitwarden vault" 22 + return 1 23 + end 24 + end 25 + 26 + function bw-login 27 + set email (or $BW_EMAIL "") 28 + if test -z "$email" 29 + echo -n "Enter your Bitwarden email: " 30 + read -l email 31 + end 32 + 33 + if test -n "$BW_SERVER" 34 + bw config server "$BW_SERVER" 35 + end 36 + 37 + echo "Logging in to Bitwarden..." 38 + if not bw login "$email" 39 + echo "Failed to login to Bitwarden" 40 + return 1 41 + end 42 + end 43 + 44 + function bw-unlock 45 + set password_file "$HOME/.bitwarden_password" 46 + 47 + if test -f "$password_file" 48 + set session "$(bw unlock --passwordfile "$password_file" --raw)" 49 + if test -n "$session" 50 + set -Ux BW_SESSION "$session" 51 + return 0 52 + else 53 + echo "Password file seems invalid, removing it" 54 + rm -f "$password_file" 55 + end 56 + end 57 + 58 + echo -n "Enter your Bitwarden master password: " 59 + read -s -l password 60 + 61 + set session "$(echo "$password" | bw unlock --raw)" 62 + if test -n "$session" 63 + echo "$password" > "$password_file" 64 + chmod 600 "$password_file" 65 + set -Ux BW_SESSION "$session" 66 + echo "Bitwarden vault unlocked successfully" 67 + return 0 68 + else 69 + echo "Failed to unlock Bitwarden vault - incorrect password" 70 + return 1 71 + end 72 + end 73 + 74 + # Load existing session 75 + function bw-load-session 76 + set session_file "$HOME/.cache/bw-session" 77 + if test -f "$session_file" 78 + set session_token "$(cat "$session_file")" 79 + if test -n "$session_token" && bw list items --search "" >/dev/null 80 + set -Ux BW_SESSION "$session_token" 81 + return 0 82 + else 83 + rm -f "$session_file" 84 + end 85 + end 86 + return 1 87 + end 88 + 89 + # Ensure we have a valid Bitwarden session 90 + function bw-ensure-session 91 + # Only try to load session in interactive shells 92 + if not status is-interactive 93 + return 1 94 + end 95 + 96 + if bw-load-session 97 + return 0 98 + end 99 + 100 + if not bw status | grep -q '"status":"unlocked"' 101 + if bw status | grep -q '"status":"locked"' 102 + bw-unlock 103 + else 104 + bw-login && bw-unlock 105 + end 106 + else 107 + bw-load-session || bw-unlock 108 + end 109 + end 110 + 111 + # Copy secret to clipboard (requires xclip/pbcopy) 112 + function bw-copy 113 + set secret (bw-get $argv[1]) 114 + if test "$secret" != "Not found" -a "$secret" != "BW_NOT_AVAILABLE" 115 + if type -q xclip 116 + echo "$secret" | xclip -selection clipboard 117 + echo "Secret copied to clipboard" 118 + else if type -q pbcopy 119 + echo "$secret" | pbcopy 120 + echo "Secret copied to clipboard" 121 + else 122 + echo "Clipboard utility not available. Secret: $secret" 123 + end 124 + else 125 + echo "Secret not found: $argv[1]" 126 + end 127 + end 128 + 129 + # Generate and copy a random password 130 + function bw-generate 131 + set length (or $argv[1] 20) 132 + if type -q bw 133 + set password (bw generate --length "$length") 134 + if type -q xclip 135 + echo "$password" | xclip -selection clipboard 136 + echo "Generated password copied to clipboard" 137 + else if type -q pbcopy 138 + echo "$password" | pbcopy 139 + echo "Generated password copied to clipboard" 140 + else 141 + echo "Generated password: $password" 142 + end 143 + end 144 + end 145 + 146 + # Template helper: get secret for use in chezmoi templates 147 + function bw-template-helper 148 + set item_name $argv[1] 149 + set field (or $argv[2] "password") 150 + 151 + if not type -q bw 152 + echo "BW_NOT_AVAILABLE" 153 + return 0 154 + end 155 + 156 + if not bw-get-secret "$item_name" "$field" ^ /dev/null 157 + echo "BW_SECRET_NOT_FOUND" 158 + return 0 159 + end 160 + end 161 + end
+610
configs/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://github.com/YaLTeR/niri/wiki/Configuration:-Introduction 5 + 6 + // Input device configuration. 7 + // Find the full list of options on the wiki: 8 + // https://github.com/YaLTeR/niri/wiki/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 + 20 + // Enable numlock on startup, omitting this setting disables it. 21 + numlock 22 + } 23 + 24 + // Next sections include libinput settings. 25 + // Omitting settings disables them, or leaves them at their default values. 26 + touchpad { 27 + // off 28 + tap 29 + // dwt 30 + // dwtp 31 + // drag false 32 + // drag-lock 33 + natural-scroll 34 + // accel-speed 0.2 35 + // accel-profile "flat" 36 + // scroll-method "two-finger" 37 + // disabled-on-external-mouse 38 + } 39 + 40 + mouse { 41 + // off 42 + // natural-scroll 43 + accel-speed 1.0 44 + // accel-profile "flat" 45 + // scroll-method "no-scroll" 46 + } 47 + 48 + trackpoint { 49 + // off 50 + // natural-scroll 51 + // accel-speed 0.2 52 + // accel-profile "flat" 53 + // scroll-method "on-button-down" 54 + // scroll-button 273 55 + // middle-emulation 56 + } 57 + 58 + // Uncomment this to make the mouse warp to the center of newly focused windows. 59 + // warp-mouse-to-focus 60 + 61 + // Focus windows and outputs automatically when moving the mouse into them. 62 + // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. 63 + // focus-follows-mouse max-scroll-amount="0%" 64 + } 65 + 66 + spawn-at-startup "xwayland-satellite" 67 + 68 + environment { 69 + DISPLAY ":1" 70 + ELECTRON_OZONE_PLATFORM_HINT "auto" 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://github.com/YaLTeR/niri/wiki/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://github.com/YaLTeR/niri/wiki/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 "on-overflow" 123 + 124 + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. 125 + preset-column-widths { 126 + // Full 127 + proportion 1.0 128 + // 50/50 129 + proportion 0.5 130 + // *70*/30 131 + proportion 0.69 132 + // 70/*30* 133 + proportion 0.29 134 + 135 + } 136 + 137 + preset-window-heights { 138 + proportion 0.4 139 + proportion 0.74 140 + proportion 1.0 141 + 142 + } // You can change the default width of the new windows. 143 + default-column-width { proportion 0.75; } 144 + // If you leave the brackets empty, the windows themselves will decide their initial width. 145 + // default-column-width {} 146 + 147 + // By default focus ring and border are rendered as a solid background rectangle 148 + // behind windows. That is, they will show up through semitransparent windows. 149 + // This is because windows using client-side decorations can have an arbitrary shape. 150 + // 151 + // If you don't like that, you should uncomment `prefer-no-csd` below. 152 + // Niri will draw focus ring and border *around* windows that agree to omit their 153 + // client-side decorations. 154 + // 155 + // Alternatively, you can override it with a window rule called 156 + // `draw-border-with-background`. 157 + 158 + // You can change how the focus ring looks. 159 + focus-ring { 160 + // Uncomment this line to disable the focus ring. 161 + // off 162 + 163 + // How many logical pixels the ring extends out from the windows. 164 + width 4 165 + 166 + // Colors can be set in a variety of ways: 167 + // - CSS named colors: "red" 168 + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" 169 + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. 170 + 171 + // Color of the ring on the active monitor. 172 + active-color "#7fc8ff" 173 + 174 + // Color of the ring on inactive monitors. 175 + inactive-color "#505050" 176 + 177 + // You can also use gradients. They take precedence over solid colors. 178 + // Gradients are rendered the same as CSS linear-gradient(angle, from, to). 179 + // The angle is the same as in linear-gradient, and is optional, 180 + // defaulting to 180 (top-to-bottom gradient). 181 + // You can use any CSS linear-gradient tool on the web to set these up. 182 + // Changing the color space is also supported, check the wiki for more info. 183 + // 184 + // active-gradient from="#80c8ff" to="#bbddff" angle=45 185 + 186 + // You can also color the gradient relative to the entire view 187 + // of the workspace, rather than relative to just the window itself. 188 + // To do that, set relative-to="workspace-view". 189 + // 190 + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" 191 + } 192 + 193 + // You can also add a border. It's similar to the focus ring, but always visible. 194 + border { 195 + // The settings are the same as for the focus ring. 196 + // If you enable the border, you probably want to disable the focus ring. 197 + off 198 + 199 + width 4 200 + active-color "#ffc87f" 201 + inactive-color "#505050" 202 + 203 + // Color of the border around windows that request your attention. 204 + urgent-color "#9b0000" 205 + 206 + // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view" 207 + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" 208 + } 209 + 210 + // You can enable drop shadows for windows. 211 + shadow { 212 + // Uncomment the next line to enable shadows. 213 + on 214 + 215 + // By default, the shadow draws only around its window, and not behind it. 216 + // Uncomment this setting to make the shadow draw behind its window. 217 + // 218 + // Note that niri has no way of knowing about the CSD window corner 219 + // radius. It has to assume that windows have square corners, leading to 220 + // shadow artifacts inside the CSD rounded corners. This setting fixes 221 + // those artifacts. 222 + // 223 + // However, instead you may want to set prefer-no-csd and/or 224 + // geometry-corner-radius. Then, niri will know the corner radius and 225 + // draw the shadow correctly, without having to draw it behind the 226 + // window. These will also remove client-side shadows if the window 227 + // draws any. 228 + // 229 + // draw-behind-window true 230 + 231 + // You can change how shadows look. The values below are in logical 232 + // pixels and match the CSS box-shadow properties. 233 + 234 + // Softness controls the shadow blur radius. 235 + softness 30 236 + 237 + // Spread expands the shadow. 238 + spread 5 239 + 240 + // Offset moves the shadow relative to the window. 241 + offset x=0 y=5 242 + 243 + // You can also change the shadow color and opacity. 244 + color "#0007" 245 + } 246 + 247 + // Struts shrink the area occupied by windows, similarly to layer-shell panels. 248 + // You can think of them as a kind of outer gaps. They are set in logical pixels. 249 + // Left and right struts will cause the next window to the side to always be visible. 250 + // Top and bottom struts will simply add outer gaps in addition to the area occupied by 251 + // layer-shell panels and regular gaps. 252 + struts { 253 + left 14 254 + right 14 255 + // top 64 256 + // bottom 64 257 + } 258 + } 259 + 260 + // Add lines like this to spawn processes at startup. 261 + // Note that running niri as a session supports xdg-desktop-autostart, 262 + // which may be more convenient to use. 263 + // See the binds section below for more spawn examples. 264 + 265 + // This line starts waybar, a commonly used bar for Wayland compositors. 266 + spawn-at-startup "waybar" 267 + // And wallpaper. 268 + // Make sure to run $ git clone https://github.com/D3Ext/aesthetic-wallpapers.git ~/.local/share/wallpapers/aesthetic-wallpapers 269 + // once. 270 + spawn-at-startup "swww-daemon" 271 + spawn-at-startup "swww" "img" "/home/mar/.local/share/wallpapers/aesthetic-wallpapers/images/wallhaven-9mjw78.png" 272 + 273 + // Uncomment this line to ask the clients to omit their client-side decorations if possible. 274 + // If the client will specifically ask for CSD, the request will be honored. 275 + // Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. 276 + // This option will also fix border/focus ring drawing behind some semitransparent windows. 277 + // After enabling or disabling this, you need to restart the apps for this to take effect. 278 + // prefer-no-csd 279 + 280 + // You can change the path where screenshots are saved. 281 + // A ~ at the front will be expanded to the home directory. 282 + // The path is formatted with strftime(3) to give you the screenshot date and time. 283 + screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" 284 + 285 + // You can also set this to null to disable saving screenshots to disk. 286 + // screenshot-path null 287 + 288 + // Animation settings. 289 + // The wiki explains how to configure individual animations: 290 + // https://github.com/YaLTeR/niri/wiki/Configuration:-Animations 291 + animations { 292 + // Uncomment to turn off all animations. 293 + // off 294 + 295 + // Slow down all animations by this factor. Values below 1 speed them up instead. 296 + // slowdown 3.0 297 + } 298 + 299 + // Window rules let you adjust behavior for individual windows. 300 + // Find more information on the wiki: 301 + // https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules 302 + 303 + // Work around WezTerm's initial configure bug 304 + // by setting an empty default-column-width. 305 + window-rule { 306 + // This regular expression is intentionally made as specific as possible, 307 + // since this is the default config, and we want no false positives. 308 + // You can get away with just app-id="wezterm" if you want. 309 + match app-id=r#"^org\.wezfurlong\.wezterm$"# 310 + default-column-width {} 311 + } 312 + 313 + // Open the Firefox picture-in-picture player as floating by default. 314 + window-rule { 315 + // This app-id regular expression will work for both: 316 + // - host Firefox (app-id is "firefox") 317 + // - Flatpak Firefox (app-id is "org.mozilla.firefox") 318 + match app-id=r#"firefox$"# title="^Picture-in-Picture$" 319 + open-floating true 320 + } 321 + window-rule { 322 + match app-id=r#"vivaldi$"# title="^Picture-in-Picture$" 323 + open-floating true 324 + } 325 + 326 + // Example: block out two password managers from screen capture. 327 + // (This example rule is commented out with a "/-" in front.) 328 + /-window-rule { 329 + match app-id=r#"^org\.keepassxc\.KeePassXC$"# 330 + match app-id=r#"^org\.gnome\.World\.Secrets$"# 331 + 332 + block-out-from "screen-capture" 333 + 334 + // Use this instead if you want them visible on third-party screenshot tools. 335 + // block-out-from "screencast" 336 + } 337 + 338 + // Example: enable rounded corners for all windows. 339 + // (This example rule is commented out with a "/-" in front.) 340 + window-rule { 341 + geometry-corner-radius 12 342 + clip-to-geometry true 343 + } 344 + 345 + binds { 346 + Mod+Alt+R hotkey-overlay-title="Full reset/reload of config files; Runs chezmoi apply." { spawn "~/.config/hypr/scripts/fullres.sh"; } 347 + // Keys consist of modifiers separated by + signs, followed by an XKB key name 348 + // in the end. To find an XKB name for a particular key, you may use a program 349 + // like wev. 350 + // 351 + // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt 352 + // when running as a winit window. 353 + // 354 + // Most actions that you can bind here can also be invoked programmatically with 355 + // `niri msg action do-something`. 356 + 357 + // Mod-Shift-/, which is usually the same as Mod-?, 358 + // shows a list of important hotkeys. 359 + Mod+Shift+Slash { show-hotkey-overlay; } 360 + 361 + // Suggested binds for running programs: terminal, app launcher, screen locker. 362 + Mod+Return hotkey-overlay-title="Open a Terminal: wezterm" { spawn "wezterm"; } 363 + Mod+Shift+Return hotkey-overlay-title="Open backup terminal: alacritty" { spawn "alacritty"; } 364 + Mod+B hotkey-overlay-title="Open Vivaldi" { spawn "vivaldi"; } 365 + Mod+D hotkey-overlay-title="Open fuzzel" { spawn "fuzzel"; } 366 + Mod+Shift+D hotkey-overlay-title="Open (k)runner (backup runner)" { spawn "krunner"; } 367 + Alt+Space hotkey-overlay-title="Open Krun" { spawn "krunner"; } 368 + 369 + // You can also use a shell. Do this if you need pipes, multiple commands, etc. 370 + // Note: the entire command goes as a single argument in the end. 371 + // Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; } 372 + 373 + // Example volume keys mappings for PipeWire & WirePlumber. 374 + // The allow-when-locked=true property makes them work even when the session is locked. 375 + XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; } 376 + XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; } 377 + XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } 378 + XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } 379 + 380 + // Other media keys, brightness: 381 + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "1%-"; } 382 + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "+1%"; } 383 + 384 + // Open/close the Overview: a zoomed-out view of workspaces and windows. 385 + // You can also move the mouse into the top-left hot corner, 386 + // or do a four-finger swipe up on a touchpad. 387 + Mod+O repeat=false { toggle-overview; } 388 + 389 + Mod+Q { close-window; } 390 + 391 + Mod+Left { focus-column-left; } 392 + Mod+Down { focus-window-or-workspace-down; } 393 + Mod+Up { focus-window-or-workspace-up; } 394 + Mod+Right { focus-column-right; } 395 + Mod+Alt+H { focus-column-left; } 396 + // Mod+J { focus-window-down; } 397 + // Mod+K { focus-window-up; } 398 + Mod+Alt+L { focus-column-right; } 399 + 400 + Mod+Shift+Left { move-column-left; } 401 + Mod+Shift+Down { move-window-down-or-to-workspace-down; } 402 + Mod+Shift+Up { move-window-up-or-to-workspace-up; } 403 + Mod+Shift+Right { move-column-right; } 404 + Mod+Shift+H { move-column-left; } 405 + // Mod+Ctrl+J { move-window-down; } 406 + // Mod+Ctrl+K { move-window-up; } 407 + Mod+Shift+L { move-column-right; } 408 + 409 + // Alternative commands that move across workspaces when reaching 410 + // the first or last window in a column. 411 + Mod+Alt+J { focus-window-or-workspace-down; } 412 + Mod+Alt+K { focus-window-or-workspace-up; } 413 + Mod+Shift+J { move-window-down-or-to-workspace-down; } 414 + Mod+Shift+K { move-window-up-or-to-workspace-up; } 415 + 416 + Mod+Home { focus-column-first; } 417 + Mod+End { focus-column-last; } 418 + Mod+Ctrl+Home { move-column-to-first; } 419 + Mod+Ctrl+End { move-column-to-last; } 420 + 421 + Mod+Ctrl+Left { focus-monitor-left; } 422 + Mod+Ctrl+Down { focus-monitor-down; } 423 + Mod+Ctrl+Up { focus-monitor-up; } 424 + Mod+Ctrl+Right { focus-monitor-right; } 425 + Mod+Ctrl+H { focus-monitor-left; } 426 + Mod+Ctrl+J { focus-monitor-down; } 427 + Mod+Ctrl+K { focus-monitor-up; } 428 + Mod+Ctrl+L { focus-monitor-right; } 429 + 430 + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } 431 + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } 432 + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } 433 + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } 434 + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } 435 + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } 436 + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } 437 + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } 438 + 439 + // Alternatively, there are commands to move just a single window: 440 + // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } 441 + // ... 442 + 443 + // And you can also move a whole workspace to another monitor: 444 + // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; } 445 + // ... 446 + 447 + Mod+Page_Down { focus-workspace-down; } 448 + Mod+Page_Up { focus-workspace-up; } 449 + Mod+U { focus-workspace-down; } 450 + Mod+I { focus-workspace-up; } 451 + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } 452 + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } 453 + Mod+Ctrl+U { move-column-to-workspace-down; } 454 + Mod+Ctrl+I { move-column-to-workspace-up; } 455 + 456 + // Alternatively, there are commands to move just a single window: 457 + // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } 458 + // ... 459 + 460 + Mod+Shift+Page_Down { move-workspace-down; } 461 + Mod+Shift+Page_Up { move-workspace-up; } 462 + Mod+Shift+U { move-workspace-down; } 463 + Mod+Shift+I { move-workspace-up; } 464 + 465 + // You can bind mouse wheel scroll ticks using the following syntax. 466 + // These binds will change direction based on the natural-scroll setting. 467 + // 468 + // To avoid scrolling through workspaces really fast, you can use 469 + // the cooldown-ms property. The bind will be rate-limited to this value. 470 + // You can set a cooldown on any bind, but it's most useful for the wheel. 471 + Mod+WheelScrollRight cooldown-ms=150 { focus-workspace-down; } 472 + Mod+WheelScrollLeft cooldown-ms=150 { focus-workspace-up; } 473 + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } 474 + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } 475 + Mod+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } 476 + Mod+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } 477 + 478 + Mod+WheelScrollDown { focus-column-right; } 479 + Mod+WheelScrollUp { focus-column-left; } 480 + Mod+Ctrl+WheelScrollRight { move-column-right; } 481 + Mod+Ctrl+WheelScrollLeft { move-column-left; } 482 + 483 + // Usually scrolling up and down with Shift in applications results in 484 + // horizontal scrolling; these binds replicate that. 485 + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } 486 + Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } 487 + 488 + // Similarly, you can bind touchpad scroll "ticks". 489 + // Touchpad scrolling is continuous, so for these binds it is split into 490 + // discrete intervals. 491 + // These binds are also affected by touchpad's natural-scroll, so these 492 + // example binds are "inverted", since we have natural-scroll enabled for 493 + // touchpads by default. 494 + // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; } 495 + // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; } 496 + 497 + // You can refer to workspaces by index. However, keep in mind that 498 + // niri is a dynamic workspace system, so these commands are kind of 499 + // "best effort". Trying to refer to a workspace index bigger than 500 + // the current workspace count will instead refer to the bottommost 501 + // (empty) workspace. 502 + // 503 + // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on 504 + // will all refer to the 3rd workspace. 505 + Mod+1 { focus-workspace 1; } 506 + Mod+2 { focus-workspace 2; } 507 + Mod+3 { focus-workspace 3; } 508 + Mod+4 { focus-workspace 4; } 509 + Mod+5 { focus-workspace 5; } 510 + Mod+6 { focus-workspace 6; } 511 + Mod+7 { focus-workspace 7; } 512 + Mod+8 { focus-workspace 8; } 513 + Mod+9 { focus-workspace 9; } 514 + Mod+Shift+1 { move-column-to-workspace 1; } 515 + Mod+Shift+2 { move-column-to-workspace 2; } 516 + Mod+Shift+3 { move-column-to-workspace 3; } 517 + Mod+Shift+4 { move-column-to-workspace 4; } 518 + Mod+Shift+5 { move-column-to-workspace 5; } 519 + Mod+Shift+6 { move-column-to-workspace 6; } 520 + Mod+Shift+7 { move-column-to-workspace 7; } 521 + Mod+Shift+8 { move-column-to-workspace 8; } 522 + Mod+Shift+9 { move-column-to-workspace 9; } 523 + 524 + // Alternatively, there are commands to move just a single window: 525 + // Mod+Ctrl+1 { move-window-to-workspace 1; } 526 + 527 + // Switches focus between the current and the previous workspace. 528 + // Mod+Tab { focus-workspace-previous; } 529 + 530 + // The following binds move the focused window in and out of a column. 531 + // If the window is alone, they will consume it into the nearby column to the side. 532 + // If the window is already in a column, they will expel it out. 533 + Mod+BracketLeft { consume-or-expel-window-left; } 534 + Mod+BracketRight { consume-or-expel-window-right; } 535 + 536 + // Consume one window from the right to the bottom of the focused column. 537 + Mod+Comma { consume-window-into-column; } 538 + // Expel the bottom window from the focused column to the right. 539 + Mod+Period { expel-window-from-column; } 540 + 541 + Mod+R { switch-preset-column-width; } 542 + Mod+Shift+R { switch-preset-window-height; } 543 + Mod+Ctrl+R { reset-window-height; } 544 + Mod+F { maximize-column; } 545 + Mod+Shift+F { fullscreen-window; } 546 + 547 + // Expand the focused column to space not taken up by other fully visible columns. 548 + // Makes the column "fill the rest of the space". 549 + Mod+Ctrl+F { expand-column-to-available-width; } 550 + 551 + Mod+C { center-column; } 552 + 553 + // Center all fully visible columns on screen. 554 + Mod+Ctrl+C { center-visible-columns; } 555 + 556 + // Finer width adjustments. 557 + // This command can also: 558 + // * set width in pixels: "1000" 559 + // * adjust width in pixels: "-5" or "+5" 560 + // * set width as a percentage of screen width: "25%" 561 + // * adjust width as a percentage of screen width: "-10%" or "+10%" 562 + // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, 563 + // set-column-width "100" will make the column occupy 200 physical screen pixels. 564 + Mod+Minus { set-column-width "-5%"; } 565 + Mod+Equal { set-column-width "+5%"; } 566 + 567 + // Finer height adjustments when in column with other windows. 568 + Mod+Shift+Minus { set-window-height "-10%"; } 569 + Mod+Shift+Equal { set-window-height "+10%"; } 570 + 571 + // Move the focused window between the floating and the tiling layout. 572 + Mod+V { toggle-window-floating; } 573 + Mod+Shift+V { switch-focus-between-floating-and-tiling; } 574 + 575 + // Toggle tabbed column display mode. 576 + // Windows in this column will appear as vertical tabs, 577 + // rather than stacked on top of each other. 578 + Mod+W { toggle-column-tabbed-display; } 579 + 580 + // Actions to switch layouts. 581 + // Note: if you uncomment these, make sure you do NOT have 582 + // a matching layout switch hotkey configured in xkb options above. 583 + // Having both at once on the same hotkey will break the switching, 584 + // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). 585 + // Mod+Space { switch-layout "next"; } 586 + // Mod+Shift+Space { switch-layout "prev"; } 587 + 588 + Super+Shift+S { screenshot; } 589 + Super+Ctrl+Shift+S { screenshot-screen; } 590 + Super+Alt+Shift+S { screenshot-window; } 591 + Print { screenshot; } 592 + Ctrl+Print { screenshot-screen; } 593 + Alt+Print { screenshot-window; } 594 + 595 + // Applications such as remote-desktop clients and software KVM switches may 596 + // request that niri stops processing the keyboard shortcuts defined here 597 + // so they may, for example, forward the key presses as-is to a remote machine. 598 + // It's a good idea to bind an escape hatch to toggle the inhibitor, 599 + // so a buggy application can't hold your session hostage. 600 + // 601 + // The allow-inhibiting=false property can be applied to other binds as well, 602 + // which ensures niri always processes them, even when an inhibitor is active. 603 + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } 604 + 605 + // The quit action will show a confirmation dialog to avoid accidental exits. 606 + Mod+Shift+E { quit; } 607 + Ctrl+Alt+Delete { quit; } 608 + 609 + Super+L hotkey-overlay-title="Lock the system" { spawn "sh" "-c" "niri msg action spawn -- hyprlock && niri msg action power-off-monitors"; } 610 + }
+95
configs/niri/fuzzel.ini
··· 1 + # output=<not set> 2 + # font=monospace 3 + # dpi-aware=auto 4 + # prompt="> " 5 + # icon-theme=hicolor 6 + # icons-enabled=yes 7 + # fields=filename,name,generic 8 + # password-character=* 9 + # filter-desktop=no 10 + # fuzzy=yes 11 + # show-actions=no 12 + # terminal=$TERMINAL -e # Note: you cannot actually use environment variables here 13 + # launch-prefix=<not set> 14 + # list-executables-in-path=no 15 + 16 + # anchor=center 17 + # lines=15 18 + # width=30 19 + # tabs=8 20 + # horizontal-pad=40 21 + # vertical-pad=8 22 + # inner-pad=0 23 + 24 + # image-size-ratio=0.5 25 + 26 + # line-height=<use font metrics> 27 + # letter-spacing=0 28 + 29 + # layer = top 30 + # exit-on-keyboard-focus-loss = yes 31 + 32 + [colors] 33 + background=fa8071 34 + text=000000 35 + match=818181ff 36 + selection=fa8071 37 + selection-text=000000 38 + # selection-match=cb4b16ff 39 + # border=002b36ff 40 + 41 + [border] 42 + # width=1 43 + # radius=10 44 + 45 + [dmenu] 46 + # mode=text # text|index 47 + # exit-immediately-if-empty=no 48 + 49 + [key-bindings] 50 + # cancel=Escape Control+g 51 + # execute=Return KP_Enter Control+y 52 + # execute-or-next=Tab 53 + # execute-input=Shift+Return Shift+KP_Enter 54 + # cursor-left=Left Control+b 55 + # cursor-left-word=Control+Left Mod1+b 56 + # cursor-right=Right Control+f 57 + # cursor-right-word=Control+Right Mod1+f 58 + # cursor-home=Home Control+a 59 + # cursor-end=End Control+e 60 + # delete-prev=BackSpace 61 + # delete-prev-word=Mod1+BackSpace Control+BackSpace 62 + # delete-line-backward=Control+u 63 + # delete-next=Delete KP_Delete Control+d 64 + # delete-next-word=Mod1+d Control+Delete Control+KP_Delete 65 + # delete-line-forward=Control+k 66 + # prev=Up Control+p 67 + # prev-with-wrap=ISO_Left_Tab 68 + # prev-page=Page_Up KP_Page_Up 69 + # next=Down Control+n 70 + # next-with-wrap=none 71 + # next-page=Page_Down KP_Page_Down 72 + 73 + # custom-N: *dmenu mode only*. Like execute, but with a non-zero 74 + # exit-code; custom-1 exits with code 10, custom-2 with 11, custom-3 75 + # with 12, and so on. 76 + 77 + # custom-1=Mod1+1 78 + # custom-2=Mod1+2 79 + # custom-3=Mod1+3 80 + # custom-4=Mod1+4 81 + # custom-5=Mod1+5 82 + # custom-6=Mod1+6 83 + # custom-7=Mod1+7 84 + # custom-8=Mod1+8 85 + # custom-9=Mod1+9 86 + # custom-10=Mod1+0 87 + # custom-11=Mod1+exclam 88 + # custom-12=Mod1+at 89 + # custom-13=Mod1+numbersign 90 + # custom-14=Mod1+dollar 91 + # custom-15=Mod1+percent 92 + # custom-16=Mod1+dead_circumflex 93 + # custom-17=Mod1+ampersand 94 + # custom-18=Mod1+asterix 95 + # custom-19=Mod1+parentleft
+44
configs/niri/hypr/hyprlock.conf
··· 1 + # _ _ _ 2 + # | |__ _ _ _ __ _ __| | ___ ___| | __ 3 + # | '_ \| | | | '_ \| '__| |/ _ \ / __| |/ / 4 + # | | | | |_| | |_) | | | | (_) | (__| < 5 + # |_| |_|\__, | .__/|_| |_|\___/ \___|_|\_\ 6 + # |___/|_| 7 + # 8 + 9 + background { 10 + monitor = 11 + path = screenshot 12 + blur_passes = 3 13 + blur_size = 10 14 + } 15 + 16 + input-field { 17 + size = 300,300 18 + outline_thickness = 3 19 + dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8 20 + dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0 21 + dots_center = true 22 + dots_rounding = -1 # -1 default circle, -2 follow input-field rounding 23 + outer_color = rgb(151515) 24 + inner_color = rgb(FFFFFF) 25 + font_color = rgb(10, 10, 10) 26 + fade_on_empty = false 27 + fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered. 28 + placeholder_text = <i>  </i> # Text rendered in the input box when it's empty. 29 + hide_input = true 30 + rounding = -1 # -1 means complete rounding (circle/oval) 31 + check_color = rgb(204, 136, 34) 32 + fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color 33 + fail_text = # can be set to empty 34 + fail_transition = 300 # transition time in ms between normal outer_color and fail_color 35 + capslock_color = -1 36 + numlock_color = -1 37 + bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above) 38 + invert_numlock = false # change color if numlock is off 39 + swap_font_color = false # see below 40 + position = 0, -20 41 + halign = center 42 + valign = center 43 + } 44 +
+11
configs/niri/hypr/scripts/keyboard-relaunch.sh
··· 1 + #!/run/current-system/sw/bin/bash 2 + # Relaunch the touch keyboard if it crashed 3 + 4 + line=$(ps -C wvkbd-mobintl --no-headers) 5 + if [ -z "$line" ]; then 6 + wvkbd-mobintl -L 300 7 + else 8 + echo $line >/dev/null 9 + # Its running, so send it a signal to toggle it up 10 + kill -34 $(ps -C wvkbd-mobintl) 11 + fi
+5
configs/niri/hypr/scripts/reload-hyprpaper.sh
··· 1 + #!/bin/bash 2 + killall hyprpaper 3 + sleep 1 4 + hyprpaper & 5 +
+4
configs/niri/hypr/scripts/reload-waybar.sh
··· 1 + #!/bin/bash 2 + killall -9 waybar 3 + sleep 1 4 + waybar &
+37
configs/niri/waybar/config
··· 1 + { 2 + "layer": "top", // Waybar at top layer 3 + "position": "top", // Waybar position (top|bottom|left|right) 4 + "height": 30, // Waybar height (to be removed for auto height) 5 + // "width": 1280, // Waybar width 6 + "spacing": 0, // Gaps between modules in pixels 7 + // Choose the order of the modules 8 + // Load Modules 9 + "include": [ 10 + "~/.config/waybar/modules.jsonc" 11 + ], 12 + "cffi/niri-taskbar": { 13 + "module_path": "/home/mar/.local/bin/libs/libniri_taskbar.so", 14 + }, 15 + "modules-left": [ 16 + // "custom/appmenu", 17 + "sway/workspaces", 18 + "sway/mode", 19 + "sway/window", 20 + "cffi/niri-taskbar" 21 + ], 22 + "modules-center": [ 23 + "custom/osktoggle", 24 + "battery", 25 + "clock", 26 + "custom/exit" 27 + ], 28 + "modules-right": [ 29 + "tray", 30 + "mpd", 31 + "pulseaudio", 32 + "network", 33 + "cpu", 34 + "memory", 35 + "keyboard-state" 36 + ] 37 + }
+242
configs/niri/waybar/modules.jsonc
··· 1 + { 2 + // Workspaces 3 + "hyprland/workspaces": { 4 + "on-click": "activate", 5 + "active-only": false, 6 + "all-outputs": true, 7 + "format": "{icon}", 8 + "format-icons": { 9 + "1": "1 ", 10 + "2": "2 ", 11 + "3": "3 ", 12 + "4": "4 #", 13 + }, 14 + "persistent-workspaces": { 15 + "*": 4, 16 + }, 17 + }, 18 + "sway/workspaces": { 19 + "on-click": "activate", 20 + "active-only": false, 21 + "all-outputs": true, 22 + "disable-scroll": true, 23 + "format-icons": { 24 + "1": "1 ", 25 + "2": "2 ", 26 + "3": "3 ", 27 + "4": "4 #", 28 + }, 29 + "persistent-workspaces": { 30 + // "1": "1", 31 + // "2": "2", 32 + // "3": "3" 33 + }, 34 + }, 35 + "sway/mode": { 36 + "format": "<span style=\"italic\">{}</span>", 37 + }, 38 + // Hyprland Window 39 + "hyprland/window": { 40 + "rewrite": { 41 + "(.*) - Discord": "# Discord: $1", 42 + "Element \\| (.*)": "# Element: $1", 43 + "(.*) - ArmCord": "# Discord: $1", 44 + "Revolt": "# Revolt", 45 + "(.*) — LibreWolf": "$1", 46 + "(.*) — Mozilla Firefox": "$1", 47 + "(.*) — Zen Browser": "$1", 48 + "(.*) - Chromium": "$1", 49 + "(.*) - Vivaldi": "$1", 50 + "Spotify (.*)": "Spotify", 51 + "(.*) - Tidal": "Tidal", 52 + "(.*) - TIDAL": "Tidal", 53 + }, 54 + "separate-outputs": true, 55 + }, 56 + "sway/window": { 57 + "rewrite": { 58 + "(.*) - Discord": "# Discord: $1", 59 + "Element \\| (.*)": "# Element: $1", 60 + "(.*) - ArmCord": "# Discord: $1", 61 + "Revolt": "# Revolt", 62 + "(.*) — LibreWolf": "$1", 63 + "(.*) — Mozilla Firefox": "$1", 64 + "(.*) — Zen Browser": "$1", 65 + "(.*) - Chromium": "$1", 66 + "(.*) - Vivaldi": "$1", 67 + "Spotify (.*)": "Spotify", 68 + "(.*) - Tidal": "Tidal", 69 + "(.*) - TIDAL": "Tidal", 70 + }, 71 + "separate-outputs": true, 72 + }, 73 + "cffi/niri-taskbar": { 74 + "rewrite": { 75 + "(.*) - Discord": "# Discord: $1", 76 + "Element \\| (.*)": "# Element: $1", 77 + "(.*) - ArmCord": "# Discord: $1", 78 + "Revolt": "# Revolt", 79 + "(.*) — LibreWolf": "$1", 80 + "(.*) — Mozilla Firefox": "$1", 81 + "(.*) — Zen Browser": "$1", 82 + "(.*) - Chromium": "$1", 83 + "(.*) - Vivaldi": "$1", 84 + "Spotify (.*)": "Spotify", 85 + "(.*) - Tidal": "Tidal", 86 + "(.*) - TIDAL": "Tidal", 87 + }, 88 + "separate-outputs": true, 89 + }, 90 + 91 + // Wofi Application Launcher 92 + "custom/appmenu": { 93 + "format": "Launch", 94 + "tooltip-format": "Left: Open the application launcher\nRight: Show all keybindings", 95 + "on-click": "anyrun", 96 + "on-click-right": "wezterm -e bat ~/.config/hypr/conf/binds.conf", 97 + "tooltip": true, 98 + }, 99 + "custom/osktoggle": { 100 + "format": "  ", 101 + "on-click": "~/.config/hypr/scripts/keyboard-relaunch.sh", 102 + "tooltip-format": "Toggle the on-screen keyboard (restarts the keyboard if needed.)", 103 + }, 104 + // Power Menu 105 + "custom/exit": { 106 + "format": "", 107 + "tooltip-format": "Powermenu", 108 + "on-click": "wlogout -b 4", 109 + "tooltip": false, 110 + }, 111 + // Keyboard State 112 + "keyboard-state": { 113 + "numlock": true, 114 + "capslock": true, 115 + "format": "{name} {icon}", 116 + "format-icons": { 117 + "locked": "", 118 + "unlocked": "", 119 + }, 120 + }, 121 + // System tray 122 + "tray": { 123 + // "icon-size": 21, 124 + "spacing": 10, 125 + }, 126 + // Clock 127 + "clock": { 128 + "timezone": "Europe/Berlin", 129 + "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", 130 + "format-alt": "{:%Y-%m-%d}", 131 + }, 132 + // System 133 + "custom/system": { 134 + "format": "", 135 + "tooltip": false, 136 + }, 137 + // CPU 138 + "cpu": { 139 + "format": " {usage}% ", 140 + "on-click": "wezterm -e htop", 141 + }, 142 + // Memory 143 + "memory": { 144 + "format": " {}% ", 145 + "on-click": "wezterm -e btop", 146 + }, 147 + // Harddisc space used 148 + "disk": { 149 + "interval": 30, 150 + "format": "D {percentage_used}% ", 151 + "path": "/", 152 + "on-click": "wezterm -e htop", 153 + }, 154 + "hyprland/language": { 155 + "format": "/ K {short}", 156 + }, 157 + // Group Hardware 158 + "group/hardware": { 159 + "orientation": "inherit", 160 + "drawer": { 161 + "transition-duration": 300, 162 + "children-class": "not-memory", 163 + "transition-left-to-right": false, 164 + }, 165 + "modules": ["custom/system", "disk", "cpu", "memory", "hyprland/language"], 166 + }, 167 + // Network 168 + "network": { 169 + "format": "{ifname}", 170 + "format-wifi": " ", 171 + "format-ethernet": "  ", 172 + "format-disconnected": "Not connected", 173 + "tooltip-format": " {ifname} via {gwaddri}", 174 + "tooltip-format-wifi": " {essid} ({signalStrength}%)", 175 + "tooltip-format-ethernet": " {ifname} ({ipaddr}/{cidr})", 176 + "tooltip-format-disconnected": "Disconnected", 177 + "max-length": 50, 178 + "on-click": "wezterm -e nmtui connect", 179 + }, 180 + // Battery 181 + "battery": { 182 + "states": { 183 + "good": 80, 184 + "warning": 30, 185 + "critical": 15, 186 + }, 187 + "format-alt": "{icon} {capacity}%", 188 + "format": "{icon} {time}", 189 + "format-charging": " {capacity}%", 190 + "format-plugged": " {capacity}%", 191 + // "format-good": " ", 192 + "format-full": "", 193 + "format-icons": [" ", " ", " ", " ", " "], 194 + }, 195 + // Pulseaudio 196 + "pulseaudio": { 197 + // "scroll-step": 1, // %, can be a float 198 + "format": "{icon} {volume}%", 199 + "format-bluetooth": "{volume}% {icon} {format_source}", 200 + "format-bluetooth-muted": "{icon}", 201 + "format-muted": "", 202 + "format-source": "{volume}% ", 203 + "format-source-muted": "", 204 + "format-icons": { 205 + "headphone": "", 206 + "hands-free": "", 207 + "headset": "", 208 + "phone": "", 209 + "portable": "", 210 + "car": "", 211 + "default": ["", " ", " "], 212 + }, 213 + "on-click": "pavucontrol", 214 + }, 215 + // Bluetooth 216 + "bluetooth": { 217 + "format-disabled": "", 218 + "format-off": "", 219 + "interval": 30, 220 + "on-click": "blueman-manager", 221 + "format-no-controller": "", 222 + }, 223 + // Other 224 + "user": { 225 + "format": "{user}", 226 + "interval": 60, 227 + "icon": false, 228 + }, 229 + "cffi/niri-taskbar": { 230 + "module_path": "/home/mar/.local/share/chezmoi/.dotfiles/deps/niri-taskbar/target/release/libniri_taskbar.so", 231 + }, 232 + // Idle Inhibator 233 + "idle_inhibitor": { 234 + "format": "{icon}", 235 + "tooltip": true, 236 + "format-icons": { 237 + "activated": "", 238 + "deactivated": "", 239 + }, 240 + "on-click-right": "hyprlock", 241 + }, 242 + }
+420
configs/niri/waybar/style.css
··· 1 + @define-color backgroundlight #e06666; 2 + @define-color backgrounddark #f4cccc; 3 + @define-color workspacesbackground1 #f4cccc; 4 + @define-color workspacesbackground2 #fa8071; 5 + @define-color workspacesbackground3 rgba(250, 128, 113, 0.3); 6 + @define-color bordercolor #f4cccc; 7 + @define-color textcolor1 #000000; 8 + @define-color textcolor2 #000000; 9 + @define-color textcolor3 #f4cccc; 10 + @define-color iconcolor #9b4457; 11 + 12 + /* ----------------------------------------------------- 13 + * General 14 + * ----------------------------------------------------- */ 15 + 16 + * { 17 + font-family: Atkinson Hyperlegible Next, "Font Awesome 6 Free", FontAwesome, Ubuntu, Arial, 18 + sans-serif; 19 + border: none; 20 + border-radius: 0px; 21 + } 22 + 23 + window#waybar { 24 + background-color: transparent; 25 + /* border-bottom: 3px groove rgb(255,204,255); */ 26 + /* color: #FFFFFF; */ 27 + transition-property: background-color; 28 + transition-duration: 0.5s; 29 + } 30 + 31 + /* ----------------------------------------------------- 32 + * Workspaces 33 + * ----------------------------------------------------- */ 34 + 35 + #workspaces { 36 + margin: 5px 6px 6px 3px; 37 + padding: 0px 1px; 38 + border-radius: 5px; 39 + background-color: @workspacesbackground3; 40 + border: 0px; 41 + font-weight: bold; 42 + font-style: normal; 43 + font-size: 12px; 44 + color: @textcolor1; 45 + } 46 + 47 + #workspaces button { 48 + padding: 0px 5px; 49 + margin: 4px 3px; 50 + border-radius: 5px; 51 + border: 0px; 52 + color: @textcolor1; 53 + transition: all 0.3s ease-in-out; 54 + background: @workspacesbackground1; 55 + } 56 + 57 + #workspaces button.active, #workspaces button.focused { 58 + color: @textcolor1; 59 + background: @workspacesbackground2; 60 + border-radius: 5px; 61 + min-width: 40px; 62 + transition: all 1.0s ease-in-out; 63 + border: 2px rgb(255,77,77) solid; 64 + } 65 + 66 + #workspaces button:hover { 67 + color: @textcolor1; 68 + background: @workspacesbackground2; 69 + border-radius: 6px; 70 + } 71 + 72 + /* ----------------------------------------------------- 73 + * Tooltips 74 + * ----------------------------------------------------- */ 75 + 76 + tooltip { 77 + border-radius: 10px; 78 + background-color: @backgroundlight; 79 + opacity: 0.8; 80 + padding: 20px; 81 + margin: 0px; 82 + } 83 + 84 + tooltip label { 85 + color: @textcolor2; 86 + } 87 + 88 + /* ----------------------------------------------------- 89 + * Window 90 + * ----------------------------------------------------- */ 91 + 92 + #window { 93 + background: @backgroundlight; 94 + margin: 10px 15px 10px 0px; 95 + padding: 2px 10px 0px 10px; 96 + border-radius: 12px; 97 + color: @textcolor2; 98 + font-size: 16px; 99 + font-weight: normal; 100 + } 101 + 102 + window#waybar.empty #window { 103 + background-color: transparent; 104 + } 105 + 106 + /* ----------------------------------------------------- 107 + * Taskbar 108 + * ----------------------------------------------------- */ 109 + #taskbar, .niri-taskbar { 110 + background: @backgroundlight; 111 + margin: 10px 15px 10px 18px; 112 + padding: 0px; 113 + border-radius: 5px; 114 + font-weight: normal; 115 + font-style: normal; 116 + border: 3px dotted @backgroundlight; 117 + } 118 + #taskbar button, .niri-taskbar button { 119 + margin: 3px; 120 + border-radius: 5px; 121 + padding: 1px 1px 1px 1px; 122 + border: 1px transparent; 123 + } 124 + 125 + #taskbar button.unread, .niri-taskbar button { 126 + border: 2px dotted @textcolor3; 127 + border-radius: 5px; 128 + padding: 2px 2px 2px 2px; 129 + } 130 + 131 + /* ----------------------------------------------------- 132 + * Modules 133 + * ----------------------------------------------------- */ 134 + 135 + .modules-left > widget:first-child > #workspaces { 136 + margin-left: 0; 137 + } 138 + 139 + .modules-right > widget:last-child > #workspaces { 140 + margin-right: 0; 141 + } 142 + 143 + /* ----------------------------------------------------- 144 + * Custom Quicklinks 145 + * ----------------------------------------------------- */ 146 + 147 + #custom-browser, 148 + #custom-filemanager, 149 + #network, 150 + #pulseaudio, 151 + #battery, 152 + #custom-appmenu, 153 + #clock { 154 + margin-right: 20px; 155 + font-size: 20px; 156 + font-weight: bold; 157 + color: @iconcolor; 158 + padding: 4px 10px 2px 10px; 159 + font-size: 16px; 160 + } 161 + 162 + #custom-quicklink1, 163 + #custom-quicklink2, 164 + #custom-quicklink3, 165 + #custom-quicklink4, 166 + #custom-quicklink5, 167 + #custom-quicklink6, 168 + #custom-quicklink7, 169 + #custom-quicklink8, 170 + #custom-quicklink9, 171 + #custom-quicklink10 { 172 + padding: 0px; 173 + margin-right: 7px; 174 + font-size: 20px; 175 + color: @iconcolor; 176 + } 177 + 178 + #custom-osktoggle { 179 + border-radius: 5px; 180 + font-size: 20px; 181 + padding: 4px; 182 + background-color: @backgroundlight; 183 + color: @textcolor1; 184 + margin: 10px 20px 10px 10px; 185 + border-radius: 5px; 186 + border: 0px; 187 + font-weight: bold; 188 + font-style: normal; 189 + } 190 + 191 + /* ----------------------------------------------------- 192 + * Custom Modules 193 + * ----------------------------------------------------- */ 194 + 195 + #custom-appmenu { 196 + color: #e06666; 197 + background-color: #fab28a; 198 + 199 + border-radius: 5px; 200 + margin: 10px 10px 10px 10px; 201 + } 202 + 203 + /* ----------------------------------------------------- 204 + * Custom Exit 205 + * ----------------------------------------------------- */ 206 + 207 + #custom-exit { 208 + margin: 10px 20px 10px 10px; 209 + padding: 5px 10px 5px 10px; 210 + /* Add a little extra padding to the right. to make it look more centered. */ 211 + padding-right: 15px; 212 + font-size: 20px; 213 + color: @iconcolor; 214 + border-radius: 5px; 215 + background-color: @backgroundlight; 216 + } 217 + 218 + /* ----------------------------------------------------- 219 + * Hardware Group 220 + * ----------------------------------------------------- */ 221 + 222 + #disk, 223 + #memory, 224 + #cpu, 225 + #language { 226 + margin: 10px; 227 + padding: 0px; 228 + font-size: 14px; 229 + color: #000000; 230 + border-radius: 5px; 231 + background-color: @backgroundlight; 232 + } 233 + /* glue cpu and memory together */ 234 + #cpu { 235 + margin-right: 0px; 236 + border-radius: 5px 0px 0px 5px; 237 + padding: 0px 10px 0px 10px; 238 + } 239 + #memory { 240 + margin-left: 0px; 241 + border-radius: 0px 5px 5px 0px; 242 + padding: 0px 10px 0px 10px; 243 + } 244 + 245 + #keyboard-state { 246 + background-color: @backgroundlight; 247 + font-size: 12px; 248 + color: @textcolor2; 249 + border-radius: 5px; 250 + margin: 10px 10px 10px 0px; 251 + } 252 + 253 + #language { 254 + margin-right: 10px; 255 + } 256 + 257 + /* ----------------------------------------------------- 258 + * Clock 259 + * ----------------------------------------------------- */ 260 + 261 + #clock { 262 + background-color: @backgroundlight; 263 + font-size: 16px; 264 + color: @textcolor1; 265 + border-radius: 5px; 266 + margin: 10px 7px 10px 0px; 267 + } 268 + 269 + /* ----------------------------------------------------- 270 + * Pulseaudio 271 + * ----------------------------------------------------- */ 272 + 273 + #pulseaudio { 274 + font-size: 16px; 275 + border-radius: 5px; 276 + margin: 10px 10px 10px 0px; 277 + background-color: #e06666; 278 + color: #000000; 279 + 280 + } 281 + 282 + #pulseaudio.muted { 283 + color: #ffa07a; 284 + background-color: #fadfb0; 285 + } 286 + 287 + /* ----------------------------------------------------- 288 + * Network 289 + * ----------------------------------------------------- */ 290 + 291 + #network { 292 + background-color: @backgroundlight; 293 + font-size: 16px; 294 + color: @textcolor2; 295 + border-radius: 5px; 296 + margin: 10px 10px 10px 0px; 297 + } 298 + 299 + #network.ethernet { 300 + background-color: @backgroundlight; 301 + color: @textcolor2; 302 + } 303 + 304 + #network.wifi { 305 + background-color: @backgroundlight; 306 + color: @textcolor2; 307 + } 308 + 309 + /* ----------------------------------------------------- 310 + * Bluetooth 311 + * ----------------------------------------------------- */ 312 + 313 + #bluetooth, 314 + #bluetooth.on, 315 + #bluetooth.connected { 316 + background-color: @backgroundlight; 317 + font-size: 16px; 318 + color: @textcolor2; 319 + border-radius: 5px; 320 + margin: 10px 15px 10px 0px; 321 + } 322 + 323 + #bluetooth.off { 324 + background-color: transparent; 325 + padding: 0px; 326 + margin: 0px; 327 + } 328 + 329 + /* ----------------------------------------------------- 330 + * Battery 331 + * ----------------------------------------------------- */ 332 + 333 + #battery { 334 + background-color: @backgroundlight; 335 + font-size: 16px; 336 + color: @textcolor2; 337 + border: 2px rgb(255,77,77) dotted; 338 + border-radius: 5px; 339 + margin: 10px 15px 10px 0px; 340 + } 341 + 342 + #battery.charging, 343 + #battery.plugged { 344 + color: @textcolor2; 345 + background-color: @backgroundlight; 346 + } 347 + 348 + @keyframes blink { 349 + to { 350 + background-color: @backgroundlight; 351 + color: @textcolor2; 352 + } 353 + } 354 + 355 + #battery.warning:not(.charging) { 356 + background-color: #f1c40f; 357 + color: @textcolor3; 358 + } 359 + 360 + #battery.full { 361 + color: @textcolor3; 362 + background-color: #2ecc71; 363 + } 364 + 365 + #battery.good:not(.charging) { 366 + background-color: #3498db; 367 + color: @textcolor3; 368 + } 369 + 370 + #battery.critical:not(.charging) { 371 + color: #ffa07a; 372 + background-color: #fadfb0; 373 + animation-name: blink; 374 + animation-duration: 0.5s; 375 + animation-timing-function: linear; 376 + animation-iteration-count: infinite; 377 + animation-direction: alternate; 378 + } 379 + 380 + /* ----------------------------------------------------- 381 + * Tray 382 + * ----------------------------------------------------- */ 383 + 384 + #tray { 385 + background-color: rgba(250, 128, 113, 0.3); 386 + border-radius: 5px; 387 + border: 2px rgb(255,77,77) dotted; 388 + padding: 4px; 389 + margin: 10px 15px 10px 0px; 390 + } 391 + 392 + #tray > .passive { 393 + -gtk-icon-effect: dim; 394 + } 395 + 396 + #tray > .needs-attention { 397 + -gtk-icon-effect: highlight; 398 + background-color: #eb4d4b; 399 + } 400 + 401 + /* ----------------------------------------------------- 402 + * Other 403 + * ----------------------------------------------------- */ 404 + 405 + label:focus { 406 + background-color: #000000; 407 + } 408 + 409 + #backlight { 410 + background-color: #90b1b1; 411 + } 412 + 413 + #network { 414 + background-color: #2980b9; 415 + } 416 + 417 + #network.disconnected { 418 + color: #ffa07a; 419 + background-color: #fadfb0; 420 + }
configs/niri/wlogout/icons/hibernate.png

This is a binary file and will not be displayed.

configs/niri/wlogout/icons/lock.png

This is a binary file and will not be displayed.

configs/niri/wlogout/icons/logout.png

This is a binary file and will not be displayed.

configs/niri/wlogout/icons/reboot.png

This is a binary file and will not be displayed.

configs/niri/wlogout/icons/shutdown.png

This is a binary file and will not be displayed.

configs/niri/wlogout/icons/suspend.png

This is a binary file and will not be displayed.

+24
configs/niri/wlogout/layout
··· 1 + { 2 + "label" : "lock", 3 + "action" : "hyprlock", 4 + "text" : "Lock", 5 + "keybind" : "l" 6 + } 7 + { 8 + "label" : "logout", 9 + "action" : "killall -9 Hyprland", 10 + "text" : "Exit", 11 + "keybind" : "e" 12 + } 13 + { 14 + "label" : "shutdown", 15 + "action" : "poweroff", 16 + "text" : "Shutdown", 17 + "keybind" : "s" 18 + } 19 + { 20 + "label" : "reboot", 21 + "action" : "reboot", 22 + "text" : "Reboot", 23 + "keybind" : "r" 24 + }
+72
configs/niri/wlogout/style.css
··· 1 + /* 2 + _ _ 3 + __ _| | ___ __ _ ___ _ _| |_ 4 + \ \ /\ / / |/ _ \ / _` |/ _ \| | | | __| 5 + \ V V /| | (_) | (_| | (_) | |_| | |_ 6 + \_/\_/ |_|\___/ \__, |\___/ \__,_|\__| 7 + |___/ 8 + 9 + by Stephan Raabe (2024) 10 + ----------------------------------------------------- 11 + */ 12 + 13 + * { 14 + font-family: "Fira Sans Semibold", FontAwesome, Roboto, Helvetica, Arial, sans-serif; 15 + background-image: none; 16 + transition: 20ms; 17 + box-shadow: none; 18 + } 19 + 20 + window { 21 + background-color: rgba(12, 12, 12, 0.8); 22 + } 23 + 24 + button { 25 + color: #FFFFFF; 26 + font-size:20px; 27 + 28 + background-repeat: no-repeat; 29 + background-position: center; 30 + background-size: 25%; 31 + border-style: solid; 32 + border: 3px solid #FFFFFF; 33 + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 34 + 35 + } 36 + 37 + button:focus, 38 + button:active, 39 + button:hover { 40 + color: #FFFFFF; 41 + border: 3px solid #FFFFFF; 42 + } 43 + 44 + /* 45 + ----------------------------------------------------- 46 + Buttons 47 + ----------------------------------------------------- 48 + */ 49 + 50 + #lock { 51 + margin: 10px; 52 + border-radius: 20px; 53 + background-image: image(url("icons/lock.png")); 54 + } 55 + 56 + #logout { 57 + margin: 10px; 58 + border-radius: 20px; 59 + background-image: image(url("icons/logout.png")); 60 + } 61 + 62 + #shutdown { 63 + margin: 10px; 64 + border-radius: 20px; 65 + background-image: image(url("icons/shutdown.png")); 66 + } 67 + 68 + #reboot { 69 + margin: 10px; 70 + border-radius: 20px; 71 + background-image: image(url("icons/reboot.png")); 72 + }
+3
configs/nvim/.stylua.toml
··· 1 + indent_type = "Tabs" 2 + indent_width = 4 3 + column_width = 120
+201
configs/nvim/LICENSE
··· 1 + Apache License 2 + Version 2.0, January 2004 3 + http://www.apache.org/licenses/ 4 + 5 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 + 7 + 1. Definitions. 8 + 9 + "License" shall mean the terms and conditions for use, reproduction, 10 + and distribution as defined by Sections 1 through 9 of this document. 11 + 12 + "Licensor" shall mean the copyright owner or entity authorized by 13 + the copyright owner that is granting the License. 14 + 15 + "Legal Entity" shall mean the union of the acting entity and all 16 + other entities that control, are controlled by, or are under common 17 + control with that entity. For the purposes of this definition, 18 + "control" means (i) the power, direct or indirect, to cause the 19 + direction or management of such entity, whether by contract or 20 + otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 + outstanding shares, or (iii) beneficial ownership of such entity. 22 + 23 + "You" (or "Your") shall mean an individual or Legal Entity 24 + exercising permissions granted by this License. 25 + 26 + "Source" form shall mean the preferred form for making modifications, 27 + including but not limited to software source code, documentation 28 + source, and configuration files. 29 + 30 + "Object" form shall mean any form resulting from mechanical 31 + transformation or translation of a Source form, including but 32 + not limited to compiled object code, generated documentation, 33 + and conversions to other media types. 34 + 35 + "Work" shall mean the work of authorship, whether in Source or 36 + Object form, made available under the License, as indicated by a 37 + copyright notice that is included in or attached to the work 38 + (an example is provided in the Appendix below). 39 + 40 + "Derivative Works" shall mean any work, whether in Source or Object 41 + form, that is based on (or derived from) the Work and for which the 42 + editorial revisions, annotations, elaborations, or other modifications 43 + represent, as a whole, an original work of authorship. For the purposes 44 + of this License, Derivative Works shall not include works that remain 45 + separable from, or merely link (or bind by name) to the interfaces of, 46 + the Work and Derivative Works thereof. 47 + 48 + "Contribution" shall mean any work of authorship, including 49 + the original version of the Work and any modifications or additions 50 + to that Work or Derivative Works thereof, that is intentionally 51 + submitted to Licensor for inclusion in the Work by the copyright owner 52 + or by an individual or Legal Entity authorized to submit on behalf of 53 + the copyright owner. For the purposes of this definition, "submitted" 54 + means any form of electronic, verbal, or written communication sent 55 + to the Licensor or its representatives, including but not limited to 56 + communication on electronic mailing lists, source code control systems, 57 + and issue tracking systems that are managed by, or on behalf of, the 58 + Licensor for the purpose of discussing and improving the Work, but 59 + excluding communication that is conspicuously marked or otherwise 60 + designated in writing by the copyright owner as "Not a Contribution." 61 + 62 + "Contributor" shall mean Licensor and any individual or Legal Entity 63 + on behalf of whom a Contribution has been received by Licensor and 64 + subsequently incorporated within the Work. 65 + 66 + 2. Grant of Copyright License. Subject to the terms and conditions of 67 + this License, each Contributor hereby grants to You a perpetual, 68 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 + copyright license to reproduce, prepare Derivative Works of, 70 + publicly display, publicly perform, sublicense, and distribute the 71 + Work and such Derivative Works in Source or Object form. 72 + 73 + 3. Grant of Patent License. Subject to the terms and conditions of 74 + this License, each Contributor hereby grants to You a perpetual, 75 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 + (except as stated in this section) patent license to make, have made, 77 + use, offer to sell, sell, import, and otherwise transfer the Work, 78 + where such license applies only to those patent claims licensable 79 + by such Contributor that are necessarily infringed by their 80 + Contribution(s) alone or by combination of their Contribution(s) 81 + with the Work to which such Contribution(s) was submitted. If You 82 + institute patent litigation against any entity (including a 83 + cross-claim or counterclaim in a lawsuit) alleging that the Work 84 + or a Contribution incorporated within the Work constitutes direct 85 + or contributory patent infringement, then any patent licenses 86 + granted to You under this License for that Work shall terminate 87 + as of the date such litigation is filed. 88 + 89 + 4. Redistribution. You may reproduce and distribute copies of the 90 + Work or Derivative Works thereof in any medium, with or without 91 + modifications, and in Source or Object form, provided that You 92 + meet the following conditions: 93 + 94 + (a) You must give any other recipients of the Work or 95 + Derivative Works a copy of this License; and 96 + 97 + (b) You must cause any modified files to carry prominent notices 98 + stating that You changed the files; and 99 + 100 + (c) You must retain, in the Source form of any Derivative Works 101 + that You distribute, all copyright, patent, trademark, and 102 + attribution notices from the Source form of the Work, 103 + excluding those notices that do not pertain to any part of 104 + the Derivative Works; and 105 + 106 + (d) If the Work includes a "NOTICE" text file as part of its 107 + distribution, then any Derivative Works that You distribute must 108 + include a readable copy of the attribution notices contained 109 + within such NOTICE file, excluding those notices that do not 110 + pertain to any part of the Derivative Works, in at least one 111 + of the following places: within a NOTICE text file distributed 112 + as part of the Derivative Works; within the Source form or 113 + documentation, if provided along with the Derivative Works; or, 114 + within a display generated by the Derivative Works, if and 115 + wherever such third-party notices normally appear. The contents 116 + of the NOTICE file are for informational purposes only and 117 + do not modify the License. You may add Your own attribution 118 + notices within Derivative Works that You distribute, alongside 119 + or as an addendum to the NOTICE text from the Work, provided 120 + that such additional attribution notices cannot be construed 121 + as modifying the License. 122 + 123 + You may add Your own copyright statement to Your modifications and 124 + may provide additional or different license terms and conditions 125 + for use, reproduction, or distribution of Your modifications, or 126 + for any such Derivative Works as a whole, provided Your use, 127 + reproduction, and distribution of the Work otherwise complies with 128 + the conditions stated in this License. 129 + 130 + 5. Submission of Contributions. Unless You explicitly state otherwise, 131 + any Contribution intentionally submitted for inclusion in the Work 132 + by You to the Licensor shall be under the terms and conditions of 133 + this License, without any additional terms or conditions. 134 + Notwithstanding the above, nothing herein shall supersede or modify 135 + the terms of any separate license agreement you may have executed 136 + with Licensor regarding such Contributions. 137 + 138 + 6. Trademarks. This License does not grant permission to use the trade 139 + names, trademarks, service marks, or product names of the Licensor, 140 + except as required for reasonable and customary use in describing the 141 + origin of the Work and reproducing the content of the NOTICE file. 142 + 143 + 7. Disclaimer of Warranty. Unless required by applicable law or 144 + agreed to in writing, Licensor provides the Work (and each 145 + Contributor provides its Contributions) on an "AS IS" BASIS, 146 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 + implied, including, without limitation, any warranties or conditions 148 + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 + PARTICULAR PURPOSE. You are solely responsible for determining the 150 + appropriateness of using or redistributing the Work and assume any 151 + risks associated with Your exercise of permissions under this License. 152 + 153 + 8. Limitation of Liability. In no event and under no legal theory, 154 + whether in tort (including negligence), contract, or otherwise, 155 + unless required by applicable law (such as deliberate and grossly 156 + negligent acts) or agreed to in writing, shall any Contributor be 157 + liable to You for damages, including any direct, indirect, special, 158 + incidental, or consequential damages of any character arising as a 159 + result of this License or out of the use or inability to use the 160 + Work (including but not limited to damages for loss of goodwill, 161 + work stoppage, computer failure or malfunction, or any and all 162 + other commercial damages or losses), even if such Contributor 163 + has been advised of the possibility of such damages. 164 + 165 + 9. Accepting Warranty or Additional Liability. While redistributing 166 + the Work or Derivative Works thereof, You may choose to offer, 167 + and charge a fee for, acceptance of support, warranty, indemnity, 168 + or other liability obligations and/or rights consistent with this 169 + License. However, in accepting such obligations, You may act only 170 + on Your own behalf and on Your sole responsibility, not on behalf 171 + of any other Contributor, and only if You agree to indemnify, 172 + defend, and hold each Contributor harmless for any liability 173 + incurred by, or claims asserted against, such Contributor by reason 174 + of your accepting any such warranty or additional liability. 175 + 176 + END OF TERMS AND CONDITIONS 177 + 178 + APPENDIX: How to apply the Apache License to your work. 179 + 180 + To apply the Apache License to your work, attach the following 181 + boilerplate notice, with the fields enclosed by brackets "[]" 182 + replaced with your own identifying information. (Don't include 183 + the brackets!) The text should be enclosed in the appropriate 184 + comment syntax for the file format. We also recommend that a 185 + file or class name and description of purpose be included on the 186 + same "printed page" as the copyright notice for easier 187 + identification within third-party archives. 188 + 189 + Copyright [yyyy] [name of copyright owner] 190 + 191 + Licensed under the Apache License, Version 2.0 (the "License"); 192 + you may not use this file except in compliance with the License. 193 + You may obtain a copy of the License at 194 + 195 + http://www.apache.org/licenses/LICENSE-2.0 196 + 197 + Unless required by applicable law or agreed to in writing, software 198 + distributed under the License is distributed on an "AS IS" BASIS, 199 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 + See the License for the specific language governing permissions and 201 + limitations under the License.
+3
configs/nvim/README.md
··· 1 + # Mar's NeoVim setup! 2 + 3 + > This is my personal NeoVim setup. It might not work for you at all.
+10
configs/nvim/dot_luarc.json
··· 1 + { 2 + "$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json", 3 + "Lua.diagnostics.disable": [ 4 + "redundant-parameter", 5 + "param-type-mismatch", 6 + "missing-parameter" 7 + ], 8 + "diagnostics.libraryFiles": "Disable", 9 + "diagnostics.globals": ["switch_between_outline_and_filetree"] 10 + }
+15
configs/nvim/dot_neoconf.json
··· 1 + { 2 + "neodev": { 3 + "library": { 4 + "enabled": true, 5 + "plugins": true 6 + } 7 + }, 8 + "neoconf": { 9 + "plugins": { 10 + "lua_ls": { 11 + "enabled": true 12 + } 13 + } 14 + } 15 + }
+1
configs/nvim/init.lua
··· 1 + require("config.lazy")
+29
configs/nvim/lazyvim.json
··· 1 + { 2 + "extras": [ 3 + "lazyvim.plugins.extras.ai.copilot-chat", 4 + "lazyvim.plugins.extras.coding.yanky", 5 + "lazyvim.plugins.extras.editor.aerial", 6 + "lazyvim.plugins.extras.editor.harpoon2", 7 + "lazyvim.plugins.extras.editor.outline", 8 + "lazyvim.plugins.extras.editor.refactoring", 9 + "lazyvim.plugins.extras.formatting.biome", 10 + "lazyvim.plugins.extras.formatting.prettier", 11 + "lazyvim.plugins.extras.lang.clangd", 12 + "lazyvim.plugins.extras.lang.git", 13 + "lazyvim.plugins.extras.lang.gleam", 14 + "lazyvim.plugins.extras.lang.go", 15 + "lazyvim.plugins.extras.lang.json", 16 + "lazyvim.plugins.extras.lang.kotlin", 17 + "lazyvim.plugins.extras.lang.markdown", 18 + "lazyvim.plugins.extras.lang.php", 19 + "lazyvim.plugins.extras.lang.sql", 20 + "lazyvim.plugins.extras.lang.tailwind", 21 + "lazyvim.plugins.extras.lang.toml", 22 + "lazyvim.plugins.extras.lang.yaml", 23 + "lazyvim.plugins.extras.test.core", 24 + "lazyvim.plugins.extras.util.project", 25 + "lazyvim.plugins.extras.vscode" 26 + ], 27 + "install_version": 7, 28 + "version": 8 29 + }
+5
configs/nvim/lsp/gleam.lua
··· 1 + return { 2 + cmd = { "gleam", "lsp" }, 3 + root_markers = { "gleam.toml" }, 4 + filetypes = { "gleam" }, 5 + }
+34
configs/nvim/lua/config/autocmds.lua
··· 1 + -- Autocmds are automatically loaded on the VeryLazy event 2 + -- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua 3 + -- Add any additional autocmds here 4 + -- vim.cmd([[autocmd BufWritePre * lua vim.lsp.buf.format()]]) 5 + 6 + local function open_folder(data) 7 + -- buffer is a directory 8 + local directory = vim.fn.isdirectory(data.file) == 1 9 + 10 + if directory then 11 + -- create a new, empty buffer 12 + vim.cmd.enew() 13 + 14 + -- wipe the directory buffer 15 + vim.cmd.bw(data.buf) 16 + 17 + -- change to the directory 18 + vim.cmd.cd(data.file) 19 + 20 + -- open the picker 21 + Snacks.picker.files({ cwd = true }) 22 + end 23 + end 24 + 25 + vim.api.nvim_create_autocmd({ "VimEnter" }, { callback = open_folder }) 26 + 27 + -- For now I see no reason to update the plugins everytime I open neovim -- UPDATE: I do now, constantly having notifs abt outdated stuff is annoying 28 + vim.api.nvim_create_autocmd("VimEnter", { 29 + callback = function() 30 + vim.defer_fn(function() 31 + require("lazy").update({ show = false }) 32 + end, 5000) 33 + end, 34 + })
+81
configs/nvim/lua/config/keymaps.lua
··· 1 + -- Keymaps are automatically loaded on the VeryLazy event 2 + -- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua 3 + -- Add any additional keymaps here 4 + 5 + local map = vim.keymap.set 6 + map("i", "<C-J>", 'copilot#Accept("\\<CR>")', { 7 + expr = true, 8 + replace_keycodes = false, 9 + }) 10 + 11 + vim.g.copilot_no_tab_map = true 12 + map("n", "K", "<cmd>Lspsaga hover_doc") 13 + map({ "i", "n", "v" }, "<C-K>", "<cmd>Lspsaga hover_doc<CR>") 14 + 15 + -- Exit insert mode when using the bad habit of pressing the arrow keys, but still move 16 + -- I am actively making things hard for-- well, me probably 17 + vim.api.nvim_set_keymap("i", "<Up>", "<ESC>gk", {}) 18 + -- vim.api.nvim_set_keymap("i", "<Left>", "<ESC>h", {}) 19 + -- vim.api.nvim_set_keymap("i", "<Right>", "<ESC>l", {}) 20 + 21 + -- I can't get rid of my ,-leaderkey. But I do wanna use space in the Helix-like space menu way... so yes! 22 + ---@diagnostic disable-next-line: assign-type-mismatch 23 + map("n", "<Space>f", function() 24 + Snacks.picker.files({ cwd = true }) 25 + end, { desc = "Open file picker (cwd)" }) 26 + map("n", "<Space>g", function() 27 + Snacks.picker.grep() 28 + end, { desc = "Grep" }) 29 + map("n", "<Space>b", function() 30 + Snacks.picker.buffers() 31 + end, { desc = "Open buffer picker" }) 32 + map("n", "<Space>s", function() 33 + Snacks.picker.lsp_symbols() 34 + end, { desc = "Open symbol picker" }) 35 + map("n", "<Space>S", function() 36 + Snacks.picker.lsp_symbols({ cwd = true }) 37 + end, { desc = "Open symbol picker (cwd)" }) 38 + map("n", "<Space>?", function() 39 + Snacks.picker.commands() 40 + end, { desc = "Open command picker" }) 41 + map("n", "<Space>r", function() 42 + Snacks.picker.resume() 43 + end, { desc = "Resume last search" }) 44 + map("n", "<Space><Space>", function() 45 + Snacks.picker.resume() 46 + end, { desc = "Resume last search" }) 47 + map("n", "<Space>c", "<cmd>normal gcc<CR>", { desc = "Comment line" }) 48 + map("n", "<Space>\\", "<cmd>vsplit<CR>", { desc = "Vertical split" }) 49 + map("n", "<Space>-", "<cmd>split<CR>", { desc = "Horizontal split" }) 50 + 51 + map("n", "<C-s>", "<cmd>w<cr>", { desc = "Save file" }) 52 + 53 + map("i", "<C-s>", "<esc><cmd>w<cr>", { desc = "Save and go to normal mode" }) 54 + 55 + map("i", "<down>", "<esc>gj", { desc = "Move down and exit insert" }) 56 + map("i", "<up>", "<esc>gk", { desc = "Move up and exit insert" }) 57 + 58 + -- Further helixifications: Selection 59 + map("n", "x", "V", { desc = "Select line (Helix-style)" }) 60 + map("v", "x", "j", { desc = "Extend selection down (Helix-style)" }) 61 + map("v", "X", "k", { desc = "Extend selection up (Helix-style)" }) 62 + -- Further helixifications: After pressing 'x' to select, these work on the selection 63 + map("v", "d", "d", { desc = "Delete selection" }) 64 + map("v", "c", "c", { desc = "Change selection" }) 65 + map("v", "y", "y", { desc = "Yank selection" }) 66 + 67 + -- Further helixifications: Delete single character without yanking 68 + map("n", "d", '"x', { desc = "Delete character (Helix-style)" }) 69 + 70 + -- Further helixifications: Word motions 71 + map("n", "w", "viw", { desc = "Select inner word" }) 72 + map("n", "e", "ve", { desc = "Select to end of word" }) 73 + 74 + -- Further helixifications: More text objects 75 + map("n", "w", "viw", { desc = "Select word" }) 76 + map("n", "e", "ve", { desc = "Select to end of word" }) 77 + map("n", "b", "vb", { desc = "Select to start of word" }) 78 + 79 + -- Further helixifications: Inside/Around text objects 80 + map("n", "mi", "vi", { desc = "Select Inside..." }) 81 + map("n", "ma", "va", { desc = "Select Around..." })
+38
configs/nvim/lua/config/lazy.lua
··· 1 + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 2 + if not vim.loop.fs_stat(lazypath) then 3 + -- bootstrap lazy.nvim 4 + -- stylua: ignore 5 + vim.fn.system( 6 + { "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath } 7 + ) 8 + end 9 + vim.opt.rtp:prepend(vim.env.LAZY or lazypath) 10 + 11 + require("lazy").setup({ 12 + spec = { 13 + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, 14 + { import = "plugins" }, 15 + }, 16 + defaults = { 17 + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. 18 + lazy = false, 19 + version = false, -- always use the latest git commit 20 + }, 21 + checker = { enabled = true, notify = false }, -- automatically check for plugin updates 22 + news = { lazyvim = false }, 23 + performance = { 24 + rtp = { 25 + -- disable some rtp plugins 26 + disabled_plugins = { 27 + "gzip", 28 + "matchit", 29 + "matchparen", 30 + "netrwPlugin", 31 + "tarPlugin", 32 + "tohtml", 33 + "tutor", 34 + "zipPlugin", 35 + }, 36 + }, 37 + }, 38 + })
+17
configs/nvim/lua/config/options.lua
··· 1 + -- Options are automatically loaded before lazy.nvim startup 2 + -- Add any additional options here 3 + 4 + -- // Set mapleader to ',' 5 + vim.cmd.let('mapleader = ","') 6 + 7 + vim.opt.relativenumber = true 8 + 9 + vim.opt.mouse = "a" 10 + 11 + vim.opt.guicursor = "n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50" 12 + 13 + vim.filetype.add({ 14 + extension = { 15 + jsonc = "json", 16 + }, 17 + })
+253
configs/nvim/lua/plugins/colourscheme.lua
··· 1 + vim.opt.termguicolors = true 2 + -- local default_light = "gruvbox" 3 + -- local default_light = "dayfox" 4 + local default_light = "rose-pine-dawn" 5 + local default_dark = "tokyonight-night" 6 + -- local default_dark = "kanagawa-wave" 7 + -- local default_dark = "rose-pine-main" 8 + local default_show = "koehler" 9 + 10 + local get_time_of_day = function() 11 + local hour = tonumber(os.date("%H")) 12 + if hour >= 6 and hour < 12 then 13 + return "morning" 14 + elseif hour >= 12 and hour < 18 then 15 + return "afternoon" 16 + elseif hour >= 18 and hour < 24 then 17 + return "evening" 18 + else 19 + return "night" 20 + end 21 + end 22 + local get_colorscheme = function(a) 23 + if a == "random" then 24 + math.randomseed(os.time()) 25 + math.random() 26 + math.random() 27 + math.random() 28 + local random = math.ceil((math.random(0.1, 1.9) / 2)) - 1 29 + vim.notify_once("[Random colorscheme]: random = " .. random .. " - " .. (random == 1 and "light" or "dark")) 30 + 31 + if random == 1 then 32 + return default_light 33 + end 34 + if random == 0 then 35 + return default_dark 36 + end 37 + return "default" 38 + else 39 + if a == "tod" then 40 + local tod = get_time_of_day() 41 + if (tod == "morning") or (tod == "afternoon") then 42 + vim.notify_once("Good " .. tod .. " Mar! colorscheme auto set to: " .. default_light) 43 + return default_light 44 + end 45 + if (tod == "evening") or (tod == "night") then 46 + vim.notify_once("Good " .. tod .. " Mar! colorscheme auto set to: " .. default_dark) 47 + return default_dark 48 + end 49 + end 50 + end 51 + end 52 + local get_background = function(a) 53 + if a == "random" then 54 + math.randomseed(os.time()) 55 + math.random() 56 + math.random() 57 + math.random() 58 + local random = math.ceil((math.random(0.1, 1.9) / 2)) - 1 59 + vim.notify_once("[Random background]: random = " .. random .. " - " .. (random == 1 and "light" or "dark")) 60 + 61 + if random == 1 then 62 + return "light" 63 + end 64 + if random == 0 then 65 + return "dark" 66 + end 67 + return "default" 68 + else 69 + if a == "tod" then 70 + local tod = get_time_of_day() 71 + if (tod == "morning") or (tod == "afternoon") then 72 + vim.notify_once("Good " .. tod .. " Mar! background auto set to: light") 73 + return "light" 74 + end 75 + if (tod == "evening") or (tod == "night") then 76 + vim.notify_once("Good " .. tod .. " Mar! background auto set to: dark") 77 + return "dark" 78 + end 79 + end 80 + end 81 + end 82 + return { 83 + { "haystackandroid/carbonized" }, 84 + { "xiyaowong/transparent.nvim" }, 85 + { 86 + "rebelot/kanagawa.nvim", 87 + name = "kanagawa", 88 + config = function() 89 + require("kanagawa").setup({ 90 + compile = false, -- enable compiling the colorscheme 91 + undercurl = true, -- enable undercurls 92 + commentStyle = { italic = true }, 93 + functionStyle = {}, 94 + keywordStyle = { italic = true }, 95 + statementStyle = { bold = true }, 96 + typeStyle = {}, 97 + transparent = true, -- do not set background color 98 + dimInactive = false, -- dim inactive window `:h hl-NormalNC` 99 + terminalColors = true, -- define vim.g.terminal_color_{0,17} 100 + colors = { -- add/modify theme and palette colors 101 + palette = {}, 102 + theme = { wave = {}, lotus = {}, dragon = {}, all = {} }, 103 + }, 104 + overrides = function(colors) -- add/modify highlights 105 + return {} 106 + end, 107 + theme = "wave", -- Load "wave" theme when 'background' option is not set 108 + background = { -- map the value of 'background' option to a theme 109 + dark = "wave", -- try "dragon" ! 110 + light = "lotus", 111 + }, 112 + }) 113 + end, 114 + }, 115 + { 116 + "rose-pine/neovim", 117 + name = "rose-pine", 118 + config = function() 119 + require("rose-pine").setup({ 120 + --- @usage 'auto'|'main'|'moon'|'dawn' 121 + variant = "dawn", 122 + --- @usage 'main'|'moon'|'dawn' 123 + dark_variant = "moon", 124 + bold_vert_split = false, 125 + dim_nc_background = true, 126 + disable_background = true, 127 + disable_float_background = false, 128 + disable_italics = false, 129 + 130 + --- @usage string hex value or named color from rosepinetheme.com/palette 131 + groups = { 132 + background = "base", 133 + background_nc = "_experimental_nc", 134 + panel = "surface", 135 + panel_nc = "base", 136 + border = "highlight_med", 137 + comment = "muted", 138 + link = "iris", 139 + punctuation = "subtle", 140 + 141 + error = "love", 142 + hint = "iris", 143 + info = "foam", 144 + warn = "gold", 145 + 146 + headings = { 147 + h1 = "iris", 148 + h2 = "foam", 149 + h3 = "rose", 150 + h4 = "gold", 151 + h5 = "pine", 152 + h6 = "foam", 153 + }, 154 + -- or set all headings at once 155 + -- headings = 'subtle' 156 + }, 157 + 158 + -- Change specific vim highlight groups 159 + -- https://github.com/rose-pine/neovim/wiki/Recipes 160 + highlight_groups = { 161 + ColorColumn = { bg = "rose" }, 162 + 163 + -- Blend colours against the "base" background 164 + CursorLine = { bg = "foam", blend = 10 }, 165 + StatusLine = { fg = "love", bg = "love", blend = 10 }, 166 + }, 167 + }) 168 + end, 169 + }, 170 + { 171 + "catppuccin/nvim", 172 + name = "catppuccin", 173 + lazy = false, 174 + config = function() 175 + require("catppuccin").setup({ 176 + flavour = "latte", 177 + default_integrations = true, 178 + integrations = { 179 + treesitter = true, 180 + telescope = true, 181 + nvimtree = true, 182 + noice = true, 183 + }, 184 + term_colors = true, 185 + transparent_background = false, 186 + }) 187 + end, 188 + }, 189 + { "EdenEast/nightfox.nvim" }, 190 + { "tanvirtin/monokai.nvim" }, 191 + { "ellisonleao/gruvbox.nvim" }, 192 + { "sts10/vim-pink-moon" }, 193 + { "rktjmp/lush.nvim" }, 194 + { 195 + "maxmx03/fluoromachine.nvim", 196 + lazy = false, 197 + priority = 1000, 198 + config = function() 199 + local fm = require("fluoromachine") 200 + 201 + fm.setup({ 202 + glow = true, 203 + theme = "fluoromachine", 204 + transparent = false, 205 + }) 206 + end, 207 + }, 208 + { "sainnhe/sonokai" }, 209 + { "Scysta/pink-panic.nvim" }, 210 + { "savq/melange-nvim" }, 211 + { 212 + "LazyVim/LazyVim", 213 + opts = { 214 + colorscheme = "koehler", 215 + }, 216 + config = function(_, opts) 217 + require("lazyvim").setup(opts) 218 + local tod_theme = get_colorscheme("tod") 219 + vim.cmd.colorscheme(tod_theme) 220 + vim.cmd.background = get_background("tod") 221 + end, 222 + keys = { 223 + { 224 + "<leader>Md", 225 + function() 226 + vim.cmd("colorscheme " .. default_dark) 227 + vim.cmd("set background=dark") 228 + end, 229 + mode = { "n", "t" }, 230 + desc = "Set to " .. default_dark .. " theme.", 231 + }, 232 + { 233 + "<leader>Ml", 234 + function() 235 + vim.cmd("colorscheme " .. default_light) 236 + vim.cmd("set background=light") 237 + end, 238 + mode = { "n", "t" }, 239 + desc = "Set to " .. default_light .. " theme.", 240 + }, 241 + { 242 + "<leader>Mg", 243 + function() 244 + vim.cmd("colorscheme " .. default_show) 245 + vim.cmd("set background=default") 246 + end, 247 + mode = { "n", "t" }, 248 + desc = "Set to " .. default_show .. " theme.", 249 + }, 250 + -- { "<leader>Mf", function() vim.cmd("TransparentToggle") end, mode = { "n", "t" }, desc = "Toggle transparency." }, 251 + }, 252 + }, 253 + }
+15
configs/nvim/lua/plugins/copilot.lua
··· 1 + return { 2 + { 3 + "CopilotC-Nvim/CopilotChat.nvim", 4 + dependencies = { 5 + { "nvim-lua/plenary.nvim", branch = "master" }, 6 + }, 7 + build = "make tiktoken", 8 + opts = { 9 + -- See Configuration section for options 10 + }, 11 + }, 12 + { 13 + "github/copilot.vim", 14 + }, 15 + }
+22
configs/nvim/lua/plugins/disabled.lua
··· 1 + return { 2 + { 3 + "neo-tree.nvim", 4 + enabled = false, 5 + }, 6 + { 7 + "nvim-neo-tree/neo-tree.nvim", 8 + enabled = false, 9 + }, 10 + { 11 + "nvim-tree/nvim-tree.lua", 12 + enabled = false, 13 + }, 14 + { 15 + "akinsho/bufferline.nvim", 16 + enabled = false, 17 + }, 18 + { 19 + "folke/noice.nvim", 20 + enabled = false, 21 + }, 22 + }
+30
configs/nvim/lua/plugins/gvc.lua
··· 1 + -- Graphical Version Control 2 + return { 3 + { 4 + "swaits/lazyjj.nvim", 5 + dependencies = "nvim-lua/plenary.nvim", 6 + opts = { 7 + mapping = "<space>vj", 8 + }, 9 + }, 10 + { 11 + "kdheepak/lazygit.nvim", 12 + lazy = true, 13 + cmd = { 14 + "LazyGit", 15 + "LazyGitConfig", 16 + "LazyGitCurrentFile", 17 + "LazyGitFilter", 18 + "LazyGitFilterCurrentFile", 19 + }, 20 + -- optional for floating window border decoration 21 + dependencies = { 22 + "nvim-lua/plenary.nvim", 23 + }, 24 + -- setting the keybinding for LazyGit with 'keys' is recommended in 25 + -- order to load the plugin when the command is run for the first time 26 + keys = { 27 + { "<space>vg", "<cmd>LazyGit<cr>", desc = "LazyGit" }, 28 + }, 29 + }, 30 + }
+192
configs/nvim/lua/plugins/lsp.lua
··· 1 + return { 2 + { 3 + "saecki/crates.nvim", 4 + tag = "stable", 5 + config = function() 6 + require("crates").setup() 7 + end, 8 + }, 9 + { 10 + "nvimdev/lspsaga.nvim", 11 + config = function() 12 + require("lspsaga").setup({}) 13 + end, 14 + dependencies = { 15 + "nvim-treesitter/nvim-treesitter", 16 + "nvim-tree/nvim-web-devicons", 17 + }, 18 + }, 19 + { 20 + "nvim-treesitter/nvim-treesitter", 21 + opts = { 22 + ensure_installed = { 23 + "gleam", 24 + "rust", 25 + "erlang", 26 + "toml", 27 + "sql", 28 + "json", 29 + "lua", 30 + "markdown", 31 + "markdown_inline", 32 + }, 33 + }, 34 + { 35 + "neovim/nvim-lspconfig", 36 + dependencies = { 37 + { "mason-org/mason.nvim", lazy = true }, 38 + "mason-org/mason-lspconfig.nvim", 39 + "WhoIsSethDaniel/mason-tool-installer.nvim", 40 + { "j-hui/fidget.nvim", opts = {} }, 41 + "simrat39/rust-tools.nvim", 42 + { "nvim-telescope/telescope.nvim", tag = "0.1.8" }, 43 + "Saghen/blink.cmp", 44 + }, 45 + config = function() 46 + local lspconfig = require("lspconfig") 47 + local capabilities = vim.lsp.protocol.make_client_capabilities() 48 + -- capabilities = vim.tbl_deep_extend('force', {}, capabilities, require('cmp_nvim_lsp').default_capabilities()) -- Deze regel is niet meer nodig 49 + 50 + local servers = { 51 + lua_ls = { 52 + settings = { 53 + Lua = { 54 + completion = { 55 + callSnipped = "Replace", 56 + }, 57 + }, 58 + }, 59 + }, 60 + rust_analyzer = { 61 + settings = { 62 + ["rust_analyzer"] = { 63 + cargo = { 64 + allFeatures = true, 65 + }, 66 + }, 67 + }, 68 + }, 69 + } 70 + 71 + require("mason").setup() 72 + 73 + local ensure_installed = vim.tbl_keys(servers or {}) 74 + vim.list_extend(ensure_installed, { "stylua" }) 75 + require("mason-tool-installer").setup({ ensure_installed = ensure_installed }) 76 + 77 + require("mason-lspconfig").setup({ 78 + ensure_installed = {}, 79 + automatic_installation = {}, 80 + handlers = { 81 + function(server_name) 82 + local server = servers[server_name] or {} 83 + server.capabilities = 84 + vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {}) 85 + require("lspconfig")[server_name].setup(server) 86 + end, 87 + }, 88 + }) 89 + 90 + lspconfig.gleam.setup({ 91 + capabilities = capabilities, 92 + }) 93 + lspconfig.rust_analyzer.setup({ 94 + capabilities = capabilities, 95 + }) 96 + 97 + local is_windows = vim.fn.has("win64") == 1 or vim.fn.has("win32") == 1 or vim.fn.has("win16") == 1 98 + local omnisharp_path = "" 99 + if is_windows then 100 + omnisharp_path = vim.fs.normalize("~/omnisharp/OmniSharp.exe") 101 + else 102 + omnisharp_path = vim.fs.normalize("~/omnisharp/OmniSharp") 103 + end 104 + 105 + lspconfig.omnisharp.setup({ 106 + cmd = { omnisharp_path, "--languageserver" }, 107 + filetypes = { "cs", "razor" }, 108 + root_dir = lspconfig.util.root_pattern("*.sln", "Directory.Build.props", ".git"), 109 + capabilities = capabilities, 110 + settings = { 111 + FormattingOptions = { 112 + EnableEditorConfigSupport = true, 113 + OrganizeImports = true, 114 + }, 115 + MsBuild = { 116 + LoadProjectsOnDemand = nil, 117 + }, 118 + RoslynExtensionsOptions = { 119 + EnableImportCompletion = true, 120 + AnalyzeOpenDocumentsOnly = nil, 121 + }, 122 + Sdk = { 123 + IncludePrereleases = true, 124 + }, 125 + }, 126 + }) 127 + 128 + vim.api.nvim_create_autocmd("LspAttach", { 129 + group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }), 130 + callback = function(event) 131 + local map = function(keys, func, desc, mode) 132 + mode = mode or "n" 133 + vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) 134 + end 135 + 136 + map("gd", vim.lsp.buf.definition, "[G]oto [D]efinition") 137 + map("gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences") 138 + map("gI", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation") 139 + map("<leader>D", require("telescope.builtin").lsp_type_definitions, "Type [D]efinition") 140 + map("<leader>ds", require("telescope.builtin").lsp_document_symbols, "[D]ocument [S]ymbols") 141 + map( 142 + "<leader>ws", 143 + require("telescope.builtin").lsp_dynamic_workspace_symbols, 144 + "[W]orkspace [S]ymbols" 145 + ) 146 + map("<leader>rn", vim.lsp.buf.rename, "[R]e[n]ame") 147 + map("<leader>ca", vim.lsp.buf.code_action, "[C]ode [A]ction") 148 + map("gD", vim.lsp.buf.declaration, "[G]oto [D]eclartion") 149 + 150 + local client = vim.lsp.get_client_by_id(event.data.client_id) 151 + if 152 + client 153 + and client:supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) 154 + then 155 + local highlight_augroup = 156 + vim.api.nvim_create_augroup("kickstart-lsp-highlight", { clear = true }) 157 + vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { 158 + buffer = event.buf, 159 + group = highlight_augroup, 160 + callback = vim.lsp.buf.document_highlight, 161 + }) 162 + 163 + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { 164 + buffer = event.buf, 165 + group = highlight_augroup, 166 + callback = vim.lsp.buf.clear_references, 167 + }) 168 + 169 + vim.api.nvim_create_autocmd({ "LspDetach" }, { 170 + group = vim.api.nvim_create_augroup("kickstart-lsp-detach", { clear = true }), 171 + callback = function(event2) 172 + vim.lsp.buf.clear_references() 173 + vim.api.nvim_clear_autocmds({ 174 + group = "kickstart-lsp-highlight", 175 + buffer = event2.buf, 176 + }) 177 + end, 178 + }) 179 + end 180 + if client and client:supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then 181 + vim.lsp.inlay_hint.enable(true, { bufnr = event.buf }) 182 + 183 + map("<leader>th", function() 184 + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf })) 185 + end, "[T]oggle Inlay [H]ints") 186 + end 187 + end, 188 + }) 189 + end, 190 + }, 191 + }, 192 + }
+83
configs/nvim/lua/plugins/lualine.lua
··· 1 + return { 2 + "nvim-lualine/lualine.nvim", 3 + dependencies = {}, 4 + config = function() 5 + local diagnostics = { 6 + "diagnostics", 7 + sources = { "nvim_diagnostic" }, 8 + sections = { "error", "warn" }, 9 + symbols = { error = " ", warn = " " }, 10 + colored = true, 11 + update_in_insert = false, 12 + always_visible = true, 13 + } 14 + 15 + local diff = { 16 + "diff", 17 + colored = true, 18 + symbols = { added = " ", modified = " ", removed = " " }, 19 + } 20 + 21 + local mode = { 22 + "mode", 23 + fmt = function(str) 24 + return "-- " .. str .. " --" 25 + end, 26 + } 27 + 28 + local filetype = { 29 + "filetype", 30 + icons_enabled = true, 31 + icon = nil, 32 + } 33 + 34 + local branch = { 35 + "branch", 36 + icons_enabled = true, 37 + colored = true, 38 + icon = "", 39 + } 40 + 41 + local spaces = function() 42 + return "spaces: " .. vim.api.nvim_buf_get_option(0, "shiftwidth") 43 + end 44 + 45 + local lsps = function() 46 + return "(" .. tostring(#vim.tbl_keys(vim.lsp.get_clients())) .. ")" 47 + end 48 + 49 + require("lualine").setup({ 50 + options = { 51 + icons_enabled = true, 52 + theme = "auto", 53 + globalstatus = true, 54 + component_separators = { left = "", right = "" }, 55 + section_separators = { left = "", right = "" }, 56 + disabled_filetypes = { "alpha", "dashboard", "NvimTree", "Outline" }, 57 + always_divide_middle = true, 58 + }, 59 + sections = { 60 + lualine_a = { mode }, 61 + lualine_b = { branch, diff, diagnostics }, 62 + lualine_c = { { "filename", path = 1 } }, 63 + lualine_x = { 64 + spaces, 65 + "encoding", 66 + filetype, 67 + lsps, 68 + }, 69 + lualine_y = { "location" }, 70 + lualine_z = { "progress" }, 71 + }, 72 + inactive_sections = { 73 + lualine_a = {}, 74 + lualine_b = {}, 75 + lualine_c = { "filename" }, 76 + lualine_x = { "location" }, 77 + lualine_y = {}, 78 + lualine_z = {}, 79 + }, 80 + extensions = {}, 81 + }) 82 + end, 83 + }
+14
configs/nvim/lua/plugins/neovide.lua
··· 1 + -- Options on Neovide 2 + 3 + if vim.g.neovide then 4 + vim.notify_once("Neovide detected.") 5 + vim.g.neovide_transparency = 0.95 6 + vim.g.neovide_cursor_vfx_mode = "pixiedust" 7 + vim.g.neovide_cursor_smooth_blink = true 8 + vim.g.neovide_hide_mouse_when_typing = true 9 + vim.g.neovide_cursor_vfx_particle_lifetime = 4.5 10 + vim.g.neovide_cursor_vfx_particle_density = 7.0 11 + vim.g.neovide_cursor_vfx_opacity = 200.0 12 + end 13 + 14 + return {}
+41
configs/nvim/lua/plugins/notify.lua
··· 1 + return { 2 + { 3 + "rcarriga/nvim-notify", 4 + keys = { 5 + { 6 + "<leader>un", 7 + function() 8 + require("notify").dismiss({ silent = true, pending = true }) 9 + end, 10 + desc = "Dismiss All Notifications", 11 + }, 12 + }, 13 + opts = { 14 + stages = "fade_in_slide_out", 15 + render = "wrapped-compact", 16 + timeout = 1400, 17 + position = "bottom_left", 18 + max_height = function() 19 + return math.floor(vim.o.lines * 0.75) 20 + end, 21 + max_width = function() 22 + return math.floor(vim.o.columns * 0.75) 23 + end, 24 + on_open = function(win) 25 + vim.api.nvim_win_set_config(win, { zindex = 100 }) 26 + end, 27 + window = { 28 + col = 1, 29 + row = 1, 30 + }, 31 + }, 32 + init = function() 33 + -- when noice is not enabled, install notify on VeryLazy 34 + if not LazyVim.has("noice.nvim") then 35 + LazyVim.on_very_lazy(function() 36 + vim.notify = require("notify") 37 + end) 38 + end 39 + end, 40 + }, 41 + }
+7
configs/nvim/lua/plugins/presence.lua
··· 1 + return { 2 + { 3 + "vyfor/cord.nvim", 4 + build = ":Cord update", 5 + -- opts = {} 6 + }, 7 + }
+42
configs/nvim/lua/plugins/snacks.lua
··· 1 + return { 2 + { 3 + "folke/snacks.nvim", 4 + opts = { 5 + explorer = { 6 + enabled = false, 7 + }, 8 + dashboard = { 9 + preset = { 10 + pick = function(cmd, opts) 11 + return LazyVim.pick(cmd, opts)() 12 + end, 13 + header = [[ 14 + 15 + ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 16 + ░░░░░░░░░░░░░ ░░░░░░░ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░ ░ ░ ░░░░░░░ ░░░░░░░░░░░░ 17 + ▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒ ▒▒ ▒ ▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒ 18 + ▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒ ▒ ▒ ▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒ ▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒ ▒ ▒ ▒ ▒▒▒▒▒▒▒▒▒▒▒▒ 19 + ▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓ ▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓ 20 + ▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓ ▓ ▓▓▓▓▓ ▓ ▓▓▓ ▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓ 21 + ▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓▓ ▓ ▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓ 22 + █████████████ ███████ ███ █ █ ████████ ██████████████ ██ ███████ ███████ █ ███████ ████████████ 23 + █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ 24 + ]], 25 + -- stylua: ignore 26 + ---@type snacks.dashboard.Item[] 27 + keys = { 28 + { icon = " ", key = "f", desc = "Find File", action = ":lua Snacks.dashboard.pick('files')" }, 29 + { icon = " ", key = "n", desc = "New File", action = ":ene | startinsert" }, 30 + { icon = " ", key = "/", desc = "Find Text", action = ":lua Snacks.dashboard.pick('live_grep')" }, 31 + { icon = " ", key = "r", desc = "Recent Files", action = ":lua Snacks.dashboard.pick('oldfiles')" }, 32 + { icon = " ", key = "c", desc = "Config", action = ":lua Snacks.dashboard.pick('files', {cwd = vim.fn.stdpath('config')})" }, 33 + { icon = " ", key = "s", desc = "Restore Session", section = "session" }, 34 + { icon = " ", key = "x", desc = "Lazy Extras", action = ":LazyExtras" }, 35 + { icon = "", key = "l", desc = "Plugins", action = ":Lazy" }, 36 + { icon = " ", key = "q", desc = "Quit", action = ":qa" }, 37 + }, 38 + }, 39 + }, 40 + }, 41 + }, 42 + }
+3
configs/nvim/lua/plugins/wakatime.lua
··· 1 + return { 2 + { "wakatime/vim-wakatime" }, 3 + }
+295
configs/starship.toml
··· 1 + # This config could just go in home manager, but unfortunately it is massive, and earlier attempts broke harshly.. 2 + 3 + 4 + format = """ 5 + [](fg:#9A348E)\ 6 + $os\ 7 + [](fg:#9A348E) \ 8 + """ 9 + 10 + right_format = """ 11 + [](#9A348E)\ 12 + 13 + $username\ 14 + []( fg:#C1E1C1 bg:#9A348E)\ 15 + $shell\ 16 + []( fg:#DA627D bg:#C1E1C1)\ 17 + $directory\ 18 + []( bg:#DA627D fg:#e7d1ff)\ 19 + $mise\ 20 + $nix_shell\ 21 + []( fg:#FCA17D bg:#e7d1ff)\ 22 + ${custom.vcs_branch}\ 23 + ${custom.vcs_status}\ 24 + []( bg:#FCA17D fg:#86BBD8)\ 25 + $c\ 26 + $cpp\ 27 + $elixir\ 28 + $elm\ 29 + $golang\ 30 + $gradle\ 31 + $haskell\ 32 + $java\ 33 + $julia\ 34 + $nodejs\ 35 + $bun\ 36 + $erlang\ 37 + $nim\ 38 + $gleam\ 39 + $rust\ 40 + $scala\ 41 + $php\ 42 + $zig\ 43 + []( bg:#86BBD8 fg:#06969A)\ 44 + $docker_context\ 45 + $cmd_duration\ 46 + []( bg:#06969A fg:#33658A)\ 47 + $status\ 48 + $time\ 49 + 50 + [ ](fg:#33658A)\ 51 + 52 + """ 53 + # Disable the blank line at the start of the prompt 54 + # add_newline = false 55 + 56 + # You can also replace your username with a neat symbol like  or disable this 57 + # and use the os module below 58 + [username] 59 + show_always = true 60 + style_user = "bg:#9A348E fg:#FFD6E0" 61 + style_root = "bg:#9A348E fg:#FFD6E0" 62 + format = '[$user ]($style)' 63 + disabled = false 64 + 65 + [shell] 66 + # The shell module displays the current shell name 67 + # It is disabled by default, but you can enable it if you want 68 + disabled = false # Disabled by default 69 + # Make it a bit like a pastel pistachio green color, like #C1E1C1. 70 + style = "bg:#C1E1C1 fg:#9A348E" 71 + # format = '[$shell ]($style)' 72 + # The shell module can also display the shell symbol only, for powershell, zsh, bash, etc. 73 + # Uncomment the line below to enable it 74 + format = "[$indicator]($style)" 75 + powershell_indicator = "Powershell" 76 + pwsh_indicator = "  PWSH" 77 + zsh_indicator = "🐚 Zsh" 78 + fish_indicator = "🐟 Fish" 79 + 80 + # An alternative to the username module which displays a symbol that 81 + # represents the current operating system 82 + [os] 83 + style = "bg:#9A348E fg:#FFD6E0" 84 + disabled = false # Disabled by default 85 + 86 + [directory] 87 + style = "bg:#DA627D" 88 + format = "[ $path ]($style)" 89 + truncation_symbol = "…/" 90 + 91 + [directory.substitutions] 92 + "Documents" = "󰈙 " 93 + "Downloads" = " " 94 + "Music" = " " 95 + "Pictures" = " " 96 + "source" = "󰒋 " 97 + # Keep in mind that the order matters. For example: 98 + # "Important Documents" = " 󰈙 " 99 + # will not be replaced, because "Documents" was already substituted before. 100 + # So either put "Important Documents" before "Documents" or use the substituted version: 101 + # "Important 󰈙 " = " 󰈙 " 102 + 103 + [c] 104 + symbol = " " 105 + style = "bg:#86BBD8 fg:#FF6B6B" 106 + format = '[ $symbol ($version) ]($style)' 107 + 108 + [cpp] 109 + symbol = " " 110 + style = "bg:#86BBD8 fg:#FF6B6B" 111 + format = '[ $symbol ($version) ]($style)' 112 + 113 + [docker_context] 114 + symbol = " " 115 + style = "bg:#06969A" 116 + format = '[ $symbol $context ]($style)' 117 + 118 + [elixir] 119 + symbol = " " 120 + style = "bg:#86BBD8 fg:#FF6B6B" 121 + format = '[ $symbol ($version) ]($style)' 122 + 123 + [elm] 124 + symbol = " " 125 + style = "bg:#86BBD8 fg:#FF6B6B" 126 + format = '[ $symbol ($version) ]($style)' 127 + 128 + [git_branch] 129 + format = '$symbol $branch' 130 + 131 + [git_status] 132 + format = '$all_status$ahead_behind ' 133 + 134 + [golang] 135 + symbol = " " 136 + style = "bg:#86BBD8 fg:#FF6B6B" 137 + format = '[ $symbol ($version) ]($style)' 138 + 139 + [gradle] 140 + style = "bg:#86BBD8 fg:#FF6B6B" 141 + format = '[ $symbol ($version) ]($style)' 142 + 143 + [haskell] 144 + symbol = " " 145 + style = "bg:#86BBD8 fg:#FF6B6B" 146 + format = '[ $symbol ($version) ]($style)' 147 + 148 + [java] 149 + symbol = " " 150 + style = "bg:#86BBD8 fg:#FF6B6B" 151 + format = '[ $symbol ($version) ]($style)' 152 + 153 + [nodejs] 154 + symbol = " " 155 + style = "bg:#86BBD8 fg:#FF6B6B" 156 + format = '[ $symbol ($version) ]($style)' 157 + 158 + [bun] 159 + disabled = false 160 + symbol = "🧅 " 161 + format = '[ $symbol ($version) ]($style)' 162 + detect_files = [ 163 + 'bun.lock', 164 + 'bun.lockb', 165 + 'bunfig.toml', 166 + 'package.json', 167 + "gleam.toml", 168 + ] 169 + style = "bg:#86BBD8 fg:#FF6B6B" 170 + 171 + [lua] 172 + symbol = " " 173 + style = "bg:#86BBD8 fg:#FF6B6B" 174 + format = '[ $symbol ($version) ]($style)' 175 + 176 + 177 + [php] 178 + symbol = " " 179 + style = "bg:#86BBD8 fg:#FF6B6B" 180 + format = '[ $symbol ($version) ]($style)' 181 + 182 + 183 + [nim] 184 + symbol = "󰆥 " 185 + style = "bg:#86BBD8 fg:#FF6B6B" 186 + format = '[ $symbol ($version) ]($style)' 187 + 188 + [rust] 189 + symbol = " " 190 + style = "bg:#86BBD8 fg:#FF6B6B" 191 + format = '[ $symbol ($version) ]($style)' 192 + 193 + [scala] 194 + symbol = " " 195 + style = "bg:#86BBD8 fg:#FF6B6B" 196 + format = '[ $symbol ($version) ]($style)' 197 + 198 + [erlang] 199 + symbol = " " 200 + format = "[$symbol ($version) ]($style)" 201 + style = "bg:#86BBD8 fg:#FF6B6B" 202 + detect_files = ['rebar.config', 'elang.mk', "gleam.toml"] 203 + 204 + [gleam] 205 + symbol = " " 206 + format = "[$symbol ($version) ]($style)" 207 + style = "bg:#86BBD8 fg:#FF6B6B" 208 + disabled = false 209 + 210 + 211 + [zig] 212 + symbol = "↯ " 213 + style = "bg:#86BBD8 fg:#FF6B6B" 214 + format = '[ $symbol ($version) ]($style)' 215 + 216 + [status] 217 + disabled = false 218 + style = "bg:#33658A" # Like time. 219 + # Heart symbol for success, broken heart for failure. 220 + success_symbol = "💖" 221 + symbol = "💔" 222 + format = "[ $symbol]($style)" 223 + map_symbol =true 224 + 225 + 226 + [time] 227 + disabled = false 228 + time_format = "%R" # Hour:Minute Format 229 + style = "bg:#33658A" 230 + format = '[ $time ]($style)' 231 + 232 + [cmd_duration] 233 + format = '[ ⏱️ $duration ]($style)' 234 + style = "bg:#06969A fg:#33658A" 235 + min_time = 500 236 + 237 + 238 + [mise] 239 + disabled = true 240 + symbol = "🐭" 241 + format = '[ $symbol $health ]($style)' 242 + detect_files = [ "mise.toml"] 243 + style = "bg:#e7d1ff fg:#00008b" 244 + 245 + [nix_shell] 246 + format = '[via $symbol$state( \($name\))]($style)' 247 + style = "bg:#e7d1ff fg:#00008b" 248 + 249 + [custom.vcs_status] 250 + detect_folders = [".git", ".jj"] 251 + description = "Show git or jj status, styled the same" 252 + shell = ["bash", "--noprofile"] 253 + command = ''' 254 + if [ "$GIT_DIR" == "" ]; then 255 + starship module git_status 256 + else 257 + jj log --revisions @ --no-graph --ignore-working-copy --color never --limit 1 --template ' 258 + separate(" ", 259 + change_id.shortest(1), 260 + bookmarks, 261 + 262 + concat( 263 + if(conflict, "💥"), 264 + if(divergent, "🚧"), 265 + if(hidden, "👻"), 266 + if(immutable, "🔒"), 267 + ), 268 + raw_escape_sequence("") ++ if(empty, "(empty)"), 269 + raw_escape_sequence("") ++ coalesce( 270 + truncate_end(29, description.first_line(), "…"), 271 + "(no description set)", 272 + ) ++ raw_escape_sequence(""), 273 + ) 274 + ' 275 + fi 276 + ''' 277 + 278 + format = '[($output)]($style)' 279 + style = "bg:#FCA17D fg:#2A4D69" 280 + 281 + [custom.vcs_branch] 282 + description = "Show git or jj branch, styled the same" 283 + shell = ["bash", "-noprofile"] 284 + command = ''' 285 + if [ "$GIT_DIR" == "" ]; then 286 + starship module git_branch 287 + else 288 + # JJ bookmark should show up here but idk how to yet. 289 + echo "jj" 290 + fi 291 + ''' 292 + detect_folders = [".git", ".jj"] 293 + format = '[$symbol($output )]($style)' 294 + symbol = "" 295 + style = "bg:#FCA17D fg:#2A4D69"
+435
configs/zellij/config.kdl
··· 1 + keybinds clear-defaults=true { 2 + locked { 3 + bind "Ctrl g" { SwitchToMode "normal"; } 4 + } 5 + pane { 6 + bind "left" { MoveFocus "left"; } 7 + bind "down" { MoveFocus "down"; } 8 + bind "up" { MoveFocus "up"; } 9 + bind "right" { MoveFocus "right"; } 10 + bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; } 11 + bind "d" { NewPane "down"; SwitchToMode "locked"; } 12 + bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "locked"; } 13 + bind "f" { ToggleFocusFullscreen; SwitchToMode "locked"; } 14 + bind "h" { MoveFocus "left"; } 15 + bind "i" { TogglePanePinned; SwitchToMode "locked"; } 16 + bind "j" { MoveFocus "down"; } 17 + bind "k" { MoveFocus "up"; } 18 + bind "l" { MoveFocus "right"; } 19 + bind "n" { NewPane; SwitchToMode "locked"; } 20 + bind "p" { SwitchToMode "normal"; } 21 + bind "r" { NewPane "right"; SwitchToMode "locked"; } 22 + bind "w" { ToggleFloatingPanes; SwitchToMode "locked"; } 23 + bind "x" { CloseFocus; SwitchToMode "locked"; } 24 + bind "z" { TogglePaneFrames; SwitchToMode "locked"; } 25 + bind "tab" { SwitchFocus; } 26 + } 27 + tab { 28 + bind "left" { GoToPreviousTab; } 29 + bind "down" { GoToNextTab; } 30 + bind "up" { GoToPreviousTab; } 31 + bind "right" { GoToNextTab; } 32 + bind "1" { GoToTab 1; SwitchToMode "locked"; } 33 + bind "2" { GoToTab 2; SwitchToMode "locked"; } 34 + bind "3" { GoToTab 3; SwitchToMode "locked"; } 35 + bind "4" { GoToTab 4; SwitchToMode "locked"; } 36 + bind "5" { GoToTab 5; SwitchToMode "locked"; } 37 + bind "6" { GoToTab 6; SwitchToMode "locked"; } 38 + bind "7" { GoToTab 7; SwitchToMode "locked"; } 39 + bind "8" { GoToTab 8; SwitchToMode "locked"; } 40 + bind "9" { GoToTab 9; SwitchToMode "locked"; } 41 + bind "[" { BreakPaneLeft; SwitchToMode "locked"; } 42 + bind "]" { BreakPaneRight; SwitchToMode "locked"; } 43 + bind "b" { BreakPane; SwitchToMode "locked"; } 44 + bind "h" { GoToPreviousTab; } 45 + bind "j" { GoToNextTab; } 46 + bind "k" { GoToPreviousTab; } 47 + bind "l" { GoToNextTab; } 48 + bind "n" { NewTab; SwitchToMode "locked"; } 49 + bind "r" { SwitchToMode "renametab"; TabNameInput 0; } 50 + bind "s" { ToggleActiveSyncTab; SwitchToMode "locked"; } 51 + bind "t" { SwitchToMode "normal"; } 52 + bind "x" { CloseTab; SwitchToMode "locked"; } 53 + bind "tab" { ToggleTab; } 54 + } 55 + resize { 56 + bind "left" { Resize "Increase left"; } 57 + bind "down" { Resize "Increase down"; } 58 + bind "up" { Resize "Increase up"; } 59 + bind "right" { Resize "Increase right"; } 60 + bind "+" { Resize "Increase"; } 61 + bind "-" { Resize "Decrease"; } 62 + bind "=" { Resize "Increase"; } 63 + bind "H" { Resize "Decrease left"; } 64 + bind "J" { Resize "Decrease down"; } 65 + bind "K" { Resize "Decrease up"; } 66 + bind "L" { Resize "Decrease right"; } 67 + bind "h" { Resize "Increase left"; } 68 + bind "j" { Resize "Increase down"; } 69 + bind "k" { Resize "Increase up"; } 70 + bind "l" { Resize "Increase right"; } 71 + bind "r" { SwitchToMode "normal"; } 72 + } 73 + move { 74 + bind "left" { MovePane "left"; } 75 + bind "down" { MovePane "down"; } 76 + bind "up" { MovePane "up"; } 77 + bind "right" { MovePane "right"; } 78 + bind "h" { MovePane "left"; } 79 + bind "j" { MovePane "down"; } 80 + bind "k" { MovePane "up"; } 81 + bind "l" { MovePane "right"; } 82 + bind "m" { SwitchToMode "normal"; } 83 + bind "n" { MovePane; } 84 + bind "p" { MovePaneBackwards; } 85 + bind "tab" { MovePane; } 86 + } 87 + scroll { 88 + bind "Alt left" { MoveFocusOrTab "left"; SwitchToMode "locked"; } 89 + bind "Alt down" { MoveFocus "down"; SwitchToMode "locked"; } 90 + bind "Alt up" { MoveFocus "up"; SwitchToMode "locked"; } 91 + bind "Alt right" { MoveFocusOrTab "right"; SwitchToMode "locked"; } 92 + bind "e" { EditScrollback; SwitchToMode "locked"; } 93 + bind "f" { SwitchToMode "entersearch"; SearchInput 0; } 94 + bind "Alt h" { MoveFocusOrTab "left"; SwitchToMode "locked"; } 95 + bind "Alt j" { MoveFocus "down"; SwitchToMode "locked"; } 96 + bind "Alt k" { MoveFocus "up"; SwitchToMode "locked"; } 97 + bind "Alt l" { MoveFocusOrTab "right"; SwitchToMode "locked"; } 98 + bind "s" { SwitchToMode "normal"; } 99 + } 100 + search { 101 + bind "c" { SearchToggleOption "CaseSensitivity"; } 102 + bind "n" { Search "down"; } 103 + bind "o" { SearchToggleOption "WholeWord"; } 104 + bind "p" { Search "up"; } 105 + bind "w" { SearchToggleOption "Wrap"; } 106 + } 107 + session { 108 + bind "a" { 109 + LaunchOrFocusPlugin "zellij:about" { 110 + floating true 111 + move_to_focused_tab true 112 + } 113 + SwitchToMode "locked" 114 + } 115 + bind "c" { 116 + LaunchOrFocusPlugin "configuration" { 117 + floating true 118 + move_to_focused_tab true 119 + } 120 + SwitchToMode "locked" 121 + } 122 + bind "d" { Detach; } 123 + bind "o" { SwitchToMode "normal"; } 124 + bind "p" { 125 + LaunchOrFocusPlugin "plugin-manager" { 126 + floating true 127 + move_to_focused_tab true 128 + } 129 + SwitchToMode "locked" 130 + } 131 + bind "w" { 132 + LaunchOrFocusPlugin "session-manager" { 133 + floating true 134 + move_to_focused_tab true 135 + } 136 + SwitchToMode "locked" 137 + } 138 + } 139 + shared_among "normal" "locked" { 140 + bind "Alt left" { MoveFocusOrTab "left"; } 141 + bind "Alt down" { MoveFocus "down"; } 142 + bind "Alt up" { MoveFocus "up"; } 143 + bind "Alt right" { MoveFocusOrTab "right"; } 144 + bind "Alt +" { Resize "Increase"; } 145 + bind "Alt -" { Resize "Decrease"; } 146 + bind "Alt =" { Resize "Increase"; } 147 + bind "Alt [" { PreviousSwapLayout; } 148 + bind "Alt ]" { NextSwapLayout; } 149 + bind "Alt f" { ToggleFloatingPanes; } 150 + 151 + bind "Alt n" { NewPane; } 152 + bind "Alt o" { MoveTab "right"; } 153 + } 154 + shared_except "locked" "renametab" "renamepane" { 155 + bind "Ctrl g" { SwitchToMode "locked"; } 156 + bind "Ctrl q" { Quit; } 157 + bind "Alt h" { MoveFocusOrTab "left"; } 158 + bind "Alt i" { MoveTab "left"; } 159 + bind "Alt j" { MoveFocus "down"; } 160 + bind "Alt k" { MoveFocus "up"; } 161 + bind "Alt l" { MoveFocusOrTab "right"; } 162 + } 163 + shared_except "locked" "entersearch" { 164 + bind "enter" { SwitchToMode "locked"; } 165 + } 166 + shared_except "locked" "entersearch" "renametab" "renamepane" { 167 + bind "esc" { SwitchToMode "locked"; } 168 + } 169 + shared_except "locked" "entersearch" "renametab" "renamepane" "move" { 170 + bind "m" { SwitchToMode "move"; } 171 + } 172 + shared_except "locked" "entersearch" "search" "renametab" "renamepane" "session" { 173 + bind "o" { SwitchToMode "session"; } 174 + } 175 + shared_except "locked" "tab" "entersearch" "renametab" "renamepane" { 176 + bind "t" { SwitchToMode "tab"; } 177 + } 178 + shared_except "locked" "tab" "scroll" "entersearch" "renametab" "renamepane" { 179 + bind "s" { SwitchToMode "scroll"; } 180 + } 181 + shared_among "normal" "resize" "tab" "scroll" "prompt" "tmux" { 182 + bind "p" { SwitchToMode "pane"; } 183 + } 184 + shared_except "locked" "resize" "pane" "tab" "entersearch" "renametab" "renamepane" { 185 + bind "r" { SwitchToMode "resize"; } 186 + } 187 + shared_among "scroll" "search" { 188 + bind "PageDown" { PageScrollDown; } 189 + bind "PageUp" { PageScrollUp; } 190 + bind "left" { PageScrollUp; } 191 + bind "down" { ScrollDown; } 192 + bind "up" { ScrollUp; } 193 + bind "right" { PageScrollDown; } 194 + bind "Ctrl b" { PageScrollUp; } 195 + bind "Ctrl c" { ScrollToBottom; SwitchToMode "locked"; } 196 + bind "d" { HalfPageScrollDown; } 197 + bind "Ctrl f" { PageScrollDown; } 198 + bind "h" { PageScrollUp; } 199 + bind "j" { ScrollDown; } 200 + bind "k" { ScrollUp; } 201 + bind "l" { PageScrollDown; } 202 + bind "u" { HalfPageScrollUp; } 203 + } 204 + entersearch { 205 + bind "Ctrl c" { SwitchToMode "scroll"; } 206 + bind "esc" { SwitchToMode "scroll"; } 207 + bind "enter" { SwitchToMode "search"; } 208 + } 209 + renametab { 210 + bind "esc" { UndoRenameTab; SwitchToMode "tab"; } 211 + } 212 + shared_among "renametab" "renamepane" { 213 + bind "Ctrl c" { SwitchToMode "locked"; } 214 + } 215 + renamepane { 216 + bind "esc" { UndoRenamePane; SwitchToMode "pane"; } 217 + } 218 + } 219 + 220 + // Plugin aliases - can be used to change the implementation of Zellij 221 + // changing these requires a restart to take effect 222 + plugins { 223 + about location="zellij:about" 224 + compact-bar location="zellij:compact-bar" 225 + configuration location="zellij:configuration" 226 + filepicker location="zellij:strider" { 227 + cwd "/" 228 + } 229 + plugin-manager location="zellij:plugin-manager" 230 + session-manager location="zellij:session-manager" 231 + status-bar location="zellij:status-bar" 232 + strider location="zellij:strider" 233 + tab-bar location="zellij:tab-bar" 234 + welcome-screen location="zellij:session-manager" { 235 + welcome_screen true 236 + } 237 + } 238 + 239 + // Plugins to load in the background when a new session starts 240 + // eg. "file:/path/to/my-plugin.wasm" 241 + // eg. "https://example.com/my-plugin.wasm" 242 + load_plugins { 243 + } 244 + 245 + // Use a simplified UI without special fonts (arrow glyphs) 246 + // Options: 247 + // - true 248 + // - false (Default) 249 + // 250 + // simplified_ui true 251 + 252 + // Choose the theme that is specified in the themes section. 253 + // Default: default 254 + // 255 + theme "molokai-dark" 256 + 257 + // Choose the base input mode of zellij. 258 + // Default: normal 259 + // 260 + default_mode "locked" 261 + 262 + // Choose the path to the default shell that zellij will use for opening new panes 263 + // Default: $SHELL 264 + // 265 + default_shell "fish" 266 + 267 + // Choose the path to override cwd that zellij will use for opening new panes 268 + // 269 + // default_cwd "/tmp" 270 + 271 + // The name of the default layout to load on startup 272 + // Default: "default" 273 + // 274 + default_layout "default" 275 + 276 + // The folder in which Zellij will look for layouts 277 + // (Requires restart) 278 + // 279 + // layout_dir "/tmp" 280 + 281 + // The folder in which Zellij will look for themes 282 + // (Requires restart) 283 + // 284 + // theme_dir "/tmp" 285 + 286 + // Toggle enabling the mouse mode. 287 + // On certain configurations, or terminals this could 288 + // potentially interfere with copying text. 289 + // Options: 290 + // - true (default) 291 + // - false 292 + // 293 + // mouse_mode false 294 + 295 + // Toggle having pane frames around the panes 296 + // Options: 297 + // - true (default, enabled) 298 + // - false 299 + // 300 + // pane_frames false 301 + 302 + // When attaching to an existing session with other users, 303 + // should the session be mirrored (true) 304 + // or should each user have their own cursor (false) 305 + // (Requires restart) 306 + // Default: false 307 + // 308 + // mirror_session true 309 + 310 + // Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP 311 + // eg. when terminal window with an active zellij session is closed 312 + // (Requires restart) 313 + // Options: 314 + // - detach (Default) 315 + // - quit 316 + // 317 + on_force_close "quit" 318 + 319 + // Configure the scroll back buffer size 320 + // This is the number of lines zellij stores for each pane in the scroll back 321 + // buffer. Excess number of lines are discarded in a FIFO fashion. 322 + // (Requires restart) 323 + // Valid values: positive integers 324 + // Default value: 10000 325 + // 326 + // scroll_buffer_size 10000 327 + 328 + // Provide a command to execute when copying text. The text will be piped to 329 + // the stdin of the program to perform the copy. This can be used with 330 + // terminal emulators which do not support the OSC 52 ANSI control sequence 331 + // that will be used by default if this option is not set. 332 + // Examples: 333 + // 334 + // copy_command "xclip -selection clipboard" // x11 335 + // copy_command "wl-copy" // wayland 336 + // copy_command "pbcopy" // osx 337 + // 338 + // copy_command "pbcopy" 339 + 340 + // Choose the destination for copied text 341 + // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. 342 + // Does not apply when using copy_command. 343 + // Options: 344 + // - system (default) 345 + // - primary 346 + // 347 + // copy_clipboard "primary" 348 + 349 + // Enable automatic copying (and clearing) of selection when releasing mouse 350 + // Default: true 351 + // 352 + // copy_on_select true 353 + 354 + // Path to the default editor to use to edit pane scrollbuffer 355 + // Default: $EDITOR or $VISUAL 356 + scrollback_editor "/usr/bin/nvim" 357 + 358 + // A fixed name to always give the Zellij session. 359 + // Consider also setting `attach_to_session true,` 360 + // otherwise this will error if such a session exists. 361 + // Default: <RANDOM> 362 + // 363 + // session_name "My singleton session" 364 + 365 + // When `session_name` is provided, attaches to that session 366 + // if it is already running or creates it otherwise. 367 + // Default: false 368 + // 369 + // attach_to_session true 370 + 371 + // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible 372 + // Options: 373 + // - true (default) 374 + // - false 375 + // 376 + // auto_layout false 377 + 378 + // Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected 379 + // Options: 380 + // - true (default) 381 + // - false 382 + // 383 + // session_serialization false 384 + 385 + // Whether pane viewports are serialized along with the session, default is false 386 + // Options: 387 + // - true 388 + // - false (default) 389 + // 390 + // serialize_pane_viewport false 391 + 392 + // Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 393 + // defaults to the scrollback size. If this number is higher than the scrollback size, it will 394 + // also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. 395 + // 396 + // scrollback_lines_to_serialize 10000 397 + 398 + // Enable or disable the rendering of styled and colored underlines (undercurl). 399 + // May need to be disabled for certain unsupported terminals 400 + // (Requires restart) 401 + // Default: true 402 + // 403 + // styled_underlines false 404 + 405 + // How often in seconds sessions are serialized 406 + // 407 + // serialization_interval 10000 408 + 409 + // Enable or disable writing of session metadata to disk (if disabled, other sessions might not know 410 + // metadata info on this session) 411 + // (Requires restart) 412 + // Default: false 413 + // 414 + // disable_session_metadata false 415 + 416 + // Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) 417 + // (Requires restart) 418 + // Default: true (if the host terminal supports it) 419 + // 420 + support_kitty_keyboard_protocol true 421 + 422 + // Whether to stack panes when resizing beyond a certain size 423 + // Default: true 424 + // 425 + // stacked_resize false 426 + 427 + // Whether to show tips on startup 428 + // Default: true 429 + // 430 + show_startup_tips false 431 + 432 + // Whether to show release notes on first version run 433 + // Default: true 434 + // 435 + show_release_notes false
+9
configs/zellij/layouts/default.kdl
··· 1 + layout { 2 + pane size=1 borderless=true { 3 + plugin location="tab-bar" 4 + } 5 + pane borderless=true 6 + pane size=1 borderless=true { 7 + plugin location="status-bar" 8 + } 9 + }
+37
configs/zellij/layouts/id-e.kdl
··· 1 + // IDE layout but without the editor. 2 + layout { 3 + pane size=1 borderless=true { 4 + plugin location="tab-bar" 5 + } 6 + pane split_direction="horizontal" size="100%" { 7 + pane size="90%" { 8 + split_direction "vertical" 9 + // The editor pane, but I won't set nvim as command, because that'll disable it from using LSP's 10 + pane size="80%" { 11 + // stacked true 12 + pane borderless=true focus=true 13 + } 14 + // pane size="10%" { 15 + // borderless true 16 + // command "bun" 17 + // args "x" "@google/gemini-cli" 18 + // } 19 + } 20 + pane { 21 + split_direction "vertical" 22 + pane size="60%"; 23 + children 24 + pane 25 + } 26 + } 27 + pane borderless=true size=1 { 28 + plugin location="zellij:status-bar" 29 + } 30 + } 31 + 32 + keybinds { 33 + unbind "Ctrl q" 34 + shared { 35 + bind "Ctrl q" { CloseTab; SwitchToMode "Normal"; } 36 + } 37 + }
+39
configs/zellij/layouts/ide.kdl
··· 1 + 2 + layout { 3 + pane size=1 borderless=true { 4 + plugin location="tab-bar" 5 + } 6 + pane split_direction="horizontal" size="100%" { 7 + pane size="90%" { 8 + split_direction "vertical" 9 + pane size="80%" { 10 + // stacked true 11 + pane borderless=true command="nvim" focus=true close_on_exit=true 12 + // The editor pane, but I won't set nvim as command, because that'll disable it from using LSP's 13 + // I did now. 14 + // pane borderless=true command="~/.config/zellij/scripts/ide.sh" focus=true 15 + } 16 + // pane size="10%" { 17 + // borderless true 18 + // command "bun" 19 + // args "x" "@google/gemini-cli" 20 + // } 21 + } 22 + pane { 23 + split_direction "vertical" 24 + pane size="60%"; 25 + children 26 + pane 27 + } 28 + } 29 + pane borderless=true size=1 { 30 + plugin location="zellij:status-bar" 31 + } 32 + } 33 + 34 + keybinds { 35 + unbind "Ctrl q" 36 + shared { 37 + bind "Ctrl q" { CloseTab; SwitchToMode "Normal"; } 38 + } 39 + }
+17
configs/zellij/layouts/initial_hyprboot.kdl
··· 1 + 2 + layout { 3 + pane { 4 + command "hyfetch" 5 + borderless true 6 + } 7 + pane { 8 + start_suspended true 9 + size "5%" 10 + command "zellij" 11 + args "--layout" "1" 12 + focus true 13 + borderless true 14 + } 15 + 16 + } 17 +
+9
configs/zellij/scripts/ide.sh
··· 1 + #!/bin/env bash 2 + # eval "$(~/.local/bin/mise activate bash --shims)" 3 + if ! command -v hx &>/dev/null; then 4 + alias hx='helix' 5 + if [[ "$EDITOR"=="hx" ]]; then 6 + EDITOR='helix' 7 + fi 8 + fi 9 + $EDITOR . && zellij action close-tab
+72
flake.lock
··· 1 + { 2 + "nodes": { 3 + "home-manager": { 4 + "inputs": { 5 + "nixpkgs": [ 6 + "nixpkgs" 7 + ] 8 + }, 9 + "locked": { 10 + "lastModified": 1769978395, 11 + "narHash": "sha256-gj1yP3spUb1vGtaF5qPhshd2j0cg4xf51pklDsIm19Q=", 12 + "owner": "nix-community", 13 + "repo": "home-manager", 14 + "rev": "984708c34d3495a518e6ab6b8633469bbca2f77a", 15 + "type": "github" 16 + }, 17 + "original": { 18 + "owner": "nix-community", 19 + "repo": "home-manager", 20 + "type": "github" 21 + } 22 + }, 23 + "nixpkgs": { 24 + "locked": { 25 + "lastModified": 1769789167, 26 + "narHash": "sha256-kKB3bqYJU5nzYeIROI82Ef9VtTbu4uA3YydSk/Bioa8=", 27 + "owner": "nixos", 28 + "repo": "nixpkgs", 29 + "rev": "62c8382960464ceb98ea593cb8321a2cf8f9e3e5", 30 + "type": "github" 31 + }, 32 + "original": { 33 + "owner": "nixos", 34 + "ref": "nixos-unstable", 35 + "repo": "nixpkgs", 36 + "type": "github" 37 + } 38 + }, 39 + "plasma-manager": { 40 + "inputs": { 41 + "home-manager": [ 42 + "home-manager" 43 + ], 44 + "nixpkgs": [ 45 + "nixpkgs" 46 + ] 47 + }, 48 + "locked": { 49 + "lastModified": 1769956244, 50 + "narHash": "sha256-12RCFLyAedyMOdenUi7cN3ioJPEGjA/ZG1BLjugfUVs=", 51 + "owner": "nix-community", 52 + "repo": "plasma-manager", 53 + "rev": "fe54ea85c6e4413fba03b84d50f2b431d2f7c831", 54 + "type": "github" 55 + }, 56 + "original": { 57 + "owner": "nix-community", 58 + "repo": "plasma-manager", 59 + "type": "github" 60 + } 61 + }, 62 + "root": { 63 + "inputs": { 64 + "home-manager": "home-manager", 65 + "nixpkgs": "nixpkgs", 66 + "plasma-manager": "plasma-manager" 67 + } 68 + } 69 + }, 70 + "root": "root", 71 + "version": 7 72 + }
+55
flake.nix
··· 1 + { 2 + description = "Mar's dotfiles for nix :3"; 3 + 4 + inputs = { 5 + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; 6 + home-manager = { 7 + url = "github:nix-community/home-manager"; 8 + inputs.nixpkgs.follows = "nixpkgs"; 9 + }; 10 + plasma-manager = { 11 + url = "github:nix-community/plasma-manager"; 12 + inputs.nixpkgs.follows = "nixpkgs"; 13 + inputs.home-manager.follows = "home-manager"; 14 + }; 15 + }; 16 + outputs = 17 + { 18 + self, 19 + nixpkgs, 20 + home-manager, 21 + ... 22 + }@inputs: 23 + let 24 + # Helper function to create system configs easily 25 + mkSystem = 26 + hostname: system: 27 + nixpkgs.lib.nixosSystem { 28 + inherit system; 29 + specialArgs = { inherit inputs hostname; }; 30 + modules = [ 31 + ./hosts/${hostname}/configuration.nix 32 + 33 + home-manager.nixosModules.home-manager 34 + { 35 + home-manager.useGlobalPkgs = true; 36 + home-manager.useUserPackages = true; 37 + 38 + home-manager.extraSpecialArgs = { inherit inputs hostname; }; 39 + home-manager.users.mar = { 40 + imports = [ ./home/home.nix ]; 41 + }; 42 + } 43 + ]; 44 + }; 45 + in 46 + { 47 + nixosConfigurations = { 48 + # Add your devices here 49 + fennekin = mkSystem "fennekin" "x86_64-linux"; 50 + samurott-nix = mkSystem "samurott-nix" "x86_64-linux"; 51 + Ponyta = mkSystem "Ponyta" "x86_64-linux"; 52 + # workstation = mkSystem "workstation" "x86_64-linux"; 53 + }; 54 + }; 55 + }
fonts/Lotion-Black.ttf

This is a binary file and will not be displayed.

fonts/Lotion-BlackItalic.ttf

This is a binary file and will not be displayed.

fonts/Lotion-Bold.ttf

This is a binary file and will not be displayed.

fonts/Lotion-BoldItalic.ttf

This is a binary file and will not be displayed.

fonts/Lotion-Regular.ttf

This is a binary file and will not be displayed.

fonts/Lotion-RegularItalic.ttf

This is a binary file and will not be displayed.

fonts/Lotion-SemiBold.ttf

This is a binary file and will not be displayed.

fonts/Lotion-SemiBoldItalic.ttf

This is a binary file and will not be displayed.

+52
home/home.nix
··· 1 + { pkgs, inputs, ... }: 2 + 3 + { 4 + imports = [ 5 + # Inputs 6 + inputs.plasma-manager.homeModules.plasma-manager 7 + 8 + # Modules 9 + ./modules/conversation.nix 10 + ./modules/development.nix 11 + ./modules/fonts.nix 12 + ./modules/games.nix 13 + ./modules/gnome.nix 14 + ./modules/kde.nix 15 + ./modules/librewolf.nix 16 + ./modules/niri.nix 17 + ./modules/shell.nix 18 + ./modules/spotify.nix 19 + ./modules/wezterm.nix 20 + ]; 21 + 22 + home.username = "mar"; 23 + home.homeDirectory = "/home/mar"; 24 + home.stateVersion = "24.11"; # Ensure this matches your NixOS version 25 + 26 + home.packages = with pkgs; [ 27 + # GUI Apps 28 + vivaldi 29 + 30 + #gnomeExtensions.gesture-improvements 31 + gnomeExtensions.appindicator 32 + git 33 + ]; 34 + 35 + xdg.mimeApps = { 36 + enable = true; 37 + defaultApplications = { 38 + "text/html" = "vivaldi.desktop"; 39 + "x-scheme-handler/http" = "vivaldi.desktop"; 40 + "x-scheme-handler/https" = "vivaldi.desktop"; 41 + "x-scheme-handler/about" = "vivaldi.desktop"; 42 + "x-scheme-handler/unknown" = "vivaldi.desktop"; 43 + }; 44 + }; 45 + 46 + home.sessionVariables = { 47 + TERMINAL = "wezterm"; 48 + PASSWORD_STORE_TYPE = "basic"; 49 + ZED_ALLOW_EMULATED_GPU=1; 50 + SHELL="fish"; 51 + }; 52 + }
+8
home/modules/conversation.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + home.packages = with pkgs; [ 5 + beeper 6 + fluffychat 7 + ]; 8 + }
+16
home/modules/development.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + imports = [ 5 + ./development/jujutsu.nix 6 + ./development/neovim.nix 7 + ./development/zed.nix 8 + ]; 9 + programs.mise = { 10 + enable = true; 11 + }; 12 + home.packages = with pkgs; [ 13 + # Mise is being faded out in favor of just due to growing friction between me and Mise's style 14 + just 15 + ]; 16 + }
+64
home/modules/development/jujutsu.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + programs.git = { 5 + enable = true; 6 + settings = { 7 + user.name = "MLC Bloeiman"; 8 + user.email = "mar@strawmelonjuice.com"; 9 + }; 10 + }; 11 + programs.jujutsu = { 12 + enable = true; 13 + package = pkgs.jujutsu; 14 + settings = { 15 + user.name = "MLC Bloeiman"; 16 + user.email = "mar@strawmelonjuice.com"; 17 + ui.diff-formatter = [ 18 + "difft" 19 + "--color=always" 20 + "$left" 21 + "$right" 22 + ]; 23 + ui.editor = "hx"; 24 + ui.streampager.wrapping = "none"; 25 + ui.default-command = "status"; 26 + aliases = { 27 + # Moves bookmarks from the previous commit to your current one 28 + tug = [ 29 + "bookmark" 30 + "move" 31 + "--from" 32 + "heads(::@- & bookmarks())" 33 + "--to" 34 + "coalesce(@ & ~empty(), @-)" 35 + ]; 36 + 37 + # A compact, reversed log view 38 + ll = [ 39 + "log" 40 + "-Tbuiltin_log_compact_full_description" 41 + "--reversed" 42 + "--no-pager" 43 + ]; 44 + 45 + # Rebases your active branches onto the main trunk 46 + catchup = [ 47 + "rebase" 48 + "-b" 49 + "bookmarks() & mine() & ~immutable()" 50 + "-d" 51 + "trunk()" 52 + "--skip-emptied" 53 + ]; 54 + }; 55 + }; 56 + 57 + }; 58 + 59 + home.packages = with pkgs; [ 60 + lazyjj 61 + git 62 + difftastic 63 + ]; 64 + }
+67
home/modules/development/neovim.nix
··· 1 + { config, pkgs, ... }: 2 + 3 + { 4 + programs.neovim = { 5 + enable = true; 6 + viAlias = true; 7 + vimAlias = true; 8 + 9 + # NIX-STYLE: Bundled binaries for your LazyVim config 10 + extraPackages = with pkgs; [ 11 + lua-language-server 12 + nil 13 + ripgrep 14 + fd 15 + git 16 + gcc 17 + tree-sitter 18 + lazygit 19 + lazyjj 20 + ]; 21 + 22 + initLua = '' 23 + -- Prepend the symlinked directory to the Runtime Path 24 + vim.opt.rtp:prepend("${config.home.homeDirectory}/.config/nvim") 25 + require("init") 26 + ''; 27 + }; 28 + programs.helix = { 29 + enable = true; 30 + settings = { 31 + theme = "flatwhite"; 32 + editor.line-number = "relative"; 33 + editor.mouse = true; 34 + editor.cursor-shape.insert = "bar"; 35 + editor.cursor-shape.normal = "block"; 36 + editor.cursor-shape.select = "underline"; 37 + editor.file-picker.hidden = false; 38 + keys.normal = { 39 + "C-s" = ":write"; 40 + }; 41 + keys.normal.space.M = { 42 + l = ":theme flatwhite"; 43 + L = ":theme bogster_light"; 44 + g = ":theme github_dark_high_contrast"; 45 + G = ":theme rose_pine_moon"; 46 + d = ":theme iroaseta"; 47 + D = ":theme tokyonight_moon"; 48 + }; 49 + keys.insert = { 50 + "C-s" = [ 51 + ":write" 52 + "normal_mode" 53 + ]; 54 + down = [ 55 + "move_visual_line_down" 56 + "normal_mode" 57 + ]; 58 + up = [ 59 + "move_visual_line_up" 60 + "normal_mode" 61 + ]; 62 + }; 63 + }; 64 + }; 65 + 66 + xdg.configFile."nvim".source = ../../../configs/nvim; 67 + }
+28
home/modules/development/zed.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + programs.zed-editor = { 5 + enable = true; 6 + extensions = [ 7 + "nix" 8 + "toml" 9 + "rust" 10 + "gleam" 11 + "fish" 12 + ]; 13 + extraPackages = with pkgs; [ 14 + nil 15 + nixd 16 + ]; 17 + userSettings = { 18 + theme = { 19 + mode = "system"; 20 + dark = "One Dark"; 21 + light = "One Light"; 22 + }; 23 + hour_format = "hour24"; 24 + # helix_mode = true; 25 + }; 26 + }; 27 + 28 + }
+18
home/modules/fonts.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + # Zorgt dat applicaties de fonts in je home-profile kunnen vinden 5 + fonts.fontconfig.enable = true; 6 + 7 + home.packages = with pkgs; [ 8 + noto-fonts 9 + noto-fonts-color-emoji 10 + font-awesome 11 + 12 + (runCommand "lotion-fonts" { } '' 13 + mkdir -p $out/share/fonts/truetype/lotion 14 + # We kopiëren alle fonts uit je legacy-dotfiles map naar de Nix store 15 + cp -r ${../../fonts}/Lotion*.ttf $out/share/fonts/truetype/lotion/ 16 + '') 17 + ]; 18 + }
+7
home/modules/games.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + home.packages= with pkgs; [ 5 + prismlauncher 6 + ]; 7 + }
+74
home/modules/gnome.nix
··· 1 + { pkgs, lib, hostname, ... }: 2 + 3 + { 4 + dconf.settings = { 5 + 6 + "org/gnome/shell" = { 7 + disable-user-extensions = false; 8 + enabled-extensions = [ 9 + pkgs.gnomeExtensions."appindicator".extensionUuid 10 + pkgs.gnomeExtensions."dash-to-dock".extensionUuid 11 + pkgs.gnomeExtensions."night-theme-switcher".extensionUuid 12 + pkgs.gnomeExtensions."blur-my-shell".extensionUuid 13 + pkgs.gnomeExtensions."search-light".extensionUuid 14 + ]; 15 + }; 16 + "org/gnome/shell" = { 17 + favorite-apps = [ 18 + "vivaldi-stable.desktop" 19 + "org.wezfurlong.wezterm.desktop" 20 + "obsidian.desktop" 21 + "Fluffychat.desktop" 22 + ] ++ (if hostname == "fennekin" then [ 23 + "com.github.xournalpp.xournalpp.desktop" 24 + ] else []); 25 + }; 26 + "org/gnome/shell/extensions/dash-to-dock" = { 27 + always-center-icons = true; 28 + apply-custom-theme = true; 29 + background-opacity = 0.80000000000000004; 30 + dash-max-icon-size = 48; 31 + dock-fixed = false; 32 + dock-position = "BOTTOM"; 33 + extend-height = true; 34 + height-fraction = 0.90000000000000002; 35 + icon-size-fixed = false; 36 + scroll-action = "switch-workspace"; 37 + show-mounts = false; 38 + show-thrash = false; 39 + }; 40 + "org/gnome/desktop/background" = { 41 + picture-uri = "file:///home/mar/.local/share/wallpapers/aesthetic-wallpapers/images/pink-clouds.png"; 42 + picture-uri-dark = "file:///home/mar/.local/share/wallpapers/aesthetic-wallpapers/images/wallhaven-9mjw78.png"; 43 + picture-options = "zoom"; # "zoom", "centered", "scaled", etc. 44 + }; 45 + "org/gnome/desktop/screensaver" = { 46 + picture-uri = "file:///home/mar/.local/share/wallpapers/aesthetic-wallpapers/images/wallhaven-9mjw78.png"; 47 + }; 48 + "org/gnome/desktop/interface" = { 49 + # color-scheme = "prefer-light"; # Handled by daynight plugin 50 + enable-hot-corners = false; 51 + show-battery-percentage = true; 52 + }; 53 + "org/gnome/settings-daemon/plugins/orientation" = { 54 + active = true; 55 + }; 56 + "org/gnome/settings-daemon/plugins/color" = { 57 + night-light-schedule-automatic = true; 58 + }; 59 + "org/gnome/shell/extensions/nightthemeswitcher/time" = { 60 + nightthemeswitcher-ondemand-keybinding = [ 61 + (lib.hm.gvariant.mkString "<Shift><Super>t") 62 + ]; 63 + }; 64 + "org/gnome/system/location".enabled = true; 65 + }; 66 + home.packages = with pkgs; [ 67 + dconf-editor 68 + gnomeExtensions.dash-to-dock 69 + gnomeExtensions.night-theme-switcher 70 + gnomeExtensions.appindicator 71 + gnomeExtensions.blur-my-shell 72 + gnomeExtensions.search-light 73 + ]; 74 + }
+85
home/modules/kde.nix
··· 1 + { pkgs, lib, hostname, ... }: 2 + 3 + # Please find this earlier next time 4 + # https://nix-community.github.io/plasma-manager/options.xhtml 5 + 6 + { 7 + home.activation = { 8 + removePlasmaCache = lib.hm.dag.entryAfter [ "writeBoundary" ] '' 9 + $DRY_RUN_CMD rm -rf $VERBOSE_ARG ~/.cache/plasmashell* 10 + $DRY_RUN_CMD rm -rf $VERBOSE_ARG ~/.cache/plasma* 11 + $DRY_RUN_CMD rm -rf $VERBOSE_ARG ~/.cache/kiopp* 12 + ''; 13 + }; 14 + home.packages = with pkgs; [ 15 + layan-cursors 16 + ]; 17 + programs.plasma = { 18 + enable = true; 19 + overrideConfig = true; 20 + kscreenlocker.appearance.wallpaper = "/home/mar/.local/share/wallpapers/aesthetic-wallpapers/images/pink-clouds.png"; 21 + workspace = { 22 + clickItemTo = "select"; 23 + lookAndFeel = "org.kde.breeze.desktop"; 24 + colorScheme = "BreezeLight"; 25 + cursor.theme = "Layan-cursors"; 26 + iconTheme = "breeze"; 27 + wallpaper = "/home/mar/.local/share/wallpapers/aesthetic-wallpapers/images/pink-clouds.png"; 28 + }; 29 + configFile.kdeglobals.General.AccentColor = "245,194,231"; 30 + configFile.kdeglobals.General.LastUsedCustomAccentColor = "245,194,231"; 31 + 32 + input.touchpads = [ 33 + # Fennekin's touchpad 34 + { 35 + disableWhileTyping = false; 36 + enable = true; 37 + leftHanded = false; 38 + middleButtonEmulation = true; 39 + name = "ELAN0749:00 04F3:31A5 Touchpad"; 40 + naturalScroll = true; 41 + pointerSpeed = 0; 42 + productId = "31a5"; 43 + tapToClick = true; 44 + vendorId = "04f3"; 45 + } 46 + ]; 47 + 48 + panels = [ 49 + { 50 + location = "top"; 51 + height = 48; 52 + floating = true; 53 + widgets = [ 54 + "org.kde.plasma.kickoff" 55 + 56 + { 57 + name = "org.kde.plasma.icontasks"; 58 + config = { 59 + General = { 60 + launchers = [ 61 + "applications:vivaldi-stable.desktop" 62 + "applications:org.wezfurlong.wezterm.desktop" 63 + "applications:obsidian.desktop" 64 + "applications:Fluffychat.desktop" 65 + ] ++ (if hostname == "fennekin" then [ 66 + "applications:com.github.xournalpp.xournalpp.desktop" 67 + ] else []); 68 + showOnlyLauncher = "false"; 69 + showTasksOnlyOnCurrentScreen = "false"; 70 + showTasksOnlyOnCurrentDesktop = "false"; 71 + groupingStrategy = 0; 72 + onlyGroupWhenFull = "false"; 73 + separateLaunchers = "false"; 74 + }; 75 + }; 76 + } 77 + 78 + "org.kde.plasma.marginsseparator" 79 + "org.kde.plasma.systemtray" 80 + "org.kde.plasma.digitalclock" 81 + ]; 82 + } 83 + ]; 84 + }; 85 + }
+16
home/modules/librewolf.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + # programs.librewolf = { 5 + # enable = true; 6 + # settings = { 7 + # "privacy.clearOnShutdown.history" = false; 8 + # "privacy.clearOnShutdown.downloads" = false; 9 + # "privacy.clearOnShutdown.cookies" = false; 10 + # "middlemouse.paste" = false; 11 + # "general.autoscroll" = true; 12 + # "privacy.resistFingerprinting" = false; 13 + # "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts" = true; 14 + # }; 15 + # }; 16 + }
+35
home/modules/niri.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + imports = [ 5 + ./niri/anyrun.nix 6 + ]; 7 + home.packages = with pkgs; [ 8 + niri 9 + kdePackages.krunner 10 + fuzzel 11 + waybar 12 + hyprlock 13 + swww 14 + wvkbd 15 + wlogout 16 + ]; 17 + xdg.configFile."niri/config.kdl" = { 18 + source = ../../configs/niri/config.kdl; 19 + }; 20 + xdg.configFile."fuzzel/fuzzel.ini" = { 21 + source = ../../configs/niri/fuzzel.ini; 22 + }; 23 + xdg.configFile."waybar" = { 24 + source = ../../configs/niri/waybar; 25 + recursive = true; 26 + }; 27 + xdg.configFile."wlogout" = { 28 + source = ../../configs/niri/wlogout; 29 + recursive = true; 30 + }; 31 + xdg.configFile."hypr" = { 32 + source = ../../configs/niri/hypr; 33 + recursive = true; 34 + }; 35 + }
+118
home/modules/niri/anyrun.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + programs.anyrun = { 5 + enable = true; 6 + config = { 7 + x = { 8 + fraction = 0.5; 9 + }; 10 + y = { 11 + fraction = 20.0; 12 + }; 13 + width = { 14 + fraction = 0.5; 15 + }; 16 + hideIcons = false; 17 + ignoreExclusiveZones = false; 18 + layer = "overlay"; 19 + hidePluginInfo = true; 20 + closeOnClick = true; 21 + showResultsImmediately = false; 22 + maxEntries = null; 23 + 24 + plugins = [ 25 + "${pkgs.anyrun}/lib/libapplications.so" 26 + "${pkgs.anyrun}/lib/libsymbols.so" 27 + ]; 28 + }; 29 + 30 + # Inline comments are supported for language injection into 31 + # multi-line strings with Treesitter! (Depends on your editor) 32 + extraCss = /* css */ '' 33 + * { 34 + all: unset; 35 + font-family: Atkinson Hyperlegible Next; 36 + font-size: 1.3rem; 37 + } 38 + 39 + #window, 40 + #match, 41 + #entry, 42 + #plugin, 43 + #main { 44 + background: transparent; 45 + } 46 + 47 + #match.activatable { 48 + border-radius: 16px; 49 + padding: 0.3rem 0.9rem; 50 + margin-top: 0.01rem; 51 + } 52 + 53 + #match.activatable:first-child { 54 + margin-top: 0.7rem; 55 + } 56 + 57 + #match.activatable:last-child { 58 + margin-bottom: 0.6rem; 59 + } 60 + 61 + #plugin:hover #match.activatable { 62 + border-radius: 10px; 63 + padding: 0.3rem; 64 + margin-top: 0.01rem; 65 + margin-bottom: 0; 66 + } 67 + 68 + #match:selected, 69 + #match:hover, 70 + #plugin:hover { 71 + background: #2e3131; 72 + } 73 + 74 + #entry { 75 + background: #f4cccc; 76 + border: 3px solid rgb(255,77,77); 77 + color: #000000; 78 + border-radius: 16px; 79 + margin: 0.5rem; 80 + padding: 0.3rem 1rem; 81 + } 82 + 83 + list > #plugin { 84 + border-radius: 16px; 85 + margin: 0 0.3rem; 86 + } 87 + 88 + list > #plugin:first-child { 89 + margin-top: 0.3rem; 90 + } 91 + 92 + list > #plugin:last-child { 93 + margin-bottom: 0.3rem; 94 + } 95 + 96 + list > #plugin:hover { 97 + padding: 0.6rem; 98 + } 99 + 100 + box#main { 101 + background: #fa8071; 102 + box-shadow: 103 + inset 0 0 0 1px #0b0f10, 104 + 0 0 0 1px #0b0f10; 105 + border-radius: 24px; 106 + padding: 0.3rem; 107 + } 108 + ''; 109 + 110 + extraConfigFiles."some-plugin.ron".text = '' 111 + Config( 112 + // for any other plugin 113 + // this file will be put in ~/.config/anyrun/some-plugin.ron 114 + // refer to docs of xdg.configFile for available options 115 + ) 116 + ''; 117 + }; 118 + }
+54
home/modules/shell.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + imports = [ 5 + ./shell/kc.nix 6 + ]; 7 + programs.fish = { 8 + enable = true; 9 + }; 10 + programs.hyfetch = { 11 + enable = true; 12 + settings = { 13 + preset = "sapphic"; 14 + mode = "rgb"; 15 + light_dark = "light"; 16 + lightness = 1.0; 17 + color_align = { 18 + mode = "horizontal"; 19 + }; 20 + backend = "fastfetch"; 21 + pride_month_disable = false; 22 + }; 23 + 24 + }; 25 + 26 + xdg.configFile."fish" = { 27 + source = ../../configs/fish; 28 + recursive = true; 29 + }; 30 + xdg.configFile."zellij" = { 31 + source = ../../configs/zellij; 32 + recursive = true; 33 + }; 34 + 35 + xdg.configFile."starship.toml" = { 36 + source = ../../configs/starship.toml; 37 + }; 38 + home.packages = with pkgs; [ 39 + eza 40 + bat 41 + zoxide 42 + starship 43 + hyfetch 44 + fastfetch 45 + zellij 46 + fish 47 + fishPlugins.done 48 + fishPlugins.fzf-fish 49 + fishPlugins.forgit 50 + fishPlugins.hydro 51 + fzf 52 + fishPlugins.grc 53 + ]; 54 + }
+37
home/modules/shell/kc.nix
··· 1 + { pkgs, ... }: 2 + 3 + let 4 + kc = pkgs.rustPlatform.buildRustPackage rec { 5 + pname = "kc"; 6 + version = "1.1.0"; 7 + 8 + src = pkgs.fetchFromGitHub { 9 + owner = "aslilac"; 10 + repo = "kc"; 11 + rev = "6e6e0813d9f2ed6c12b69112bc0fea69def7d8a2"; 12 + hash = "sha256-JAPv8gshFlscVsnvglA4QaVSqf/76tMtrqrM/70Eu6g="; 13 + }; 14 + 15 + # We gebruiken hier weer de automatische methode, die is het veiligst voor paden 16 + cargoLock = { 17 + lockFile = "${src}/Cargo.lock"; 18 + }; 19 + 20 + nativeBuildInputs = [ pkgs.pkg-config ]; 21 + buildInputs = [ pkgs.dbus ]; 22 + 23 + # Schakel de tests en de automatische post-build hooks van de maker uit 24 + doCheck = false; 25 + dontCargoInstallPostBuildHook = true; 26 + 27 + # Omdat de automatische installatie faalde door de scripts van de maker, 28 + # doen we alleen de kopieerslag zelf, maar op een 'luie' manier. 29 + installPhase = '' 30 + mkdir -p $out/bin 31 + find . -name kc -type f -executable -exec cp {} $out/bin/kc \; 32 + ''; 33 + }; 34 + in 35 + { 36 + home.packages = [ kc ]; 37 + }
+4
home/modules/spotify.nix
··· 1 + {pkgs, ...}: 2 + { 3 + home.packages = [ pkgs.spotify ]; 4 + }
+19
home/modules/wezterm.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + programs.wezterm = { 5 + enable = true; 6 + extraConfig = '' 7 + local wezterm = require('wezterm') 8 + local config = wezterm.config_builder() 9 + config.color_scheme = 'Atelier Heath Light (base16)' 10 + config.enable_tab_bar = false 11 + config.window_background_opacity = 0.8 12 + config.font = wezterm.font('Lotion Black') 13 + config.font_size = 9 14 + config.window_close_confirmation = 'NeverPrompt' 15 + -- and finally, return the configuration to wezterm 16 + return config 17 + ''; 18 + }; 19 + }
+126
hosts/Ponyta/configuration.nix
··· 1 + # Edit this configuration file to define what should be installed on 2 + # your system. Help is available in the configuration.nix(5) man page 3 + # and in the NixOS manual (accessible by running ‘nixos-help’). 4 + 5 + { config, pkgs, ... }: 6 + 7 + { 8 + imports = 9 + [ # Include the results of the hardware scan. 10 + ./hardware-configuration.nix 11 + ../all-hosts.nix 12 + ]; 13 + 14 + # Bootloader. 15 + boot.loader.systemd-boot.enable = true; 16 + boot.loader.efi.canTouchEfiVariables = true; 17 + 18 + # Use latest kernel. 19 + boot.kernelPackages = pkgs.linuxPackages_latest; 20 + 21 + boot.initrd.luks.devices."luks-fb4ec710-f4c0-4a6a-928a-ee3f2f302bee".device = "/dev/disk/by-uuid/fb4ec710-f4c0-4a6a-928a-ee3f2f302bee"; 22 + networking.hostName = "Ponyta"; # Define your hostname. 23 + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. 24 + 25 + # Configure network proxy if necessary 26 + # networking.proxy.default = "http://user:password@proxy:port/"; 27 + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; 28 + 29 + # Enable networking 30 + networking.networkmanager.enable = true; 31 + 32 + # Set your time zone. 33 + time.timeZone = "Europe/Amsterdam"; 34 + 35 + # Select internationalisation properties. 36 + i18n.defaultLocale = "en_GB.UTF-8"; 37 + 38 + i18n.extraLocaleSettings = { 39 + LC_ADDRESS = "nl_NL.UTF-8"; 40 + LC_IDENTIFICATION = "nl_NL.UTF-8"; 41 + LC_MEASUREMENT = "nl_NL.UTF-8"; 42 + LC_MONETARY = "nl_NL.UTF-8"; 43 + LC_NAME = "nl_NL.UTF-8"; 44 + LC_NUMERIC = "nl_NL.UTF-8"; 45 + LC_PAPER = "nl_NL.UTF-8"; 46 + LC_TELEPHONE = "nl_NL.UTF-8"; 47 + LC_TIME = "nl_NL.UTF-8"; 48 + }; 49 + 50 + # Enable the X11 windowing system. 51 + services.xserver.enable = true; 52 + 53 + 54 + # Configure keymap in X11 55 + services.xserver.xkb = { 56 + layout = "us"; 57 + variant = "euro"; 58 + }; 59 + 60 + # Enable CUPS to print documents. 61 + services.printing.enable = true; 62 + 63 + # Enable sound with pipewire. 64 + services.pulseaudio.enable = false; 65 + security.rtkit.enable = true; 66 + services.pipewire = { 67 + enable = true; 68 + alsa.enable = true; 69 + alsa.support32Bit = true; 70 + pulse.enable = true; 71 + # If you want to use JACK applications, uncomment this 72 + #jack.enable = true; 73 + 74 + # use the example session manager (no others are packaged yet so this is enabled by default, 75 + # no need to redefine it in your config for now) 76 + #media-session.enable = true; 77 + }; 78 + 79 + # Enable touchpad support (enabled default in most desktopManager). 80 + # services.xserver.libinput.enable = true; 81 + 82 + # Define a user account. Don't forget to set a password with ‘passwd’. 83 + 84 + 85 + # Install firefox. 86 + programs.firefox.enable = true; 87 + 88 + # Allow unfree packages 89 + nixpkgs.config.allowUnfree = true; 90 + 91 + # List packages installed in system profile. To search, run: 92 + # $ nix search wget 93 + environment.systemPackages = with pkgs; [ 94 + grc 95 + # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. 96 + # wget 97 + ]; 98 + 99 + # Some programs need SUID wrappers, can be configured further or are 100 + # started in user sessions. 101 + # programs.mtr.enable = true; 102 + # programs.gnupg.agent = { 103 + # enable = true; 104 + # enableSSHSupport = true; 105 + # }; 106 + 107 + # List services that you want to enable: 108 + 109 + # Enable the OpenSSH daemon. 110 + # services.openssh.enable = true; 111 + 112 + # Open ports in the firewall. 113 + # networking.firewall.allowedTCPPorts = [ ... ]; 114 + # networking.firewall.allowedUDPPorts = [ ... ]; 115 + # Or disable the firewall altogether. 116 + # networking.firewall.enable = false; 117 + 118 + # This value determines the NixOS release from which the default 119 + # settings for stateful data, like file locations and database versions 120 + # on your system were taken. It‘s perfectly fine and recommended to leave 121 + # this value at the release version of the first install of this system. 122 + # Before changing this value read the documentation for this option 123 + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 124 + system.stateVersion = "25.11"; # Did you read the comment? 125 + 126 + }
+35
hosts/Ponyta/hardware-configuration.nix
··· 1 + # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 + # and may be overwritten by future invocations. Please make changes 3 + # to /etc/nixos/configuration.nix instead. 4 + { config, lib, pkgs, modulesPath, ... }: 5 + 6 + { 7 + imports = 8 + [ (modulesPath + "/installer/scan/not-detected.nix") 9 + ]; 10 + 11 + boot.initrd.availableKernelModules = [ "vmd" "xhci_pci" "nvme" "usb_storage" "sd_mod" ]; 12 + boot.initrd.kernelModules = [ ]; 13 + boot.kernelModules = [ "kvm-intel" ]; 14 + boot.extraModulePackages = [ ]; 15 + 16 + fileSystems."/" = 17 + { device = "/dev/mapper/luks-f91f2d8f-a96f-4acf-911c-4ecdc4794eac"; 18 + fsType = "ext4"; 19 + }; 20 + 21 + boot.initrd.luks.devices."luks-f91f2d8f-a96f-4acf-911c-4ecdc4794eac".device = "/dev/disk/by-uuid/f91f2d8f-a96f-4acf-911c-4ecdc4794eac"; 22 + 23 + fileSystems."/boot" = 24 + { device = "/dev/disk/by-uuid/974A-E2F1"; 25 + fsType = "vfat"; 26 + options = [ "fmask=0077" "dmask=0077" ]; 27 + }; 28 + 29 + swapDevices = 30 + [ { device = "/dev/mapper/luks-fb4ec710-f4c0-4a6a-928a-ee3f2f302bee"; } 31 + ]; 32 + 33 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 34 + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 35 + }
+69
hosts/all-hosts.nix
··· 1 + { 2 + lib, 3 + pkgs, 4 + ... 5 + }: 6 + # Not complete. Fennekin is currently best reference. 7 + { 8 + nix.settings.experimental-features = [ 9 + "nix-command" 10 + "flakes" 11 + ]; 12 + 13 + virtualisation.podman = { 14 + enable = true; 15 + dockerCompat = true; 16 + defaultNetwork.settings.dns_enabled = true; 17 + }; 18 + 19 + environment.systemPackages = with pkgs; [ 20 + podman-compose 21 + podman-tui 22 + ]; 23 + 24 + programs.nix-ld.enable = true; 25 + programs.nix-ld.libraries = with pkgs; [ 26 + # Add any missing dynamic libraries for unpackaged programs 27 + # here, NOT in environment.systemPackages 28 + gcc 29 + ]; 30 + 31 + services.tailscale.enable = true; 32 + 33 + # Enable fish 34 + programs.fish.enable = true; 35 + 36 + # Enable the X11 windowing system. 37 + services.xserver.enable = true; 38 + 39 + # Enable the GNOME Desktop Environment, Niri and KDE. I like to be able to switch whenever. 40 + services.displayManager.gdm.enable = true; 41 + services.desktopManager.gnome.enable = true; 42 + services.desktopManager.plasma6.enable = true; 43 + programs.ssh.askPassword = lib.mkForce "${pkgs.gnome-themes-extra}/libexec/seahorse/ssh-askpass"; 44 + programs.niri.enable = true; 45 + 46 + 47 + nix.gc = { 48 + automatic = true; 49 + dates = "weekly"; 50 + options = "--delete-older-than 14d"; 51 + }; 52 + nix.settings.auto-optimise-store = true; 53 + 54 + # User account 55 + users.users.mar = { 56 + isNormalUser = true; 57 + description = "MLC Bloeiman"; 58 + shell = pkgs.fish; 59 + extraGroups = [ 60 + "networkmanager" 61 + "wheel" 62 + ]; 63 + packages = with pkgs; [ 64 + thunderbird 65 + obsidian 66 + ]; 67 + }; 68 + 69 + }
+155
hosts/fennekin/configuration.nix
··· 1 + # Edit this configuration file to define what should be installed on 2 + # your system. Help is available in the configuration.nix(5) man page 3 + # and in the NixOS manual (accessible by running ‘nixos-help’). 4 + 5 + { 6 + config, 7 + pkgs, 8 + ... 9 + }: 10 + 11 + { 12 + imports = [ 13 + # Include the results of the hardware scan. 14 + ./hardware-configuration.nix 15 + ../all-hosts.nix 16 + ]; 17 + boot.extraModulePackages = [ 18 + config.boot.kernelPackages.rtl8821au # Archer T2U 19 + ]; 20 + # Rotation sensor 21 + hardware.sensor.iio.enable = true; 22 + # Bootloader. 23 + boot.loader.systemd-boot.enable = true; 24 + boot.loader.efi.canTouchEfiVariables = true; 25 + networking.hostName = "fennekin"; # Define your hostname. 26 + networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. 27 + 28 + # Configure network proxy if necessary 29 + # networking.proxy.default = "http://user:password@proxy:port/"; 30 + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; 31 + 32 + # Enable networking 33 + networking.networkmanager.enable = true; 34 + 35 + # Set your time zone. 36 + time.timeZone = "Europe/Amsterdam"; 37 + 38 + # Select internationalisation properties. 39 + i18n.defaultLocale = "en_GB.UTF-8"; 40 + 41 + i18n.extraLocaleSettings = { 42 + LC_ADDRESS = "nl_NL.UTF-8"; 43 + LC_IDENTIFICATION = "nl_NL.UTF-8"; 44 + LC_MEASUREMENT = "nl_NL.UTF-8"; 45 + LC_MONETARY = "nl_NL.UTF-8"; 46 + LC_NAME = "nl_NL.UTF-8"; 47 + LC_NUMERIC = "nl_NL.UTF-8"; 48 + LC_PAPER = "nl_NL.UTF-8"; 49 + LC_TELEPHONE = "nl_NL.UTF-8"; 50 + LC_TIME = "nl_NL.UTF-8"; 51 + }; 52 + 53 + # Configure keymap in X11 54 + services.xserver.xkb = { 55 + layout = "us"; 56 + variant = "euro"; 57 + }; 58 + 59 + # Enable CUPS to print documents. 60 + services.printing.enable = true; 61 + 62 + # Enable sound with pipewire. 63 + services.pulseaudio.enable = false; 64 + security.rtkit.enable = true; 65 + services.pipewire = { 66 + enable = true; 67 + alsa.enable = true; 68 + alsa.support32Bit = true; 69 + pulse.enable = true; 70 + # If you want to use JACK applications, uncomment this 71 + #jack.enable = true; 72 + 73 + # use the example session manager (no others are packaged yet so this is enabled by default, 74 + # no need to redefine it in your config for now) 75 + #media-session.enable = true; 76 + }; 77 + 78 + # Enable librewolf 79 + # programs.firefox = { 80 + # enable = true; 81 + # package = pkgs.librewolf; 82 + # policies = { 83 + # DisableTelemetry = true; 84 + # DisableFirefoxStudies = true; 85 + # Preferences = { 86 + # "cookiebanners.service.mode.privateBrowsing" = 2; 87 + # "cookiebanners.service.mode" = 2; 88 + # "privacy.clearOnShutdown.history" = false; 89 + # "privacy.clearOnShutdown.downloads" = false; 90 + # "privacy.clearOnShutdown.cookies" = false; 91 + # "middlemouse.paste" = false; 92 + # "general.autoscroll" = true; 93 + # "privacy.resistFingerprinting" = false; 94 + # "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts" = true; 95 + # }; 96 + # ExtensionSettings = { 97 + # "jid1-ZAdIEUB7XOzOJw@jetpack" = { 98 + # install_url = "https://addons.mozilla.org/firefox/downloads/latest/duckduckgo-for-firefox/latest.xpi"; 99 + # installation_mode = "force_installed"; 100 + # }; 101 + # "uBlock0@raymondhill.net" = { 102 + # install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; 103 + # installation_mode = "force_installed"; 104 + # }; 105 + # }; 106 + # }; 107 + # }; 108 + 109 + # environment.etc."firefox/policies/policies.json".target = "librewolf/policies/policies.json"; 110 + 111 + # Enable touchpad support (enabled default in most desktopManager). 112 + # services.xserver.libinput.enable = true; 113 + 114 + 115 + # Allow unfree packages 116 + nixpkgs.config.allowUnfree = true; 117 + 118 + # List packages installed in system profile. To search, run: 119 + # $ nix search wget 120 + environment.systemPackages = with pkgs; [ 121 + grc 122 + xournalpp 123 + krita 124 + # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. 125 + # wget 126 + ]; 127 + 128 + # Some programs need SUID wrappers, can be configured further or are 129 + # started in user sessions. 130 + # programs.mtr.enable = true; 131 + # programs.gnupg.agent = { 132 + # enable = true; 133 + # enableSSHSupport = true; 134 + # }; 135 + 136 + # List services that you want to enable: 137 + 138 + # Enable the OpenSSH daemon. 139 + # services.openssh.enable = true; 140 + 141 + # Open ports in the firewall. 142 + # networking.firewall.allowedTCPPorts = [ ... ]; 143 + # networking.firewall.allowedUDPPorts = [ ... ]; 144 + # Or disable the firewall altogether. 145 + # networking.firewall.enable = false; 146 + 147 + # This value determines the NixOS release from which the default 148 + # settings for stateful data, like file locations and database versions 149 + # on your system were taken. It‘s perfectly fine and recommended to leave 150 + # this value at the release version of the first install of this system. 151 + # Before changing this value read the documentation for this option 152 + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 153 + system.stateVersion = "25.11"; # Did you read the comment? 154 + 155 + }
+49
hosts/fennekin/hardware-configuration.nix
··· 1 + { 2 + config, 3 + lib, 4 + pkgs, 5 + modulesPath, 6 + ... 7 + }: 8 + 9 + { 10 + imports = [ 11 + (modulesPath + "/installer/scan/not-detected.nix") 12 + ]; 13 + 14 + boot.initrd.availableKernelModules = [ 15 + "xhci_pci" 16 + "vmd" 17 + "nvme" 18 + "usb_storage" 19 + "sd_mod" 20 + "rtsx_pci_sdmmc" 21 + ]; 22 + boot.initrd.kernelModules = [ ]; 23 + boot.kernelModules = [ "kvm-intel" ]; 24 + boot.extraModulePackages = [ ]; 25 + boot.kernelParams = [ "button.lid_init_state=open" ]; 26 + 27 + services.logind.settings.Login.HandleLidSwitch = "hibernate"; 28 + 29 + fileSystems."/" = { 30 + device = "/dev/disk/by-uuid/6a15cd53-2ed0-4b4c-ba2d-1330bbdb3215"; 31 + fsType = "ext4"; 32 + }; 33 + 34 + fileSystems."/boot" = { 35 + device = "/dev/disk/by-uuid/7261-EC74"; 36 + fsType = "vfat"; 37 + options = [ 38 + "fmask=0077" 39 + "dmask=0077" 40 + ]; 41 + }; 42 + 43 + swapDevices = [ 44 + { device = "/dev/disk/by-uuid/2a2a1f7a-5a5c-4fea-a85c-4c1bf9b41431"; } 45 + ]; 46 + 47 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 48 + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 49 + }
+133
hosts/samurott-nix/configuration.nix
··· 1 + # Edit this configuration file to define what should be installed on 2 + # your system. Help is available in the configuration.nix(5) man page 3 + # and in the NixOS manual (accessible by running ‘nixos-help’). 4 + 5 + { config, pkgs, ... }: 6 + 7 + { 8 + imports = 9 + [ # Include the results of the hardware scan. 10 + ./hardware-configuration.nix 11 + ../all-hosts.nix 12 + ]; 13 + 14 + # Bootloader. 15 + boot.loader.grub.enable = true; 16 + boot.loader.grub.device = "/dev/sda"; 17 + boot.loader.grub.useOSProber = true; 18 + 19 + # Use latest kernel. 20 + boot.kernelPackages = pkgs.linuxPackages_latest; 21 + 22 + networking.hostName = "samurott-nix"; # Define your hostname. 23 + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. 24 + 25 + # Configure network proxy if necessary 26 + # networking.proxy.default = "http://user:password@proxy:port/"; 27 + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; 28 + 29 + # Enable networking 30 + networking.networkmanager.enable = true; 31 + 32 + # Set your time zone. 33 + time.timeZone = "Europe/Amsterdam"; 34 + 35 + # Select internationalisation properties. 36 + i18n.defaultLocale = "en_GB.UTF-8"; 37 + 38 + i18n.extraLocaleSettings = { 39 + LC_ADDRESS = "nl_NL.UTF-8"; 40 + LC_IDENTIFICATION = "nl_NL.UTF-8"; 41 + LC_MEASUREMENT = "nl_NL.UTF-8"; 42 + LC_MONETARY = "nl_NL.UTF-8"; 43 + LC_NAME = "nl_NL.UTF-8"; 44 + LC_NUMERIC = "nl_NL.UTF-8"; 45 + LC_PAPER = "nl_NL.UTF-8"; 46 + LC_TELEPHONE = "nl_NL.UTF-8"; 47 + LC_TIME = "nl_NL.UTF-8"; 48 + }; 49 + 50 + # Configure keymap in X11 51 + services.xserver.xkb = { 52 + layout = "us"; 53 + variant = "altgr-intl"; 54 + }; 55 + 56 + # Enable CUPS to print documents. 57 + services.printing.enable = true; 58 + 59 + # Enable sound with pipewire. 60 + services.pulseaudio.enable = false; 61 + security.rtkit.enable = true; 62 + services.pipewire = { 63 + enable = true; 64 + alsa.enable = true; 65 + alsa.support32Bit = true; 66 + pulse.enable = true; 67 + # If you want to use JACK applications, uncomment this 68 + #jack.enable = true; 69 + 70 + # use the example session manager (no others are packaged yet so this is enabled by default, 71 + # no need to redefine it in your config for now) 72 + #media-session.enable = true; 73 + }; 74 + environment.systemPackages = with pkgs; [ 75 + grc 76 + # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. 77 + # wget 78 + ]; 79 + 80 + # Enable touchpad support (enabled default in most desktopManager). 81 + # services.xserver.libinput.enable = true; 82 + 83 + # Define a user account. Don't forget to set a password with ‘passwd’. 84 + users.users.mar = { 85 + isNormalUser = true; 86 + shell = pkgs.fish; 87 + description = "MLC Bloeiman"; 88 + extraGroups = [ "networkmanager" "wheel" ]; 89 + packages = with pkgs; [ 90 + # thunderbird 91 + ]; 92 + }; 93 + 94 + # Install firefox. 95 + programs.firefox.enable = true; 96 + 97 + # Allow unfree packages 98 + nixpkgs.config.allowUnfree = true; 99 + 100 + 101 + # enable vmware tools 102 + virtualisation.vmware.guest.enable = true; 103 + 104 + 105 + # Some programs need SUID wrappers, can be configured further or are 106 + # started in user sessions. 107 + # programs.mtr.enable = true; 108 + # programs.gnupg.agent = { 109 + # enable = true; 110 + # enableSSHSupport = true; 111 + # }; 112 + 113 + # List services that you want to enable: 114 + 115 + # Enable the OpenSSH daemon. 116 + # services.openssh.enable = true; 117 + 118 + # Open ports in the firewall. 119 + # networking.firewall.allowedTCPPorts = [ ... ]; 120 + # networking.firewall.allowedUDPPorts = [ ... ]; 121 + # Or disable the firewall altogether. 122 + # networking.firewall.enable = false; 123 + 124 + # This value determines the NixOS release from which the default 125 + # settings for stateful data, like file locations and database versions 126 + # on your system were taken. It‘s perfectly fine and recommended to leave 127 + # this value at the release version of the first install of this system. 128 + # Before changing this value read the documentation for this option 129 + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 130 + system.stateVersion = "25.11"; # Did you read the comment? 131 + 132 + 133 + }
+22
hosts/samurott-nix/hardware-configuration.nix
··· 1 + # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 + # and may be overwritten by future invocations. Please make changes 3 + # to /etc/nixos/configuration.nix instead. 4 + { config, lib, pkgs, modulesPath, ... }: 5 + 6 + { 7 + imports = [ ]; 8 + 9 + boot.initrd.availableKernelModules = [ "ata_piix" "mptspi" "uhci_hcd" "ehci_pci" "ahci" "sd_mod" "sr_mod" ]; 10 + boot.initrd.kernelModules = [ ]; 11 + boot.kernelModules = [ ]; 12 + boot.extraModulePackages = [ ]; 13 + 14 + fileSystems."/" = 15 + { device = "/dev/disk/by-uuid/714d4285-35ae-403e-82f8-2ce7c9921dca"; 16 + fsType = "ext4"; 17 + }; 18 + 19 + swapDevices = [ ]; 20 + 21 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 22 + }