├── README.md ├── flake.lock ├── flake.nix ├── home └── rxen │ ├── ags │ └── default.nix │ ├── btop │ └── default.nix │ ├── default.nix │ ├── discord │ └── default.nix │ ├── firefox │ ├── default.nix │ ├── userChrome.css │ └── userContent.css │ ├── git.nix │ ├── hyprland │ ├── default.nix │ ├── pyprland.nix │ └── wallhaven-5gx2q5.png │ ├── impermanence.nix │ ├── mpv │ └── default.nix │ ├── neovim │ ├── config │ │ ├── init.lua │ │ └── lua │ │ │ ├── keymaps.lua │ │ │ ├── opts.lua │ │ │ ├── plugins │ │ │ ├── cmp.lua │ │ │ ├── dap.lua │ │ │ ├── lsp.lua │ │ │ ├── mini.lua │ │ │ ├── tools.lua │ │ │ ├── treesitter.lua │ │ │ └── ui.lua │ │ │ └── utility.lua │ └── default.nix │ ├── spotify │ └── default.nix │ ├── term │ └── default.nix │ ├── theme │ ├── default.nix │ └── pywal.nix │ ├── vscode │ └── default.nix │ └── zsh │ ├── config │ ├── config.zsh │ ├── functions.zsh │ └── plugins.zsh │ └── default.nix ├── hosts └── hollow │ ├── default.nix │ └── hardware-configuration.nix ├── lib └── disko.nix └── system ├── audio.nix ├── default.nix ├── impermanence.nix ├── stylix.nix └── user.nix /README.md: -------------------------------------------------------------------------------- 1 | # Wayland 2 | 3 | TEMPORARY break. 4 | 5 | Gave a lot of time on DWM, ST, etc (x11 stuff). Im sticking with X11 for now. 6 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "ags": { 4 | "inputs": { 5 | "astal": "astal", 6 | "nixpkgs": "nixpkgs" 7 | }, 8 | "locked": { 9 | "lastModified": 1737224637, 10 | "narHash": "sha256-FAytebF/lOl8ESnf3iaIEFCLw0+4uU/Tthb08B169hA=", 11 | "owner": "aylur", 12 | "repo": "ags", 13 | "rev": "92bdcb227dc390e2edb122b5bb182b38456b6a5e", 14 | "type": "github" 15 | }, 16 | "original": { 17 | "owner": "aylur", 18 | "repo": "ags", 19 | "type": "github" 20 | } 21 | }, 22 | "astal": { 23 | "inputs": { 24 | "nixpkgs": [ 25 | "ags", 26 | "nixpkgs" 27 | ] 28 | }, 29 | "locked": { 30 | "lastModified": 1737052425, 31 | "narHash": "sha256-sRX9eWJEThJ/0ZErG7LhHO9cFa3EIZloKA5NaLFfaF4=", 32 | "owner": "aylur", 33 | "repo": "astal", 34 | "rev": "897c6d810acfd31e6cc55df7692755b177a84fcb", 35 | "type": "github" 36 | }, 37 | "original": { 38 | "owner": "aylur", 39 | "repo": "astal", 40 | "type": "github" 41 | } 42 | }, 43 | "astal_2": { 44 | "inputs": { 45 | "nixpkgs": "nixpkgs_2" 46 | }, 47 | "locked": { 48 | "lastModified": 1737383010, 49 | "narHash": "sha256-wiB0bRpIqE8zRYqN3l9QuEY2LsUTnXrIEASv/SzGMQg=", 50 | "owner": "aylur", 51 | "repo": "astal", 52 | "rev": "4d6d85562be7fe25cf659f1f1898244e1bdb44ca", 53 | "type": "github" 54 | }, 55 | "original": { 56 | "owner": "aylur", 57 | "repo": "astal", 58 | "type": "github" 59 | } 60 | }, 61 | "base16": { 62 | "inputs": { 63 | "fromYaml": "fromYaml" 64 | }, 65 | "locked": { 66 | "lastModified": 1732200724, 67 | "narHash": "sha256-+R1BH5wHhfnycySb7Sy5KbYEaTJZWm1h+LW1OtyhiTs=", 68 | "owner": "SenchoPens", 69 | "repo": "base16.nix", 70 | "rev": "153d52373b0fb2d343592871009a286ec8837aec", 71 | "type": "github" 72 | }, 73 | "original": { 74 | "owner": "SenchoPens", 75 | "repo": "base16.nix", 76 | "type": "github" 77 | } 78 | }, 79 | "base16-fish": { 80 | "flake": false, 81 | "locked": { 82 | "lastModified": 1622559957, 83 | "narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=", 84 | "owner": "tomyun", 85 | "repo": "base16-fish", 86 | "rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe", 87 | "type": "github" 88 | }, 89 | "original": { 90 | "owner": "tomyun", 91 | "repo": "base16-fish", 92 | "type": "github" 93 | } 94 | }, 95 | "base16-helix": { 96 | "flake": false, 97 | "locked": { 98 | "lastModified": 1736852337, 99 | "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=", 100 | "owner": "tinted-theming", 101 | "repo": "base16-helix", 102 | "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5", 103 | "type": "github" 104 | }, 105 | "original": { 106 | "owner": "tinted-theming", 107 | "repo": "base16-helix", 108 | "type": "github" 109 | } 110 | }, 111 | "base16-vim": { 112 | "flake": false, 113 | "locked": { 114 | "lastModified": 1735953590, 115 | "narHash": "sha256-YbQwaApLFJobn/0lbpMKcJ8N5axKlW2QIGkDS5+xoSU=", 116 | "owner": "tinted-theming", 117 | "repo": "base16-vim", 118 | "rev": "c2a1232aa2c0ed27dcbf005779bcfe0e0ab5e85d", 119 | "type": "github" 120 | }, 121 | "original": { 122 | "owner": "tinted-theming", 123 | "repo": "base16-vim", 124 | "type": "github" 125 | } 126 | }, 127 | "disko": { 128 | "inputs": { 129 | "nixpkgs": "nixpkgs_3" 130 | }, 131 | "locked": { 132 | "lastModified": 1737038063, 133 | "narHash": "sha256-rMEuiK69MDhjz1JgbaeQ9mBDXMJ2/P8vmOYRbFndXsk=", 134 | "owner": "nix-community", 135 | "repo": "disko", 136 | "rev": "bf0abfde48f469c256f2b0f481c6281ff04a5db2", 137 | "type": "github" 138 | }, 139 | "original": { 140 | "owner": "nix-community", 141 | "repo": "disko", 142 | "type": "github" 143 | } 144 | }, 145 | "dotfiles": { 146 | "flake": false, 147 | "locked": { 148 | "lastModified": 1737386405, 149 | "narHash": "sha256-QfX1n8qfDvLGMmFcusi+vJONfarz/mwstO71z2VqqZU=", 150 | "owner": "samiulbasirfahim", 151 | "repo": "Dotfiles", 152 | "rev": "77c419310c4ada15ce1716315bedb87ceb61f500", 153 | "type": "github" 154 | }, 155 | "original": { 156 | "owner": "samiulbasirfahim", 157 | "repo": "Dotfiles", 158 | "type": "github" 159 | } 160 | }, 161 | "firefox-gnome-theme": { 162 | "flake": false, 163 | "locked": { 164 | "lastModified": 1736899990, 165 | "narHash": "sha256-S79Hqn2EtSxU4kp99t8tRschSifWD4p/51++0xNWUxw=", 166 | "owner": "rafaelmardojai", 167 | "repo": "firefox-gnome-theme", 168 | "rev": "91ca1f82d717b02ceb03a3f423cbe8082ebbb26d", 169 | "type": "github" 170 | }, 171 | "original": { 172 | "owner": "rafaelmardojai", 173 | "repo": "firefox-gnome-theme", 174 | "type": "github" 175 | } 176 | }, 177 | "flake-compat": { 178 | "flake": false, 179 | "locked": { 180 | "lastModified": 1733328505, 181 | "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", 182 | "owner": "edolstra", 183 | "repo": "flake-compat", 184 | "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", 185 | "type": "github" 186 | }, 187 | "original": { 188 | "owner": "edolstra", 189 | "repo": "flake-compat", 190 | "type": "github" 191 | } 192 | }, 193 | "flake-compat_2": { 194 | "flake": false, 195 | "locked": { 196 | "lastModified": 1733328505, 197 | "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", 198 | "owner": "edolstra", 199 | "repo": "flake-compat", 200 | "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", 201 | "type": "github" 202 | }, 203 | "original": { 204 | "owner": "edolstra", 205 | "repo": "flake-compat", 206 | "type": "github" 207 | } 208 | }, 209 | "flake-parts": { 210 | "inputs": { 211 | "nixpkgs-lib": [ 212 | "nur", 213 | "nixpkgs" 214 | ] 215 | }, 216 | "locked": { 217 | "lastModified": 1733312601, 218 | "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", 219 | "owner": "hercules-ci", 220 | "repo": "flake-parts", 221 | "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", 222 | "type": "github" 223 | }, 224 | "original": { 225 | "owner": "hercules-ci", 226 | "repo": "flake-parts", 227 | "type": "github" 228 | } 229 | }, 230 | "flake-utils": { 231 | "inputs": { 232 | "systems": [ 233 | "stylix", 234 | "systems" 235 | ] 236 | }, 237 | "locked": { 238 | "lastModified": 1731533236, 239 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 240 | "owner": "numtide", 241 | "repo": "flake-utils", 242 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 243 | "type": "github" 244 | }, 245 | "original": { 246 | "owner": "numtide", 247 | "repo": "flake-utils", 248 | "type": "github" 249 | } 250 | }, 251 | "fromYaml": { 252 | "flake": false, 253 | "locked": { 254 | "lastModified": 1731966426, 255 | "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", 256 | "owner": "SenchoPens", 257 | "repo": "fromYaml", 258 | "rev": "106af9e2f715e2d828df706c386a685698f3223b", 259 | "type": "github" 260 | }, 261 | "original": { 262 | "owner": "SenchoPens", 263 | "repo": "fromYaml", 264 | "type": "github" 265 | } 266 | }, 267 | "git-hooks": { 268 | "inputs": { 269 | "flake-compat": [ 270 | "stylix", 271 | "flake-compat" 272 | ], 273 | "gitignore": "gitignore", 274 | "nixpkgs": [ 275 | "stylix", 276 | "nixpkgs" 277 | ] 278 | }, 279 | "locked": { 280 | "lastModified": 1735882644, 281 | "narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=", 282 | "owner": "cachix", 283 | "repo": "git-hooks.nix", 284 | "rev": "a5a961387e75ae44cc20f0a57ae463da5e959656", 285 | "type": "github" 286 | }, 287 | "original": { 288 | "owner": "cachix", 289 | "repo": "git-hooks.nix", 290 | "type": "github" 291 | } 292 | }, 293 | "gitignore": { 294 | "inputs": { 295 | "nixpkgs": [ 296 | "stylix", 297 | "git-hooks", 298 | "nixpkgs" 299 | ] 300 | }, 301 | "locked": { 302 | "lastModified": 1709087332, 303 | "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", 304 | "owner": "hercules-ci", 305 | "repo": "gitignore.nix", 306 | "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 307 | "type": "github" 308 | }, 309 | "original": { 310 | "owner": "hercules-ci", 311 | "repo": "gitignore.nix", 312 | "type": "github" 313 | } 314 | }, 315 | "gnome-shell": { 316 | "flake": false, 317 | "locked": { 318 | "lastModified": 1732369855, 319 | "narHash": "sha256-JhUWbcYPjHO3Xs3x9/Z9RuqXbcp5yhPluGjwsdE2GMg=", 320 | "owner": "GNOME", 321 | "repo": "gnome-shell", 322 | "rev": "dadd58f630eeea41d645ee225a63f719390829dc", 323 | "type": "github" 324 | }, 325 | "original": { 326 | "owner": "GNOME", 327 | "ref": "47.2", 328 | "repo": "gnome-shell", 329 | "type": "github" 330 | } 331 | }, 332 | "hardened-firefox": { 333 | "flake": false, 334 | "locked": { 335 | "lastModified": 1736708527, 336 | "narHash": "sha256-/JQo2XnLF8qfSQKvjuFDtvzzz/QHO/dLBHJO4vLOXNk=", 337 | "owner": "arkenfox", 338 | "repo": "user.js", 339 | "rev": "c25187332e19c633b956a6755a7971a6591d3e8d", 340 | "type": "github" 341 | }, 342 | "original": { 343 | "owner": "arkenfox", 344 | "repo": "user.js", 345 | "type": "github" 346 | } 347 | }, 348 | "home-manager": { 349 | "inputs": { 350 | "nixpkgs": "nixpkgs_4" 351 | }, 352 | "locked": { 353 | "lastModified": 1737461688, 354 | "narHash": "sha256-zQCFe5FcSSGzY3qauAAHZcPt7Ej4WSGo78ShSTCSBvU=", 355 | "owner": "nix-community", 356 | "repo": "home-manager", 357 | "rev": "bb14224f51ae4caed12a7b26f245d042c8cf8553", 358 | "type": "github" 359 | }, 360 | "original": { 361 | "owner": "nix-community", 362 | "repo": "home-manager", 363 | "type": "github" 364 | } 365 | }, 366 | "home-manager_2": { 367 | "inputs": { 368 | "nixpkgs": [ 369 | "stylix", 370 | "nixpkgs" 371 | ] 372 | }, 373 | "locked": { 374 | "lastModified": 1736785676, 375 | "narHash": "sha256-TY0jUwR3EW0fnS0X5wXMAVy6h4Z7Y6a3m+Yq++C9AyE=", 376 | "owner": "nix-community", 377 | "repo": "home-manager", 378 | "rev": "fc52a210b60f2f52c74eac41a8647c1573d2071d", 379 | "type": "github" 380 | }, 381 | "original": { 382 | "owner": "nix-community", 383 | "repo": "home-manager", 384 | "type": "github" 385 | } 386 | }, 387 | "impermanence": { 388 | "locked": { 389 | "lastModified": 1736688610, 390 | "narHash": "sha256-1Zl9xahw399UiZSJ9Vxs1W4WRFjO1SsNdVZQD4nghz0=", 391 | "owner": "nix-community", 392 | "repo": "impermanence", 393 | "rev": "c64bed13b562fc3bb454b48773d4155023ac31b7", 394 | "type": "github" 395 | }, 396 | "original": { 397 | "owner": "nix-community", 398 | "repo": "impermanence", 399 | "type": "github" 400 | } 401 | }, 402 | "nixpkgs": { 403 | "locked": { 404 | "lastModified": 1737062831, 405 | "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", 406 | "owner": "nixos", 407 | "repo": "nixpkgs", 408 | "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", 409 | "type": "github" 410 | }, 411 | "original": { 412 | "owner": "nixos", 413 | "ref": "nixos-unstable", 414 | "repo": "nixpkgs", 415 | "type": "github" 416 | } 417 | }, 418 | "nixpkgs_2": { 419 | "locked": { 420 | "lastModified": 1734424634, 421 | "narHash": "sha256-cHar1vqHOOyC7f1+tVycPoWTfKIaqkoe1Q6TnKzuti4=", 422 | "owner": "nixos", 423 | "repo": "nixpkgs", 424 | "rev": "d3c42f187194c26d9f0309a8ecc469d6c878ce33", 425 | "type": "github" 426 | }, 427 | "original": { 428 | "owner": "nixos", 429 | "ref": "nixos-unstable", 430 | "repo": "nixpkgs", 431 | "type": "github" 432 | } 433 | }, 434 | "nixpkgs_3": { 435 | "locked": { 436 | "lastModified": 1736241350, 437 | "narHash": "sha256-CHd7yhaDigUuJyDeX0SADbTM9FXfiWaeNyY34FL1wQU=", 438 | "owner": "NixOS", 439 | "repo": "nixpkgs", 440 | "rev": "8c9fd3e564728e90829ee7dbac6edc972971cd0f", 441 | "type": "github" 442 | }, 443 | "original": { 444 | "owner": "NixOS", 445 | "ref": "nixpkgs-unstable", 446 | "repo": "nixpkgs", 447 | "type": "github" 448 | } 449 | }, 450 | "nixpkgs_4": { 451 | "locked": { 452 | "lastModified": 1736012469, 453 | "narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=", 454 | "owner": "NixOS", 455 | "repo": "nixpkgs", 456 | "rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d", 457 | "type": "github" 458 | }, 459 | "original": { 460 | "owner": "NixOS", 461 | "ref": "nixos-unstable", 462 | "repo": "nixpkgs", 463 | "type": "github" 464 | } 465 | }, 466 | "nixpkgs_5": { 467 | "locked": { 468 | "lastModified": 1737062831, 469 | "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", 470 | "owner": "nixos", 471 | "repo": "nixpkgs", 472 | "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", 473 | "type": "github" 474 | }, 475 | "original": { 476 | "owner": "nixos", 477 | "ref": "nixos-unstable", 478 | "repo": "nixpkgs", 479 | "type": "github" 480 | } 481 | }, 482 | "nixpkgs_6": { 483 | "locked": { 484 | "lastModified": 1737062831, 485 | "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", 486 | "owner": "nixos", 487 | "repo": "nixpkgs", 488 | "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", 489 | "type": "github" 490 | }, 491 | "original": { 492 | "owner": "nixos", 493 | "ref": "nixos-unstable", 494 | "repo": "nixpkgs", 495 | "type": "github" 496 | } 497 | }, 498 | "nixpkgs_7": { 499 | "locked": { 500 | "lastModified": 1737062831, 501 | "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", 502 | "owner": "NixOS", 503 | "repo": "nixpkgs", 504 | "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", 505 | "type": "github" 506 | }, 507 | "original": { 508 | "owner": "NixOS", 509 | "ref": "nixos-unstable", 510 | "repo": "nixpkgs", 511 | "type": "github" 512 | } 513 | }, 514 | "nixpkgs_8": { 515 | "locked": { 516 | "lastModified": 1736798957, 517 | "narHash": "sha256-qwpCtZhSsSNQtK4xYGzMiyEDhkNzOCz/Vfu4oL2ETsQ=", 518 | "owner": "NixOS", 519 | "repo": "nixpkgs", 520 | "rev": "9abb87b552b7f55ac8916b6fc9e5cb486656a2f3", 521 | "type": "github" 522 | }, 523 | "original": { 524 | "owner": "NixOS", 525 | "ref": "nixos-unstable", 526 | "repo": "nixpkgs", 527 | "type": "github" 528 | } 529 | }, 530 | "nur": { 531 | "inputs": { 532 | "flake-parts": "flake-parts", 533 | "nixpkgs": "nixpkgs_6", 534 | "treefmt-nix": "treefmt-nix" 535 | }, 536 | "locked": { 537 | "lastModified": 1737464637, 538 | "narHash": "sha256-St/dzvMCXfPPZNJME5bi86n4mEuohG9pMKp+a9l5ZqI=", 539 | "owner": "nix-community", 540 | "repo": "NUR", 541 | "rev": "a44b412c5d24f7bb55d81370501a8f9e6e824ec6", 542 | "type": "github" 543 | }, 544 | "original": { 545 | "owner": "nix-community", 546 | "repo": "NUR", 547 | "type": "github" 548 | } 549 | }, 550 | "root": { 551 | "inputs": { 552 | "ags": "ags", 553 | "astal": "astal_2", 554 | "disko": "disko", 555 | "dotfiles": "dotfiles", 556 | "hardened-firefox": "hardened-firefox", 557 | "home-manager": "home-manager", 558 | "impermanence": "impermanence", 559 | "nixpkgs": "nixpkgs_5", 560 | "nur": "nur", 561 | "spicetify-nix": "spicetify-nix", 562 | "stylix": "stylix" 563 | } 564 | }, 565 | "spicetify-nix": { 566 | "inputs": { 567 | "flake-compat": "flake-compat", 568 | "nixpkgs": "nixpkgs_7" 569 | }, 570 | "locked": { 571 | "lastModified": 1737433017, 572 | "narHash": "sha256-eCAps1mnTkbyjoKVWfkklDG7xpYTzKfBuQk4Rovbn1M=", 573 | "owner": "Gerg-L", 574 | "repo": "spicetify-nix", 575 | "rev": "1738341d2b1408ff63641af72043977f7d817293", 576 | "type": "github" 577 | }, 578 | "original": { 579 | "owner": "Gerg-L", 580 | "repo": "spicetify-nix", 581 | "type": "github" 582 | } 583 | }, 584 | "stylix": { 585 | "inputs": { 586 | "base16": "base16", 587 | "base16-fish": "base16-fish", 588 | "base16-helix": "base16-helix", 589 | "base16-vim": "base16-vim", 590 | "firefox-gnome-theme": "firefox-gnome-theme", 591 | "flake-compat": "flake-compat_2", 592 | "flake-utils": "flake-utils", 593 | "git-hooks": "git-hooks", 594 | "gnome-shell": "gnome-shell", 595 | "home-manager": "home-manager_2", 596 | "nixpkgs": "nixpkgs_8", 597 | "systems": "systems", 598 | "tinted-foot": "tinted-foot", 599 | "tinted-kitty": "tinted-kitty", 600 | "tinted-tmux": "tinted-tmux", 601 | "tinted-zed": "tinted-zed" 602 | }, 603 | "locked": { 604 | "lastModified": 1737416820, 605 | "narHash": "sha256-PvOXfVj62pYnl2aq8l/hQkgmo22K1qa6n1JILTm4+ng=", 606 | "owner": "danth", 607 | "repo": "stylix", 608 | "rev": "268daf22a1f93a00b7efc74c367d6711ca7f18e1", 609 | "type": "github" 610 | }, 611 | "original": { 612 | "owner": "danth", 613 | "repo": "stylix", 614 | "type": "github" 615 | } 616 | }, 617 | "systems": { 618 | "locked": { 619 | "lastModified": 1681028828, 620 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 621 | "owner": "nix-systems", 622 | "repo": "default", 623 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 624 | "type": "github" 625 | }, 626 | "original": { 627 | "owner": "nix-systems", 628 | "repo": "default", 629 | "type": "github" 630 | } 631 | }, 632 | "tinted-foot": { 633 | "flake": false, 634 | "locked": { 635 | "lastModified": 1726913040, 636 | "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", 637 | "owner": "tinted-theming", 638 | "repo": "tinted-foot", 639 | "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", 640 | "type": "github" 641 | }, 642 | "original": { 643 | "owner": "tinted-theming", 644 | "repo": "tinted-foot", 645 | "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", 646 | "type": "github" 647 | } 648 | }, 649 | "tinted-kitty": { 650 | "flake": false, 651 | "locked": { 652 | "lastModified": 1716423189, 653 | "narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=", 654 | "owner": "tinted-theming", 655 | "repo": "tinted-kitty", 656 | "rev": "eb39e141db14baef052893285df9f266df041ff8", 657 | "type": "github" 658 | }, 659 | "original": { 660 | "owner": "tinted-theming", 661 | "repo": "tinted-kitty", 662 | "rev": "eb39e141db14baef052893285df9f266df041ff8", 663 | "type": "github" 664 | } 665 | }, 666 | "tinted-tmux": { 667 | "flake": false, 668 | "locked": { 669 | "lastModified": 1735737224, 670 | "narHash": "sha256-FO2hRBkZsjlIRqzNHCPc/52yxg11kHGA8MEtSun9RwE=", 671 | "owner": "tinted-theming", 672 | "repo": "tinted-tmux", 673 | "rev": "aead506a9930c717ebf81cc83a2126e9ca08fa64", 674 | "type": "github" 675 | }, 676 | "original": { 677 | "owner": "tinted-theming", 678 | "repo": "tinted-tmux", 679 | "type": "github" 680 | } 681 | }, 682 | "tinted-zed": { 683 | "flake": false, 684 | "locked": { 685 | "lastModified": 1725758778, 686 | "narHash": "sha256-8P1b6mJWyYcu36WRlSVbuj575QWIFZALZMTg5ID/sM4=", 687 | "owner": "tinted-theming", 688 | "repo": "base16-zed", 689 | "rev": "122c9e5c0e6f27211361a04fae92df97940eccf9", 690 | "type": "github" 691 | }, 692 | "original": { 693 | "owner": "tinted-theming", 694 | "repo": "base16-zed", 695 | "type": "github" 696 | } 697 | }, 698 | "treefmt-nix": { 699 | "inputs": { 700 | "nixpkgs": [ 701 | "nur", 702 | "nixpkgs" 703 | ] 704 | }, 705 | "locked": { 706 | "lastModified": 1733222881, 707 | "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", 708 | "owner": "numtide", 709 | "repo": "treefmt-nix", 710 | "rev": "49717b5af6f80172275d47a418c9719a31a78b53", 711 | "type": "github" 712 | }, 713 | "original": { 714 | "owner": "numtide", 715 | "repo": "treefmt-nix", 716 | "type": "github" 717 | } 718 | } 719 | }, 720 | "root": "root", 721 | "version": 7 722 | } 723 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Nixos config flake"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; 6 | impermanence.url = "github:nix-community/impermanence"; 7 | disko.url = "github:nix-community/disko"; 8 | home-manager.url = "github:nix-community/home-manager"; 9 | stylix.url = "github:danth/stylix"; 10 | ags.url = "github:aylur/ags"; 11 | spicetify-nix.url = "github:Gerg-L/spicetify-nix"; 12 | astal.url = "github:aylur/astal"; 13 | nur.url = "github:nix-community/NUR"; 14 | dotfiles = { 15 | url = "github:samiulbasirfahim/Dotfiles"; 16 | flake = false; 17 | }; 18 | hardened-firefox = { 19 | url = "github:arkenfox/user.js"; 20 | flake = false; 21 | }; 22 | }; 23 | 24 | outputs = { nixpkgs, self, ... }@inputs: 25 | let 26 | system = "x86_64-linux"; 27 | inherit nixpkgs; 28 | in 29 | { 30 | packages = nixpkgs.legacyPackages.${system}; 31 | nixosConfigurations.hollow = nixpkgs.lib.nixosSystem { 32 | specialArgs = { inherit inputs self; }; 33 | modules = [ 34 | ./hosts/hollow 35 | ]; 36 | }; 37 | }; 38 | } 39 | -------------------------------------------------------------------------------- /home/rxen/ags/default.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs, ... }: 2 | { 3 | imports = [ inputs.ags.homeManagerModules.default ]; 4 | 5 | 6 | # home.persistence."/nix/persist/home/rxen".directories = [ 7 | # ".config/ags" 8 | # ]; 9 | programs.ags = { 10 | enable = true; 11 | 12 | # configDir = ./config; 13 | 14 | extraPackages = with pkgs; [ 15 | gtk3 16 | gtk4 17 | dart-sass 18 | ] ++ (with inputs.ags.packages.${pkgs.system}; [ 19 | hyprland 20 | astal3 21 | mpris 22 | network 23 | notifd 24 | # powerprofiles 25 | apps 26 | tray 27 | wireplumber 28 | inputs.astal.packages.${pkgs.system}.default 29 | ]); 30 | }; 31 | } 32 | -------------------------------------------------------------------------------- /home/rxen/btop/default.nix: -------------------------------------------------------------------------------- 1 | { 2 | programs.btop = { 3 | enable = true; 4 | settings = { 5 | color_theme = "TTY"; 6 | theme_background = false; 7 | truecolor = true; 8 | vim_keys = true; 9 | force_tty = false; 10 | rounded_corners = false; 11 | show_battery = false; 12 | check_temp = true; 13 | show_uptime = true; 14 | cpu_bottom = true; 15 | }; 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /home/rxen/default.nix: -------------------------------------------------------------------------------- 1 | { user, ... }: { 2 | imports = [ 3 | ./hyprland 4 | ./term 5 | ./neovim 6 | ./btop 7 | ./ags 8 | ./zsh 9 | ./firefox 10 | ./theme 11 | ./spotify 12 | ./vscode 13 | ./mpv 14 | ./discord 15 | ./impermanence.nix 16 | ./git.nix 17 | ]; 18 | 19 | home = { 20 | username = "${user}"; 21 | homeDirectory = "/home/${user}"; 22 | stateVersion = "24.11"; 23 | sessionPath = [ "$HOME/.cargo/bin" ]; 24 | }; 25 | programs.home-manager.enable = true; 26 | } 27 | -------------------------------------------------------------------------------- /home/rxen/discord/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: 2 | 3 | let 4 | pywal_discord = pkgs.writeShellScriptBin "pywal-discord" '' 5 | #!/usr/bin/env bash 6 | echo " 7 | @import url('https://refact0r.github.io/system24/src/main.css'); /* main theme css. DO NOT REMOVE */ 8 | @import url('https://refact0r.github.io/system24/src/unrounding.css'); /* gets rid of all rounded corners. remove if you want rounded corners. */ 9 | 10 | 11 | :root { 12 | --font: 'Rxen Sans'; /* UI font name. it must be installed on your system. */ 13 | letter-spacing: -0.05ch; /* decreases letter spacing for better readability. */ 14 | font-weight: 400; /* UI font weight. */ 15 | --label-font-weight: 500; /* font weight for panel labels. */ 16 | --pad: 16px; /* padding between panels. */ 17 | --txt-pad: 10px; /* padding inside panels to prevent labels from clipping */ 18 | --panel-roundness: 0px; /* corner roundness of panels. ONLY WORKS IF unrounding.css IS REMOVED (see above). */ 19 | 20 | 21 | /* state modifiers */ 22 | --hover: color-mix(in oklch, var(--txt-3), transparent 80%); /* color of hovered elements. */ 23 | --active: color-mix(in oklch, var(--txt-3), transparent 60%); /* color of elements when clicked. */ 24 | --selected: var(--active); /* color of selected elements. */ 25 | 26 | --mention-txt: var(--acc-0); /* color of mention text. */ 27 | --mention-bg: color-mix(in oklch, var(--acc-0), transparent 90%); /* background highlight of mention text. */ 28 | --mention-overlay: color-mix(in oklch, var(--acc-0), transparent 90%); /* overlay color of messages that mention you. */ 29 | --mention-hover-overlay: color-mix(in oklch, var(--acc-0), transparent 95%); /* overlay color of messages that mention you when hovered. */ 30 | --reply-overlay: var(--active); /* overlay color of message you are replying to. */ 31 | --reply-hover-overlay: var(--hover); /* overlay color of message you are replying to when hovered. */ 32 | 33 | 34 | 35 | /* accent colors */ 36 | --acc-0: var(--aqua); /* main accent color. */ 37 | --acc-1: var(--green); /* color of accent buttons when hovered. */ 38 | --acc-2: var(--blue); /* color of accent buttons when clicked. */ 39 | 40 | /* borders */ 41 | --border-width: 2px; /* panel border thickness. */ 42 | --border-color: var(--bg-2); /* panel border color. */ 43 | --border-hover-color: var(--acc-0); /* panel border color when hovered. */ 44 | --border-transition: 0.2s ease; /* panel border transition. */ 45 | 46 | /* status dot colors */ 47 | --online-dot: green; /* color of online dot. */ 48 | --dnd-dot: red; /* color of do not disturb dot. */ 49 | --idle-dot: yellow; /* color of idle dot. */ 50 | --streaming-dot: purple; /* color of streaming dot. */ 51 | }" > /tmp/pywal-discord 52 | 53 | mkdir -p "$HOME/.config/Vencord/themes" 54 | cat "/tmp/pywal-discord" "$HOME/.cache/wal/discord.css" > "$HOME/.config/Vencord/themes/tui.css" 55 | ''; 56 | in 57 | { 58 | 59 | 60 | # home.persistence."/nix/persist/home/rxen".directories = [ 61 | # ".config/discord" 62 | # ".config/Vencord" 63 | # ]; 64 | 65 | 66 | home.packages = with pkgs; 67 | [ 68 | pywal_discord 69 | (discord.override { 70 | # withOpenASAR = true; # can do this here too 71 | withVencord = true; 72 | }) 73 | ]; 74 | 75 | } 76 | -------------------------------------------------------------------------------- /home/rxen/firefox/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, inputs, ... }: { 2 | 3 | # home.persistence."/nix/persist/home/rxen".directories = [ 4 | # ".mozilla" 5 | # ]; 6 | 7 | 8 | programs.firefox = { 9 | enable = true; 10 | policies = { 11 | DisableAppUpdate = true; 12 | DNSOverHTTPS = { Enabled = false; Locked = true; }; 13 | Bookmarks = [ ]; 14 | DisableMasterPasswordCreation = true; 15 | DisableFeedbackCommands = true; 16 | DisableFirefoxAccounts = true; 17 | DisableFirefoxStudies = true; 18 | DisableForgetButton = true; 19 | DisableFormHistory = true; 20 | DisablePocket = true; 21 | DisableProfileImport = true; 22 | DisableProfileRefresh = true; 23 | DisableTelemetry = true; 24 | DontCheckDefaultBrowser = true; 25 | EnableTrackingProtection = { Value = true; Locked = true; }; 26 | NoDefaultBookmarks = true; 27 | OfferToSaveLogins = false; 28 | Homepage = { URL = "about:blank"; StartPage = "previous-session"; Locked = true; }; 29 | PopupBlocking = { Default = true; Locked = true; }; 30 | FlashPlugin = { Default = false; Locked = true; }; 31 | OverrideFirstRunPage = ""; 32 | OverridePostUpdatePage = ""; 33 | Proxy = { Mode = "none"; Locked = true; }; 34 | RequestedLocales = [ "en-US.UTF-8" ]; 35 | }; 36 | profiles.rxen = { 37 | name = "rxen"; 38 | isDefault = true; 39 | 40 | extraConfig = builtins.readFile "${inputs.hardened-firefox}/user.js"; 41 | search = { 42 | engines = { 43 | "Bing".metaData.hidden = true; 44 | "Amazon".metaData.hidden = true; 45 | "Amazon.com".metaData.hidden = true; 46 | "eBay".metaData.hidden = true; 47 | "Google".metaData.hidden = true; 48 | "Wikipedia (en)".metaData.hidden = true; 49 | "DuckDuckGo".metaData.alias = "@d"; 50 | }; 51 | force = true; 52 | default = "DuckDuckGo"; 53 | order = [ "DuckDuckGo" ]; 54 | }; 55 | userChrome = builtins.readFile (./userChrome.css); 56 | userContent = builtins.readFile (./userContent.css); 57 | settings = { 58 | "browser.in-content.dark-mode" = true; 59 | "privacy.clearOnShutdown_v2.historyFormDataAndDownloads" = false; 60 | "privacy.resistFingerprinting.letterboxing" = false; 61 | "webgl.disabled" = false; 62 | "toolkit.legacyUserProfileCustomizations.stylesheets" = true; 63 | "browser.tabs.inTitlebar" = "0"; 64 | "media.ffmpeg.vaapi.enabled" = true; 65 | "extensions.autoDisableScopes" = 0; 66 | permissions = { 67 | "default.desktop-notification" = false; 68 | }; 69 | }; 70 | extensions = with pkgs.nur.repos.rycee.firefox-addons; [ 71 | ublock-origin 72 | pywalfox 73 | vimium-c 74 | 75 | 76 | (buildFirefoxXpiAddon rec { 77 | pname = "competitive-companion"; 78 | version = "2.58.0"; 79 | addonId = "{74e326aa-c645-4495-9287-b6febc5565a7}"; 80 | url = "https://addons.mozilla.org/firefox/downloads/file/4412528/competitive_companion-${version}.xpi"; 81 | sha256 = "sha256-jmhyzKBjumf0NRBnYlbuZRMII4NePFtauQRZ6Mn3Vu0="; 82 | meta = { }; 83 | }) 84 | 85 | (buildFirefoxXpiAddon rec { 86 | pname = "authenticator"; 87 | version = "8.0.2"; 88 | addonId = "authenticator@mymindstorm"; 89 | url = "https://addons.mozilla.org/firefox/downloads/file/4353166/auth_helper-${version}.xpi"; 90 | sha256 = "sha256-26uRlHI330yFl/6hsA3OBc9/rqJ3Ij8sUQkPkUiBKmI="; 91 | meta = { }; 92 | }) 93 | ]; 94 | }; 95 | }; 96 | home = { 97 | sessionVariables = { 98 | MOZ_DISABLE_CONTENT_SANDBOX = 1; 99 | }; 100 | }; 101 | } 102 | -------------------------------------------------------------------------------- /home/rxen/firefox/userChrome.css: -------------------------------------------------------------------------------- 1 | /******************** BEGIN PYWALFOX CUSTOM CSS ********************/ 2 | #main-window { 3 | --pywalfox-background: var(--lwt-accent-color); 4 | --pywalfox-background-light: var(--arrowpanel-background); 5 | --pywalfox-text: var(--arrowpanel-color); 6 | --pywalfox-text-focus: var(--toolbar-color); 7 | --pywalfox-unselected-tab-opacity: 0.8; 8 | --pywalfox-darker-background: rgba(0, 0, 0, 0.4); 9 | } 10 | 11 | /* Disable default appearance of certain elements to be able to override shadow DOM attributes */ 12 | menupopup, 13 | menuseparator, 14 | button, 15 | search-textbox { 16 | -moz-appearance: none !important; 17 | } 18 | 19 | /* Override the default appearance of buttons and textboxes to match the pywalfox theme */ 20 | button, 21 | search-textbox, 22 | menuseparator { 23 | background-color: var(--pywalfox-darker-background) !important; 24 | } 25 | 26 | /* Background color on hover in right-click context menus */ 27 | menu[_moz-menuactive="true"], 28 | menuitem[_moz-menuactive="true"] { 29 | -moz-appearance: none !important; 30 | background-color: var(--pywalfox-background) !important; 31 | color: var(--pywalfox-text-focus) !important; 32 | } 33 | /* Separators in dropwdown menus */ 34 | menuseparator { 35 | height: 1px; 36 | } 37 | 38 | /* Fix background color of elements that can not be targeted via the Theme API */ 39 | notification, 40 | menupopup { 41 | background: var(--pywalfox-background-light) !important; 42 | color: var(--pywalfox-text) !important; 43 | } 44 | 45 | /* Decrease opacity of unselected tabs to match the default Firefox theme */ 46 | .tabbrowser-tab:not([visuallyselected="true"]) { 47 | opacity: var(--pywalfox-unselected-tab-opacity) !important; 48 | } 49 | 50 | /* Hide unnecessary borders */ 51 | .sidebar-splitter, 52 | notification { 53 | border: 0px !important; 54 | } 55 | 56 | /* Change the background color of the resize splitter on the right side of the sidebar */ 57 | .sidebar-splitter { 58 | background-color: transparent !important; 59 | } 60 | 61 | /* Change the grey background color seen e.g. when opening a bookmark in a newtab */ 62 | #tabbrowser-tabpanels { 63 | background-color: var(--pywalfox-background) !important; 64 | } 65 | 66 | /* Theme the status panel at the bottom */ 67 | #statuspanel-label { 68 | background: var(--pywalfox-background-light) !important; 69 | border-color: var(--pywalfox-background) !important; 70 | color: var(--pywalfox-text) !important; 71 | } 72 | /********************* END PYWALFOX CUSTOM CSS *********************/ 73 | 74 | * { 75 | border-radius: 0px !important; 76 | } 77 | 78 | :root { 79 | /* global border radius */ 80 | --uc-border-radius: 0px !important; 81 | --uc-temp-border-radius: 0px !important; 82 | 83 | /* adds left and right margin to the container-tabs indicator */ 84 | --container-tabs-indicator-margin: 0px; 85 | 86 | /* dynamic url bar width settings */ 87 | --uc-urlbar-width: clamp(150px, 40vw, 500px); 88 | 89 | /* dynamic tab width settings */ 90 | --uc-active-tab-width: clamp(60px, 18vw, 220px); 91 | --uc-inactive-tab-width: clamp(50px, 15vw, 200px); 92 | 93 | /* if active always shows the tab close button */ 94 | --show-tab-close-button: none; /* DEFAULT: -moz-inline-box; */ 95 | 96 | /* if active only shows the tab close button on hover*/ 97 | --show-tab-close-button-hover: none; /* DEFAULT: -moz-inline-box; */ 98 | } 99 | 100 | /*---+---+---+---+---+---+---+ 101 | | B | U | T | T | O | N | S | 102 | +---+---+---+---+---+---+---*/ 103 | 104 | #back-button, 105 | #forward-button, 106 | #urlbar-zoom-button, 107 | #PanelUI-button, 108 | #reader-mode-button, 109 | #tracking-protection-icon-container, 110 | .tab-secondary-label, 111 | #pageActionButton, 112 | #page-action-buttons, 113 | #urlbar-go-button, 114 | #star-button { 115 | display: none !important; 116 | } 117 | 118 | #identity-box.extensionPage 119 | #identity-icon[tooltiptext="Loaded by extension: Tabliss"], 120 | #urlbar[pageproxystate="invalid"] #identity-box #identity-icon, 121 | #tracking-protection-icon-container[hidden] 122 | ~ #identity-box[pageproxystate="valid"].notSecure:not( 123 | .chromeUI, 124 | .localResource 125 | ) 126 | #identity-icon { 127 | display: none !important; 128 | } 129 | 130 | #identity-box.extensionPage 131 | #identity-icon[tooltiptext="Loaded by extension: Tabliss"], 132 | #urlbar[pageproxystate="invalid"] #identity-box #identity-icon, 133 | #tracking-protection-icon-container[hidden] 134 | ~ #identity-box[pageproxystate="valid"].notSecure:not( 135 | .chromeUI, 136 | .localResource 137 | ) 138 | #identity-icon { 139 | fill-opacity: var(--urlbar-icon-fill-opacity) !important; 140 | list-style-image: url(chrome://userchrome/content/engines/google.svg) !important; 141 | } 142 | 143 | /* Hide Extension Name Unless Site Identity Area is Hovered */ 144 | #identity-box.extensionPage:not(:hover) #identity-icon-labels { 145 | display: none !important; 146 | } 147 | #identity-box.extensionPage:hover #identity-icon-labels { 148 | display: none !important; 149 | } 150 | #identity-box.extensionPage #identity-icon-label { 151 | display: none !important; 152 | } 153 | 154 | window, 155 | #main-window, 156 | #toolbar-menubar, 157 | #TabsToolbar, 158 | #PersonalToolbar, 159 | #navigator-toolbox, 160 | #sidebar-box, 161 | #nav-bar { 162 | -moz-appearance: none !important; 163 | border: none !important; 164 | box-shadow: none !important; 165 | } 166 | 167 | /* grey out ccons inside the toolbar to make it 168 | * more aligned with the Black & White colour look */ 169 | #PersonalToolbar toolbarbutton:not(:hover), 170 | #bookmarks-toolbar-button:not(:hover) { 171 | filter: grayscale(1) !important; 172 | } 173 | 174 | /* Show Window Control Button */ 175 | .titlebar-buttonbox-container { 176 | display: none !important; 177 | } 178 | 179 | /* remove "padding" left and right from tabs */ 180 | .titlebar-spacer { 181 | display: none !important; 182 | } 183 | 184 | /* remove gap after pinned tabs */ 185 | #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]) 186 | > #tabbrowser-arrowscrollbox 187 | > .tabbrowser-tab[first-visible-unpinned-tab] { 188 | margin-inline-start: 0 !important; 189 | } 190 | 191 | /* remove tab shadow */ 192 | .tabbrowser-tab > .tab-stack > .tab-background { 193 | box-shadow: none !important; 194 | } 195 | 196 | /* .tabbrowser-tab { */ 197 | /* height: 37px !important; */ 198 | /* } */ 199 | 200 | /* active tab background */ 201 | .tabbrowser-tab[selected] > .tab-stack > .tab-background { 202 | border: 2px solid var(--color2) !important; 203 | } 204 | 205 | /* tab close button options */ 206 | .tabbrowser-tab:not([pinned]) .tab-close-button { 207 | display: none !important; 208 | } 209 | 210 | .tabbrowser-tab:not([pinned]):hover .tab-close-button { 211 | display: -moz-inline-box !important; 212 | } 213 | 214 | /* adaptive tab width */ 215 | .tabbrowser-tab[selected][fadein]:not([pinned]) { 216 | max-width: var(--uc-active-tab-width) !important; 217 | } 218 | 219 | .tabbrowser-tab[fadein]:not([selected]):not([pinned]) { 220 | max-width: var(--uc-inactive-tab-width) !important; 221 | } 222 | 223 | /* container tabs indicator */ 224 | .tabbrowser-tab[usercontextid] 225 | > .tab-stack 226 | > .tab-background 227 | > .tab-context-line { 228 | margin: -1px var(--container-tabs-indicator-margin) 0 229 | var(--container-tabs-indicator-margin) !important; 230 | border-radius: 0px !important; 231 | } 232 | 233 | /* show favicon when media is playing but tab is hovered */ 234 | .tab-icon-image:not([pinned]) { 235 | opacity: 1 !important; 236 | } 237 | 238 | /* Makes the speaker icon to always appear if the tab is playing (not only on hover) */ 239 | .tab-icon-overlay:not([crashed]), 240 | .tab-icon-overlay[pinned][crashed][selected] { 241 | top: 5px !important; 242 | z-index: 1 !important; 243 | padding: 1.5px !important; 244 | inset-inline-end: -8px !important; 245 | width: 16px !important; 246 | height: 16px !important; 247 | border-radius: 0px !important; 248 | } 249 | 250 | .tab-icon-overlay:not([pinned], [sharing], [crashed]):is( 251 | [soundplaying], 252 | [muted], 253 | [activemedia-blocked] 254 | ) { 255 | margin-inline-end: 9.5px !important; 256 | } 257 | 258 | .tabbrowser-tab:not([image]) 259 | .tab-icon-overlay:not([pinned], [sharing], [crashed]) { 260 | top: 0 !important; 261 | padding: 0 !important; 262 | margin-inline-end: 5.5px !important; 263 | inset-inline-end: 0 !important; 264 | } 265 | 266 | #nav-bar { 267 | border: none !important; 268 | box-shadow: none !important; 269 | } 270 | 271 | /* remove border below whole nav */ 272 | #navigator-toolbox { 273 | border-bottom: none !important; 274 | } 275 | 276 | /* transition to oneline */ 277 | @media (min-width: 1000px) { 278 | /* move tabs bar over */ 279 | #TabsToolbar { 280 | margin-left: var(--uc-urlbar-width) !important; 281 | } 282 | /* move entire nav bar */ 283 | #nav-bar { 284 | margin: calc((var(--urlbar-min-height) * -1) - 10px) 285 | calc(100vw - var(--uc-urlbar-width)) 0 0 !important; 286 | } 287 | } 288 | -------------------------------------------------------------------------------- /home/rxen/firefox/userContent.css: -------------------------------------------------------------------------------- 1 | /******************** BEGIN PYWALFOX CUSTOM CSS ********************/ 2 | /* Hide page scrollbars */ 3 | html { 4 | /* scrollbar-width: none !important; */ 5 | } 6 | 7 | @-moz-document url(about:blank), url(about:newtab), url(about:home) { 8 | body { 9 | --pywalfox-font-size: 1rem; 10 | --pywalfox-font-size-sm: 0.8rem; 11 | --pywalfox-accent: var(--lwt-sidebar-highlight-background-color); 12 | --pywalfox-background: var(--newtab-background-color); 13 | --pywalfox-background-light: var(--lwt-sidebar-background-color); 14 | 15 | --newtab-snippets-background-color: var(--pywalfox-background-light) !important; 16 | --newtab-contextmenu-button-color: var(--pywalfox-background) !important; 17 | --newtab-contextmenu-background-color: var(--pywalfox-background-light) !important; 18 | 19 | /* Firefox 89 */ 20 | --newtab-topsites-background-color: var(--pywalfox-background-light) !important; 21 | --newtab-textbox-background-color: var(--pywalfox-background-light) !important; 22 | --customize-menu-background: var(--pywalfox-background-light) !important; 23 | --customize-menu-secondary-action-background: var(--pywalfox-background) !important; 24 | --customize-menu-secondary-action-background-hover: var(--pywalfox-background) !important; 25 | --newtab-primary-action-background: var(--pywalfox-accent) !important; 26 | --newtab-primary-action-background-off: var(--pywalfox-background) !important; 27 | --customize-menu-line-color: var(--pywalfox-accent) !important; 28 | --newtab-background-button-color: var(--pywalfox-background-light) !important; 29 | --newtab-background-button-hover-color: var(--pywalfox-background-light) !important; 30 | } 31 | 32 | /* Add bold text to most text */ 33 | .top-site-outer .title span, .top-site-outer .default-icon[data-fallback]::before, 34 | .top-site-outer .search-topsite[data-fallback]::before, .context-menu > ul > li > a, 35 | .top-site-outer .default-icon, .top-site-outer .search-topsite { 36 | font-weight: bold !important; 37 | font-size: var(--pywalfox-font-size-sm); 38 | } 39 | 40 | /* Bold text to activity card page labels */ 41 | .ds-highlights .section .section-list .card-outer .card-host-name { 42 | font-weight: bold; 43 | } 44 | 45 | /* Remove box shadow border from top sites cards */ 46 | .top-site-outer .tile { 47 | box-shadow: none !important; 48 | } 49 | 50 | /* Highlights card image placeholder */ 51 | [lwt-newtab-brighttext] .card-outer .card-preview-image-outer { 52 | background-color: var(--pywalfox-accent) !important; 53 | } 54 | 55 | /* Top sites card hover border */ 56 | [lwt-newtab-brighttext] .ds-top-sites .top-sites .top-site-outer .top-site-inner > a:-moz-any(:hover) .tile { 57 | box-shadow: 0 0 0 3px var(--pywalfox-background-light) !important; 58 | } 59 | 60 | /* Clock icon in new tab highlight cards */ 61 | [lwt-newtab-brighttext] .card > .card-details > .card-context { 62 | clip-path: none !important; 63 | background-color: var(--pywalfox-background-light) !important; 64 | } 65 | 66 | /* "Highlights" domain name */ 67 | .card-outer .card-host-name { 68 | color: var(--pywalfox-accent) !important; 69 | } 70 | 71 | /* "Highlights" context icon */ 72 | .card-outer .card-context-icon { 73 | fill: var(--pywalfox-accent) !important; 74 | } 75 | 76 | /* "Top sites" and "Highlights" titles */ 77 | .ds-header, .ds-layout .section-title span { 78 | color: var(--newtab-text-primary-color) !important; 79 | } 80 | 81 | /* "Top sites" and "Highlights" icons */ 82 | .ds-header .icon, .ds-layout .section-title span .icon { 83 | fill: var(--newtab-text-primary-color) !important; 84 | } 85 | 86 | /* Change card and search input background color based for dark mode */ 87 | [lwt-newtab-brighttext] .trailheadCard, 88 | [lwt-newtab-brighttext] .search-wrapper input, 89 | [lwt-newtab-brighttext] .top-site-outer .top-site-icon, 90 | [lwt-newtab-brighttext] .ds-highlights .section .section-list .card-outer { 91 | background-color: var(--pywalfox-background-light) !important; 92 | } 93 | 94 | /* Card border when hovering in dark mode */ 95 | [lwt-newtab-brighttext] .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) { 96 | box-shadow: 0 0 0 5px var(--pywalfox-background-light) !important; 97 | } 98 | 99 | /* Card border when hovering in light mode */ 100 | .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) { 101 | box-shadow: 0 0 0 5px white !important; 102 | } 103 | 104 | /* Change and search input background color for light mode */ 105 | .trailheadCard, 106 | .search-wrapper input, 107 | .top-site-outer .top-site-icon, 108 | .ds-highlights .section .section-list .card-outer { 109 | background-color: white !important; 110 | } 111 | 112 | /* Hides the active background of a section when opening a context menu */ 113 | .collapsible-section.active { 114 | background: none !important; 115 | } 116 | 117 | .personalize-button:hover, 118 | .customize-menu .close-button:hover { 119 | filter: brightness(80%); 120 | } 121 | 122 | [lwt-newtab-brighttext] .personalize-button:hover, 123 | [lwt-newtab-brighttext] .customize-menu .close-button:hover { 124 | filter: brightness(120%); 125 | } 126 | } 127 | /********************* END PYWALFOX CUSTOM CSS *********************/ 128 | -------------------------------------------------------------------------------- /home/rxen/git.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: { 2 | programs.git = { 3 | enable = true; 4 | userName = "SamiulBasirFahim"; 5 | userEmail = "samiulbasirfahim.rxen@gmail.com"; 6 | }; 7 | 8 | # home.persistence."/nix/persist/home/rxen" = { 9 | # directories = [ 10 | # ".config/gh" 11 | # ]; 12 | # }; 13 | home.packages = with pkgs;[ 14 | gh 15 | lazygit 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /home/rxen/hyprland/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, inputs, config, lib, ... }: 2 | let 3 | mod = "Super"; 4 | workspaces = builtins.concatLists (builtins.genList 5 | (x: 6 | let ws = let c = (x + 1) / 10; in builtins.toString (x + 1 - (c * 10)); in [ 7 | "${mod}, ${ws}, workspace, ${toString (x + 1)}" 8 | "${mod} SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}" 9 | ]) 10 | 10); 11 | in 12 | { 13 | 14 | 15 | # home.persistence."/nix/persist/home/rxen".directories = [ 16 | # ".cache/cliphist" 17 | # ".cache/swww" 18 | # ]; 19 | 20 | imports = [ ./pyprland.nix ]; 21 | 22 | home.packages = with pkgs; 23 | [ 24 | swww 25 | wl-clipboard 26 | cliphist 27 | nemo 28 | hyprprop 29 | ]; 30 | 31 | services.cliphist.enable = true; 32 | 33 | 34 | wayland.windowManager.hyprland = 35 | { 36 | enable = true; 37 | settings = { 38 | source = "~/.cache/wal/colors-hyprland.conf"; 39 | 40 | monitor = [ 41 | ", highrr, auto, 1" 42 | ]; 43 | 44 | 45 | input = { 46 | kb_layout = "us"; 47 | repeat_rate = 50; 48 | repeat_delay = 300; 49 | 50 | accel_profile = "flat"; 51 | follow_mouse = 1; 52 | sensitivity = 0; 53 | mouse_refocus = false; 54 | }; 55 | 56 | general = { 57 | gaps_in = 6; 58 | gaps_out = 12; 59 | border_size = 3; 60 | "col.active_border" = "$color1"; 61 | "col.inactive_border" = "rgba(00000000)"; 62 | allow_tearing = true; 63 | resize_on_border = true; 64 | }; 65 | 66 | misc = { 67 | disable_hyprland_logo = true; 68 | disable_autoreload = true; 69 | force_default_wallpaper = 0; 70 | animate_mouse_windowdragging = false; 71 | swallow_regex = "^(Alacritty|kitty|footclient|foot)$"; 72 | enable_swallow = true; 73 | vrr = 1; 74 | }; 75 | 76 | master = { 77 | new_on_top = true; 78 | new_status = "master"; 79 | mfact = 0.55; 80 | special_scale_factor = 1; 81 | }; 82 | 83 | xwayland.force_zero_scaling = true; 84 | debug.disable_logs = false; 85 | 86 | decoration = { 87 | rounding = 0; 88 | blur = { 89 | enabled = true; 90 | passes = 1; 91 | size = 3; 92 | popups = true; 93 | popups_ignorealpha = 0.2; 94 | }; 95 | 96 | shadow.enabled = false; 97 | }; 98 | 99 | 100 | animations = { 101 | enabled = "yes"; 102 | bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; 103 | animation = [ 104 | "windows, 1, 4, myBezier" 105 | "windowsOut, 1, 4, default, popin 80%" 106 | "border, 1, 3, default" 107 | "fade, 1, 4, default" 108 | "workspaces, 1, 4, default" 109 | ]; 110 | 111 | # enabled = true; 112 | # bezier = [ "overshot, 0.13, 0.99, 0.29, 1.1" ]; 113 | # animation = [ 114 | # "windows, 1, 4, overshot, slide" 115 | # "windowsOut, 1, 5, default, popin 80%" 116 | # "border, 1, 5, default" 117 | # "fade, 1, 8, default" 118 | # "workspaces, 1, 6, overshot, slidevert" 119 | # ]; 120 | }; 121 | 122 | 123 | "$mod" = "${mod}"; 124 | 125 | bind = [ 126 | "$mod, Return, exec, st" 127 | "$mod, Z, exec, ags toggle launcher" 128 | "$mod, Q, killactive" 129 | "$mod, F, fullscreen" 130 | "$mod, Space, togglefloating" 131 | "$mod, S, pin" 132 | 133 | 134 | "$mod, Escape, exec, pypr toggle term && hyprctl dispatch bringactivetotop" 135 | "$mod, E, exec, pypr toggle yazi && hyprctl dispatch bringactivetotop" 136 | "$mod, T, exec, pypr toggle btop && hyprctl dispatch bringactivetotop" 137 | "$mod, A, exec, pypr toggle pulsemixer && hyprctl dispatch bringactivetotop" 138 | # "$shiftMod, W, exec, pypr toggle waypaper && hyprctl dispatch bringactivetotop" 139 | # "$shiftMod, S, exec, pypr toggle spotify && hyprctl dispatch bringactivetotop" 140 | 141 | ] ++ workspaces; 142 | 143 | binde = [ 144 | "$mod, h, movefocus, l" 145 | "$mod, l, movefocus, r" 146 | "$mod, k, movefocus, u" 147 | "$mod, j, movefocus, d" 148 | 149 | "$mod SHIFT, H, movewindow, l" 150 | "$mod SHIFT, L, movewindow, r" 151 | "$mod SHIFT, K, movewindow, u" 152 | "$mod SHIFT, J, movewindow, d" 153 | 154 | "$mod CTRL, l, resizeactive, 20 0" 155 | "$mod CTRL, h, resizeactive, -20 0" 156 | "$mod CTRL, k, resizeactive, 0 -20" 157 | "$mod CTRL, j, resizeactive, 0 20" 158 | 159 | "$mod, n, workspace, e+1" 160 | "$mod, p, workspace, e-1" 161 | ]; 162 | 163 | bindm = [ 164 | "$mod, mouse:273, resizewindow" 165 | "$mod, mouse:272, movewindow" 166 | ]; 167 | 168 | 169 | "$scratchpad_float" = "title:^(scratchpad.float)$"; 170 | "$waypaper" = "class:^(waypaper)$"; 171 | "$spotify" = "title:^(Spotify Premium)$"; 172 | "$networkmanager" = "class:^(nm-connection-editor)$"; 173 | "$blueman" = "class:^(.blueman-manager-wrapped)$"; 174 | 175 | windowrulev2 = [ 176 | "float, $scratchpad_float" 177 | "center, $scratchpad_float" 178 | 179 | "float, $spotify" 180 | "workspace special silent, $spotify" 181 | "center, $spotify" 182 | 183 | "float, $waypaper" 184 | "workspace special silent, $waypaper" 185 | "center, $waypaper" 186 | ]; 187 | exec-once = [ 188 | "hyprctl setcursor ${config.home.pointerCursor.name} ${toString config.home.pointerCursor.size}" 189 | "swww-daemon" 190 | "xrdb load ~/.cache/wal/colors.Xresources" 191 | "ags run ~/.config/ags/ags" 192 | ]; 193 | }; 194 | }; 195 | 196 | 197 | 198 | 199 | programs.pyprland = { 200 | enable = true; 201 | 202 | settings = { 203 | pyprland = { plugins = [ "scratchpads" ]; }; 204 | 205 | scratchpads = { 206 | term = { 207 | class = "scratchpad.term"; 208 | lazy = true; 209 | animation = "fromTop"; 210 | command = "foot --title=scratchpad.float"; 211 | margin = 200; 212 | size = "85% 70%"; 213 | }; 214 | yazi = { 215 | class = "scratchpad.yazi"; 216 | lazy = true; 217 | animation = "fromTop"; 218 | command = "foot --title=scratchpad.float -e yazi"; 219 | margin = 200; 220 | size = "85% 70%"; 221 | }; 222 | btop = { 223 | class = "scratchpad.btop"; 224 | lazy = true; 225 | animation = "fromTop"; 226 | command = "st --title=scratchpad.float -e btop -g 30:20"; 227 | margin = 200; 228 | }; 229 | pulsemixer = { 230 | lazy = true; 231 | animation = "fromTop"; 232 | command = "foot --title=scratchpad.float -e pulsemixer"; 233 | margin = 200; 234 | size = "85% 70%"; 235 | }; 236 | waypaper = { 237 | lazy = true; 238 | class = "waypaper"; 239 | animation = "fromTop"; 240 | command = "waypaper"; 241 | margin = 200; 242 | size = "85% 70%"; 243 | }; 244 | }; 245 | }; 246 | }; 247 | 248 | home.sessionVariables.NIXOS_OZONE_WL = "1"; 249 | } 250 | -------------------------------------------------------------------------------- /home/rxen/hyprland/pyprland.nix: -------------------------------------------------------------------------------- 1 | { config, lib, pkgs, ... }: 2 | let 3 | cfg = config.programs.pyprland; 4 | 5 | tomlFormat = pkgs.formats.toml { }; 6 | in 7 | { 8 | options.programs.pyprland = { 9 | enable = lib.mkEnableOption "pyprland"; 10 | 11 | package = lib.mkOption { 12 | type = lib.types.package; 13 | default = pkgs.pyprland; 14 | defaultText = lib.literalExpression "pkgs.pyprland"; 15 | description = "The package to use for the pypr binary"; 16 | }; 17 | 18 | settings = 19 | let 20 | t = lib.types; 21 | prim = t.either t.bool (t.either t.int t.str); 22 | primOrPrimAttrs = t.either prim (t.attrsOf prim); 23 | entry = t.either prim (t.listOf primOrPrimAttrs); 24 | entryOrAttrsOf = type: t.either entry (t.attrsOf type); 25 | entries = entryOrAttrsOf (entryOrAttrsOf entry); 26 | in 27 | lib.mkOption { 28 | type = lib.types.attrsOf entries; 29 | default = { }; 30 | example = lib.literalExpression '' 31 | { 32 | pyprland = { 33 | plugins = [ 34 | "scratchpads" 35 | "magnify" 36 | ]; 37 | }; 38 | 39 | "scratchpads.term" = { 40 | command = "kitty --class scratchpad"; 41 | margin = 100; 42 | }; 43 | } 44 | ''; 45 | }; 46 | description = '' 47 | Configuration written to 48 | {file}`$XDG_CONFIG_HOME/hypr/pyprland.toml` 49 | ''; 50 | }; 51 | 52 | config = lib.mkIf cfg.enable { 53 | home.packages = [ cfg.package ]; 54 | 55 | wayland.windowManager.hyprland = { 56 | settings = { exec-once = [ "pypr" ]; }; 57 | }; 58 | 59 | xdg.configFile."hypr/pyprland.toml" = lib.mkIf (cfg.settings != { }) { 60 | source = tomlFormat.generate "pyprland-config" cfg.settings; 61 | }; 62 | }; 63 | } 64 | -------------------------------------------------------------------------------- /home/rxen/hyprland/wallhaven-5gx2q5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiulbasirfahim/flakes/2f7e0d3b85477f22a092f4063acca7dcab622555/home/rxen/hyprland/wallhaven-5gx2q5.png -------------------------------------------------------------------------------- /home/rxen/impermanence.nix: -------------------------------------------------------------------------------- 1 | { inputs, user, ... }: 2 | { 3 | imports = [ 4 | inputs.impermanence.homeManagerModules.impermanence 5 | ]; 6 | home.persistence."/nix/persist/home/${user}" = { 7 | directories = [ 8 | "dev" 9 | "vids" 10 | "pix" 11 | "Downloads" 12 | ".mozilla" 13 | ".ssh" 14 | ".local" 15 | # ".config" 16 | # ".cache" 17 | ]; 18 | files = [ 19 | ]; 20 | allowOther = true; 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /home/rxen/mpv/default.nix: -------------------------------------------------------------------------------- 1 | { config, lib, pkgs, ... }: { 2 | home.packages = with pkgs; 3 | [ yt-dlp ani-cli ]; 4 | programs.mpv = { 5 | enable = true; 6 | scripts = lib.mkIf pkgs.stdenv.isLinux [ 7 | pkgs.mpvScripts.mpris 8 | pkgs.mpvScripts.uosc 9 | pkgs.mpvScripts.thumbfast 10 | pkgs.mpvScripts.sponsorblock 11 | pkgs.mpvScripts.youtube-upnext 12 | ]; 13 | config = { 14 | profile = "high-quality"; 15 | fullscreen = false; 16 | ytdl-format = "bestvideo[height<=?1080]+bestaudio/best"; 17 | cache-default = 4000000; 18 | osd-font = "Rxen Sans"; 19 | video-sync = "display-resample"; 20 | interpolation = true; 21 | tscale = "oversample"; 22 | sub-auto = "fuzzy"; 23 | sub-font = "Rxen Sans"; 24 | sub-blur = 10; 25 | sub-pos = 90; 26 | sub-scale = 0.6; 27 | sub-file-paths = "subs:subtitles:字幕"; 28 | screenshot-format = "png"; 29 | title = "\${filename}"; 30 | script-opts = "osc-title=\${filename},osc-boxalpha=150,osc-visibility=never,osc-boxvideo=yes"; 31 | osd-duration = 750; 32 | osc = false; 33 | osd-bar = false; 34 | volume-max = 100; 35 | }; 36 | scriptOpts = { 37 | uosc = { 38 | timeline_size = 30; 39 | volume_size = 30; 40 | timeline_style = "bar"; 41 | timeline_persistency = "paused,audio"; 42 | progress = "always"; 43 | progress_size = 4; 44 | progress_line_width = 4; 45 | top_bar_title = true; 46 | top_bar_size = 60; 47 | top_bar_persistency = "paused,audio"; 48 | refine = "text_width"; 49 | opacity = "timeline=0.6,speed=0.6,title=0.0"; 50 | disable_elements = "pause_indicator,controls"; 51 | scale = 1; 52 | border_radius = 0; 53 | scale_fullscreen = 1; 54 | animation_duration = 0; 55 | stream_quality_options = "1080,720,480,360,240,144"; 56 | top_bar_controls = false; 57 | }; 58 | thumbfast = { 59 | spawn_first = true; 60 | network = true; 61 | hwdec = true; 62 | }; 63 | }; 64 | bindings = { 65 | "Tab" = "script-binding uosc/menu"; 66 | n = "script-binding uosc/flash-volume; script-binding uosc/flash-timeline; script-binding uosc/flash-top-bar"; 67 | a = "script-binding uosc/audio"; 68 | s = "script-binding uosc/subtitles"; 69 | c = "script-binding uosc/chapter"; 70 | p = "script-binding uosc/playlist"; 71 | 72 | m = "no-osd cycle mute; script-binding uosc/flash-volume"; #! Audio > Mute 73 | k = "no-osd add volume 2; script-binding uosc/flash-volume"; #! Audio > Volume Up 74 | j = "no-osd add volume -2; script-binding uosc/flash-volume"; #! Audio > Volume Down 75 | 76 | h = "no-osd seek -5; script-binding uosc/flash-timeline"; 77 | l = "no-osd seek 5; script-binding uosc/flash-timeline"; 78 | 79 | 80 | o = "script-binding uosc/open-file"; 81 | ">" = "script-binding uosc/next"; 82 | "<" = "script-binding uosc/prev"; 83 | 84 | 85 | "0" = "ignore"; 86 | "1" = "ignore"; 87 | "2" = "ignore"; 88 | "3" = "ignore"; 89 | "4" = "ignore"; 90 | "5" = "ignore"; 91 | "6" = "ignore"; 92 | "7" = "ignore"; 93 | "8" = "ignore"; 94 | "9" = "ignore"; 95 | }; 96 | }; 97 | } 98 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/init.lua: -------------------------------------------------------------------------------- 1 | require(".opts") 2 | require(".keymaps") 3 | 4 | if vim.fn.argc() == 1 then 5 | vim.api.nvim_create_autocmd("VimEnter", { 6 | pattern = "*", 7 | callback = function() 8 | vim.api.nvim_set_current_dir(vim.fn.expand("%:p:h")) 9 | end 10 | }) 11 | end 12 | 13 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 14 | if not vim.loop.fs_stat(lazypath) then 15 | vim.fn.system({ 16 | "git", 17 | "clone", 18 | "--filter=blob:none", 19 | "https://github.com/folke/lazy.nvim.git", 20 | "--branch=stable", -- latest stable release 21 | lazypath, 22 | }) 23 | end 24 | vim.opt.rtp:prepend(lazypath) 25 | 26 | require("lazy").setup({ 27 | spec = { 28 | { import = "plugins" }, 29 | { import = "plugins.lsp" }, 30 | }, 31 | 32 | -- ui config 33 | ui = { 34 | border = "single", 35 | size = { 36 | width = 0.85, 37 | height = 0.75, 38 | }, 39 | }, 40 | 41 | checker = { 42 | enabled = true, 43 | notify = false, 44 | }, 45 | change_detection = { 46 | notify = false, 47 | }, 48 | }) 49 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/keymaps.lua: -------------------------------------------------------------------------------- 1 | local function map(mode, keys, action, desc) 2 | desc = desc or "" 3 | local opts = { silent = true, noremap = true, desc = desc } 4 | vim.keymap.set(mode, keys, action, opts) 5 | end 6 | 7 | map("n", "", "nohlsearch") 8 | 9 | map("i", "", "") 10 | map("i", "", "") 11 | map("i", "", "") 12 | map("i", "", "") 13 | 14 | map("n", "", "h") 15 | map("n", "", "j") 16 | map("n", "", "k") 17 | map("n", "", "l") 18 | 19 | map("i", "", "") 20 | map("i", "", "") 21 | map("i", "", "") 22 | map("i", "", "") 23 | 24 | map("n", "", "write") 25 | map("n", "", "bnext") 26 | map("n", "", "bprev") 27 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/opts.lua: -------------------------------------------------------------------------------- 1 | vim.o.number = true 2 | vim.o.relativenumber = true 3 | vim.o.numberwidth = 3 4 | 5 | vim.o.pumheight = 10 -- Max items to show in pop up menu 6 | vim.o.cmdheight = 1 -- Max items to show in command menu 7 | vim.o.conceallevel = 0 -- For markdown like elements 8 | 9 | vim.o.title = false 10 | vim.o.showmode = false 11 | 12 | vim.o.splitbelow = true 13 | vim.o.splitright = true 14 | 15 | vim.o.wrap = false 16 | 17 | vim.o.expandtab = true 18 | vim.o.tabstop = 4 19 | vim.o.shiftwidth = 4 20 | vim.o.softtabstop = 4 21 | 22 | vim.o.clipboard = "unnamedplus" 23 | vim.o.autoread = true 24 | vim.o.mouse = "a" 25 | vim.o.hlsearch = true 26 | vim.o.incsearch = true 27 | vim.o.ignorecase = true 28 | vim.o.undofile = true 29 | vim.o.swapfile = false 30 | vim.o.cursorline = true 31 | -- vim.o.cursorcolumn = true 32 | 33 | vim.o.scrolloff = 999 34 | 35 | vim.o.virtualedit = "block" 36 | 37 | vim.o.inccommand = "split" 38 | 39 | vim.o.termguicolors = true 40 | vim.o.laststatus = 0 41 | 42 | vim.g.mapleader = " " 43 | vim.g.maplocalleader = " " 44 | 45 | vim.o.hlsearch = true 46 | vim.o.ignorecase = true 47 | vim.o.smartcase = true 48 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/cmp.lua: -------------------------------------------------------------------------------- 1 | ---@type LazyPluginSpec 2 | return { 3 | "hrsh7th/nvim-cmp", 4 | -- enabled = false, 5 | event = { "InsertEnter", "CmdlineEnter" }, 6 | dependencies = { 7 | "hrsh7th/cmp-buffer", -- source for text in buffer 8 | "hrsh7th/cmp-path", -- source for file system paths 9 | "hrsh7th/cmp-nvim-lsp", -- source for lsp 10 | "onsails/lspkind.nvim", 11 | { 12 | "chrisgrieser/nvim-scissors", 13 | event = "VeryLazy", 14 | opts = { 15 | snippetDir = vim.fn.stdpath("config") .. "/snippets", 16 | jsonFormatter = { "prettier", "-w", "--parser", "json" }, 17 | }, 18 | config = function() 19 | vim.keymap.set("n", "se", function() 20 | require("scissors").editSnippet() 21 | end, { desc = "[E]dit snippets", noremap = true, silent = true }) 22 | 23 | vim.keymap.set({ "v" }, "sa", function() 24 | require("scissors").addNewSnippet() 25 | end, { desc = "[A]dd snippet", noremap = true, silent = true }) 26 | end, 27 | }, 28 | { 29 | "L3MON4D3/LuaSnip", 30 | version = "v2.*", 31 | event = "InsertEnter", 32 | dependencies = { 33 | "saadparwaiz1/cmp_luasnip", 34 | -- "rafamadriz/friendly-snippets", 35 | }, 36 | config = function() 37 | local luasnip = require("luasnip") 38 | luasnip.config.set_config({ 39 | history = true, 40 | updateevents = "TextChanged,TextChangedI", 41 | }) 42 | 43 | require("luasnip.loaders.from_vscode").lazy_load({ paths = { "./snippets" } }) 44 | -- require("luasnip.loaders.from_vscode").lazy_load() 45 | vim.api.nvim_create_autocmd("InsertLeave", { 46 | callback = function() 47 | if 48 | require("luasnip").session.current_nodes[vim.api.nvim_get_current_buf()] 49 | and not require("luasnip").session.jump_active 50 | then 51 | require("luasnip").unlink_current() 52 | end 53 | end, 54 | }) 55 | end, 56 | }, 57 | { 58 | "windwp/nvim-autopairs", 59 | event = "InsertEnter", 60 | opts = { 61 | fast_wrap = {}, 62 | disable_filetype = { "TelescopePrompt", "vim" }, 63 | }, 64 | config = function(_, opts) 65 | require("nvim-autopairs").setup(opts) 66 | local cmp_autopairs = require("nvim-autopairs.completion.cmp") 67 | require("cmp").event:on("confirm_done", cmp_autopairs.on_confirm_done()) 68 | end, 69 | }, 70 | }, 71 | config = function() 72 | local cmp = require("cmp") 73 | local lspkind = require("lspkind") 74 | local luasnip = require("luasnip") 75 | 76 | cmp.setup({ 77 | enabled = true, 78 | }) 79 | 80 | cmp.setup({ 81 | snippet = { 82 | expand = function(args) 83 | luasnip.lsp_expand(args.body) 84 | end, 85 | }, 86 | sources = cmp.config.sources({ 87 | { name = "nvim_lsp" }, 88 | { name = "luasnip" }, 89 | }, { 90 | { name = "path" }, 91 | { name = "buffer" }, 92 | }), 93 | 94 | mapping = cmp.mapping.preset.insert({ 95 | [""] = cmp.mapping.select_prev_item(), 96 | [""] = cmp.mapping.select_next_item(), 97 | [""] = cmp.mapping.select_prev_item(), 98 | [""] = cmp.mapping.select_next_item(), 99 | [""] = cmp.mapping.scroll_docs(-4), 100 | [""] = cmp.mapping.scroll_docs(4), 101 | [""] = cmp.mapping.complete(), 102 | [""] = cmp.mapping.close(), 103 | [""] = cmp.mapping.confirm({ 104 | behavior = cmp.ConfirmBehavior.Insert, 105 | select = true, 106 | }), 107 | [""] = cmp.mapping(function(fallback) 108 | if cmp.visible() then 109 | cmp.confirm({ select = true }) 110 | elseif luasnip.expand_or_jumpable() then 111 | luasnip.expand_or_jump() 112 | else 113 | fallback() 114 | end 115 | end, { "i", "s" }), 116 | 117 | [""] = cmp.mapping(function(fallback) 118 | if luasnip.jumpable(-1) then 119 | luasnip.jump(-1) 120 | elseif cmp.visible() then 121 | cmp.confirm({ select = true }) 122 | else 123 | fallback() 124 | end 125 | end, { "i", "s" }), 126 | }), 127 | 128 | experimental = { 129 | ghost_text = true, 130 | }, 131 | 132 | formatting = { 133 | fields = { "abbr", "menu", "kind" }, 134 | format = function(entry, item) 135 | local short_name = { 136 | cmdline = "cmd", 137 | nvim_lsp = "lsp", 138 | nvim_lsp_signature_help = "sig", 139 | nvim_lua = "nvim", 140 | luasnip = "snip", 141 | buffer = "buff", 142 | path = "path", 143 | } 144 | 145 | local menu_name = short_name[entry.source.name] or entry.source.name 146 | local icon, hl = require("mini.icons").get("lsp", item.kind) 147 | 148 | local kind = lspkind.cmp_format({ 149 | mode = "symbol", 150 | maxwidth = 35, 151 | })(entry, item) 152 | 153 | kind.menu = string.format("[%s]", menu_name) 154 | kind.kind = icon 155 | kind.kind_hl_group = hl 156 | 157 | return kind 158 | end, 159 | }, 160 | window = { 161 | completion = cmp.config.window.bordered(), 162 | documentation = cmp.config.window.bordered(), 163 | }, 164 | }) 165 | end, 166 | } 167 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/dap.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "jay-babu/mason-nvim-dap.nvim", 3 | event = "VeryLazy", 4 | dependencies = { 5 | "williamboman/mason.nvim", 6 | "rcarriga/nvim-dap-ui", 7 | "mfussenegger/nvim-dap", 8 | "nvim-neotest/nvim-nio", 9 | }, 10 | 11 | config = function() 12 | require("mason-nvim-dap").setup({ 13 | ensure_installed = { "codelldb" }, 14 | handlers = {}, 15 | }) 16 | 17 | local dap = require("dap") 18 | local dapui = require("dapui") 19 | -- UI 20 | dap.defaults.fallback.terminal_win_cmd = "below 10new" 21 | 22 | dapui.setup({ 23 | layouts = { 24 | { 25 | elements = { 26 | "watches", 27 | "scopes", 28 | }, 29 | size = 50, 30 | position = "left", 31 | }, 32 | { 33 | elements = { 34 | "breakpoints", 35 | "console", 36 | }, 37 | size = 10, 38 | position = "bottom", 39 | }, 40 | }, 41 | }) 42 | 43 | dap.listeners.after.event_initialized["dapui_config"] = function() 44 | dapui.open({}) 45 | end 46 | dap.listeners.before.event_terminated["dapui_config"] = function() 47 | dapui.close({}) 48 | end 49 | dap.listeners.before.event_exited["dapui_config"] = function() 50 | dapui.close({}) 51 | end 52 | 53 | require(".utility").map({ 54 | { 55 | key = "dc", 56 | action = function() 57 | dap.continue() 58 | end, 59 | mode = "n", 60 | desc = "[C]ontinue", 61 | }, 62 | { 63 | key = "dt", 64 | action = function() 65 | dap.toggle_breakpoint() 66 | end, 67 | mode = "n", 68 | desc = "[T]oggle breakpoint", 69 | }, 70 | { 71 | key = "ds", 72 | action = function() 73 | dap.terminate() 74 | end, 75 | mode = "n", 76 | desc = "[S]top", 77 | }, 78 | { 79 | key = "db", 80 | action = function() 81 | dap.step_back() 82 | end, 83 | mode = "n", 84 | desc = "Step [O]ut", 85 | }, 86 | { 87 | key = "do", 88 | action = function() 89 | dap.step_out() 90 | end, 91 | mode = "n", 92 | desc = "Step [O]ut", 93 | }, 94 | { 95 | key = "dn", 96 | action = function() 97 | dap.step_over() 98 | end, 99 | mode = "n", 100 | desc = "Step over", 101 | }, 102 | { 103 | key = "di", 104 | action = function() 105 | dap.step_into() 106 | end, 107 | mode = "n", 108 | desc = "Step [i]nto", 109 | }, 110 | { 111 | key = "dr", 112 | action = function() 113 | dap.restart() 114 | end, 115 | mode = "n", 116 | desc = "Restart", 117 | }, 118 | 119 | { 120 | key = "du", 121 | action = function() 122 | dapui.toggle() 123 | end, 124 | mode = "n", 125 | desc = "Toggle ui", 126 | }, 127 | }) 128 | end, 129 | } 130 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/lsp.lua: -------------------------------------------------------------------------------- 1 | return { 2 | ---@type LazyPluginSpec 3 | { 4 | "williamboman/mason-lspconfig.nvim", 5 | dependencies = { 6 | "neovim/nvim-lspconfig", 7 | "hrsh7th/cmp-nvim-lsp", 8 | "williamboman/mason.nvim", 9 | { 10 | "jay-babu/mason-null-ls.nvim", 11 | dependencies = { 12 | "williamboman/mason.nvim", 13 | "nvimtools/none-ls.nvim", 14 | "nvim-lua/plenary.nvim", 15 | }, 16 | config = function() 17 | local null_ls = require("null-ls") 18 | 19 | require("null-ls").setup({ 20 | sources = { 21 | -- null_ls.builtins.diagnostics.cppcheck, 22 | null_ls.builtins.formatting.clang_format.with({ 23 | filetypes = { "c", "cpp", "cc", "hpp", "h" }, 24 | extra_args = { 25 | "--style", 26 | "{BasedOnStyle: llvm, IndentWidth: 4}", 27 | }, 28 | }) 29 | }, 30 | }) 31 | local mason = require("mason-null-ls") 32 | require("mason-null-ls").setup({ 33 | ensure_installed = { "stylua", 34 | "shfmt", 35 | -- "prettierd" 36 | }, 37 | automatic_installation = false, 38 | 39 | handlers = { 40 | mason.default_setup, 41 | 42 | clang_format = function() 43 | null_ls.register(null_ls.builtins.formatting.clang_format.with({ 44 | filetypes = { "c", "cpp", "cc", "hpp", "h" }, 45 | extra_args = { 46 | "--style", 47 | "{BasedOnStyle: llvm, IndentWidth: 4}", 48 | }, 49 | })) 50 | end, 51 | shfmt = function() 52 | null_ls.register(null_ls.builtins.formatting.shfmt.with({ 53 | extra_args = { 54 | "--indent", 55 | "4", 56 | }, 57 | })) 58 | end, 59 | }, 60 | }) 61 | end, 62 | }, 63 | }, 64 | config = function() 65 | local lspconfig = require("lspconfig") 66 | 67 | local M = {} 68 | 69 | M.on_attach = function(client, _) 70 | if client.name == "clangd" then 71 | client.server_capabilities.documentFormattingProvider = false -- 0.8 and later 72 | end 73 | if vim.fn.has("nvim-0.10") == 1 then 74 | vim.lsp.inlay_hint.enable() 75 | end 76 | end 77 | 78 | M.capabilities = vim.lsp.protocol.make_client_capabilities() 79 | M.capabilities = require("cmp_nvim_lsp").default_capabilities(M.capabilities) 80 | 81 | require("lspconfig").clangd.setup( 82 | { 83 | on_attach = M.on_attach, 84 | capabilities = M.capabilities, 85 | } 86 | ) 87 | 88 | 89 | require("lspconfig").nixd.setup({ 90 | cmd = { "nixd" }, 91 | settings = { 92 | nixd = { 93 | nixpkgs = { 94 | expr = "import { }", 95 | }, 96 | formatting = { 97 | command = { "nixpkgs-fmt" }, -- or nixfmt or nixpkgs-fmt 98 | }, 99 | -- options = { 100 | -- nixos = { 101 | -- expr = '(builtins.getFlake "/nix/persist/home/rxen/dev/flakes/").nixosConfigurations.CONFIGNAME.options', 102 | -- }, 103 | -- home_manager = { 104 | -- expr = '(builtins.getFlake "/nix/persist/home/rxen/dev/flakes/").homeConfigurations.CONFIGNAME.options', 105 | -- }, 106 | -- }, 107 | }, 108 | }, 109 | }) 110 | 111 | require("mason").setup({}) 112 | require("mason-lspconfig").setup({ 113 | automatic_installation = true, 114 | ensure_installed = { 115 | "lua_ls", 116 | "rust_analyzer", 117 | }, 118 | }) 119 | 120 | require("mason-lspconfig").setup_handlers({ 121 | function(server) 122 | lspconfig[server].setup({ 123 | on_attach = M.on_attach, 124 | capabilities = M.capabilities, 125 | }) 126 | end, 127 | }) 128 | 129 | lspconfig.lua_ls.setup({ 130 | settings = { 131 | Lua = { 132 | diagnostics = { 133 | globals = { "vim" }, 134 | }, 135 | workspace = { 136 | library = { 137 | [vim.fn.expand("$VIMRUNTIME/lua")] = true, 138 | [vim.fn.expand("$VIMRUNTIME/lua/vim/lsp")] = true, 139 | [vim.fn.stdpath("data") .. "/lazy/lazy.nvim/lua/lazy"] = true, 140 | }, 141 | }, 142 | }, 143 | }, 144 | }) 145 | 146 | local signs = { Error = "✘", Warn = "󱡃", Hint = "󱐮", Info = "󱓔" } 147 | -- local signs = { Error = "✘", Warn = "󱡃", Hint = ">>", Info = ">>" } 148 | 149 | for type, icon in pairs(signs) do 150 | local hl = "DiagnosticSign" .. type 151 | vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) 152 | end 153 | 154 | vim.diagnostic.config({ 155 | virtual_text = true, 156 | signs = true, 157 | update_in_insert = true, 158 | underline = true, 159 | severity_sort = false, 160 | float = { 161 | border = "single", 162 | source = true, 163 | header = "", 164 | prefix = "", 165 | }, 166 | }) 167 | 168 | require(".utility").map({ 169 | { 170 | key = "lf", 171 | action = function() 172 | vim.lsp.buf.format() 173 | end, 174 | mode = "n", 175 | desc = "[F]format file", 176 | }, 177 | { 178 | key = "ls", 179 | action = function() 180 | vim.lsp.buf.signature_help() 181 | end, 182 | mode = "n", 183 | desc = "[S]ignature help", 184 | }, 185 | { 186 | key = "lt", 187 | action = function() 188 | vim.lsp.buf.type_definition() 189 | end, 190 | mode = "n", 191 | desc = "[T]ype defination", 192 | }, 193 | { 194 | key = "la", 195 | action = function() 196 | vim.lsp.buf.code_action() 197 | end, 198 | mode = "n", 199 | desc = "Code [a]ction", 200 | }, 201 | { 202 | key = "ld", 203 | action = function() 204 | vim.lsp.buf.definition() 205 | end, 206 | mode = "n", 207 | desc = "Go to [d]efinition", 208 | }, 209 | { 210 | key = "lD", 211 | action = function() 212 | vim.lsp.buf.declaration() 213 | end, 214 | mode = "n", 215 | desc = "Go to [d]eclaration", 216 | }, 217 | { 218 | key = "lR", 219 | action = function() 220 | vim.lsp.buf.references() 221 | end, 222 | mode = "n", 223 | desc = "Go to [r]eferences", 224 | }, 225 | { 226 | key = "lr", 227 | action = function() 228 | vim.lsp.buf.rename() 229 | end, 230 | mode = "n", 231 | desc = "[R]ename", 232 | }, 233 | { 234 | key = "ln", 235 | action = function() 236 | vim.diagnostic.goto_next() 237 | end, 238 | mode = "n", 239 | desc = "Go to [n]ext diagnostic", 240 | }, 241 | { 242 | key = "lp", 243 | action = function() 244 | vim.diagnostic.goto_prev() 245 | end, 246 | mode = "n", 247 | desc = "Go to [p]rev diagnostic", 248 | }, 249 | }) 250 | 251 | vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { 252 | border = "single", 253 | }) 254 | 255 | vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { 256 | border = "single", 257 | }) 258 | 259 | vim.o.updatetime = 250 260 | vim.cmd([[autocmd CursorHold,CursorHoldI * lua vim.diagnostic.open_float(nil, {focus=false})]]) 261 | end, 262 | }, 263 | } 264 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/mini.lua: -------------------------------------------------------------------------------- 1 | local function confirm_discard_changes(all_buffers) 2 | local buf_list = all_buffers == false and { 0 } or vim.api.nvim_list_bufs() 3 | local unsaved = vim.tbl_filter(function(buf_id) 4 | return vim.bo[buf_id].modified and vim.bo[buf_id].buflisted 5 | end, buf_list) 6 | 7 | if #unsaved == 0 then 8 | return true 9 | end 10 | 11 | for _, buf_id in ipairs(unsaved) do 12 | local name = vim.api.nvim_buf_get_name(buf_id) 13 | local result = vim.fn.confirm( 14 | string.format('Save changes to "%s"?', name ~= "" and vim.fn.fnamemodify(name, ":~:.") or "Untitled"), 15 | "&Yes\n&No\n&Cancel", 16 | 1, 17 | "Question" 18 | ) 19 | 20 | if result == 1 then 21 | if buf_id ~= 0 then 22 | vim.cmd("buffer " .. buf_id) 23 | end 24 | vim.cmd("update") 25 | elseif result == 0 or result == 3 then 26 | return false 27 | end 28 | end 29 | 30 | return true 31 | end 32 | 33 | return { 34 | ---@type LazyPkgSpec 35 | { 36 | "echasnovski/mini.tabline", 37 | config = function() 38 | require("mini.tabline").setup() 39 | end, 40 | }, 41 | { 42 | "echasnovski/mini.sessions", 43 | config = function() 44 | local MiniSessions = require("mini.sessions") 45 | MiniSessions.setup({}) 46 | vim.keymap.set("n", "sd", function() 47 | MiniSessions.select("delete") 48 | end, { desc = "Delete session" }) 49 | vim.keymap.set("n", "sf", function() 50 | MiniSessions.select() 51 | end, { desc = "Find session" }) 52 | vim.keymap.set("n", "sw", function() 53 | vim.ui.input({ 54 | prompt = "Session Name: ", 55 | default = vim.v.this_session ~= "" and vim.v.this_session 56 | or vim.fn.fnamemodify(vim.fn.getcwd(), ":t"), 57 | }, function(input) 58 | if input ~= nil then 59 | MiniSessions.write(input, { force = true }) 60 | end 61 | end) 62 | end, { desc = "Save session" }) 63 | vim.keymap.set("n", "sx", function() 64 | if confirm_discard_changes() then 65 | vim.v.this_session = "" 66 | vim.cmd("%bwipeout!") 67 | end 68 | end, { desc = "Clear current session" }) 69 | end, 70 | }, 71 | 72 | { 73 | "echasnovski/mini.icons", 74 | init = function() 75 | package.preload["nvim-web-devicons"] = function() 76 | package.loaded["nvim-web-devicons"] = {} 77 | require("mini.icons").mock_nvim_web_devicons() 78 | return package.loaded["nvim-web-devicons"] 79 | end 80 | end, 81 | config = function() 82 | require("mini.icons").setup({ 83 | extension = { 84 | h = { glyph = "", hl = "MiniIconsCyan" }, 85 | norg = { glyph = "", hl = "MiniIconsCyan" }, 86 | }, 87 | }) 88 | end, 89 | }, 90 | { 91 | "echasnovski/mini.bufremove", 92 | config = function() 93 | require("mini.bufremove").setup({}) 94 | vim.keymap.set("n", "q", function() 95 | if confirm_discard_changes(false) then 96 | require("mini.bufremove").delete(0, true) 97 | end 98 | end, { desc = "Close buffer" }) 99 | end, 100 | }, 101 | { 102 | "echasnovski/mini.surround", 103 | config = function() 104 | require("mini.surround").setup() 105 | end, 106 | }, 107 | ---@type LazyPluginSpec 108 | { 109 | "echasnovski/mini.pick", 110 | dependencies = { "echasnovski/mini.extra", "echasnovski/mini.fuzzy" }, 111 | config = function() 112 | local minipick = require("mini.pick") 113 | local miniextra = require("mini.extra") 114 | -- local minivisits = require("mini.visits") 115 | local builtin = minipick.builtin 116 | 117 | vim.ui.select = minipick.ui_select 118 | 119 | miniextra.setup() 120 | require("mini.fuzzy").setup() 121 | 122 | minipick.setup({ 123 | mappings = { 124 | move_down = "", 125 | move_start = "", 126 | move_up = "", 127 | }, 128 | }) 129 | 130 | require(".utility").map({ 131 | { 132 | mode = "n", 133 | key = "ff", 134 | action = function() 135 | builtin.files({ tool = "rg" }) 136 | end, 137 | desc = "Find [f]iles", 138 | }, 139 | { 140 | mode = "n", 141 | key = "fr", 142 | action = function() 143 | builtin.resume() 144 | end, 145 | desc = "[R]esume finding", 146 | }, 147 | { 148 | mode = "n", 149 | key = "fg", 150 | action = function() 151 | builtin.grep_live({ tool = "rg" }) 152 | end, 153 | desc = "Live [g]rep", 154 | }, 155 | { 156 | mode = "n", 157 | key = "fb", 158 | action = function() 159 | builtin.buffers() 160 | end, 161 | desc = "Find [b]uffer", 162 | }, 163 | { 164 | mode = "n", 165 | key = "fh", 166 | action = function() 167 | builtin.help() 168 | end, 169 | desc = "Find [h]elp", 170 | }, 171 | { 172 | mode = "n", 173 | key = "fw", 174 | action = function() 175 | miniextra.pickers.buf_lines() 176 | end, 177 | desc = "Find [w]ord", 178 | }, 179 | 180 | { 181 | mode = "n", 182 | key = "fk", 183 | action = function() 184 | miniextra.pickers.keymaps() 185 | end, 186 | desc = "[K]eymaps", 187 | }, 188 | 189 | { 190 | mode = "n", 191 | key = "fld", 192 | action = function() 193 | miniextra.pickers.lsp({ scope = "declaration" }) 194 | end, 195 | desc = "[D]eclaration", 196 | }, 197 | 198 | { 199 | mode = "n", 200 | key = "flr", 201 | action = function() 202 | miniextra.pickers.lsp({ scope = "references" }) 203 | end, 204 | desc = "[R]eferences", 205 | }, 206 | 207 | { 208 | mode = "n", 209 | key = "fli", 210 | action = function() 211 | miniextra.pickers.lsp({ scope = "implementation" }) 212 | end, 213 | desc = "[I]mplementation", 214 | }, 215 | 216 | { 217 | mode = "n", 218 | key = "fls", 219 | action = function() 220 | miniextra.pickers.lsp({ scope = "document_symbol" }) 221 | end, 222 | desc = "[S]symbol", 223 | }, 224 | 225 | { 226 | mode = "n", 227 | key = "flt", 228 | action = function() 229 | miniextra.pickers.lsp({ scope = "type_definition" }) 230 | end, 231 | desc = "[T]ype definition", 232 | }, 233 | 234 | { 235 | mode = "n", 236 | key = "flw", 237 | action = function() 238 | miniextra.pickers.lsp({ scope = "workspace_symbol" }) 239 | end, 240 | desc = "[W]orkspace symbol", 241 | }, 242 | 243 | { 244 | mode = "n", 245 | key = "flD", 246 | action = function() 247 | miniextra.pickers.lsp({ scope = "definition" }) 248 | end, 249 | desc = "[D]efinition", 250 | }, 251 | { 252 | mode = "n", 253 | key = "fd", 254 | action = function() 255 | miniextra.pickers.diagnostic() 256 | end, 257 | desc = "[D]iagnostics", 258 | }, 259 | { 260 | mode = "n", 261 | key = "fo", 262 | action = function() 263 | miniextra.pickers.oldfiles() 264 | end, 265 | desc = "Find [o]oldfiles", 266 | }, 267 | 268 | { 269 | mode = "n", 270 | key = "fe", 271 | action = function() 272 | miniextra.pickers.explorer() 273 | end, 274 | desc = "[E]xplorer", 275 | }, 276 | { 277 | mode = "n", 278 | key = "fc", 279 | action = function() 280 | miniextra.pickers.git_commits() 281 | end, 282 | desc = "Git [c]ommits", 283 | }, 284 | }) 285 | end, 286 | }, 287 | { 288 | "echasnovski/mini.indentscope", 289 | config = function() 290 | require("mini.indentscope").setup({ 291 | draw = { 292 | delay = 0, 293 | animation = function() 294 | return 0 295 | end, 296 | }, 297 | options = { try_as_border = true, border = "both", indent_at_cursor = true }, 298 | }) 299 | end, 300 | }, 301 | { 302 | "echasnovski/mini.comment", 303 | config = function() 304 | require("mini.comment").setup() 305 | end, 306 | }, 307 | { 308 | "echasnovski/mini.files", 309 | config = function() 310 | local MiniFiles = require("mini.files") 311 | 312 | MiniFiles.setup({ 313 | mappings = { 314 | close = "q", 315 | go_in_plus = "l", 316 | go_out = "h", 317 | go_out_plus = "", 318 | reset = "", 319 | reveal_cwd = "@", 320 | show_help = "g?", 321 | synchronize = "", 322 | trim_left = "<", 323 | trim_right = ">", 324 | }, 325 | windows = { 326 | preview = false, 327 | width_focus = 25, 328 | width_preview = 30, 329 | width_nofocus = 20, 330 | }, 331 | }) 332 | 333 | local function dynamic_open(path) 334 | MiniFiles.open(path, true, {}) 335 | end 336 | 337 | vim.keymap.set("n", "e", function() 338 | if not MiniFiles.close() then 339 | dynamic_open(".") 340 | end 341 | end, { desc = "Open file browser" }) 342 | vim.keymap.set("n", "-", function() 343 | dynamic_open(vim.api.nvim_buf_get_name(0)) 344 | MiniFiles.reveal_cwd() 345 | end, { desc = "Open file browser" }) 346 | 347 | local files_set_cwd = function() 348 | local cur_entry_path = MiniFiles.get_fs_entry().path 349 | local cur_directory = vim.fs.dirname(cur_entry_path) 350 | if vim.fn.chdir(cur_directory) ~= "" then 351 | print("Current directory set to " .. cur_directory) 352 | else 353 | print("Unable to set current directory") 354 | end 355 | end 356 | 357 | local minifiles_triggers = vim.api.nvim_create_augroup("MiniFilesMappings", { clear = true }) 358 | 359 | vim.api.nvim_create_autocmd("User", { 360 | group = minifiles_triggers, 361 | pattern = "MiniFilesBufferCreate", 362 | callback = function(args) 363 | local buf_id = args.data.buf_id 364 | vim.keymap.set("n", "g.", files_set_cwd, { buffer = buf_id, desc = "Set CWD" }) 365 | end, 366 | }) 367 | end, 368 | }, 369 | } 370 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/tools.lua: -------------------------------------------------------------------------------- 1 | local leet_arg = "leetcode.nvim" 2 | 3 | return { 4 | { 5 | "akinsho/toggleterm.nvim", 6 | config = function() 7 | local toggleterm = require("toggleterm") 8 | toggleterm.setup({ 9 | size = 12, 10 | open_mapping = [[]], 11 | shade_filetypes = {}, 12 | run_tmux = false, 13 | shade_terminal = true, 14 | shading_factor = 1, 15 | start_in_insert = true, 16 | persist_size = true, 17 | direction = "horizontal", 18 | autochdir = true, 19 | }) 20 | local keymap = vim.keymap -- for conciseness 21 | keymap.set("n", "", ":ToggleTerm") 22 | keymap.set("t", "", "ToggleTerm") 23 | vim.keymap.set("t", "", [[]]) 24 | end, 25 | }, 26 | { 27 | "CRAG666/code_runner.nvim", 28 | event = "BufReadPre", 29 | keys = { 30 | { 31 | "r", 32 | ":RunCode", 33 | "n", 34 | desc = "Run code", 35 | }, 36 | }, 37 | config = function() 38 | local code_runner = require("code_runner") 39 | code_runner.setup({ 40 | mode = "term", 41 | startinsert = true, 42 | filetype = { 43 | python = "python3 -u", 44 | typescript = "deno run", 45 | rust = "cd $dir && cargo run", 46 | c = 47 | "cd $dir && mkdir -p .bin && cd .bin && clang --debug ../$fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt", 48 | cpp = 49 | "cd $dir && mkdir -p .bin && cd .bin && clang++ --debug ../$fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt", 50 | }, 51 | project = {}, 52 | }) 53 | end, 54 | }, 55 | { 56 | "mg979/vim-visual-multi", 57 | }, 58 | { 59 | "xeluxee/competitest.nvim", 60 | dependencies = { "muniftanjim/nui.nvim", lazy = true }, 61 | cmd = "CompetiTest", 62 | keys = { 63 | { "ca", "CompetiTest add_testcase", options, desc = "CP: add testcases" }, 64 | { "ce", "CompetiTest edit_testcase", options, desc = "CP: edit testcases" }, 65 | { "cd", "CompetiTest delete_testcase", options, desc = "CP: delete testcases" }, 66 | { "cr", "CompetiTest run", options, desc = "CP: run testcases" }, 67 | { "cp", "CompetiTest receive problem", options, desc = "CP: download testcases" }, 68 | { "cc", "CompetiTest receive contest", options, desc = "CP: download contest" }, 69 | }, 70 | opts = { 71 | received_files_extension = "cpp", 72 | testcases_directory = "./.tests", 73 | compile_directory = "./.bin", 74 | running_directory = "./.bin", 75 | compile_command = { 76 | cpp = { 77 | exec = "clang++", --[[ clang++ | g++ ]] 78 | args = { 79 | "-std=c++20", 80 | "-pedantic", 81 | "-O2", 82 | "-Wall", 83 | "-Wextra", 84 | "-Wconversion", 85 | "-Wno-sign-conversion", 86 | "-Wshadow", 87 | "../$(FNAME)", 88 | "-o", 89 | "$(FNOEXT)", 90 | }, 91 | }, 92 | c = { exec = "clang", args = { "-Wall", "-Wextra", "-O2", "../$(FNAME)", "-o", "$(FNOEXT)" } }, 93 | }, 94 | run_command = { 95 | c = { exec = "./$(FNOEXT)" }, 96 | cpp = { exec = "./$(FNOEXT)" }, 97 | }, 98 | }, 99 | }, 100 | { 101 | "kawre/leetcode.nvim", 102 | build = ":TSUpdate html", 103 | 104 | cond = vim.fn.argv()[1] == leet_arg, 105 | lazy = false, 106 | dependencies = { 107 | "nvim-telescope/telescope.nvim", 108 | "nvim-lua/plenary.nvim", -- required by telescope 109 | "MunifTanjim/nui.nvim", 110 | "nvim-treesitter/nvim-treesitter", 111 | }, 112 | keys = { 113 | { 114 | "Le", 115 | "Leet menu", 116 | desc = "focus dashboard", 117 | }, 118 | { 119 | "Lt", 120 | "Leet desc", 121 | desc = "toggle question description", 122 | }, 123 | { 124 | "Ld", 125 | "Leet daily", 126 | desc = "opens question of today", 127 | }, 128 | { 129 | "Lc", 130 | "Leet console", 131 | desc = "opens question console", 132 | }, 133 | { 134 | "Li", 135 | "Leet info", 136 | desc = "opens question information", 137 | }, 138 | { 139 | "Ll", 140 | "Leet lang", 141 | desc = "change question language", 142 | }, 143 | { 144 | "Lr", 145 | "Leet run", 146 | desc = "run question", 147 | }, 148 | { 149 | "Ls", 150 | "Leet submit", 151 | desc = "submit question", 152 | }, 153 | { 154 | "Lf", 155 | "Leet list", 156 | desc = "opens problemlist", 157 | }, 158 | { 159 | "Lb", 160 | "Leet tabs", 161 | desc = "opens question tabs", 162 | }, 163 | }, 164 | opts = { 165 | lang = "cpp", 166 | storage = { 167 | home = "$HOME/dev/leetcode", 168 | }, 169 | description = { 170 | width = "50%", 171 | }, 172 | }, 173 | }, 174 | { 175 | "nvim-telescope/telescope.nvim", 176 | opts = { 177 | defaults = { 178 | mappings = { 179 | i = { 180 | [""] = "move_selection_next", 181 | [""] = "move_selection_previous", 182 | 183 | [""] = "move_selection_next", 184 | [""] = "move_selection_previous", 185 | }, 186 | }, 187 | }, 188 | }, 189 | }, 190 | { 191 | "lostl1ght/lazygit.nvim", 192 | lazy = true, 193 | cmd = "Lazygit", 194 | keys = { { "g", "Lazygit", desc = "Git" } }, 195 | }, 196 | { 197 | "IogaMaster/neocord", 198 | event = "VeryLazy", 199 | config = function() 200 | require("neocord").setup() 201 | end, 202 | }, 203 | { 204 | "windwp/nvim-ts-autotag", 205 | config = function() 206 | require("nvim-ts-autotag").setup() 207 | end, 208 | }, 209 | { 210 | "norcalli/nvim-colorizer.lua", 211 | config = function() 212 | require("colorizer").setup() 213 | end, 214 | }, 215 | -- { 216 | -- "Bekaboo/dropbar.nvim", 217 | -- name = "dropbar", 218 | -- event = { "BufReadPost", "BufNewFile" }, 219 | -- config = function() 220 | -- require(".utility").map({ 221 | -- { 222 | -- key = "p", 223 | -- action = function() 224 | -- require("dropbar.api").pick(vim.v.count ~= 0 and vim.v.count) 225 | -- end, 226 | -- mode = "n", 227 | -- desc = "Toggle dropdown menu", 228 | -- }, 229 | -- }) 230 | -- require("dropbar").setup({ 231 | -- require("dropbar").setup({}), 232 | -- }) 233 | -- end, 234 | -- }, 235 | } 236 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/treesitter.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvim-treesitter/nvim-treesitter", 3 | dependencies = { 4 | "nvim-treesitter/nvim-treesitter-textobjects", 5 | }, 6 | config = function() 7 | require("nvim-treesitter.configs").setup({ 8 | ensure_installed = { "c", "cpp", "lua", "rust", "python", "markdown" }, 9 | auto_install = true, 10 | highlight = { 11 | enable = true, 12 | }, 13 | incremental_selection = { 14 | enable = true, 15 | keymaps = { 16 | init_selection = "ss", 17 | node_incremental = "si", 18 | scope_incremental = "sc", 19 | node_decremental = "sd", 20 | }, 21 | }, 22 | textobjects = { 23 | select = { 24 | enable = true, 25 | lookahead = true, 26 | keymaps = { 27 | ["a="] = "@assignment.outer", 28 | ["t="] = "@assignment.lhs", 29 | ["r="] = "@assignment.rhs", 30 | ["aw"] = "@word.outer", 31 | ["ap"] = "@parameter.outer", 32 | ["ip"] = "@parameter.inner", 33 | ["af"] = "@function.outer", 34 | ["if"] = "@function.inner", 35 | ["ac"] = "@class.outer", 36 | ["ic"] = { query = "@class.inner", desc = "Select inner part of a class region" }, 37 | ["as"] = { query = "@scope", query_group = "locals", desc = "Select language scope" }, 38 | ["ai"] = { query = "@conditional.outer", desc = "Select condition outer" }, 39 | ["ii"] = { query = "@conditional.inner", desc = "Select condition inner" }, 40 | ["al"] = { query = "@loop.outer", desc = "Select loop outer" }, 41 | ["il"] = { query = "@loop.inner", desc = "Select loop inner" }, 42 | }, 43 | selection_modes = { 44 | ["@parameter.outer"] = "v", 45 | ["@function.outer"] = "v", 46 | ["@class.outer"] = "v", 47 | }, 48 | include_surrounding_whitespace = true, 49 | }, 50 | swap = { 51 | enable = true, 52 | swap_next = { 53 | ["sp"] = "@parameter.inner", 54 | }, 55 | swap_previous = { 56 | ["sP"] = "@parameter.inner", 57 | }, 58 | }, 59 | move = { 60 | enable = true, 61 | set_jumps = true, 62 | goto_next_start = { 63 | ["]p"] = "@parameter.outer", 64 | ["]af"] = "@function.outer", 65 | ["]if"] = "@function.inner", 66 | ["]c"] = "@class.outer", 67 | ["]s"] = { query = "@scope", query_group = "locals", desc = "Select language scope" }, 68 | ["]i"] = { query = "@conditional.outer", desc = "Select condition outer" }, 69 | ["]l"] = { query = "@loop.outer", desc = "Select loop outer" }, 70 | }, 71 | goto_previous_start = { 72 | ["[p"] = "@parameter.outer", 73 | ["[af"] = "@function.outer", 74 | ["[if"] = "@function.inner", 75 | ["[c"] = "@class.outer", 76 | ["[s"] = { query = "@scope", query_group = "locals", desc = "Select language scope" }, 77 | ["[i"] = { query = "@conditional.outer", desc = "Select condition outer" }, 78 | ["[l"] = { query = "@loop.outer", desc = "Select loop outer" }, 79 | }, 80 | }, 81 | }, 82 | }) 83 | end, 84 | } 85 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/plugins/ui.lua: -------------------------------------------------------------------------------- 1 | return { 2 | ---@type LazyPluginSpec 3 | { 4 | "rose-pine/neovim", 5 | name = "rose-pine", 6 | config = function() 7 | require("rose-pine").setup({ 8 | styles = { 9 | bold = false, 10 | italic = true, 11 | transparency = true, 12 | }, 13 | }) 14 | vim.cmd("colorscheme rose-pine") 15 | end, 16 | }, 17 | 18 | { 19 | "folke/which-key.nvim", 20 | opts = {}, 21 | }, 22 | 23 | 24 | -- Status line 25 | { 26 | "nvim-lualine/lualine.nvim", 27 | event = "VeryLazy", 28 | dependencies = { 29 | { 30 | "folke/noice.nvim", 31 | event = "VeryLazy", 32 | dependencies = { 33 | "MunifTanjim/nui.nvim", 34 | }, 35 | opts = { 36 | cmdline = { 37 | view = "cmdline", 38 | } 39 | }, 40 | }, 41 | }, 42 | config = function() 43 | require("lualine").setup({ 44 | 45 | options = { 46 | theme = "auto", 47 | component_separators = "", 48 | section_separators = "", 49 | icons_enabled = true, 50 | globalstatus = true, 51 | }, 52 | sections = { 53 | lualine_a = { 54 | { "mode", color = { gui = "bold" } }, 55 | }, 56 | lualine_b = { 57 | { "branch" }, 58 | { "diff", colored = false }, 59 | }, 60 | lualine_c = { 61 | { "filename", file_status = true }, 62 | { "diagnostics" }, 63 | }, 64 | lualine_x = { 65 | { 66 | require("noice").api.statusline.mode.get, 67 | cond = require("noice").api.statusline.mode.has, 68 | }, 69 | "filetype", 70 | }, 71 | lualine_y = { "location" }, 72 | lualine_z = { "progress" }, 73 | }, 74 | tabline = {}, 75 | extensions = { "quickfix", "nvim-tree" }, 76 | }) 77 | end 78 | }, 79 | 80 | ---@type LazyPluginSpec 81 | { 82 | "folke/which-key.nvim", 83 | dependencies = { 84 | "echasnovski/mini.icons", 85 | }, 86 | config = function() 87 | local wk = require("which-key") 88 | wk.setup({ 89 | win = { 90 | border = "single", 91 | }, 92 | }) 93 | end, 94 | }, 95 | } 96 | -------------------------------------------------------------------------------- /home/rxen/neovim/config/lua/utility.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | local function set_keymap(mode, key, action, desc) 3 | vim.keymap.set(mode, key, action, { noremap = true, silent = true, desc = desc }) 4 | end 5 | 6 | M.map = function(keymaps) 7 | for _, keymap in ipairs(keymaps) do 8 | set_keymap(keymap.mode, keymap.key, keymap.action, keymap.desc) 9 | end 10 | end 11 | 12 | return M 13 | -------------------------------------------------------------------------------- /home/rxen/neovim/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: { 2 | 3 | programs.neovim = { 4 | enable = true; 5 | viAlias = true; 6 | vimAlias = true; 7 | defaultEditor = true; 8 | }; 9 | 10 | home.file.".config/nvim" = { 11 | source = ./config; 12 | enable = true; 13 | recursive = true; 14 | }; 15 | 16 | home.packages = with pkgs; 17 | [ 18 | ripgrep 19 | cargo 20 | nodejs 21 | nixd 22 | llvmPackages_19.clang-tools 23 | cppcheck 24 | ]; 25 | 26 | # home.persistence."/nix/persist/home/rxen".directories = [ 27 | # ".config/nvim/" 28 | # ".local/share/nvim" 29 | # ".local/state/nvim" 30 | # ]; 31 | } 32 | -------------------------------------------------------------------------------- /home/rxen/spotify/default.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs, user, ... }: 2 | let 3 | spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; 4 | in 5 | { 6 | 7 | imports = [ inputs.spicetify-nix.homeManagerModules.default ]; 8 | programs.spicetify = { 9 | enable = true; 10 | enabledExtensions = with spicePkgs.extensions; [ 11 | autoSkipVideo 12 | adblock 13 | hidePodcasts 14 | shuffle 15 | keyboardShortcut 16 | ]; 17 | enabledSnippets = with spicePkgs.snippets; [ 18 | beSquare 19 | removeConnectBar 20 | removeTopSpacing 21 | hideMiniPlayerButton 22 | ]; 23 | theme = 24 | spicePkgs.themes.text 25 | // { 26 | additionalCss = '' 27 | @import url("https://fonts.googleapis.com/css2?family=Anonymous+Pro:ital,wght@0,400;0,700;1,400;1,700&family=Azeret+Mono:ital,wght@0,100..900;1,100..900&family=B612+Mono:ital,wght@0,400;0,700;1,400;1,700&family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&family=Cousine:ital,wght@0,400;0,700;1,400;1,700&family=Cutive+Mono&family=DM+Mono:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=Fira+Code:wght@300..700&family=Fira+Mono:wght@400;500;700&family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&family=M+PLUS+1+Code:wght@100..700&family=Nova+Mono&family=Overpass+Mono:wght@300..700&family=Oxygen+Mono&family=PT+Mono&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Share+Tech+Mono&family=Sometype+Mono:ital,wght@0,400..700;1,400..700&family=Sono:wght@200..800&family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&family=Syne+Mono&family=Ubuntu+Mono:ital,wght@0,400;0,700;1,400;1,700&family=VT323&family=Xanh+Mono:ital@0;1&display=swap"); 28 | @import url("https://fonts.cdnfonts.com/css/asciid"); 29 | 30 | /* user settings */ 31 | :root { 32 | --font-family: "Rxen Sans", monospace; 33 | /* 34 | --font-family: 'Anonymous Pro', monospace; 35 | --font-family: 'Azeret Mono', monospace; 36 | --font-family: 'B612 Mono', monospace; 37 | --font-family: 'Courier Prime', monospace; 38 | --font-family: 'Cousine', monospace; 39 | --font-family: 'Cutive Mono', monospace; 40 | --font-family: 'DM Mono', monospace; 41 | --font-family: 'Fira Code', monospace; 42 | --font-family: 'Fira Mono', monospace; 43 | --font-family: 'IBM Plex Mono', monospace; 44 | --font-family: 'JetBrains Mono', monospace; 45 | --font-family: 'M PLUS 1 Code', monospace; 46 | --font-family: 'Major Mono Display', monospace; 47 | --font-family: 'Monofett', monospace; 48 | --font-family: 'Nova Mono', monospace; 49 | --font-family: 'Overpass Mono', monospace; 50 | --font-family: 'Oxygen Mono', monospace; 51 | --font-family: 'PT Mono', monospace; 52 | --font-family: 'Roboto Mono', monospace; 53 | --font-family: 'Share Tech Mono', monospace; 54 | --font-family: 'Sometype Mono', monospace; 55 | --font-family: 'Sono', monospace; 56 | --font-family: 'Source Code Pro', monospace; 57 | --font-family: 'Space Mono', monospace; 58 | --font-family: 'Syne Mono', monospace; 59 | --font-family: 'Ubuntu Mono', monospace; 60 | --font-family: 'VT323', monospace; 61 | --font-family: 'Xanh Mono', monospace; 62 | */ 63 | --font-size: 16px; 64 | --font-weight: 400; /* 200 : 900 */ 65 | --line-height: 1.2; 66 | 67 | --font-size-lyrics: 24px; /* 1.5em (default) */ 68 | 69 | --font-family-header: "asciid"; 70 | --font-size-multiplier-header: 4; 71 | 72 | --display-card-image: block; /* none | block */ 73 | --display-coverart-image: none; /* none | block */ 74 | --display-header-image: none; /* none | block */ 75 | --display-sidebar-image: block; /* none | block */ 76 | --display-tracklist-image: none; /* none | block */ 77 | --display-spicetify-banner-ascii: block; /* none | block */ 78 | --display-music-banner-ascii: none; /* none | block */ 79 | 80 | --border-radius: 0px; 81 | --border-width: 1px; 82 | --border-style: solid; /* dotted | dashed | solid | double | groove | ridge | inset | outset */ 83 | --border-transition: 0.2s ease; /* 'none' to disable */ 84 | } 85 | 86 | /* font */ 87 | *:not([style*="lyric" i] *, [class*="lyric" i], .main-entityHeader-title) { 88 | font-family: var(--font-family) !important; 89 | font-size: var(--font-size) !important; 90 | font-weight: var(--font-weight) !important; 91 | line-height: var(--line-height) !important; 92 | } 93 | .lyrics-lyrics-container *, 94 | .main-nowPlayingView-lyricsContent * { 95 | font-family: var(--font-family); 96 | font-size: var(--font-size-lyrics); 97 | font-weight: var(--font-weight); 98 | line-height: var(--line-height); 99 | } 100 | .main-entityHeader-title h1 { 101 | font-family: var(--font-family-header) !important; 102 | font-size: calc( 103 | var(--font-size) * var(--font-size-multiplier-header) 104 | ) !important; 105 | display: -webkit-box; 106 | -webkit-box-orient: vertical; 107 | -webkit-line-clamp: 2; 108 | line-clamp: 2; 109 | } 110 | 111 | /* images */ 112 | .main-card-imageContainer img, 113 | .view-homeShortcutsGrid-imageContainer img { 114 | display: var(--display-card-image) !important; 115 | } 116 | .main-coverSlotCollapsed-container { 117 | display: var(--display-coverart-image); 118 | } 119 | .main-entityHeader-imageContainer, 120 | .under-main-view, 121 | .main-entityHeader-creatorWrapper .main-avatar-avatar, 122 | .main-entityHeader-imageContainer, 123 | .playlist-playlist-playlistImageContainer, 124 | .profile-userOverview-imageContainer { 125 | display: var(--display-header-image); 126 | } 127 | .x-entityImage-imageContainer img, 128 | .main-avatar-image { 129 | display: var(--display-sidebar-image); 130 | } 131 | .main-trackList-rowImage { 132 | display: var(--display-tracklist-image); 133 | } 134 | 135 | /* fix */ 136 | :root { 137 | --content-max-width: 100% !important; 138 | } 139 | .Root__globalNav { 140 | padding: 8px 16px !important; 141 | height: unset; 142 | } 143 | .spotify__container--is-desktop.spotify__os--is-windows .Root__globalNav, 144 | .spotify__container--is-desktop.spotify__os--is-macos .Root__globalNav { 145 | margin: 40px 0 0; 146 | } 147 | .spotify__container--is-desktop.spotify__os--is-linux .Root__globalNav { 148 | margin: 8px 0 0; 149 | } 150 | .Root__top-container { 151 | --panel-gap: 16px !important; 152 | } 153 | .Root__top-bar { 154 | border: var(--border-width) solid transparent; 155 | } 156 | .Root__nav-bar, 157 | .Root__now-playing-bar { 158 | overflow: visible; 159 | } 160 | .main-view-container { 161 | overflow: hidden; 162 | } 163 | section:has(> .main-entityHeader-container), 164 | div:has(> .main-entityHeader-container) { 165 | margin-top: 0; 166 | } 167 | .main-entityHeader-container { 168 | height: unset !important; 169 | min-height: unset !important; 170 | } 171 | .main-entityHeader-imageContainerNew { 172 | height: 128px; 173 | width: 128px; 174 | } 175 | .main-topBar-background { 176 | background-color: var(--spice-main); 177 | } 178 | .main-topBar-overlay, 179 | .main-entityHeader-container > div, 180 | .main-entityHeader-container + div[style*="background-color"], 181 | .main-entityHeader-container + div > div[style*="background-color"], 182 | .main-home-homeHeader, 183 | .main-home-filterChipsSection, 184 | .main-home-filterChipsSection::after { 185 | background-color: transparent !important; 186 | background-image: none !important; 187 | background: transparent !important; 188 | } 189 | .LayoutResizer__resize-bar { 190 | cursor: w-resize; 191 | } 192 | .LayoutResizer__inline-end:after, 193 | .LayoutResizer__inline-start:after { 194 | background-color: var(--spice-border-inactive); 195 | } 196 | .LayoutResizer__resize-bar--resizing.LayoutResizer__inline-start:after, 197 | .LayoutResizer__resize-bar--resizing.LayoutResizer__inline-end:after { 198 | background-color: var(--spice-border-active); 199 | } 200 | 201 | /* fullscreen */ 202 | .spotifyinternal-artistnpv .npv-what-is-playing .npv-cover-art, 203 | .spotifyinternal-artistnpv .npv-what-is-playing .npv-track { 204 | bottom: 18em; 205 | } 206 | .spotifyinternal-artistnpv .npv-what-is-playing .npv-cover-art { 207 | -webkit-transform: scale(0.34375); 208 | transform: scale(0.34375); 209 | } 210 | .spotifyinternal-artistnpv .npv-what-is-playing .npv-track { 211 | -webkit-transform: none; 212 | transform: none; 213 | } 214 | .npv-main-container .playback-bar { 215 | position: unset; 216 | width: auto; 217 | } 218 | .npv-nowPlayingBar-controls { 219 | height: auto; 220 | } 221 | 222 | /* recolor */ 223 | :root { 224 | --spice-main-elevated: var(--spice-main); 225 | --spice-highlight-elevated: var(--spice-main); 226 | --spice-sidebar: var(--spice-main); 227 | --spice-player: var(--spice-main); 228 | --spice-card: var(--spice-main); 229 | --spice-shadow: var(--spice-main); 230 | --spice-selected-row: var(--spice-subtext); 231 | --spice-button: var(--spice-accent); 232 | --spice-button-active: var(--spice-accent-active); 233 | --spice-button-disabled: var(--spice-accent-inactive); 234 | --spice-tab-active: var(--spice-main); 235 | --spice-rgb-main-elevated: var(--spice-rgb-main); 236 | --spice-rgb-highlight-elevated: var(--spice-rgb-main); 237 | --spice-rgb-sidebar: var(--spice-rgb-main); 238 | --spice-rgb-player: var(--spice-rgb-main); 239 | --spice-rgb-card: var(--spice-rgb-main); 240 | --spice-rgb-shadow: var(--spice-rgb-main); 241 | --spice-rgb-selected-row: var(--spice-rgb-subtext); 242 | --spice-rgb-button: var(--spice-rgb-accent); 243 | --spice-rgb-button-active: var(--spice-rgb-accent-active); 244 | --spice-rgb-button-disabled: var(--spice-rgb-accent-inactive); 245 | --spice-rgb-tab-active: var(--spice-rgb-main); 246 | } 247 | .encore-dark-theme, 248 | .encore-dark-theme .encore-base-set { 249 | --background-elevated-press: var(--spice-main-elevated); 250 | --essential-subdued: var(--spice-border-inactive); 251 | --decorative-subdued: var(--spice-accent-inactive); 252 | } 253 | .encore-dark-theme .encore-bright-accent-set { 254 | --background-highlight: var(--spice-button-active) !important; 255 | --background-elevated-base: var(--spice-button-active) !important; 256 | --background-elevated-highlight: var(--spice-button-active) !important; 257 | --background-press: var(--spice-button-active) !important; 258 | --background-elevated-press: var(--spice-button-active) !important; 259 | } 260 | .Root__top-container, 261 | .Root__nav-bar { 262 | background-color: var(--spice-main); 263 | } 264 | .main-playPauseButton-button { 265 | background-color: transparent; 266 | color: var(--spice-subtext); 267 | } 268 | .main-playPauseButton-button:focus, 269 | .main-playPauseButton-button:hover { 270 | transform: none; 271 | color: var(--spice-text); 272 | } 273 | #_R_G *:not([fill="none"]) { 274 | fill: var(--spice-button-active) !important; 275 | } 276 | #_R_G *:not([stroke="none"]) { 277 | stroke: var(--spice-button-active); 278 | } 279 | .view-homeShortcutsGrid-equaliser, 280 | .main-devicePicker-nowPlayingActiveIcon, 281 | .main-trackList-playingIcon { 282 | filter: grayscale(1) opacity(0.2) 283 | drop-shadow(0 0 0 var(--spice-button-active)) 284 | drop-shadow(0 0 0 var(--spice-button-active)) 285 | drop-shadow(0 0 0 var(--spice-button-active)); 286 | } 287 | ::placeholder { 288 | color: var(--spice-subtext); 289 | } 290 | .main-entityHeader-background, 291 | .main-entityHeader-backgroundColor, 292 | .main-entityHeader-overlay, 293 | .main-actionBarBackground-background, 294 | .main-buddyFeed-container, 295 | .main-nowPlayingView-content.main-nowPlayingView-gradient { 296 | background-color: transparent !important; 297 | background-image: none; 298 | } 299 | .progress-bar { 300 | --fg-color: var(--spice-button-active); 301 | --bg-color: var(--spice-button-disabled); 302 | } 303 | .playback-bar__progress-time-elapsed, 304 | .main-playbackBarRemainingTime-container { 305 | mix-blend-mode: difference; 306 | color: var(--spice-button-active); 307 | } 308 | .main-trackList-placeholder { 309 | background-color: var(--background-base); 310 | background-blend-mode: color-dodge; 311 | } 312 | .main-trackList-trackListHeaderStuck.main-trackList-trackListHeader { 313 | background: var(--spice-main); 314 | } 315 | .main-trackList-trackListRow:focus-within, 316 | .main-trackList-trackListRow:hover, 317 | .main-contextMenu-menuItemButton:hover, 318 | .main-contextMenu-menuItemButton:not([aria-checked="true"]):focus, 319 | .main-card-card:hover, 320 | .main-card-card[data-context-menu-open="true"], 321 | [class*="BoxComponent-group-card"]:hover::after, 322 | [class*="BoxComponent-group-listRow"]:hover::after { 323 | background-color: rgba(var(--spice-rgb-highlight), 0.5); 324 | } 325 | .main-trackList-trackListRow.main-trackList-selected, 326 | .main-trackList-trackListRow.main-trackList-selected:hover { 327 | background-color: var(--spice-highlight); 328 | } 329 | .x-entityImage-imageContainer, 330 | .main-card-imageContainer > div:first-child { 331 | background-color: var(--card-color, var(--spice-border-inactive)); 332 | } 333 | .main-avatar-avatar { 334 | background-color: var(--spice-border-inactive) !important; 335 | } 336 | .main-entityHeader-title h1 { 337 | color: var(--spice-banner); 338 | } 339 | div[style*="--text-subdued: rgba(255, 255, 255, 0.7);"] { 340 | --text-subdued: var(--spice-subtext) !important; 341 | } 342 | 343 | /* pane borders */ 344 | .Root__globalNav, 345 | .main-yourLibraryX-entryPoints, 346 | .Root__main-view, 347 | .Root__now-playing-bar, 348 | .Root__right-sidebar:has(aside:not(:empty)) { 349 | border: var(--border-width) var(--border-style); 350 | border-color: var(--spice-border-inactive); 351 | border-radius: var(--border-radius); 352 | background-color: var(--spice-main); 353 | transition: border-color var(--border-transition); 354 | } 355 | .Root__globalNav:hover, 356 | .main-yourLibraryX-entryPoints:hover, 357 | .Root__main-view:hover, 358 | .Root__now-playing-bar:hover, 359 | .Root__right-sidebar:has(aside:not(:empty)):hover { 360 | border: var(--border-width) var(--border-style); 361 | border-color: var(--spice-border-active); 362 | } 363 | 364 | /* pane headers */ 365 | .Root__nav-bar .main-yourLibraryX-entryPoints { 366 | overflow-x: visible !important; 367 | } 368 | .Root__globalNav::before, 369 | .main-globalNav-searchContainer 370 | form 371 | div:has(> .main-topBar-searchBar:focus)::before, 372 | .Root__nav-bar 373 | .main-yourLibraryX-entryPoints:has(.main-yourLibraryX-navItems)::before, 374 | .Root__nav-bar 375 | .main-yourLibraryX-entryPoints:has( 376 | .main-yourLibraryX-libraryContainer 377 | )::before, 378 | .Root__main-view::before, 379 | .Root__now-playing-bar::before, 380 | .Root__right-sidebar:has(aside:not(:empty))::before { 381 | color: var(--spice-header); 382 | position: absolute; 383 | margin: -10px 4px; 384 | background: var(--spice-main); 385 | padding: 0 3px; 386 | z-index: 3; 387 | transition: color var(--border-transition); 388 | } 389 | .Root__globalNav::before { 390 | content: "Nav"; 391 | top: 0; 392 | left: 0; 393 | } 394 | .main-globalNav-searchContainer 395 | form 396 | div:has(> .main-topBar-searchBar:focus)::before { 397 | content: "Search"; 398 | color: var(--spice-border-active) !important; 399 | } 400 | .Root__nav-bar 401 | .main-yourLibraryX-entryPoints:has(.main-yourLibraryX-navItems)::before { 402 | content: "Pages"; 403 | } 404 | .Root__nav-bar 405 | .main-yourLibraryX-entryPoints:has( 406 | .main-yourLibraryX-libraryContainer 407 | )::before { 408 | content: "Library"; 409 | } 410 | .Root__main-view::before { 411 | content: "Main"; 412 | position: fixed; 413 | } 414 | .Root__now-playing-bar::before { 415 | content: "Playing"; 416 | } 417 | .Root__right-sidebar:has(aside:not(:empty))::before { 418 | content: "Sidebar"; 419 | } 420 | .Root__globalNav:hover::before, 421 | .Root__nav-bar .main-yourLibraryX-entryPoints:hover::before, 422 | .Root__main-view:hover::before, 423 | .Root__now-playing-bar:hover::before, 424 | .Root__right-sidebar:has(aside:not(:empty)):hover::before { 425 | color: var(--spice-border-active); 426 | } 427 | 428 | /* scrollbars */ 429 | .os-scrollbar-handle { 430 | border-radius: var(--border-radius) !important; 431 | width: 2px !important; 432 | position: absolute; 433 | top: 0; 434 | right: 0; 435 | } 436 | .os-scrollbar-handle:hover { 437 | border-radius: var(--border-radius) !important; 438 | width: 6px !important; 439 | } 440 | .os-scrollbar-vertical { 441 | top: 5px !important; 442 | right: 5px !important; 443 | } 444 | 445 | /* context menus + tippy boxes */ 446 | .main-contextMenu-menu, 447 | .tippy-box { 448 | border: var(--border-width) var(--border-style) var(--spice-border-active); 449 | border-radius: var(--border-radius) !important; 450 | } 451 | 452 | /* modals */ 453 | .GenericModal, 454 | .GenericModal__overlay > div { 455 | border: var(--border-width) var(--border-style) var(--spice-border-active); 456 | border-radius: var(--border-radius); 457 | overflow: visible; 458 | } 459 | .GenericModal::before, 460 | .GenericModal__overlay > div::before { 461 | content: "Modal"; 462 | color: var(--spice-border-active); 463 | position: absolute; 464 | margin: -10px 4px; 465 | background: var(--spice-main); 466 | padding: 0 3px; 467 | z-index: 9; 468 | } 469 | 470 | /* ================================ 471 | GLOBAL NAV 472 | ================================ */ 473 | 474 | /* search section */ 475 | .main-globalNav-searchSection, 476 | .main-globalNav-searchContainer { 477 | align-items: center; 478 | } 479 | .main-globalNav-searchSection { 480 | position: unset; 481 | top: unset; 482 | left: unset; 483 | } 484 | .main-globalNav-searchContainer { 485 | max-width: unset; 486 | width: 100%; 487 | } 488 | .main-globalNav-searchContainer form .main-topBar-searchBar { 489 | border-radius: var(--border-radius); 490 | border: 1px solid; 491 | border-color: var(--spice-main); 492 | } 493 | .main-globalNav-searchContainer form:hover .main-topBar-searchBar { 494 | box-shadow: none; 495 | border: 1px solid; 496 | border-color: var(--spice-border-inactive); 497 | } 498 | .Root__globalNav:hover:has(.main-topBar-searchBar:focus) { 499 | border: var(--border-width) var(--border-style); 500 | border-color: var(--spice-border-inactive); 501 | } 502 | .Root__globalNav:hover:has(.main-topBar-searchBar:focus)::before { 503 | color: var(--spice-header); 504 | } 505 | .main-globalNav-searchContainer form .main-topBar-searchBar:focus { 506 | box-shadow: none; 507 | border: var(--border-width) var(--border-style); 508 | border-color: var(--spice-border-active); 509 | outline: 14px solid var(--spice-main); 510 | } 511 | .main-globalNav-searchContainer form .main-topBar-searchBar + div > div { 512 | border-radius: var(--border-radius); 513 | box-shadow: none; 514 | margin: 24.5px 0; 515 | border: var(--border-width) var(--border-style); 516 | border-color: var(--spice-border-active); 517 | outline: 14px solid var(--spice-main); 518 | } 519 | form .main-topBar-searchBar::placeholder, 520 | form .main-topBar-searchBar:placeholder-shown { 521 | transition: none !important; 522 | } 523 | 524 | /* ================================ 525 | LEFT SIDEBAR 526 | ================================ */ 527 | 528 | /* pages pane */ 529 | .main-yourLibraryX-navLink { 530 | height: 24px; 531 | gap: 8px; 532 | text-decoration: none !important; 533 | } 534 | .main-yourLibraryX-navLink > svg, 535 | .main-yourLibraryX-header .main-yourLibraryX-collapseButtonWrapper > span { 536 | transform: scale(0.7); 537 | } 538 | 539 | /* library pane */ 540 | .x-entityImage-imageContainer { 541 | transform: scale(0.7); 542 | background-color: transparent; 543 | } 544 | .x-entityImage-imageContainer::before { 545 | content: "░▒▒░"; 546 | color: var(--spice-subtext); 547 | transform: scale(1.4); 548 | position: absolute; 549 | top: 50%; 550 | left: 20%; 551 | z-index: -1; 552 | } 553 | .main-yourLibraryX-filterArea { 554 | padding: 0 8px; 555 | } 556 | .main-yourLibraryX-libraryRootlist { 557 | padding: 0 16px 8px; 558 | } 559 | .main-yourLibraryX-listItem span.LineClamp { 560 | -webkit-line-clamp: 1; 561 | line-clamp: 1; 562 | } 563 | 564 | /* sidebar config */ 565 | .main-yourLibraryX-entryPoints:first-child:has( 566 | .main-yourLibraryX-navItems:empty 567 | ) { 568 | display: none; 569 | } 570 | 571 | /* ================================ 572 | MAIN VIEW 573 | ================================ */ 574 | 575 | /* check out a cool project: https://github.com/Rigellute/spotify-tui 576 | 577 | _________ ____ / /_(_) __/_ __ / /___ __(_)\A 578 | / ___/ __ \\/ __ \\/ __/ / /_/ / / /_____/ __/ / / / /\A 579 | (__ ) /_/ / /_/ / /_/ / __/ /_/ /_____/ /_/ /_/ / /\A 580 | /____/ .___/\\____/\\__/_/_/ \\__, / \\__/\\__,_/_/\A 581 | /_/ /____/ 582 | 583 | */ 584 | .view-homeShortcutsGrid-shortcuts::before { 585 | content: "${user}"; 586 | white-space: pre-wrap; 587 | padding: 32px 0; 588 | color: var(--spice-banner); 589 | line-height: 1.2; 590 | text-wrap: nowrap; 591 | display: var(--display-spicetify-banner-ascii); 592 | } 593 | .main-entityHeader-headerText::before { 594 | content: "────█▀█▄▄▄▄─────██▄\A────█▀▄▄▄▄█─────█▀▀█\A─▄▄▄█─────█──▄▄▄█\A██▀▄█─▄██▀█─███▀█\A─▀▀▀──▀█▄█▀─▀█▄█▀\A"; 595 | white-space: pre-wrap; 596 | padding-bottom: 32px; 597 | color: var(--spice-banner); 598 | line-height: 1.2; 599 | text-wrap: nowrap; 600 | display: var(--display-music-banner-ascii); 601 | } 602 | 603 | /* top bar */ 604 | .queue-tabBar-active, 605 | .marketplace-tabBar-active { 606 | text-decoration: underline !important; 607 | } 608 | .main-topBar-historyButtons .main-topBar-button { 609 | background-color: transparent; 610 | } 611 | .main-topBar-historyButtons > .main-topBar-button:first-child::before { 612 | content: "<"; 613 | } 614 | .main-topBar-button.main-topBar-responsiveForward::before { 615 | content: ">"; 616 | } 617 | .main-topBar-historyButtons > .main-topBar-button:first-child > svg, 618 | .main-topBar-button.main-topBar-responsiveForward > svg { 619 | display: none; 620 | } 621 | .main-topBar-topbarContent { 622 | gap: 24px; 623 | } 624 | .x-searchInput-searchInputInput { 625 | border-radius: var(--border-radius); 626 | background-color: transparent; 627 | } 628 | .x-searchInput-searchInputInput:hover, 629 | .x-searchInput-searchInputInput:focus { 630 | box-shadow: none; 631 | border: 1px solid var(--spice-button-active); 632 | background-color: transparent; 633 | } 634 | .search-searchCategory-catergoryGrid *, 635 | .main-shelf-subHeader *, 636 | .ChipInnerComponent-sm, 637 | .ChipInnerComponent-sm-selected { 638 | border-radius: var(--border-radius); 639 | } 640 | .main-globalNav-historyButtonsContainer svg, 641 | .main-globalNav-searchContainer svg { 642 | transform: scale(0.7); 643 | } 644 | 645 | /* headers */ 646 | .main-entityHeader-container { 647 | padding: var(--content-spacing) 0; 648 | } 649 | .main-entityHeader-container.main-entityHeader-withBackgroundImage { 650 | background-image: radial-gradient( 651 | circle, 652 | rgba(var(--spice-rgb-main), 0.7) 0%, 653 | rgba(var(--spice-rgb-main), 0.9) 50%, 654 | rgba(var(--spice-rgb-main), 1) 100% 655 | ); 656 | } 657 | 658 | /* compact tracklists */ 659 | .main-trackList-trackListRow { 660 | height: 32px; 661 | } 662 | .main-trackList-rowMainContent { 663 | grid-template: "title badges subtitle" / auto 1fr; 664 | column-gap: 0; 665 | } 666 | .main-trackList-rowImage { 667 | height: 24px; 668 | width: 24px; 669 | } 670 | .main-trackList-rowTitle:has(+ span)::after { 671 | content: "|"; 672 | color: var(--spice-highlight); 673 | padding: 0 10px; 674 | } 675 | .main-trackList-rowBadges { 676 | padding-right: 10px; 677 | } 678 | .main-trackList-number, 679 | .main-trackList-icon { 680 | top: unset; 681 | } 682 | 683 | /* lyrics page & sidebar */ 684 | .lyrics-lyrics-background { 685 | background-color: var(--spice-main); 686 | } 687 | .main-nowPlayingView-sectionHeaderSpacing.main-nowPlayingView-lyricsGradient { 688 | background-color: var(--background-tinted-base); 689 | } 690 | .lyrics-lyrics-contentContainer { 691 | justify-content: start; 692 | } 693 | .lyrics-lyrics-container, 694 | .main-nowPlayingView-section { 695 | --lyrics-color-active: var(--spice-text) !important; 696 | --lyrics-color-inactive: var(--spice-subtext) !important; 697 | --lyrics-color-passed: var(--spice-subtext) !important; 698 | --lyrics-color-messaging: var(--spice-subtext) !important; 699 | } 700 | .lyrics-lyricsContent-lyric { 701 | opacity: 0.3; 702 | display: flex; 703 | flex-direction: row; 704 | } 705 | .lyrics-lyricsContent-lyric.lyrics-lyricsContent-highlight { 706 | opacity: 0.7; 707 | transition: none; 708 | } 709 | .lyrics-lyricsContent-lyric.lyrics-lyricsContent-active:not(:empty) { 710 | background-color: var(--lyrics-color-background); 711 | color: var(--spice-main); 712 | opacity: 1; 713 | transition: none; 714 | } 715 | .lyrics-lyricsContent-lyric:not(:empty)::before { 716 | content: ">> "; 717 | opacity: 0; 718 | white-space: break-spaces; 719 | } 720 | .lyrics-lyricsContent-lyric.lyrics-lyricsContent-active:not(:empty)::before { 721 | content: ">> "; 722 | opacity: 1; 723 | white-space: break-spaces; 724 | } 725 | 726 | /* lyrics cinema */ 727 | .Root__lyrics-cinema { 728 | border: var(--border-width) var(--border-style) transparent; 729 | overflow: hidden; 730 | } 731 | .main-nowPlayingView-lyricsContent { 732 | -webkit-mask-image: none !important; 733 | mask-image: none !important; 734 | } 735 | 736 | /* ================================ 737 | PLAYBACK BAR 738 | ================================ */ 739 | 740 | /* playback bar itself */ 741 | .main-nowPlayingBar-nowPlayingBar { 742 | padding: 8px 8px 32px 8px; 743 | height: 96px; 744 | } 745 | .playback-bar { 746 | position: absolute; 747 | left: calc(var(--panel-gap) + 8px); 748 | bottom: calc(var(--panel-gap) + 8px); 749 | width: calc(100vw - var(--panel-gap) * 2 - 16px); 750 | justify-content: center; 751 | } 752 | 753 | /* playback time indicators */ 754 | .playback-bar__progress-time-elapsed { 755 | pointer-events: none; 756 | } 757 | .playback-bar__progress-time-elapsed::after { 758 | content: " /"; 759 | } 760 | .playback-bar__progress-time-elapsed, 761 | .main-playbackBarRemainingTime-container { 762 | z-index: 9; 763 | padding-top: 2px; 764 | } 765 | 766 | /* playback seek bar */ 767 | .playback-progressbar-container { 768 | position: absolute; 769 | width: 100%; 770 | } 771 | .progress-bar { 772 | --progress-bar-height: 16px; 773 | --progress-bar-radius: var(--border-radius); 774 | } 775 | .progress-bar__slider { 776 | box-shadow: none; 777 | height: 100%; 778 | border-radius: 0; 779 | } 780 | 781 | /* cover art */ 782 | .main-nowPlayingWidget-coverArt .cover-art { 783 | height: 32px !important; 784 | width: 32px !important; 785 | } 786 | 787 | /* left nowplaying text */ 788 | .main-nowPlayingBar-left { 789 | padding-inline-start: 0; 790 | } 791 | .main-nowPlayingWidget-trackInfo { 792 | margin: 0; 793 | } 794 | 795 | /* volume bar */ 796 | .volume-bar__slider-container .x-progressBar-fillColor, 797 | .volume-bar__slider-container 798 | .playback-progressbar-isInteractive 799 | .progress-bar--isDragging 800 | .x-progressBar-fillColor, 801 | .volume-bar__slider-container 802 | .playback-progressbar-isInteractive 803 | .progress-bar:focus 804 | .x-progressBar-fillColor, 805 | .volume-bar__slider-container 806 | .playback-progressbar-isInteractive 807 | .progress-bar:hover 808 | .x-progressBar-fillColor, 809 | .volume-bar__slider-container 810 | .playback-progressbar-isInteractive:focus-within 811 | .x-progressBar-fillColor { 812 | height: 9px; 813 | background-color: transparent; 814 | border-bottom: 2px dashed var(--fg-color); 815 | } 816 | .volume-bar__slider-container .x-progressBar-progressBarBg { 817 | background-color: transparent; 818 | } 819 | 820 | /* player controls */ 821 | .player-controls__buttons { 822 | margin-bottom: 0; 823 | } 824 | .player-controls__buttons, 825 | .main-nowPlayingBar-extraControls { 826 | opacity: 0.25; 827 | transition: opacity var(--border-transition); 828 | } 829 | .player-controls__buttons:hover, 830 | .main-nowPlayingBar-extraControls:hover { 831 | opacity: 1; 832 | } 833 | .main-shuffleButton-button::before, 834 | button[data-testid="control-button-shuffle"]::after, 835 | .ecHWOS 836 | button:has( 837 | path[d="M13.151.922a.75.75 0 1 0-1.06 1.06L13.109 3H11.16a3.75 3.75 0 0 0-2.873 1.34l-6.173 7.356A2.25 2.25 0 0 1 .39 12.5H0V14h.391a3.75 3.75 0 0 0 2.873-1.34l6.173-7.356a2.25 2.25 0 0 1 1.724-.804h1.947l-1.017 1.018a.75.75 0 0 0 1.06 1.06L15.98 3.75 13.15.922zM.391 3.5H0V2h.391c1.109 0 2.16.49 2.873 1.34L4.89 5.277l-.979 1.167-1.796-2.14A2.25 2.25 0 0 0 .39 3.5z"] 838 | )::before { 839 | content: "\21C4"; 840 | } 841 | .ecHWOS 842 | button:has( 843 | path[d="M12.09.922a.75.75 0 0 1 1.061 0L15.98 3.75l-2.83 2.828a.75.75 0 1 1-1.06-1.06L13.109 4.5H11.16a2.25 2.25 0 0 0-1.724.804L3.264 12.66A3.75 3.75 0 0 1 .391 14H0v-1.5h.391a2.25 2.25 0 0 0 1.724-.804L8.288 4.34A3.75 3.75 0 0 1 11.16 3h1.947L12.09 1.982a.75.75 0 0 1 0-1.06zM.88 3.319C2.255 2.874 2.976 1.787 3.297.874c.036-.102.37-.102.406 0 .321.913 1.042 2 2.417 2.445.103.033.103.329 0 .362-1.375.445-2.096 1.532-2.417 2.445-.036.102-.37.102-.406 0-.321-.913-1.042-2-2.417-2.445-.103-.033-.103-.329 0-.362z"] 844 | )::before { 845 | content: "\21C4\2726"; 846 | text-wrap: nowrap; 847 | } 848 | .main-skipBackButton-button::before, 849 | button[data-testid="control-button-skip-back"]::after { 850 | content: "\25C1"; 851 | } 852 | .main-playPauseButton-button[aria-label="Play"]::before, 853 | .main-playPauseButton-button:has( 854 | path[d="M3 1.713a.7.7 0 0 1 1.05-.607l10.89 6.288a.7.7 0 0 1 0 1.212L4.05 14.894A.7.7 0 0 1 3 14.288V1.713z"] 855 | )::before, 856 | button[data-testid="control-button-playpause"]:has( 857 | path[d="M3 1.713a.7.7 0 0 1 1.05-.607l10.89 6.288a.7.7 0 0 1 0 1.212L4.05 14.894A.7.7 0 0 1 3 14.288V1.713z"] 858 | )::after, 859 | button[data-testid="control-button-playpause"]:has( 860 | path[d="m7.05 3.606 13.49 7.788a.7.7 0 0 1 0 1.212L7.05 20.394A.7.7 0 0 1 6 19.788V4.212a.7.7 0 0 1 1.05-.606z"] 861 | )::after { 862 | content: "\25B6"; 863 | } 864 | .main-playPauseButton-button[aria-label="Pause"]::before, 865 | .main-playPauseButton-button:has( 866 | path[d="M3 1.713a.7.7 0 0 1 1.05-.607l10.89 6.288a.7.7 0 0 1 0 1.212L4.05 14.894A.7.7 0 0 1 3 14.288V1.713z"] 867 | )::before, 868 | button[data-testid="control-button-playpause"]:has( 869 | path[d="M2.7 1a.7.7 0 0 0-.7.7v12.6a.7.7 0 0 0 .7.7h2.6a.7.7 0 0 0 .7-.7V1.7a.7.7 0 0 0-.7-.7H2.7zm8 0a.7.7 0 0 0-.7.7v12.6a.7.7 0 0 0 .7.7h2.6a.7.7 0 0 0 .7-.7V1.7a.7.7 0 0 0-.7-.7h-2.6z"] 870 | )::after, 871 | button[data-testid="control-button-playpause"]:has( 872 | path[d="M5.7 3a.7.7 0 0 0-.7.7v16.6a.7.7 0 0 0 .7.7h2.6a.7.7 0 0 0 .7-.7V3.7a.7.7 0 0 0-.7-.7H5.7zm10 0a.7.7 0 0 0-.7.7v16.6a.7.7 0 0 0 .7.7h2.6a.7.7 0 0 0 .7-.7V3.7a.7.7 0 0 0-.7-.7h-2.6z"] 873 | )::after { 874 | content: "\275A\275A"; 875 | text-wrap: nowrap; 876 | } 877 | button[data-testid="control-button-playpause"] { 878 | padding: 8px; 879 | } 880 | button[data-testid="control-button-playpause"]:hover { 881 | color: var(--spice-text); 882 | } 883 | button[data-testid="control-button-playpause"] .ButtonInner-small-iconOnly { 884 | display: none; 885 | } 886 | .main-skipForwardButton-button::before, 887 | button[data-testid="control-button-skip-forward"]::after { 888 | content: "\25B7"; 889 | } 890 | .main-repeatButton-button::before, 891 | button[data-testid="control-button-repeat"]::after { 892 | content: "\21BB"; 893 | } 894 | .main-repeatButton-button[aria-checked="mixed"]::before, 895 | button[data-testid="control-button-repeat"][aria-checked="mixed"]::after { 896 | content: "\21BB\2474"; 897 | text-wrap: nowrap; 898 | } 899 | .main-shuffleButton-button > svg, 900 | .player-controls__left .ecHWOS svg, 901 | .main-skipBackButton-button > svg, 902 | .main-playPauseButton-button > svg, 903 | .main-skipForwardButton-button > svg, 904 | .main-repeatButton-button > svg, 905 | :is(.player-controls__buttons, .npv-nowPlayingBar-controls) span { 906 | display: none; 907 | } 908 | 909 | /* connect bar */ 910 | .main-connectBar-connectBar { 911 | position: absolute; 912 | background-color: transparent !important; 913 | mix-blend-mode: difference; 914 | pointer-events: none; 915 | right: var(--panel-gap); 916 | bottom: var(--panel-gap); 917 | opacity: 0.25; 918 | padding: 0 10px 10px; 919 | } 920 | .main-connectBar-connectBar span { 921 | color: var(--spice-accent-active); 922 | } 923 | .main-connectBar-connectBar svg { 924 | fill: var(--spice-accent-active); 925 | } 926 | ''; 927 | injectCss = true; 928 | injectThemeJs = true; 929 | replaceColors = true; 930 | homeConfig = true; 931 | overwriteAssets = false; 932 | }; 933 | 934 | colorScheme = "custom"; 935 | customColorScheme = { 936 | accent = "ebbcba"; 937 | accent-active = "ebbcba"; 938 | accent-inactive = "1f1d2e"; 939 | banner = "ebbcba"; 940 | border-active = "ebbcba"; 941 | border-inactive = "26233a"; 942 | header = "6e6a86"; 943 | highlight = "403d52"; 944 | main = "191724"; 945 | notification = "31748f"; 946 | notification-error = "eb6f92"; 947 | subtext = "908caa"; 948 | text = "e0def4"; 949 | }; 950 | }; 951 | } 952 | -------------------------------------------------------------------------------- /home/rxen/term/default.nix: -------------------------------------------------------------------------------- 1 | { config, ... }: 2 | { 3 | 4 | programs.foot = { 5 | enable = true; 6 | server.enable = true; 7 | 8 | settings = { 9 | main = { 10 | include = "~/.cache/wal/colors-foot.ini"; 11 | term = "screen-256color"; 12 | font = "Rxen Sans:size=15"; 13 | horizontal-letter-offset = 0; 14 | vertical-letter-offset = 0; 15 | pad = "4x4 center"; 16 | selection-target = "clipboard"; 17 | }; 18 | url = { 19 | protocols = "http, https, ftp, ftps, file, gemini, gopher"; 20 | }; 21 | colors = { 22 | alpha = ".9"; 23 | }; 24 | cursor = { 25 | style = "block"; 26 | }; 27 | key-bindings = { }; 28 | mouse.hide-when-typing = "yes"; 29 | tweak = { 30 | sixel = "yes"; 31 | }; 32 | }; 33 | }; 34 | 35 | 36 | 37 | programs.yazi = { 38 | enable = true; 39 | settings = { 40 | manager = { 41 | ratio = [ 42 | 1 43 | 2 44 | 3 45 | ]; 46 | sort_by = "natural"; 47 | sort_sensitive = true; 48 | sort_reverse = false; 49 | sort_dir_first = true; 50 | linemode = "none"; 51 | show_hidden = true; 52 | show_symlink = true; 53 | }; 54 | 55 | preview = { 56 | image_filter = "lanczos3"; 57 | image_quality = 90; 58 | tab_size = 1; 59 | max_width = 600; 60 | max_height = 900; 61 | cache_dir = ""; 62 | ueberzug_scale = 1; 63 | ueberzug_offset = [ 64 | 0 65 | 0 66 | 0 67 | 0 68 | ]; 69 | }; 70 | 71 | tasks = { 72 | micro_workers = 5; 73 | macro_workers = 10; 74 | bizarre_retry = 5; 75 | }; 76 | }; 77 | }; 78 | } 79 | -------------------------------------------------------------------------------- /home/rxen/theme/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, inputs, ... }: 2 | { 3 | 4 | imports = [ 5 | ./pywal.nix 6 | ]; 7 | 8 | home.file.".local/share/fonts" = { 9 | enable = true; 10 | recursive = true; 11 | source = "${inputs.dotfiles}/fonts/.local/share/fonts"; 12 | }; 13 | 14 | home.pointerCursor = { 15 | gtk.enable = true; 16 | package = pkgs.vimix-cursors; 17 | name = "Vimix-white-cursors"; 18 | size = 14; 19 | }; 20 | 21 | # home.persistence."/nix/persist/home/rxen".directories = [ 22 | # ".cache/wal" 23 | # ".config/wpg" 24 | # ".themes" 25 | # ".icons" 26 | # ".local/share/themes" 27 | # ".local/share/icons" 28 | # ]; 29 | 30 | home.packages = with pkgs; 31 | [ 32 | wpgtk 33 | xfce.thunar 34 | nwg-look 35 | ]; 36 | 37 | programs.pywal16 = { 38 | enable = true; 39 | templates = { 40 | "discord.css" = '' 41 | /* customize things here */ 42 | :root {{ 43 | 44 | /* background colors */ 45 | --bg-0: {background}; /* main background color. */ 46 | --bg-1: #1d2021; /* background color for secondary elements like code blocks, embeds, etc. */ 47 | --bg-2: #3c3836; /* color of neutral buttons. */ 48 | --bg-3: #504945; /* color of neutral buttons when hovered. */ 49 | 50 | 51 | /* text colors */ 52 | --txt-dark: var(--bg-0); /* color of dark text on colored backgrounds. */ 53 | --txt-link: var(--aqua); /* color of links. */ 54 | --txt-0: {foreground}; /* color of bright/white text. */ 55 | --txt-1: {color1}; /* main text color. */ 56 | --txt-2: {color3}; /* color of secondary text like channel list. */ 57 | --txt-3: {color2}; /* color of muted text. */ 58 | /* mention/ping and message colors */ 59 | --red: {color1}; 60 | --green: {color2}; 61 | --yellow: {color3}; 62 | --blue: {color4}; 63 | --purple: {color5}; 64 | --aqua: {color1}; 65 | }} 66 | ''; 67 | "colors-hyprland.conf" = '' 68 | $wallpaper = {wallpaper} 69 | $background = rgb({background.strip}) 70 | $foreground = rgb({foreground.strip}) 71 | $color0 = rgb({color0.strip}) 72 | $color1 = rgb({color1.strip}) 73 | $color2 = rgb({color2.strip}) 74 | $color3 = rgb({color3.strip}) 75 | $color4 = rgb({color4.strip}) 76 | $color5 = rgb({color5.strip}) 77 | $color6 = rgb({color6.strip}) 78 | $color7 = rgb({color7.strip}) 79 | $color8 = rgb({color8.strip}) 80 | $color9 = rgb({color9.strip}) 81 | $color10 = rgb({color10.strip}) 82 | $color11 = rgb({color11.strip}) 83 | $color12 = rgb({color12.strip}) 84 | $color13 = rgb({color13.strip}) 85 | $color14 = rgb({color14.strip}) 86 | $color15 = rgb({color15.strip}) 87 | ''; 88 | 89 | "colors-foot.ini" = '' 90 | [colors] 91 | background={background.strip} 92 | foreground={foreground.strip} 93 | regular0={color0.strip} 94 | regular1={color1.strip} 95 | regular2={color2.strip} 96 | regular3={color3.strip} 97 | regular4={color4.strip} 98 | regular5={color5.strip} 99 | regular6={color6.strip} 100 | regular7={color7.strip} 101 | bright0={color8.strip} 102 | bright1={color9.strip} 103 | bright2={color10.strip} 104 | bright3={color11.strip} 105 | bright4={color12.strip} 106 | bright5={color13.strip} 107 | bright6={color14.strip} 108 | bright7={color15.strip} 109 | ''; 110 | }; 111 | }; 112 | 113 | 114 | gtk = { 115 | enable = true; 116 | theme.name = "FlatColor"; 117 | font.name = "Rxen Sans"; 118 | font.size = 12; 119 | iconTheme. name = "flattrcolor-dark"; 120 | }; 121 | } 122 | -------------------------------------------------------------------------------- /home/rxen/theme/pywal.nix: -------------------------------------------------------------------------------- 1 | { config, lib, pkgs, ... }: 2 | let 3 | inherit (lib) mkIf mkOption mkEnableOption; 4 | inherit (lib) types literalExpression; 5 | cfg = config.programs.pywal16; 6 | in 7 | { 8 | options.programs.pywal16 = { 9 | enable = mkEnableOption "pywal16"; 10 | 11 | package = mkOption { 12 | type = types.package; 13 | default = pkgs.pywal16; 14 | defaultText = literalExpression "pkgs.pywal16"; 15 | description = "The package to use for pywal16"; 16 | }; 17 | 18 | templates = mkOption { 19 | type = types.attrsOf types.str; 20 | default = { }; 21 | description = "Custom templates for pywal16"; 22 | }; 23 | }; 24 | 25 | config = mkIf cfg.enable { 26 | home.packages = [ 27 | cfg.package 28 | ]; 29 | 30 | home.file = builtins.foldl' 31 | (acc: set: acc // { 32 | ".config/wal/templates/${set.name}".text = set.value; 33 | }) 34 | { } 35 | (lib.attrsToList cfg.templates); 36 | }; 37 | } 38 | -------------------------------------------------------------------------------- /home/rxen/vscode/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: { 2 | programs.vscode = { 3 | enable = true; 4 | package = pkgs.vscodium.fhs; 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /home/rxen/zsh/config/config.zsh: -------------------------------------------------------------------------------- 1 | bindkey -v 2 | 3 | bindkey '^r' buffer-fzf-history 4 | bindkey '^l' clear-screen 5 | bindkey '^[[Z' reverse-menu-complete 6 | 7 | bindkey '^O' zoxide_cd 8 | 9 | autoload -U colors && colors 10 | setopt prompt_subst 11 | 12 | # Checks if working tree is dirty 13 | function parse_git_dirty() { 14 | local STATUS 15 | local -a FLAGS 16 | FLAGS=('--porcelain') 17 | if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then 18 | if [[ "${DISABLE_UNTRACKED_FILES_DIRTY:-}" == "true" ]]; then 19 | FLAGS+='--untracked-files=no' 20 | fi 21 | case "${GIT_STATUS_IGNORE_SUBMODULES:-}" in 22 | git) 23 | ;; 24 | *) 25 | FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}" 26 | ;; 27 | esac 28 | STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1) 29 | fi 30 | if [[ -n $STATUS ]]; then 31 | echo "$ZSH_THEME_GIT_PROMPT_DIRTY" 32 | else 33 | echo "$ZSH_THEME_GIT_PROMPT_CLEAN" 34 | fi 35 | } 36 | 37 | 38 | function git_current_branch() { 39 | local ref 40 | ref=$(__git_prompt_git symbolic-ref --quiet HEAD 2> /dev/null) 41 | local ret=$? 42 | if [[ $ret != 0 ]]; then 43 | [[ $ret == 128 ]] && return # no git repo. 44 | ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) || return 45 | fi 46 | echo ${ref#refs/heads/} 47 | } 48 | 49 | 50 | # Depends on the git plugin for work_in_progress() 51 | (( $+functions[work_in_progress] )) || work_in_progress() {} 52 | 53 | ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}[" 54 | ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}" 55 | ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}" 56 | ZSH_THEME_GIT_PROMPT_CLEAN="" 57 | 58 | # Customized git status, oh-my-zsh currently does not allow render dirty status before branch 59 | git_custom_status() { 60 | local branch=$(git_current_branch) 61 | [[ -n "$branch" ]] || return 0 62 | echo "$(parse_git_dirty)\ 63 | %{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\ 64 | ${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}${ZSH_THEME_GIT_PROMPT_SUFFIX}" 65 | } 66 | 67 | # Combine it all into a final right-side prompt 68 | RPS1="\$(git_custom_status)${RPS1:+ $RPS1}" 69 | PROMPT='%{$fg[blue]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b ' 70 | 71 | 72 | 73 | setopt auto_pushd 74 | setopt pushd_ignore_dups 75 | setopt pushdminus 76 | 77 | setopt hist_ignore_dups # do not record an event that was just recorded again 78 | setopt hist_ignore_all_dups # delete an old recorded event if a new event is a duplicate 79 | setopt hist_ignore_space # do not record an event starting with a space 80 | setopt hist_save_no_dups # do not write a duplicate event to the history file 81 | setopt inc_append_history # write to the history file immediately, not when the shell exits 82 | setopt share_history # share history between terminals 83 | 84 | unsetopt nomatch 85 | 86 | autoload -Uz +X compinit && compinit 87 | zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 88 | zstyle ':completion:*' menu select 89 | zstyle -e ':completion:*:default' list-colors 'reply=("${PREFIX:+=(#bi)($PREFIX:t)(?)*==02=01}:${(s.:.)LS_COLORS}")' 90 | -------------------------------------------------------------------------------- /home/rxen/zsh/config/functions.zsh: -------------------------------------------------------------------------------- 1 | 2 | function fw() { 3 | RG_PREFIX='rg -i --column --line-number --color=always' 4 | INITIAL_QUERY='' 5 | fzf --ansi --disabled --query "$INITIAL_QUERY" \ 6 | --bind "start:reload:$RG_PREFIX {q}" \ 7 | --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ 8 | --delimiter : \ 9 | --preview 'bat --style=plain,numbers --color=always --theme=gruvbox-dark {1} --highlight-line {2}' \ 10 | --preview-window 'right,60%,border-left,+{2}+3/3,~3' \ 11 | --bind 'enter:become(/usr/bin/nvim {1} +{2})' 12 | } 13 | 14 | function ff() { 15 | RG_PREFIX="fd --strip-cwd-prefix --type file" 16 | INITIAL_QUERY='' 17 | fzf --ansi --disabled --query "$INITIAL_QUERY" \ 18 | --bind "start:reload:$RG_PREFIX {q}" \ 19 | --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ 20 | --delimiter : \ 21 | --preview 'bat --style=plain,numbers --color=always --theme=gruvbox-dark {1}' \ 22 | --preview-window 'right,60%,border-left,+{2}+3/3,~3' | sed 's/^\(.*\)$/"\1"/' | xargs -r -n 1 xdg-open 23 | } 24 | 25 | function vid() { 26 | files="$(fd --type=directory --type=file --regex ".mp4|.mkv|.webm")" 27 | if [ $# -eq 0 ] 28 | then 29 | files="$(echo "$files" | fzf --layout=reverse -i)" 30 | [[ -f "$files" ]] && mpv $files && vid 31 | else 32 | files="$(echo "$files" | grep -i $1)" 33 | if [[ "$(echo $files | wc -l)" -gt 1 ]] 34 | then 35 | files="$(echo $files | fzf --layout=reverse -i)" 36 | [[ -f "$files" ]] && mpv $files && vid 37 | else 38 | [[ -f "$files" ]] && mpv $files && vid 39 | fi 40 | fi 41 | } 42 | 43 | function mkcd() { 44 | mkdir -p $@ && cd ${@:$#} 45 | } 46 | 47 | 48 | function buffer-fzf-history() { 49 | local HISTORY=$(history -n -r 1 | fzf +m) 50 | BUFFER=$HISTORY 51 | if [ -n "$HISTORY" ]; then 52 | CURSOR=$#BUFFER 53 | else 54 | zle accept-line 55 | fi 56 | } 57 | 58 | function slash-backward-kill-word() { 59 | local WORDCHARS="*?_-.[]~=&;!#$%^(){}<>" 60 | zle backward-kill-word 61 | } 62 | 63 | function zoxide_cd () { 64 | local dir 65 | dir=$(zoxide query -i) 66 | cd -- $dir 67 | zle reset-prompt 68 | } 69 | 70 | zle -N slash-backward-kill-word 71 | zle -N buffer-fzf-history 72 | zle -N zoxide_cd 73 | -------------------------------------------------------------------------------- /home/rxen/zsh/config/plugins.zsh: -------------------------------------------------------------------------------- 1 | # ------------------------------------------------------------------------------ 2 | # Description 3 | # ----------- 4 | # 5 | # sudo or sudo -e (replacement for sudoedit) will be inserted before the command 6 | # 7 | # ------------------------------------------------------------------------------ 8 | # Authors 9 | # ------- 10 | # 11 | # * Dongweiming 12 | # * Subhaditya Nath 13 | # * Marc Cornellà 14 | # * Carlo Sala 15 | # 16 | # ------------------------------------------------------------------------------ 17 | 18 | __sudo-replace-buffer() { 19 | local old=$1 new=$2 space=${2:+ } 20 | 21 | # if the cursor is positioned in the $old part of the text, make 22 | # the substitution and leave the cursor after the $new text 23 | if [[ $CURSOR -le ${#old} ]]; then 24 | BUFFER="${new}${space}${BUFFER#$old }" 25 | CURSOR=${#new} 26 | # otherwise just replace $old with $new in the text before the cursor 27 | else 28 | LBUFFER="${new}${space}${LBUFFER#$old }" 29 | fi 30 | } 31 | 32 | sudo-command-line() { 33 | # If line is empty, get the last run command from history 34 | [[ -z $BUFFER ]] && LBUFFER="$(fc -ln -1)" 35 | 36 | # Save beginning space 37 | local WHITESPACE="" 38 | if [[ ${LBUFFER:0:1} = " " ]]; then 39 | WHITESPACE=" " 40 | LBUFFER="${LBUFFER:1}" 41 | fi 42 | 43 | { 44 | # If $SUDO_EDITOR or $VISUAL are defined, then use that as $EDITOR 45 | # Else use the default $EDITOR 46 | local EDITOR=${SUDO_EDITOR:-${VISUAL:-$EDITOR}} 47 | 48 | # If $EDITOR is not set, just toggle the sudo prefix on and off 49 | if [[ -z "$EDITOR" ]]; then 50 | case "$BUFFER" in 51 | sudo\ -e\ *) __sudo-replace-buffer "sudo -e" "" ;; 52 | sudo\ *) __sudo-replace-buffer "sudo" "" ;; 53 | *) LBUFFER="sudo $LBUFFER" ;; 54 | esac 55 | return 56 | fi 57 | 58 | # Check if the typed command is really an alias to $EDITOR 59 | 60 | # Get the first part of the typed command 61 | local cmd="${${(Az)BUFFER}[1]}" 62 | # Get the first part of the alias of the same name as $cmd, or $cmd if no alias matches 63 | local realcmd="${${(Az)aliases[$cmd]}[1]:-$cmd}" 64 | # Get the first part of the $EDITOR command ($EDITOR may have arguments after it) 65 | local editorcmd="${${(Az)EDITOR}[1]}" 66 | 67 | # Note: ${var:c} makes a $PATH search and expands $var to the full path 68 | # The if condition is met when: 69 | # - $realcmd is '$EDITOR' 70 | # - $realcmd is "cmd" and $EDITOR is "cmd" 71 | # - $realcmd is "cmd" and $EDITOR is "cmd --with --arguments" 72 | # - $realcmd is "/path/to/cmd" and $EDITOR is "cmd" 73 | # - $realcmd is "/path/to/cmd" and $EDITOR is "/path/to/cmd" 74 | # or 75 | # - $realcmd is "cmd" and $EDITOR is "cmd" 76 | # - $realcmd is "cmd" and $EDITOR is "/path/to/cmd" 77 | # or 78 | # - $realcmd is "cmd" and $EDITOR is /alternative/path/to/cmd that appears in $PATH 79 | if [[ "$realcmd" = (\$EDITOR|$editorcmd|${editorcmd:c}) \ 80 | || "${realcmd:c}" = ($editorcmd|${editorcmd:c}) ]] \ 81 | || builtin which -a "$realcmd" | command grep -Fx -q "$editorcmd"; then 82 | __sudo-replace-buffer "$cmd" "sudo -e" 83 | return 84 | fi 85 | 86 | # Check for editor commands in the typed command and replace accordingly 87 | case "$BUFFER" in 88 | $editorcmd\ *) __sudo-replace-buffer "$editorcmd" "sudo -e" ;; 89 | \$EDITOR\ *) __sudo-replace-buffer '$EDITOR' "sudo -e" ;; 90 | sudo\ -e\ *) __sudo-replace-buffer "sudo -e" "$EDITOR" ;; 91 | sudo\ *) __sudo-replace-buffer "sudo" "" ;; 92 | *) LBUFFER="sudo $LBUFFER" ;; 93 | esac 94 | } always { 95 | # Preserve beginning space 96 | LBUFFER="${WHITESPACE}${LBUFFER}" 97 | 98 | # Redisplay edit buffer (compatibility with zsh-syntax-highlighting) 99 | zle && zle redisplay # only run redisplay if zle is enabled 100 | } 101 | } 102 | 103 | zle -N sudo-command-line 104 | 105 | # Defined shortcut keys: [Esc] [Esc] 106 | bindkey -M emacs '\e\e' sudo-command-line 107 | bindkey -M vicmd '\e\e' sudo-command-line 108 | bindkey -M viins '\e\e' sudo-command-line 109 | 110 | 111 | 112 | 113 | 114 | 115 | fancy-ctrl-z () { 116 | if [[ $#BUFFER -eq 0 ]]; then 117 | BUFFER="fg" 118 | zle accept-line -w 119 | else 120 | zle push-input -w 121 | zle clear-screen -w 122 | fi 123 | } 124 | zle -N fancy-ctrl-z 125 | bindkey '^Z' fancy-ctrl-z 126 | -------------------------------------------------------------------------------- /home/rxen/zsh/default.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: { 2 | # home.persistence."/nix/persist/home/rxen".files = [ 3 | # ".cache/zsh_history" 4 | # ]; 5 | 6 | programs.zoxide = { 7 | enable = true; 8 | enableZshIntegration = true; 9 | }; 10 | 11 | programs.fzf.enable = true; 12 | programs.fzf.enableZshIntegration = true; 13 | 14 | programs.zsh = { 15 | enable = true; 16 | autocd = true; 17 | enableCompletion = true; 18 | autosuggestion.enable = true; 19 | syntaxHighlighting.enable = true; 20 | historySubstringSearch = { 21 | enable = true; 22 | searchDownKey = "^N"; 23 | searchUpKey = "^P"; 24 | }; 25 | 26 | history = { 27 | share = true; 28 | size = 10000; 29 | save = 10000; 30 | path = "$HOME/.cache/zsh_history"; 31 | }; 32 | 33 | initExtra = '' 34 | ${(builtins.readFile ./config/functions.zsh)} 35 | ${(builtins.readFile ./config/plugins.zsh)} 36 | ${(builtins.readFile ./config/config.zsh)} 37 | 38 | if [ -z "$DISPLAY" ] && [ "$(fgconsole)" -eq 1 ]; then 39 | exec Hyprland 40 | fi 41 | ''; 42 | 43 | shellAliases = { 44 | rebuild = "sudo nixos-rebuild switch --flake /nix/persist/home/rxen/dev/flakes/#hollow"; 45 | ls = "${pkgs.eza}/bin/eza -l --icons=always"; 46 | lsa = "${pkgs.eza}/bin/eza -la --icons=always"; 47 | lst = "${pkgs.eza}/bin/eza -T --icons=always"; 48 | lsta = "${pkgs.eza}/bin/eza -Ta --icons=always"; 49 | ip = "ip --color"; 50 | ipb = "ip --color --brief"; 51 | }; 52 | }; 53 | } 54 | -------------------------------------------------------------------------------- /hosts/hollow/default.nix: -------------------------------------------------------------------------------- 1 | { config, lib, pkgs, inputs, ... }: 2 | 3 | { 4 | imports = 5 | [ 6 | ./hardware-configuration.nix 7 | ../../system 8 | 9 | (import ../../lib/disko.nix { device = "/dev/nvme0n1"; swapSize = "16G"; }) 10 | inputs.disko.nixosModules.default 11 | ]; 12 | 13 | boot.loader.systemd-boot.enable = true; 14 | boot.loader.efi.canTouchEfiVariables = true; 15 | boot.initrd.kernelModules = [ "amdgpu" ]; 16 | 17 | networking.hostName = "hollow"; 18 | i18n.defaultLocale = "en_US.UTF-8"; 19 | 20 | # Set your time zone. 21 | time.timeZone = "Asia/Dhaka"; 22 | 23 | # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . 24 | # don't change it, even if you update nixos. 25 | system.stateVersion = "24.11"; # Did you read the comment? 26 | 27 | } 28 | -------------------------------------------------------------------------------- /hosts/hollow/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 = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; 12 | boot.initrd.kernelModules = [ ]; 13 | boot.kernelModules = [ "kvm-amd" ]; 14 | boot.extraModulePackages = [ ]; 15 | 16 | # Enables DHCP on each ethernet and wireless interface. In case of scripted networking 17 | # (the default) this is the recommended approach. When using systemd-networkd it's 18 | # still possible to use this option, but it's recommended to use it in conjunction 19 | # with explicit per-interface declarations with `networking.interfaces..useDHCP`. 20 | networking.useDHCP = lib.mkDefault true; 21 | # networking.interfaces.enp5s0.useDHCP = lib.mkDefault true; 22 | 23 | nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 24 | hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 25 | } 26 | -------------------------------------------------------------------------------- /lib/disko.nix: -------------------------------------------------------------------------------- 1 | { 2 | device ? throw "Set this to your disk device (e.g. /dev/nvme0n1)", 3 | swapSize ? throw "Set this to the amount of RAM you have (e.g. 16G)", 4 | ... 5 | }: 6 | { 7 | disko.devices = { 8 | disk = { 9 | vdb = { 10 | device = device; 11 | type = "disk"; 12 | content = { 13 | type = "gpt"; 14 | partitions = { 15 | ESP = { 16 | size = "500M"; 17 | type = "EF00"; 18 | content = { 19 | type = "filesystem"; 20 | format = "vfat"; 21 | mountpoint = "/boot"; 22 | }; 23 | }; 24 | swap = { 25 | size = swapSize; 26 | content = { 27 | type = "swap"; 28 | resumeDevice = true; 29 | }; 30 | }; 31 | root = { 32 | size = "100%"; 33 | content = { 34 | type = "filesystem"; 35 | format = "ext4"; 36 | mountpoint = "/nix"; 37 | }; 38 | }; 39 | }; 40 | }; 41 | }; 42 | }; 43 | nodev = { 44 | "/" = { 45 | fsType = "tmpfs"; 46 | mountOptions = [ "defaults" "size=12G" "mode=755" ]; 47 | }; 48 | }; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /system/audio.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: 2 | { 3 | services.pulseaudio.enable = false; 4 | security.rtkit.enable = true; 5 | services.pipewire = { 6 | enable = true; 7 | audio.enable = true; 8 | pulse.enable = true; 9 | alsa.enable = true; 10 | alsa.support32Bit = true; 11 | 12 | }; 13 | 14 | environment.systemPackages = with pkgs; 15 | [ pulsemixer ]; 16 | } 17 | -------------------------------------------------------------------------------- /system/default.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs, ... }: 2 | { 3 | imports = [ 4 | ./audio.nix 5 | ./user.nix 6 | ./impermanence.nix 7 | # ./stylix.nix 8 | ]; 9 | 10 | systemd = { 11 | packages = [ pkgs.cloudflare-warp ]; 12 | services."warp-svc".wantedBy = [ "multi-user.target" ]; 13 | user.services."warp-taskbar".wantedBy = [ "tray.target" ]; 14 | }; 15 | 16 | environment.systemPackages = with pkgs;[ 17 | cloudflare-warp 18 | libcxxStdenv 19 | clang 20 | gcc 21 | git 22 | curl 23 | neovim 24 | unzip 25 | nixd 26 | libnotify 27 | kitty 28 | xorg.xrdb 29 | st 30 | ]; 31 | 32 | fonts.packages = [ 33 | pkgs.dejavu_fonts 34 | pkgs.nerd-fonts.symbols-only 35 | pkgs.nerd-fonts.iosevka-term-slab 36 | ]; 37 | 38 | nix.nixPath = [ "nixpkgs=${inputs.nixpkgs}" ]; 39 | 40 | programs.hyprland.enable = true; 41 | 42 | nixpkgs.config.allowUnfree = true; 43 | nixpkgs.overlays = [ 44 | inputs.nur.overlays.default 45 | (self: super: { 46 | st = super.st.overrideAttrs (old: { 47 | src = pkgs.fetchFromGitHub { 48 | owner = " samiulbasirfahim "; 49 | repo = "st"; 50 | rev = "926ad9f29b179bd5fe16f4e07dbdcec83def6785"; 51 | hash = "sha256-hwX1XhSX8KhXHROuKLEMzdYtd86/aMsetIycPLN0l2I="; 52 | }; 53 | buildInputs = (old.buildInputs or [ ]) ++ [ pkgs.harfbuzz ]; 54 | nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ pkgs.pkg-config ]; 55 | }); 56 | }) 57 | ]; 58 | 59 | 60 | nix = { 61 | gc = { 62 | automatic = true; 63 | dates = "weekly"; 64 | options = "--delete-older-than 7d"; 65 | }; 66 | settings = { 67 | experimental-features = [ "nix-command" "flakes" ]; 68 | }; 69 | }; 70 | 71 | 72 | services.gvfs.enable = true; 73 | programs.nano.enable = false; 74 | powerManagement = { 75 | enable = true; 76 | cpuFreqGovernor = "performancee"; 77 | }; 78 | 79 | services.udev.extraRules = '' 80 | SUBSYSTEM=="pci", DRIVER=="amdgpu", ATTR{power_dpm_force_performance_level}="high" 81 | ''; 82 | } 83 | -------------------------------------------------------------------------------- /system/impermanence.nix: -------------------------------------------------------------------------------- 1 | { inputs, ... }: { 2 | imports = [ inputs.impermanence.nixosModules.impermanence ]; 3 | 4 | programs.fuse.userAllowOther = true; 5 | fileSystems."/nix".neededForBoot = true; 6 | 7 | system.activationScripts.createPersist = "mkdir -p /persist"; 8 | 9 | environment.persistence."/nix/persist" = { 10 | hideMounts = true; 11 | directories = 12 | [ "/etc/nixos" "/var/lib/" "/etc/NetworkManager/system-connections" ]; 13 | files = [ 14 | "/etc/machine-id" 15 | { 16 | file = "/var/keys/secret_file"; 17 | parentDirectory = { mode = "u=rwx,g=,o="; }; 18 | } 19 | ]; 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /system/stylix.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs, ... }: { 2 | imports = [ 3 | inputs.stylix.nixosModules.stylix 4 | ]; 5 | stylix = { 6 | base16Scheme = "${pkgs.base16-schemes}/share/themes/rose-pine.yaml"; 7 | enable = true; 8 | image = ../home/rxen/hyprland/wallhaven-5gx2q5.png; 9 | polarity = "dark"; 10 | 11 | opacity.terminal = 0.9; 12 | opacity.popups = 0.9; 13 | 14 | cursor = { 15 | package = pkgs.vimix-cursors; 16 | name = "Vimix-white-cursors"; 17 | size = 14; 18 | }; 19 | 20 | fonts = { 21 | sizes = { 22 | applications = 11; 23 | terminal = 14; 24 | desktop = 12; 25 | popups = 11; 26 | }; 27 | 28 | monospace = { 29 | package = pkgs.nerd-fonts.zed-mono; 30 | name = "Rxen Sans"; 31 | }; 32 | 33 | serif = { 34 | package = pkgs.nerd-fonts.zed-mono; 35 | name = "Rxen Sans"; 36 | }; 37 | 38 | sansSerif = { 39 | package = pkgs.nerd-fonts.zed-mono; 40 | name = "Rxen Sans"; 41 | }; 42 | 43 | emoji = { 44 | package = pkgs.noto-fonts-emoji; 45 | name = "Noto Color Emoji"; 46 | }; 47 | 48 | }; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /system/user.nix: -------------------------------------------------------------------------------- 1 | { inputs, self, pkgs, lib, config, ... }: 2 | let 3 | user = "rxen"; 4 | in 5 | { 6 | imports = [ 7 | inputs.home-manager.nixosModules.home-manager 8 | ]; 9 | 10 | users.users."${user}" = { 11 | isNormalUser = true; 12 | extraGroups = [ "wheel" ]; 13 | initialPassword = "f4h1m"; 14 | }; 15 | 16 | 17 | users.defaultUserShell = pkgs.zsh; 18 | programs.zsh.enable = true; 19 | 20 | home-manager = { 21 | backupFileExtension = "bkp"; 22 | useUserPackages = true; 23 | useGlobalPkgs = true; 24 | extraSpecialArgs = { inherit inputs user self; }; 25 | users."${user}" = import ../home/${user}; 26 | }; 27 | 28 | services.getty.autologinUser = "${user}"; 29 | 30 | systemd.services.persistence-folder = { 31 | script = '' 32 | mkdir -p /nix/persist/home/${user} 33 | chown ${user} /nix/persist/home/${user} 34 | ''; 35 | wantedBy = [ "multi-user.target" ]; 36 | serviceConfig = { 37 | Type = "oneshot"; 38 | }; 39 | }; 40 | } 41 | --------------------------------------------------------------------------------