diff --git a/flake.lock b/flake.lock index 6ecc379..e03935e 100644 --- a/flake.lock +++ b/flake.lock @@ -9,11 +9,11 @@ ] }, "locked": { - "lastModified": 1684153753, - "narHash": "sha256-PVbWt3qrjYAK+T5KplFcO+h7aZWfEj1UtyoKlvcDxh0=", + "lastModified": 1690228878, + "narHash": "sha256-9Xe7JV0krp4RJC9W9W9WutZVlw6BlHTFMiUP/k48LQY=", "owner": "ryantm", "repo": "agenix", - "rev": "db5637d10f797bb251b94ef9040b237f4702cde3", + "rev": "d8c973fd228949736dedf61b7f8cc1ece3236792", "type": "github" }, "original": { @@ -25,11 +25,11 @@ "arkenfox-userjs": { "flake": false, "locked": { - "lastModified": 1683284168, - "narHash": "sha256-EWa9vkzprNuBFV+HpO6yBrClVtMTI5QmChErISW/SZY=", + "lastModified": 1691983650, + "narHash": "sha256-oA1bIpPc27Kk89n3JGpni7RkcIDRVAsTjUfjRHbKS24=", "owner": "arkenfox", "repo": "user.js", - "rev": "04e6e77439bfa6e3f6b7b9c5e0afac7f74f0586a", + "rev": "915f39959c7e077f00477e6ce34a0f9f9e3e7c6b", "type": "github" }, "original": { @@ -55,38 +55,6 @@ "type": "github" } }, - "cmp-async-path": { - "flake": false, - "locked": { - "lastModified": 1673896803, - "narHash": "sha256-dgAiVbdMiKjiKWk+dJf/Zz8T20+D4OalGH5dTzYi5aM=", - "owner": "FelipeLema", - "repo": "cmp-async-path", - "rev": "d8229a93d7b71f22c66ca35ac9e6c6cd850ec61d", - "type": "github" - }, - "original": { - "owner": "FelipeLema", - "repo": "cmp-async-path", - "type": "github" - } - }, - "copilot-lua": { - "flake": false, - "locked": { - "lastModified": 1685261869, - "narHash": "sha256-jBTS8MeN7Ydf0ZY7JWbrxaGo/GeDoEClfULiJVfN8Wo=", - "owner": "zbirenbaum", - "repo": "copilot.lua", - "rev": "77e3a4907928f0813024e573b882dc879dfc0c6b", - "type": "github" - }, - "original": { - "owner": "zbirenbaum", - "repo": "copilot.lua", - "type": "github" - } - }, "darwin": { "inputs": { "nixpkgs": [ @@ -157,22 +125,6 @@ "type": "github" } }, - "flake-compat_4": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -181,11 +133,11 @@ ] }, "locked": { - "lastModified": 1685662779, - "narHash": "sha256-cKDDciXGpMEjP1n6HlzKinN0H+oLmNpgeCTzYnsA2po=", + "lastModified": 1690933134, + "narHash": "sha256-ab989mN63fQZBFrkk4Q8bYxQCktuHmBIBqUG1jl6/FQ=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "71fb97f0d875fd4de4994dfb849f2c75e17eb6c3", + "rev": "59cf3f1447cfc75087e7273b04b31e689a8599fb", "type": "github" }, "original": { @@ -199,11 +151,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1685546676, - "narHash": "sha256-XDbjJyAg6odX5Vj0Q22iI/gQuFvEkv9kamsSbQ+npaI=", + "lastModified": 1688466019, + "narHash": "sha256-VeM2akYrBYMsb4W/MmBo1zmaMfgbL4cH3Pu8PGyIwJ0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "6ef2707776c6379bc727faf3f83c0dd60b06e0c6", + "rev": "8e8d955c22df93dbe24f19ea04f47a74adbdc5ec", "type": "github" }, "original": { @@ -221,11 +173,11 @@ ] }, "locked": { - "lastModified": 1680392223, - "narHash": "sha256-n3g7QFr85lDODKt250rkZj2IFS3i4/8HBU2yKHO3tqw=", + "lastModified": 1688466019, + "narHash": "sha256-VeM2akYrBYMsb4W/MmBo1zmaMfgbL4cH3Pu8PGyIwJ0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "dcc36e45d054d7bb554c9cdab69093debd91a0b5", + "rev": "8e8d955c22df93dbe24f19ea04f47a74adbdc5ec", "type": "github" }, "original": { @@ -238,6 +190,24 @@ "inputs": { "systems": "systems" }, + "locked": { + "lastModified": 1692799911, + "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_3" + }, "locked": { "lastModified": 1685518550, "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", @@ -252,43 +222,16 @@ "type": "github" } }, - "flake-utils_2": { - "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "flake-utils_3": { - "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", - "type": "github" + "inputs": { + "systems": "systems_4" }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_4": { "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", "owner": "numtide", "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", "type": "github" }, "original": { @@ -298,30 +241,6 @@ } }, "gitignore": { - "inputs": { - "nixpkgs": [ - "neovim-nightly-overlay", - "hercules-ci-effects", - "hercules-ci-agent", - "pre-commit-hooks-nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1660459072, - "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore_2": { "inputs": { "nixpkgs": [ "pre-commit-hooks", @@ -344,16 +263,16 @@ }, "haskell-flake": { "locked": { - "lastModified": 1678745009, - "narHash": "sha256-ujfwSrkxThmHJozibkCnJmlXLVyxm+Cbo2Q4wXPbCS4=", + "lastModified": 1684780604, + "narHash": "sha256-2uMZsewmRn7rRtAnnQNw1lj0uZBMh4m6Cs/7dV5YF08=", "owner": "srid", "repo": "haskell-flake", - "rev": "26852ade574c712bc3912ad28de52b0c4cf7d4cb", + "rev": "74210fa80a49f1b6f67223debdbf1494596ff9f2", "type": "github" }, "original": { "owner": "srid", - "ref": "0.2.0", + "ref": "0.3.0", "repo": "haskell-flake", "type": "github" } @@ -362,16 +281,14 @@ "inputs": { "flake-parts": "flake-parts_3", "haskell-flake": "haskell-flake", - "nix-darwin": "nix-darwin", - "nixpkgs": "nixpkgs_4", - "pre-commit-hooks-nix": "pre-commit-hooks-nix" + "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1681758488, - "narHash": "sha256-RBd/RNq3wL52FvoajMwrnfyZPfq67KMzmp6rtNAx/2o=", + "lastModified": 1688568579, + "narHash": "sha256-ON0M56wtY/TIIGPkXDlJboAmuYwc73Hi8X9iJGtxOhM=", "owner": "hercules-ci", "repo": "hercules-ci-agent", - "rev": "ef296dd6211e2ffeb942f12e6232a2d9abdd488d", + "rev": "367dd8cd649b57009a6502e878005a1e54ad78c5", "type": "github" }, "original": { @@ -389,11 +306,11 @@ ] }, "locked": { - "lastModified": 1685557007, - "narHash": "sha256-0prbgwFJeBuLGJgNdOXCXQ8/oSamzkcNZYHr04ZXI2I=", + "lastModified": 1689397210, + "narHash": "sha256-fVxZnqxMbsDkB4GzGAs/B41K0wt/e+B/fLxmTFF/S20=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "6d8e62977dc34fd2c187879856ebb6cf1faabba9", + "rev": "0a63bfa3f00a3775ea3a6722b247880f1ffe91ce", "type": "github" }, "original": { @@ -402,6 +319,22 @@ "type": "github" } }, + "hmts-nvim": { + "flake": false, + "locked": { + "lastModified": 1692743873, + "narHash": "sha256-lfqJVj1HbFJ5H4mo6rKYrexaosqSh17+PQ9BWpcuxZI=", + "owner": "calops", + "repo": "hmts.nvim", + "rev": "34b825bd1c9ec1b6e2952c111753e2eb286c9e07", + "type": "github" + }, + "original": { + "owner": "calops", + "repo": "hmts.nvim", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -430,11 +363,11 @@ ] }, "locked": { - "lastModified": 1685721552, - "narHash": "sha256-ifvq/zlO7lck8q+YkC5uom/h8/MVdMcQEldOL3cDQW0=", + "lastModified": 1692763155, + "narHash": "sha256-qMrGKZ8c/q/mHO3ZdrcBPwiVVXPLLgXjY98Ejqb5kAA=", "owner": "nix-community", "repo": "home-manager", - "rev": "29519461834c08395b35f840811faf8c23e3b61c", + "rev": "6a20e40acaebf067da682661aa67da8b36812606", "type": "github" }, "original": { @@ -448,11 +381,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1684479483, - "narHash": "sha256-NCkOkgR7PtkAQmYgeYd6vOzkulQjxlf+vWGUmrQu4uw=", + "lastModified": 1690635289, + "narHash": "sha256-ec77Yf7mqusmGkxrmYXEG4D0DqEcNRA3vFextWVQOVA=", "owner": "hyprwm", "repo": "contrib", - "rev": "805bedf51a2f75a2279b6fc75b3066ff21f235ee", + "rev": "bef073cff65917ba2d888aa4dc39bd9868e2b0a4", "type": "github" }, "original": { @@ -465,15 +398,16 @@ "inputs": { "hyprland-protocols": "hyprland-protocols", "nixpkgs": "nixpkgs_2", + "systems": "systems_2", "wlroots": "wlroots", "xdph": "xdph" }, "locked": { - "lastModified": 1685729674, - "narHash": "sha256-i5+/bAZVmCbeIKmnwyd2DG3mGrP4LOJWbsU7nJ1lzuA=", + "lastModified": 1692871050, + "narHash": "sha256-OJ/OkOLFn546rcXmj/3VEGlsPYjdXWAhEmjqdc6re6k=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "871ab24c6e9d2fb6e48cbf990ddddf0c46a950af", + "rev": "90c03e5bd2204ba6d1a0167c68f65b7a9231bef4", "type": "github" }, "original": { @@ -487,14 +421,18 @@ "nixpkgs": [ "hyprland", "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" ] }, "locked": { - "lastModified": 1684265364, - "narHash": "sha256-AxNnWbthsuNx73HDQr0eBxrcE3+yfl/WsaXZqUFmkpQ=", + "lastModified": 1691753796, + "narHash": "sha256-zOEwiWoXk3j3+EoF3ySUJmberFewWlagvewDRuWYAso=", "owner": "hyprwm", "repo": "hyprland-protocols", - "rev": "8c279b9fb0f2b031427dc5ef4eab53f2ed835530", + "rev": "0c2ce70625cb30aef199cb388f99e19a61a6ce03", "type": "github" }, "original": { @@ -508,11 +446,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1685378141, - "narHash": "sha256-/ehJbAtSJS86NlqHVOeR2ViBKlImKH4guFVPacTmCr8=", + "lastModified": 1692480535, + "narHash": "sha256-3Q0Uz/JPW9USHyAmrzRl6KhZLqMYTWkmtL3RA+oAeVY=", "owner": "hyprwm", "repo": "hyprpaper", - "rev": "cd86c196f3500f20539754d347c8378349ca0974", + "rev": "5e73eb60552d48d55541c60f9a8da2b666003fe6", "type": "github" }, "original": { @@ -537,40 +475,46 @@ "type": "github" } }, - "lspsaga-nvim": { - "flake": false, + "master": { "locked": { - "lastModified": 1685612219, - "narHash": "sha256-Cr4BAAMX0SEPM51JejjnhOUXigMIGvyzqFYYAZ426bU=", - "owner": "glepnir", - "repo": "lspsaga.nvim", - "rev": "c475ace5b8882631b351ef7c3e8078ca9ebbb751", + "lastModified": 1692893187, + "narHash": "sha256-Hbbp6bWQykkLsvzi7yo2KQme0oXCZkCdz9bBorcSKH4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d240553dcc2180fe486155bea8a846d5941e168c", "type": "github" }, "original": { - "owner": "glepnir", - "repo": "lspsaga.nvim", + "owner": "nixos", + "repo": "nixpkgs", "type": "github" } }, - "master": { + "naersk": { + "inputs": { + "nixpkgs": [ + "timers", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1685770779, - "narHash": "sha256-cJd4Bf0jUOG/l/k9I83IYsq9jDFPyLAfiIw1cjErcTU=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "f04dbdd29e954e51e98d2a0896c13180f5247143", + "lastModified": 1692351612, + "narHash": "sha256-KTGonidcdaLadRnv9KFgwSMh1ZbXoR/OBmPjeNMhFwU=", + "owner": "nix-community", + "repo": "naersk", + "rev": "78789c30d64dea2396c9da516bbcc8db3a475207", "type": "github" }, "original": { - "owner": "nixos", - "repo": "nixpkgs", + "owner": "nix-community", + "ref": "master", + "repo": "naersk", "type": "github" } }, "neovim-flake": { "inputs": { - "flake-utils": "flake-utils_3", + "flake-utils": "flake-utils_2", "nixpkgs": [ "neovim-nightly-overlay", "nixpkgs" @@ -578,11 +522,11 @@ }, "locked": { "dir": "contrib", - "lastModified": 1685727707, - "narHash": "sha256-qxmSnNjRxXuFfPNaDMnTPjn8890CN2EQ1Il8XVJhkKE=", + "lastModified": 1692744130, + "narHash": "sha256-Iod6+KGeWnX1SV4owXpSoC17iImCJjTq2iqEp6IRBZc=", "owner": "neovim", "repo": "neovim", - "rev": "a8ee4c7a81a8df3fe705e941e7d1c2c9e2f6194e", + "rev": "6462ee1c10f9f1aa66ffc4d4fe1b7b3d9f0f91af", "type": "github" }, "original": { @@ -601,11 +545,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1685750689, - "narHash": "sha256-ylsh7ELjDc4jHCBZgUVTD08aTD31SpXoqXnjlbGdyoQ=", + "lastModified": 1692749096, + "narHash": "sha256-XyFSBw3WMf5cTG9ImL6S/v9Aoawr38h/Fr1XIi7peEs=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "b9c2089d1936a81d466de8a2ccb9d75c22b5b7fd", + "rev": "83d68ba72f3308b5c90b12fb40044c870903e6ee", "type": "github" }, "original": { @@ -625,11 +569,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1685532165, - "narHash": "sha256-xHH9WbE9uya2B+j5w82HzpZVeErBt03/jtmWVRox0EU=", + "lastModified": 1691372739, + "narHash": "sha256-fZ8KfBMcIFO/R7xaWtB85SFeuUjb9SCH8fxYBnY8068=", "owner": "oxalica", "repo": "nil", - "rev": "dcd38b96c91a2d07552f824a6480e00dc7b4948a", + "rev": "97abe7d3d48721d4e0fcc1876eea83bb4247825b", "type": "github" }, "original": { @@ -638,32 +582,9 @@ "type": "github" } }, - "nix-darwin": { - "inputs": { - "nixpkgs": [ - "neovim-nightly-overlay", - "hercules-ci-effects", - "hercules-ci-agent", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1680266963, - "narHash": "sha256-IW/lzbUCOcldLHWHjNSg1YoViDnZOmz0ZJL7EH9OkV8=", - "owner": "LnL7", - "repo": "nix-darwin", - "rev": "99d4187d11be86b49baa3a1aec0530004072374f", - "type": "github" - }, - "original": { - "owner": "LnL7", - "repo": "nix-darwin", - "type": "github" - } - }, "nix-super": { "inputs": { - "flake-compat": "flake-compat_3", + "flake-compat": "flake-compat_2", "lowdown-src": "lowdown-src", "nixpkgs": [ "stable" @@ -671,11 +592,11 @@ "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1687621557, - "narHash": "sha256-FWtdWRmtzmqjjAsvYXefdZ2uVv5p5UfB7eftqsctSck=", + "lastModified": 1691953666, + "narHash": "sha256-HxgMSgoM19OnDb4h47nrxI2lRGsDo+4Y4JEHeCoWB+Q=", "owner": "privatevoid-net", "repo": "nix-super", - "rev": "c39cdf9ad2365509a602f8e2c6faa35aec1097a3", + "rev": "65e8abac80cc06f9f05147b51908a47549e9342e", "type": "github" }, "original": { @@ -703,11 +624,11 @@ "nixpkgs-lib": { "locked": { "dir": "lib", - "lastModified": 1682879489, - "narHash": "sha256-sASwo8gBt7JDnOOstnps90K1wxmVfyhsTPPNTGBPjjg=", + "lastModified": 1688049487, + "narHash": "sha256-100g4iaKC9MalDjUW9iN6Jl/OocTDtXdeAj7pEGIRh4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "da45bf6ec7bbcc5d1e14d3795c025199f28e0de0", + "rev": "4bc72cae107788bf3f24f30db2e2f685c9298dc9", "type": "github" }, "original": { @@ -736,43 +657,27 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1678872516, - "narHash": "sha256-/E1YwtMtFAu2KUQKV/1+KFuReYPANM2Rzehk84VxVoc=", + "lastModified": 1685801374, + "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9b8e5abb18324c7fe9f07cb100c3cd4a29cda8b8", + "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-22.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-stable_2": { - "locked": { - "lastModified": 1678872516, - "narHash": "sha256-/E1YwtMtFAu2KUQKV/1+KFuReYPANM2Rzehk84VxVoc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "9b8e5abb18324c7fe9f07cb100c3cd4a29cda8b8", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-22.11", + "ref": "nixos-23.05", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1685655444, - "narHash": "sha256-6EujQNAeaUkWvpEZZcVF8qSfQrNVWFNNGbUJxv/A5a8=", + "lastModified": 1692638711, + "narHash": "sha256-J0LgSFgJVGCC1+j5R2QndadWI1oumusg6hCtYAzLID4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e635192892f5abbc2289eaac3a73cdb249abaefd", + "rev": "91a22f76cd1716f9d0149e8a5c68424bb691de15", "type": "github" }, "original": { @@ -800,11 +705,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1680213900, - "narHash": "sha256-cIDr5WZIj3EkKyCgj/6j3HBH4Jj1W296z7HTcWj1aMA=", + "lastModified": 1688322751, + "narHash": "sha256-eW62dC5f33oKZL7VWlomttbUnOTHrAbte9yNUNW8rbk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e3652e0735fbec227f342712f180f4f21f0594f2", + "rev": "0fbe93c5a7cac99f90b60bdf5f149383daaa615f", "type": "github" }, "original": { @@ -816,11 +721,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1685677062, - "narHash": "sha256-zoHF7+HNwNwne2XEomphbdc4Y8tdWT16EUxUTXpOKpQ=", + "lastModified": 1692557222, + "narHash": "sha256-TCOtZaioLf/jTEgfa+nyg0Nwq5Uc610Z+OFV75yUgGw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "95be94370d09f97f6af6a1df1eb9649b5260724e", + "rev": "0b07d4957ee1bd7fd3bdfd12db5f361bd70175a6", "type": "github" }, "original": { @@ -832,11 +737,11 @@ }, "nixpkgs_6": { "locked": { - "lastModified": 1685677062, - "narHash": "sha256-zoHF7+HNwNwne2XEomphbdc4Y8tdWT16EUxUTXpOKpQ=", + "lastModified": 1692808169, + "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "95be94370d09f97f6af6a1df1eb9649b5260724e", + "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", "type": "github" }, "original": { @@ -848,16 +753,32 @@ }, "nixpkgs_7": { "locked": { - "lastModified": 1681303793, - "narHash": "sha256-JEdQHsYuCfRL2PICHlOiH/2ue3DwoxUX7DJ6zZxZXFk=", + "lastModified": 1689261696, + "narHash": "sha256-LzfUtFs9MQRvIoQ3MfgSuipBVMXslMPH/vZ+nM40LkA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fe2ecaf706a5907b5e54d979fbde4924d84b65fc", + "rev": "df1eee2aa65052a18121ed4971081576b25d6b5c", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1692934111, + "narHash": "sha256-9EEE59v/esKNMR5zKbLRV9NoRPYvERw5jHQOnfr47bk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1e44a037bbf4fcaba041436e65e87be88f3f495b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -865,11 +786,11 @@ "nvim-treesitter-textsubjects": { "flake": false, "locked": { - "lastModified": 1676144693, - "narHash": "sha256-4jb9v0xpO17wp85dzojKUQ6hUdNBx3T2tB4fSWoANus=", + "lastModified": 1691029837, + "narHash": "sha256-O57pMYtDR713ItAeUfdkcl2IfBLQcLEa2sb+AXhaqDs=", "owner": "RRethy", "repo": "nvim-treesitter-textsubjects", - "rev": "b913508f503527ff540f7fe2dcf1bf1d1f259887", + "rev": "df75fcec548014f158cda6498ac38c4622c221e1", "type": "github" }, "original": { @@ -880,45 +801,18 @@ }, "pre-commit-hooks": { "inputs": { - "flake-compat": "flake-compat_4", - "flake-utils": "flake-utils_4", - "gitignore": "gitignore_2", - "nixpkgs": "nixpkgs_7", - "nixpkgs-stable": "nixpkgs-stable_2" - }, - "locked": { - "lastModified": 1685361114, - "narHash": "sha256-4RjrlSb+OO+e1nzTExKW58o3WRwVGpXwj97iCta8aj4=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "ca2fdbf3edda2a38140184da6381d49f8206eaf4", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix": { - "inputs": { - "flake-compat": "flake-compat_2", - "flake-utils": "flake-utils_2", + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_3", "gitignore": "gitignore", - "nixpkgs": [ - "neovim-nightly-overlay", - "hercules-ci-effects", - "hercules-ci-agent", - "nixpkgs" - ], + "nixpkgs": "nixpkgs_7", "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1680170909, - "narHash": "sha256-FtKU/edv1jFRr/KwUxWTYWXEyj9g8GBrHntC2o8oFI8=", + "lastModified": 1692274144, + "narHash": "sha256-BxTQuRUANQ81u8DJznQyPmRsg63t4Yc+0kcyq6OLz8s=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "29dbe1efaa91c3a415d8b45d62d48325a4748816", + "rev": "7e3517c03d46159fdbf8c0e5c97f82d5d4b0c8fa", "type": "github" }, "original": { @@ -930,11 +824,11 @@ "rofi-wayland": { "flake": false, "locked": { - "lastModified": 1679493688, - "narHash": "sha256-8Hu9k84LNi+Gz8zJNE7AxYxmv8XXQz3cG7CFhv31fz4=", + "lastModified": 1690115482, + "narHash": "sha256-fUneGsSWpi8zYrTbF14e/fuf0vaXF8ckOo4OhL1tInM=", "owner": "lbonn", "repo": "rofi", - "rev": "d06095b5ed40e5d28236b7b7b575ca867696d847", + "rev": "ff2338c38fbf6e7049563acf55f9055bcf882a4e", "type": "github" }, "original": { @@ -949,14 +843,12 @@ "agenix": "agenix", "arkenfox-userjs": "arkenfox-userjs", "asus-touchpad-numpad-driver": "asus-touchpad-numpad-driver", - "cmp-async-path": "cmp-async-path", - "copilot-lua": "copilot-lua", "flake-utils": "flake-utils", + "hmts-nvim": "hmts-nvim", "home-manager": "home-manager_2", "hypr-contrib": "hypr-contrib", "hyprland": "hyprland", "hyprpaper": "hyprpaper", - "lspsaga-nvim": "lspsaga-nvim", "master": "master", "neovim-nightly-overlay": "neovim-nightly-overlay", "nil": "nil", @@ -966,7 +858,9 @@ "pre-commit-hooks": "pre-commit-hooks", "rofi-wayland": "rofi-wayland", "smartcolumn-nvim": "smartcolumn-nvim", - "stable": "stable" + "stable": "stable", + "telekasten-nvim": "telekasten-nvim", + "timers": "timers" } }, "rust-overlay": { @@ -981,11 +875,11 @@ ] }, "locked": { - "lastModified": 1685413459, - "narHash": "sha256-+ELexqS2yN0wj1WnmWdF24OfjRBIgTN6Ltcpjvp2dEo=", + "lastModified": 1688783586, + "narHash": "sha256-HHaM2hk2azslv1kH8zmQxXo2e7i5cKgzNIuK4yftzB0=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "9b3284e2412f76bd68ff46f8cf1c7af44d7ffac0", + "rev": "7a29283cc242c2486fc67f60b431ef708046d176", "type": "github" }, "original": { @@ -997,11 +891,11 @@ "smartcolumn-nvim": { "flake": false, "locked": { - "lastModified": 1679417638, - "narHash": "sha256-DjPWBOLbzdfOQAx+6xgV1CD5NKuP1N6An2lmHNHd39Q=", + "lastModified": 1692020684, + "narHash": "sha256-lNEsAkKRpMgdO6Og0odpTn/t4qkzO7EuTjC5ABJhvXc=", "owner": "m4xshen", "repo": "smartcolumn.nvim", - "rev": "0c572e3eae48874f25b74394a486f38cadb5c958", + "rev": "4aa00ad766f3c0f0e2561e0eb42df3ea3743c135", "type": "github" }, "original": { @@ -1012,11 +906,11 @@ }, "stable": { "locked": { - "lastModified": 1685620773, - "narHash": "sha256-iQ+LmporQNdLz8uMJdP62TaAWeLUwl43/MYUBtWqulM=", + "lastModified": 1692794066, + "narHash": "sha256-H0aG8r16dj0x/Wz6wQhQxc9V7AsObOiHPaKxQgH6Y08=", "owner": "nixos", "repo": "nixpkgs", - "rev": "f0ba8235153dd2e25cf06cbf70d43efdd4443592", + "rev": "fc944919f743bb22379dddf18dcb72db6cff84aa", "type": "github" }, "original": { @@ -1041,21 +935,136 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "telekasten-nvim": { + "flake": false, + "locked": { + "lastModified": 1691743763, + "narHash": "sha256-zYBMUzanFtjnsUrwxjHLvhRODLj1uwGi18wMUWnrqRA=", + "owner": "renerocksai", + "repo": "telekasten.nvim", + "rev": "584783fdbdd13bb691a435f86ed10a3717fa9e9a", + "type": "github" + }, + "original": { + "owner": "renerocksai", + "repo": "telekasten.nvim", + "type": "github" + } + }, + "timers": { + "inputs": { + "naersk": "naersk", + "nixpkgs": "nixpkgs_8", + "utils": "utils" + }, + "locked": { + "lastModified": 1693040925, + "narHash": "sha256-AhJSwmp7XN/9V66EYHFnNuIAjqOrYUN3LGRjwrTN6T0=", + "ref": "refs/heads/main", + "rev": "739f76fa90271860e2c1d683e3a53cfb93e6eb89", + "revCount": 27, + "type": "git", + "url": "https://gitea.moritzboeh.me/moritz/timers.git" + }, + "original": { + "type": "git", + "url": "https://gitea.moritzboeh.me/moritz/timers.git" + } + }, + "utils": { + "inputs": { + "systems": "systems_5" + }, + "locked": { + "lastModified": 1692799911, + "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "wlroots": { "flake": false, "locked": { "host": "gitlab.freedesktop.org", - "lastModified": 1685723274, - "narHash": "sha256-mjETVZbVheaSO0VRKQHWYAHcoKwYu0WZ0vhKVN7vyRo=", + "lastModified": 1691073628, + "narHash": "sha256-LlxE3o3UzRY7APYVLGNKM30DBMcDifCRIQiMVSbYLIc=", "owner": "wlroots", "repo": "wlroots", - "rev": "6668c822b3bf58ca5af5d370ef03b075be3e4d27", + "rev": "c74f89d4f84bfed0284d3908aee5d207698c70c5", "type": "gitlab" }, "original": { "host": "gitlab.freedesktop.org", "owner": "wlroots", "repo": "wlroots", + "rev": "c74f89d4f84bfed0284d3908aee5d207698c70c5", "type": "gitlab" } }, @@ -1068,14 +1077,18 @@ "nixpkgs": [ "hyprland", "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" ] }, "locked": { - "lastModified": 1685385764, - "narHash": "sha256-r+XMyOoRXq+hlfjayb+fyi9kq2JK48TrwuNIAXqlj7U=", + "lastModified": 1691841170, + "narHash": "sha256-RCTm1/MVWYPnReMgyp7tr2ogGYo/pvw38jZaFwemgPU=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "4d9ff0c17716936e0b5ca577a39e263633901ed1", + "rev": "57a3a41ba6b358109e4fc25c6a4706b5f7d93c6b", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 9eae8fc..91ccddd 100644 --- a/flake.nix +++ b/flake.nix @@ -35,21 +35,18 @@ # Neovim neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay"; - cmp-async-path.url = "github:FelipeLema/cmp-async-path"; - cmp-async-path.flake = false; - - copilot-lua.flake = false; - copilot-lua.url = "github:zbirenbaum/copilot.lua"; - - lspsaga-nvim.flake = false; - lspsaga-nvim.url = "github:glepnir/lspsaga.nvim"; - nvim-treesitter-textsubjects.flake = false; nvim-treesitter-textsubjects.url = "github:RRethy/nvim-treesitter-textsubjects"; smartcolumn-nvim.flake = false; smartcolumn-nvim.url = "github:m4xshen/smartcolumn.nvim"; + telekasten-nvim.flake = false; + telekasten-nvim.url = "github:renerocksai/telekasten.nvim"; + + hmts-nvim.flake = false; + hmts-nvim.url = "github:calops/hmts.nvim"; + # Hyprland hypr-contrib.url = "github:hyprwm/contrib"; hyprland.url = "github:hyprwm/Hyprland"; @@ -62,6 +59,8 @@ # Firefox user.js arkenfox-userjs.url = "github:arkenfox/user.js"; arkenfox-userjs.flake = false; + + timers.url = "git+https://gitea.moritzboeh.me/moritz/timers.git"; }; /* diff --git a/hosts/nixos-desktop/default.nix b/hosts/nixos-desktop/default.nix index 43f39fa..30679e6 100644 --- a/hosts/nixos-desktop/default.nix +++ b/hosts/nixos-desktop/default.nix @@ -27,6 +27,8 @@ jetbrains.idea-community ]; + hardware.keyboard.qmk.enable = true; + # KERNEL boot.kernelPackages = pkgs.linuxPackages_latest; @@ -64,13 +66,7 @@ } ]; }; - networkmanager = { - enable = true; - dns = "none"; - }; - dhcpcd.extraConfig = '' - nohook resolv.conf - ''; + networkmanager.enable = true; }; hardware.nvidia.modesetting.enable = true; services.xserver.videoDrivers = [ "nvidia" ]; diff --git a/hosts/scadspc25/default.nix b/hosts/scadspc25/default.nix new file mode 100644 index 0000000..6e1633d --- /dev/null +++ b/hosts/scadspc25/default.nix @@ -0,0 +1,56 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running `nixos-help`). + +{ pkgs, ... }: + +{ + imports = + [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; + + + my = { + yubikey.luksSupport.enable = false; + profiles = { + desktop.enable = true; + webis.enable = true; + }; + services.synology-drive.enable = true; + programs.hyprland.keyboardLayouts = [ "us" "de" ]; + }; + + # Use the systemd-boot EFI boot loader. + boot.loader.grub.enable = true; + boot.loader.grub.device = "nodev"; + boot.loader.grub.efiSupport = true; + boot.loader.efi.canTouchEfiVariables = true; + + networking.hostName = "scadspc25"; # Define your hostname. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Set your time zone. + time.timeZone = "Europe/Berlin"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + environment.systemPackages = with pkgs; [ + vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. + wget + ]; + + hardware.bluetooth.enable = true; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It's perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "23.05"; # Did you read the comment? + +} + diff --git a/hosts/scadspc25/hardware-configuration.nix b/hosts/scadspc25/hardware-configuration.nix new file mode 100644 index 0000000..d4d8fdb --- /dev/null +++ b/hosts/scadspc25/hardware-configuration.nix @@ -0,0 +1,72 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" "sr_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { + device = "/dev/disk/by-uuid/cfc2d232-f833-4ecf-8098-fe805afd390d"; + fsType = "btrfs"; + options = [ "subvol=root" "compress=zstd" "noatime" ]; + }; + + fileSystems."/home" = + { + device = "/dev/disk/by-uuid/cfc2d232-f833-4ecf-8098-fe805afd390d"; + fsType = "btrfs"; + options = [ "subvol=home" "compress=zstd" "noatime" ]; + }; + + fileSystems."/nix" = + { + device = "/dev/disk/by-uuid/cfc2d232-f833-4ecf-8098-fe805afd390d"; + fsType = "btrfs"; + options = [ "subvol=nix" "compress=zstd" "noatime" ]; + }; + + fileSystems."/var/log" = + { + device = "/dev/disk/by-uuid/cfc2d232-f833-4ecf-8098-fe805afd390d"; + fsType = "btrfs"; + options = [ "subvol=log" "compress=zstd" "noatime" ]; + }; + + fileSystems."/snapshots" = + { + device = "/dev/disk/by-uuid/cfc2d232-f833-4ecf-8098-fe805afd390d"; + fsType = "btrfs"; + options = [ "subvol=snapshots" "compress=zstd" "noatime" ]; + }; + + fileSystems."/boot" = + { + device = "/dev/disk/by-uuid/3B2B-63DB"; + fsType = "vfat"; + }; + + swapDevices = + [{ device = "/dev/disk/by-uuid/c08ff6b6-d6e2-4620-95fc-6c20b04c7363"; }]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp0s20f3.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/scadspc25/system.nix b/hosts/scadspc25/system.nix new file mode 100644 index 0000000..132026a --- /dev/null +++ b/hosts/scadspc25/system.nix @@ -0,0 +1 @@ +"x86_64-linux" diff --git a/modules/profiles/base.nix b/modules/profiles/base.nix index 518ae72..aefaac4 100644 --- a/modules/profiles/base.nix +++ b/modules/profiles/base.nix @@ -6,14 +6,70 @@ with lib; let - nom-system = pkgs.writeShellApplication { + nom-system = pkgs.writeFishApplication { name = "nom-system"; runtimeInputs = with pkgs; [ nix-output-monitor ]; - text = '' - nom build --no-link "/home/moritz/.dotfiles#nixosConfigurations.$(hostname).config.system.build.toplevel" + text = /* fish */ '' + nom build --no-link "/home/moritz/.dotfiles#nixosConfigurations.$(hostname).config.system.build.toplevel" $argv ''; }; - nom-system-command = command: "${nom-system}/bin/nom-system && ${command}"; + nom-system-command = name: command: pkgs.writeFishApplication { + inherit name; + runtimeInputs = with pkgs; [ nom-system nix ]; + text = /* fish */ '' + nom-system $argv && ${command} + ''; + }; + + f = pkgs.writeFishApplication { + name = "f"; + runtimeInputs = with pkgs; [ fzf bat ]; + text = /* fish */ '' + fzf --query "$argv" \ + --multi \ + --bind "enter:become($EDITOR {+})" \ + --preview "bat --color=always --style=header,grid --line-range :500 {+}" + ''; + }; + + which-nix = pkgs.writeFishApplication { + name = "which-nix"; + runtimeInputs = with pkgs; [ which coreutils-full ]; + text = /* fish */ '' + readlink -f (which $argv) + ''; + completions = /* fish */ '' + complete -c which-nix -fa '(__fish_complete_command)' + ''; + }; + + gi = pkgs.writeFishApplication + { + name = "gi"; + runtimeInputs = with pkgs; [ fzf gum curl ]; + text = /* fish */ '' + set url https://www.gitignore.io/api + + if test (count $argv) -eq 0 + set choice ( curl -sL $url/list \ + | string split "," \ + | fzf -m \ + | string join "," ) + else + set choice (string join "," $argv[1..]) + end + + if gum confirm "Overwrite current .gitignore?" + curl -sL $url/$choice > .gitignore + else + curl -sL $url/$choice >> .gitignore + end + ''; + completions = /* fish */ '' + set args (curl -sL https://www.gitignore.io/api/list | string split ",") + complete -c gi -fa "$args" + ''; + }; in { users.users.moritz = { @@ -43,12 +99,8 @@ in cat = "bat"; rm = "rm -i"; mv = "mv -i"; - cd = "z"; + cd = "__zoxide_z"; - f = "fzf --multi --bind \"enter:become($EDITOR {+})\""; - - nixos-switch = nom-system-command "sudo nixos-rebuild switch --flake ~/.dotfiles"; - nixos-boot = nom-system-command "sudo nixos-rebuild boot --flake ~/.dotfiles"; nixos-update = "pushd ~/.dotfiles && nix flake update && popd"; latexwatch = ''find -type f -name "*.tex" | entr -c latexmk -pdf -silent''; @@ -60,7 +112,6 @@ in fish.enable = true; git.enable = true; gpg.enable = true; - navi.enable = true; nix = { gc.enable = true; optimise.enable = true; @@ -96,12 +147,15 @@ in bottom # nix + (nom-system-command "nixos-boot" "sudo nixos-rebuild boot --flake ~/.dotfiles") + (nom-system-command "nixos-switch" "sudo nixos-rebuild switch --flake ~/.dotfiles") comma + manix nix-index + nix-output-monitor nixpkgs-fmt statix - manix - nix-output-monitor + which-nix # other bat @@ -110,17 +164,19 @@ in duf entr exa + f + gi gparted neofetch reptyr ripgrep up + vim viu wget - vim ]; - fonts.fonts = with pkgs; [ + fonts.packages = with pkgs; [ (nerdfonts.override { fonts = [ "FiraCode" ]; }) @@ -154,9 +210,15 @@ in enable = true; defaultOptions = [ "--height 50%" + "--bind alt-j:preview-down,alt-k:preview-up" + ]; + }; + zoxide = { + enable = true; + options = [ + "--cmd c" ]; }; - zoxide.enable = true; }; home = { username = "moritz"; diff --git a/modules/profiles/desktop.nix b/modules/profiles/desktop.nix index bae0d2f..f23ec05 100644 --- a/modules/profiles/desktop.nix +++ b/modules/profiles/desktop.nix @@ -36,7 +36,25 @@ in nix-edit.enable = mkDefault true; nvim.enable = mkDefault true; python.versions."311".enable = mkDefault true; - spotify.enable = mkDefault true; + spotify-player = { + enable = mkDefault true; + package = pkgs.spotify-player.overrideAttrs (old: { + buildFeatures = lib.lists.remove "notify" (old.buildFeatures or [ ]); + }); + config = { + client_id = "3172dbeaf64949728920c58b823bc24b"; + copy_command = { + command = "wl-copy"; + args = [ ]; + }; + enable_cover_image_cache = true; + default_device = "spotify-player-daemon"; + enable_streaming = false; + playback_window_position = "Bottom"; + cover_img_length = 20; + cover_img_width = 10; + }; + }; ssh.enable = mkDefault true; thunar.enable = mkDefault true; wallpaper.enable = mkDefault true; @@ -47,6 +65,20 @@ in gammastep.enable = true; kdeconnect.enable = mkDefault true; printing.enable = true; + spotify-player = { + enable = mkDefault true; + config = { + client_id = "3172dbeaf64949728920c58b823bc24b"; + device = { + name = "spotify-player-daemon"; + device_type = "computer"; + volume = 70; + bitrate = 320; + audio_cache = true; + }; + }; + }; + timers.enable = true; wireguard.enable = true; }; }; @@ -75,6 +107,7 @@ in }; services = { illum.enable = true; + resolved.enable = true; gnome.gnome-keyring.enable = true; pipewire = { enable = true; diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix index 549a363..de683ab 100644 --- a/modules/programs/fish.nix +++ b/modules/programs/fish.nix @@ -43,28 +43,22 @@ in # visual mode, but due to fish_cursor_default, is redundant here set fish_cursor_visual block + # Completions + complete -c c -kfa '(zoxide query -l | sed "s|$HOME|~|")' + ${optionalString config.virtualisation.podman.dockerCompat /* fish */ "complete -c docker -w podman"} + + complete -c timers \ + -n "__fish_seen_subcommand_from toggle" \ + -fa '(timers --json l | ${getExe pkgs.jq} -r .[][].name)' + + complete -c timers \ + -n "__fish_seen_subcommand_from remove" \ + -fa '(timers --json l | ${getExe pkgs.jq} -r .[][].name)' + # Variables ${exportedVariables} ''; functions = { - gi = with pkgs; '' - set url https://www.gitignore.io/api - - if test (count $argv) -eq 0 - set choice ( curl -sL $url/list \ - | string split "," \ - | ${fzf}/bin/fzf -m \ - | string join "," ) - else - set choice (string join "," $argv[1..]) - end - - if ${gum}/bin/gum confirm "Overwrite current .gitignore?" - ${curl}/bin/curl -sL $url/$choice > .gitignore - else - ${curl}/bin/curl -sL $url/$choice >> .gitignore - end - ''; fish_greeting = ""; cheat = "cht.sh $argv | bat -p"; }; diff --git a/modules/programs/hyprland/_config.nix b/modules/programs/hyprland/_config.nix index 67cd433..c8b5aab 100644 --- a/modules/programs/hyprland/_config.nix +++ b/modules/programs/hyprland/_config.nix @@ -7,8 +7,6 @@ with lib; let cfg = config.my.programs.hyprland; - boolToYesNo = bool: if bool then "yes" else "no"; - mkRule = rule: windowRegexes: "windowrulev2 = ${rule},${concatStringsSep "," windowRegexes}"; mkRules = rules: windowRegexes: concatStringsSep "\n" (map (flip mkRule windowRegexes) rules); in @@ -58,12 +56,14 @@ in # See https://wiki.hyprland.org/Configuring/Variables/ for more rounding = 3 - blur = ${boolToYesNo cfg.blur} - blur_size = 3 - blur_passes = 3 - blur_new_optimizations = on + blur { + enabled = ${boolToString cfg.blur} + size = 3 + passes = 3 + new_optimizations = on + } - drop_shadow = ${boolToYesNo cfg.shadows} + drop_shadow = ${boolToString cfg.shadows} shadow_range = 10 shadow_render_power = 2 @@ -73,7 +73,7 @@ in animations { enabled = yes - # Some default Lanimations, see https://wiki.hyprland.org/Configuring/Animations/ for more + # see https://wiki.hyprland.org/Configuring/Animations/ for more bezier = sine, 0.445, 0.05, 0.55, 0.95 bezier = quad, 0.455, 0.03, 0.515, 0.955 @@ -120,16 +120,6 @@ in # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more - ${optionalString cfg.blur '' - # Kitty - windowrulev2 = opacity 0.95 0.95, class:^kitty$ - - # Rofi - ${mkRules ["float" "opacity 0.85 0.85" "noborder"] ["class:^([rR]ofi)$"]} - - windowrulev2 = opacity 0.85 0.85, floating:1 - ''} - # Firefox Sharing Indicator ${mkRules ["float" "move 49% 40" "noborder" "nofullscreenrequest"] ["title:^(.*Sharing Indicator)$"]} diff --git a/modules/programs/hyprland/default.nix b/modules/programs/hyprland/default.nix index 2805a2e..e208565 100644 --- a/modules/programs/hyprland/default.nix +++ b/modules/programs/hyprland/default.nix @@ -9,7 +9,7 @@ with lib; let cfg = config.my.programs.hyprland; - hyprland = pkgs.hyprland.override { nvidiaPatches = cfg.nvidiaSupport; }; + hyprland = pkgs.hyprland.override { enableNvidiaPatches = cfg.nvidiaSupport; }; in { options.my.programs.hyprland = { @@ -38,7 +38,6 @@ in wallpaper.enable = true; kitty.enable = true; rofi.enable = true; - }; wallpapers.enable = true; services.dunst.enable = true; @@ -62,18 +61,6 @@ in home-manager.users.moritz.programs.waybar = { enable = true; - # use package with hyprland support for switching workspaces - package = pkgs.symlinkJoin { - name = "waybar-hyprland"; - paths = [ pkgs.waybar-hyprland ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; - postBuild = '' - wrapProgram $out/bin/waybar \ - --prefix PATH ":" "${hyprland}/bin" - ''; - }; - - # start using systemd service systemd = { enable = true; @@ -85,14 +72,9 @@ in layer = "top"; position = "top"; height = 20; - modules-left = [ "wlr/workspaces" ]; + modules-left = [ "hyprland/workspaces" ]; modules-center = [ "hyprland/window" ]; - modules-right = [ "network" "memory" "cpu" "battery" "clock" ]; - modules = { - "wlr/workspaces" = { - on-click = "activate"; - }; - }; + modules-right = [ "hyprland/language" "network" "memory" "cpu" "battery" "clock" ]; }; }; }; diff --git a/modules/programs/kitty.nix b/modules/programs/kitty.nix index 1261a65..a1e5b56 100644 --- a/modules/programs/kitty.nix +++ b/modules/programs/kitty.nix @@ -21,6 +21,7 @@ in cursor_shape = "underline"; window_padding_width = 3; confirm_os_window_close = 0; + background_opacity = "0.9"; }; keybindings = { "ctrl+plus" = "change_font_size all +2.0"; diff --git a/modules/programs/nvim/default.nix b/modules/programs/nvim/default.nix index 7e88008..f39da7c 100644 --- a/modules/programs/nvim/default.nix +++ b/modules/programs/nvim/default.nix @@ -12,14 +12,8 @@ let id = x: x; listToString = sep: f: list: ''{ ${concatStringsSep sep (map f list)} }''; listToStringOneLine = listToString ", "; - listToStringMultiLine = listToString ",\n"; - keybinding = - { key - , cmd - , func - , mode - , desc - }: + listToStringMultiLine' = listToString ",\n" id; + keybinding = { key, cmd, func, mode, desc }: let cmdString = if cmd != null @@ -30,42 +24,30 @@ let then func else abort "Either cmd or function must be set" ); + descString = optionalString (desc != null) "desc = ${quote desc},"; in - ''{ ${quote key}, ${cmdString}, mode = ${quote mode}, ${optionalString (desc != null) "desc = ${quote desc},"} }''; + ''{ ${quote key}, ${cmdString}, mode = ${quote mode}, ${descString} }''; lazySpecFromPlugin = - { plugin - , dependencies - , init - , conf - , lazy - , event - , enabled - , cmd - , ft - , priority - , keys - }: - listToStringMultiLine id + { plugin, dependencies, init, conf, lazy, event, enabled, cmd, ft, priority, keys }: + listToStringMultiLine' ([ "dir = ${quote plugin}" - "name = ${quote plugin.name}" - "lazy = ${boolToString lazy}" + "name = ${quote (getName plugin)}" ] + ++ (optional (lazy != null) "lazy = ${boolToString lazy}") ++ (optional (!enabled) "enabled = ${boolToString enabled}") - ++ (optional (dependencies != [ ]) "dependencies = ${listToStringMultiLine id (map lazySpecFromPlugin dependencies)}") + ++ (optional (dependencies != [ ]) "dependencies = ${listToStringMultiLine' (map lazySpecFromPlugin dependencies)}") ++ (optional (init != null) "init = function(plugin)\n${toString init}\nend") ++ (optional (conf != null) "config = function(plugin, opts)\n${toString conf}\nend") - ++ (optional (keys != [ ]) "keys = ${listToStringMultiLine id (map keybinding keys)}") + ++ (optional (keys != [ ]) "keys = ${listToStringMultiLine' (map keybinding keys)}") ++ (optional (event != [ ]) "event = ${listToStringOneLine quote event}") ++ (optional (cmd != [ ]) "cmd = ${listToStringOneLine quote cmd}") ++ (optional (ft != [ ]) "ft = ${listToStringOneLine quote ft}") - ++ (optional (priority != 50) "priority = ${toString priority}") + ++ (optional (priority != null) "priority = ${toString priority}") ); - lazySpecs = listToStringMultiLine id (map lazySpecFromPlugin cfg.plugins); - lazy = '' - require("lazy").setup({ - ${lazySpecs} - }) + lazySpecs = listToStringMultiLine' (map lazySpecFromPlugin cfg.plugins); + lazy = /* lua */ '' + require("lazy").setup(${lazySpecs}) ''; in { @@ -86,7 +68,7 @@ in type = nullOr str; default = null; description = '' - Lua code to be executed when the plugin is loaded. + Lua function to be executed when the plugin is loaded. ''; }; dependencies = mkOption { @@ -111,8 +93,8 @@ in ''; }; lazy = mkOption { - type = bool; - default = true; + type = nullOr bool; + default = null; description = '' Whether to load the plugin lazily. ''; @@ -145,8 +127,8 @@ in ''; }; priority = mkOption { - type = int; - default = 50; + type = nullOr int; + default = null; description = '' Priority to load the plugin. ''; @@ -213,7 +195,17 @@ in else neovide ) ]; - + xdg.configFile."nvim/init.lua" = { + source = + let + text = lib.concatLines [ (builtins.readFile ./options.lua) lazy ]; + in + pkgs.runCommand "init.lua" { inherit text; } '' + touch $out + echo -n "$text" > $out + ${getExe pkgs.stylua} $out + ''; + }; programs.neovim = { enable = true; package = pkgs.neovim-nightly; @@ -221,28 +213,35 @@ in vimdiffAlias = true; withNodeJs = true; withPython3 = true; - extraLuaConfig = lib.concatLines [ (builtins.readFile ./options.lua) lazy ]; - extraPackages = with pkgs; [ - alejandra - black - deadnix - isort - jq - nil - nixpkgs-fmt - nodePackages.bash-language-server - nodePackages.cspell - rustfmt - shellcheck - shfmt - statix - stylua - sumneko-lua-language-server - taplo - typst - typst-lsp - yamlfmt - ]; + extraPython3Packages = ps: + let + plugins = map (getAttr "plugin") cfg.plugins; + depAttrName = "python3Dependencies"; + filtered = filter (hasAttr depAttrName) plugins; + funcs = map (getAttr depAttrName) filtered; + in + foldl (list: f: list ++ (f ps)) [ ] funcs; + extraPackages = with pkgs; + [ + alejandra + black + deadnix + isort + jq + nil + nixpkgs-fmt + nodePackages.bash-language-server + rustfmt + shellcheck + shfmt + statix + stylua + sumneko-lua-language-server + taplo + typst + typst-lsp + yamlfmt + ]; plugins = [ pkgs.vimPlugins.lazy-nvim ]; diff --git a/modules/programs/nvim/plugins/catppuccin-nvim.lua b/modules/programs/nvim/plugins/catppuccin-nvim.lua index 921651c..3b8cd7c 100644 --- a/modules/programs/nvim/plugins/catppuccin-nvim.lua +++ b/modules/programs/nvim/plugins/catppuccin-nvim.lua @@ -10,6 +10,7 @@ require("catppuccin").setup({ enabled = true, }, treesitter = true, + telekasten = true, telescope = true, lsp_trouble = true, which_key = true, diff --git a/modules/programs/nvim/plugins/codeium-vim.lua b/modules/programs/nvim/plugins/codeium-vim.lua new file mode 100644 index 0000000..72cd968 --- /dev/null +++ b/modules/programs/nvim/plugins/codeium-vim.lua @@ -0,0 +1,2 @@ +-- dont show ghost text +vim.g.codeium_render = false diff --git a/modules/programs/nvim/plugins/coq-nvim.lua b/modules/programs/nvim/plugins/coq-nvim.lua new file mode 100644 index 0000000..63536a8 --- /dev/null +++ b/modules/programs/nvim/plugins/coq-nvim.lua @@ -0,0 +1,6 @@ +vim.g.coq_settings = { + auto_start = "shut-up", + keymap = { + jump_to_mark = "", + }, +} diff --git a/modules/programs/nvim/plugins/coq-thirdparty.lua b/modules/programs/nvim/plugins/coq-thirdparty.lua new file mode 100644 index 0000000..ec1e05c --- /dev/null +++ b/modules/programs/nvim/plugins/coq-thirdparty.lua @@ -0,0 +1,4 @@ +require("coq_3p")({ + { src = "orgmode", short_name = "ORG" }, + { src = "codeium", short_name = "COD" }, +}) diff --git a/modules/programs/nvim/plugins/default.nix b/modules/programs/nvim/plugins/default.nix index 89dc6af..8fcc9e1 100644 --- a/modules/programs/nvim/plugins/default.nix +++ b/modules/programs/nvim/plugins/default.nix @@ -20,7 +20,6 @@ with builtins; { key = "="; cmd = "Format"; desc = "format (formatter)"; } ]; conf = readFile ./formatter-nvim.lua; - dependencies = [{ plugin = which-key-nvim; }]; } { plugin = oil-nvim; @@ -31,18 +30,11 @@ with builtins; { plugin = nvim-web-devicons; } ]; } - { plugin = nvim-ts-context-commentstring; } { plugin = mini-nvim; lazy = false; conf = readFile ./mini-nvim.lua; } - { - plugin = noice-nvim; - lazy = false; - conf = readFile ./noice-nvim.lua; - dependencies = [{ plugin = nui-nvim; }]; - } { plugin = trouble-nvim; keys = [ @@ -55,7 +47,7 @@ with builtins; { key = "st"; cmd = "TodoTelescope"; desc = "Todo"; } { key = "[q"; - func = ''function() + func = /* lua */ ''function() if require("trouble").is_open() then require("trouble").previous({ skip_groups = true, jump = true }) else @@ -66,7 +58,7 @@ with builtins; } { key = "]q"; - func = ''function() + func = /* lua */ ''function() if require("trouble").is_open() then require("trouble").next({ skip_groups = true, jump = true }) else @@ -82,28 +74,6 @@ with builtins; { plugin = nvim-web-devicons; } ]; } - { - plugin = nvim-cmp; - conf = readFile ./nvim-cmp.lua; - event = [ "InsertEnter" ]; - dependencies = [ - { plugin = cmp-async-path; } - { plugin = cmp-nvim-lsp; } - { plugin = cmp_luasnip; } - { - plugin = copilot-cmp; - dependencies = [ - { - plugin = copilot-lua; - conf = readFile ./copilot-lua.lua; - dependencies = [{ plugin = which-key-nvim; }]; - } - ]; - } - { plugin = friendly-snippets; } - { plugin = luasnip; } - ]; - } { plugin = todo-comments-nvim; event = [ "BufReadPost" "BufNewFile" ]; @@ -141,7 +111,7 @@ with builtins; } { plugin = nvim-lspconfig; - event = [ "BufReadPre" "BufNewFile" ]; + event = [ "BufRead" "BufNewFile" ]; conf = readFile ./nvim-lspconfig.lua; dependencies = [ { @@ -153,26 +123,41 @@ with builtins; ]; } { plugin = which-key-nvim; } - { plugin = lspkind-nvim; } { plugin = lsp_lines-nvim; } { - plugin = lspsaga-nvim-original; + plugin = nvim-ufo; + conf = readFile ./nvim-ufo.lua; dependencies = [ - { plugin = nvim-web-devicons; } - { plugin = nvim-treesitter.withAllGrammars; } + { plugin = promise-async; } ]; } { - plugin = nvim-ufo; + plugin = neodev-nvim; + conf = readFile ./neodev-nvim.lua; + } + { + plugin = inc-rename-nvim; + conf = /* lua */ '' + require("inc_rename").setup { + input_buffer_type = "dressing", + } + ''; dependencies = [ - { plugin = promise-async; } + { + plugin = dressing-nvim; + } ]; } ]; } { + plugin = statuscol-nvim; event = [ "VeryLazy" ]; + conf = readFile ./statuscol-nvim.lua; + } + { plugin = vim-fugitive; + event = [ "VeryLazy" ]; } { plugin = vim-tmux-navigator; @@ -200,9 +185,9 @@ with builtins; conf = readFile ./smartcolumn-nvim.lua; } { - plugin = telescope-fzf-native-nvim; - conf = readFile ./telescope-fzf-native-nvim.lua; + plugin = telescope-nvim; cmd = [ "Telescope" ]; + conf = builtins.readFile ./telescope.lua; keys = [ { key = "ff"; cmd = "Telescope find_files"; desc = "Find files"; } { key = "fb"; cmd = "Telescope buffers"; desc = "Find buffers"; } @@ -216,17 +201,11 @@ with builtins; { key = "sk"; cmd = "Telescope keymaps"; desc = "Keymaps"; } { key = "ss"; cmd = "Telescope lsp_document_symbols"; desc = "Symbols (Document)"; } { key = "sS"; cmd = "Telescope lsp_workspace_symbols"; desc = "Symbols (Workspace)"; } - { key = "gc"; cmd = "Telescope git_commits"; desc = "Commits"; } - { key = "gs"; cmd = "Telescope git_status"; desc = "Status"; } ]; dependencies = [ - { - plugin = telescope-nvim; - dependencies = [ - { plugin = plenary-nvim; } - { plugin = which-key-nvim; } - ]; - } + { plugin = plenary-nvim; } + { plugin = which-key-nvim; } + { plugin = telescope-fzf-native-nvim; } ]; } { @@ -241,7 +220,76 @@ with builtins; { plugin = comment-nvim; event = [ "BufReadPost" "BufNewFile" ]; - conf = "require('Comment').setup()"; + conf = /* lua */ '' + require("Comment").setup() + ''; + } + { + plugin = telekasten-nvim; + dependencies = [ + { plugin = telescope-nvim; } + { plugin = which-key-nvim; } + ]; + cmd = [ "Telekasten" ]; + keys = [ + { key = "z"; cmd = "Telekasten"; desc = "zettelkasten"; } + ]; + conf = builtins.readFile ./zettelkasten-nvim.lua; + } + { + plugin = markdown-preview-nvim; + ft = [ "md" ]; + } + { + plugin = coq_nvim; + event = [ "BufReadPost" "BufNewFile" ]; + init = builtins.readFile ./coq-nvim.lua; + dependencies = [ + { + plugin = coq-thirdparty; + conf = builtins.readFile ./coq-thirdparty.lua; + dependencies = [ + { + plugin = codeium-vim; + init = builtins.readFile ./codeium-vim.lua; + } + ]; + } + { + plugin = coq-artifacts; + } + ]; + } + { + plugin = nvim-surround; + event = [ "BufReadPost" "BufNewFile" ]; + conf = /* lua */ '' + require("nvim-surround").setup({}) + ''; + } + { + plugin = nvim-treesitter-context; + event = [ "BufReadPost" "BufNewFile" ]; + conf = /* lua */ '' + require("treesitter-context").setup({}) + ''; + } + { + plugin = dressing-nvim; + event = [ "VeryLazy" ]; + } + { + plugin = hmts-nvim; + ft = [ "nix" ]; + } + { + plugin = zen-mode-nvim; + keys = [ + { key = "tz"; cmd = "ZenMode"; desc = "Zen mode"; } + ]; + dependencies = [ + { plugin = twilight-nvim; } + ]; } ]; } diff --git a/modules/programs/nvim/plugins/formatter-nvim.lua b/modules/programs/nvim/plugins/formatter-nvim.lua index adbdeeb..a7eee92 100644 --- a/modules/programs/nvim/plugins/formatter-nvim.lua +++ b/modules/programs/nvim/plugins/formatter-nvim.lua @@ -6,6 +6,9 @@ require("formatter").setup({ log_level = vim.log.levels.WARN, -- All formatter configurations are opt-in filetype = { + go = { + require("formatter.filetypes.go").gofmt, + }, json = { require("formatter.filetypes.json").jq, }, diff --git a/modules/programs/nvim/plugins/gitsigns-nvim.lua b/modules/programs/nvim/plugins/gitsigns-nvim.lua index 3cdce95..1a17a9b 100644 --- a/modules/programs/nvim/plugins/gitsigns-nvim.lua +++ b/modules/programs/nvim/plugins/gitsigns-nvim.lua @@ -1,22 +1,15 @@ require("gitsigns").setup() require("which-key").register({ - ["["] = { - h = { "Gitsigns prev_hunk", "Previous hunk" }, - }, - ["]"] = { - h = { "Gitsigns next_hunk", "Next hunk" }, - }, -}) -require("which-key").register({ - h = { - name = "hunk", + ["[h"] = { "Gitsigns prev_hunk", "Previous hunk" }, + ["]h"] = { "Gitsigns next_hunk", "Next hunk" }, + ["g"] = { s = { "Gitsigns stage_hunk", "Stage hunk", mode = { "n", "v" } }, r = { "Gitsigns reset_hunk", "Reset hunk", mode = { "n", "v" } }, S = { "Gitsigns stage_buffer", "Stage buffer" }, R = { "Gitsigns reset_buffer", "Reset buffer" }, u = { "Gitsigns undo_stage_hunk", "Undo stage hunk" }, + p = { "Gitsigns preview_hunk_inline", "Preview hunk (inline)" }, + P = { "Gitsigns preview_hunk", "Preview hunk (float)" }, }, -}, { prefix = "g" }) -require("which-key").register({ - h = { ":Gitsigns select_hunk", "Gitsigns select hunk" }, -}, { prefix = "i", mode = { "o", "x" } }) + ["ih"] = { ":Gitsigns select_hunk", "gitsigns hunk", mode = { "o", "x" } }, +}) diff --git a/modules/programs/nvim/plugins/mini-nvim.lua b/modules/programs/nvim/plugins/mini-nvim.lua index 6ce1ecc..e89e7a3 100644 --- a/modules/programs/nvim/plugins/mini-nvim.lua +++ b/modules/programs/nvim/plugins/mini-nvim.lua @@ -1,18 +1,8 @@ require("mini.align").setup() -require("mini.surround").setup() require("mini.move").setup() require("mini.pairs").setup() require("mini.starter").setup() -require("mini.tabline").setup() -local tabline_current = vim.api.nvim_get_hl(0, { name = "MiniTablineCurrent" }) -vim.api.nvim_set_hl(0, "MiniTablineCurrent", { - fg = tabline_current.fg, - bg = tabline_current.bg, - bold = true, - italic = true, -}) - require("mini.statusline").setup({ content = { active = function() diff --git a/modules/programs/nvim/plugins/neodev-nvim.lua b/modules/programs/nvim/plugins/neodev-nvim.lua new file mode 100644 index 0000000..a63e89a --- /dev/null +++ b/modules/programs/nvim/plugins/neodev-nvim.lua @@ -0,0 +1,8 @@ +require("neodev").setup({ + override = function(root_dir, library) + if root_dir:find("/home/moritz/.dotfiles/", 1, true) == 1 then + library.enabled = true + library.plugins = true + end + end, +}) diff --git a/modules/programs/nvim/plugins/null-ls-nvim.lua b/modules/programs/nvim/plugins/null-ls-nvim.lua index 7d65248..c689fad 100644 --- a/modules/programs/nvim/plugins/null-ls-nvim.lua +++ b/modules/programs/nvim/plugins/null-ls-nvim.lua @@ -3,14 +3,12 @@ local null_ls = require("null-ls") null_ls.setup({ sources = { -- Code actions - null_ls.builtins.code_actions.cspell, null_ls.builtins.code_actions.gitsigns, null_ls.builtins.code_actions.shellcheck, null_ls.builtins.code_actions.statix, -- Completion null_ls.builtins.completion.spell, -- Diagnostics - null_ls.builtins.diagnostics.cspell, null_ls.builtins.diagnostics.deadnix, null_ls.builtins.diagnostics.shellcheck, null_ls.builtins.diagnostics.statix, @@ -18,7 +16,6 @@ null_ls.setup({ }) -- disable (c)spell initially -null_ls.disable("cspell") null_ls.disable("spell") -- make sources toggle able @@ -31,11 +28,5 @@ require("which-key").register({ end, "spell", }, - S = { - function() - null_ls.toggle("cspell") - end, - "cspell", - }, }, }, { prefix = "t" }) diff --git a/modules/programs/nvim/plugins/nvim-cmp.lua b/modules/programs/nvim/plugins/nvim-cmp.lua deleted file mode 100644 index 0533cb7..0000000 --- a/modules/programs/nvim/plugins/nvim-cmp.lua +++ /dev/null @@ -1,63 +0,0 @@ -local cmp = require("cmp") -local luasnip = require("luasnip") -require("luasnip.loaders.from_vscode").lazy_load() -require("copilot_cmp").setup() - -local default_sources = { - { name = "async_path", priority = 1 }, - { name = "copilot", priority = 2 }, - { name = "luasnip", priority = 2 }, - { name = "nvim_lsp", priority = 3 }, -} - -cmp.setup({ - formatting = { - format = require("lspkind").cmp_format({ - mode = "symbol", -- show only symbol annotations - maxwidth = 50, -- prevent the popup from showing more than provided characters - ellipsis_char = "...", -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead - symbol_map = { - Copilot = "", - }, - }), - }, - snippet = { - -- REQUIRED - you must specify a snippet engine - expand = function(args) - require("luasnip").lsp_expand(args.body) - end, - }, - mapping = cmp.mapping.preset.insert({ - [""] = cmp.mapping.scroll_docs(-4), - [""] = cmp.mapping.scroll_docs(4), - [""] = cmp.mapping.complete(), - [""] = cmp.mapping.abort(), - [""] = cmp.mapping.confirm({ select = true }), - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - elseif luasnip.expand_or_jumpable() then - luasnip.expand_or_jump() - else - fallback() - end - end, { "i", "s" }), - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, { "i", "s" }), - }), - sources = default_sources, -}) - -cmp.setup.filetype("org", { - sources = vim.tbl_deep_extend("force", default_sources, { - { name = "buffer", priority = 1 }, - { name = "orgmode", priority = 3 }, - }), -}) diff --git a/modules/programs/nvim/plugins/nvim-lspconfig.lua b/modules/programs/nvim/plugins/nvim-lspconfig.lua index d844ca5..0c44ceb 100644 --- a/modules/programs/nvim/plugins/nvim-lspconfig.lua +++ b/modules/programs/nvim/plugins/nvim-lspconfig.lua @@ -5,111 +5,101 @@ vim.diagnostic.config({ virtual_text = false, }) --- The nvim-cmp almost supports LSP's capabilities so You should advertise it to LSP servers.. -local capabilities = require("cmp_nvim_lsp").default_capabilities() - -vim.o.foldcolumn = "1" -- '0' is not bad -vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value -vim.o.foldlevelstart = 99 -vim.o.foldenable = true -vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] -vim.o.statuscolumn = "%= " - -- FIXME: figure out how to put on the other side without having to do a lot of shifting - .. "%s" -- sign column - .. "%{%" -- evaluate this, and then evaluate what it returns - .. "&number ?" - .. "(v:relnum ?" - -- when showing relative numbers, make sure to pad so things don't shift as you move the cursor - .. 'printf("%"..len(line("$")).."s", v:relnum)' - .. ":" - .. "v:lnum" - .. ")" - .. ":" - .. '""' - .. " " -- space between lines and fold - .. "%}" - .. "%= " - .. "%#FoldColumn#" -- highlight group for fold - .. "%{" -- expression for showing fold expand/colapse - .. "foldlevel(v:lnum) > foldlevel(v:lnum - 1)" -- any folds? - .. "? (foldclosed(v:lnum) == -1" -- currently open? - .. '? ""' -- point down - .. ': ""' -- point to right - .. ")" - .. ': " "' -- blank for no fold, or inside fold - .. "}" - .. "%= " -- spacing between end of column and start of text - --- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself -require("which-key").register({ - z = { - R = { require("ufo").openAllFolds, "Open all folds" }, - M = { require("ufo").closeAllFolds, "Close all folds" }, - }, -}) +local capabilities = vim.lsp.protocol.make_client_capabilities() +-- NOTE for nvim-ufo -- Tell the server the capability of foldingRange, -- Neovim hasn't added foldingRange to default capabilities, users must add it manually capabilities.textDocument.foldingRange = { dynamicRegistration = false, lineFoldingOnly = true, } -require("ufo").setup() - -require("lspsaga").setup({ - symbol_in_winbar = { - enable = false, - }, - lightbulb = { - enable = false, - enable_in_insert = false, - }, -}) +-- NOTE https://github.com/neovim/neovim/pull/22405 +capabilities.didChangeWatchedFiles = { + dynamicRegistration = true, +} local lspconfig = require("lspconfig") -local on_attach_def = function(_, bufnr) +local on_attach_def = function(client, bufnr) require("which-key").register({ - K = { "Lspsaga hover_doc ++quiet", "show info" }, + K = { + function() + local winid = require("ufo").peekFoldedLinesUnderCursor() + if not winid then + vim.lsp.buf.hover() + end + end, + "Hover", + }, [""] = { l = { - d = { "Lspsaga show_cursor_diagnostics", "open diagnostic window" }, - c = { "Lspsaga code_action", "code action" }, - r = { "Lspsaga rename", "rename" }, - i = { "Lspsaga hover_doc ++keep", "show info (sticky)" }, + name = "lsp", + d = { vim.diagnostic.open_float, "Open diagnostic window" }, + c = { vim.lsp.buf.code_action, "Code action" }, + r = { + function() + return ":IncRename " .. vim.fn.expand("") + end, + "Rename", + expr = true, + }, f = { function() vim.lsp.buf.format({ async = true }) end, - "format (lsp)", + "Format (lsp)", mode = { "n", "v" }, }, }, t = { - l = { lsp_lines.toggle, "lsp lines" }, + l = { lsp_lines.toggle, "LSP lines" }, + i = { + function() + vim.lsp.inlay_hint(bufnr, nil) + end, + "LSP inlay hints", + }, }, }, g = { - d = { "Lspsaga peek_definition", "Goto definition" }, - t = { "Lspsaga peek_type_definition", "Goto type defininition" }, - h = { "Lspsaga lsp_finder", "Lsp finder" }, - r = { "Telescope lsp_references", "Goto reference" }, + d = { + function() + require("telescope.builtin").lsp_definitions({ reuse_win = true }) + end, + "Goto definition", + }, + t = { + function() + require("telescope.builtin").lsp_type_definitions({ reuse_win = true }) + end, + "Goto type defininition", + }, + r = { "Telescope lsp_references", "Goto references" }, D = { vim.lsp.buf.declaration, "Goto declaration" }, I = { "Telescope lsp_implementations", "Goto implementation" }, + K = { vim.lsp.buf.signature_help, "Signature help" }, }, ["["] = { - d = { "Lspsaga diagnostic_jump_prev", "Previous diagnostic" }, + d = { vim.diagnostic.goto_prev, "Previous diagnostic" }, }, ["]"] = { - d = { "Lspsaga diagnostic_jump_next", "Next diagnostic" }, + d = { vim.diagnostic.goto_next, "Next diagnostic" }, }, }, { buffer = bufnr, silent = true }) + + if client.server_capabilities.inlayHintProvider then + local slow_lsp_servers = { + "rust_analyzer", + } + local timeout = vim.tbl_contains(slow_lsp_servers, client.name, {}) and 500 or 0 + vim.defer_fn(function() + vim.lsp.inlay_hint(bufnr, true) + end, timeout) + end end local lspconfig_default_options = { on_attach = on_attach_def, capabilities = capabilities, - flags = { - debounce_text_changes = 100, - }, } ---function to add default options to lspconfig @@ -117,8 +107,9 @@ local lspconfig_default_options = { ---@param options table ---@return nil local function lspconfig_setup(lsp, options) - local final_options = vim.tbl_deep_extend("force", lspconfig_default_options, options) - lspconfig[lsp].setup(final_options) + local coq_options = require("coq").lsp_ensure_capabilities({}) + local merged_options = vim.tbl_deep_extend("force", coq_options, lspconfig_default_options, options) + lspconfig[lsp].setup(merged_options) end local servers = { @@ -126,19 +117,30 @@ local servers = { "nil_ls", "pylsp", "ruff_lsp", - "rust_analyzer", "typst_lsp", + "gopls", } for _, lsp in ipairs(servers) do lspconfig_setup(lsp, {}) end +lspconfig_setup("rust_analyzer", { + settings = { + ["rust-analyzer"] = { + checkOnSave = { + command = "clippy", + }, + }, + }, +}) + lspconfig_setup("lua_ls", { settings = { Lua = { runtime = { -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = "LuaJIT", + path = vim.split(package.path, ";"), }, diagnostics = { -- Get the language server to recognize the `vim` global @@ -156,6 +158,9 @@ lspconfig_setup("lua_ls", { format = { enable = false, }, + hint = { + enable = true, + }, }, }, }) diff --git a/modules/programs/nvim/plugins/nvim-ufo.lua b/modules/programs/nvim/plugins/nvim-ufo.lua new file mode 100644 index 0000000..d940e0e --- /dev/null +++ b/modules/programs/nvim/plugins/nvim-ufo.lua @@ -0,0 +1,74 @@ +vim.o.foldcolumn = "1" -- '0' is not bad +vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value +vim.o.foldlevelstart = 99 +vim.o.foldenable = true + +local ftMap = { + vim = "indent", + python = { "indent" }, + git = "", +} + +---@param bufnr number +---@return Promise +local function customizeSelector(bufnr) + local function handleFallbackException(err, providerName) + if type(err) == "string" and err:match("UfoFallbackException") then + return require("ufo").getFolds(bufnr, providerName) + else + return require("promise").reject(err) + end + end + + return require("ufo") + .getFolds(bufnr, "lsp") + :catch(function(err) + return handleFallbackException(err, "treesitter") + end) + :catch(function(err) + return handleFallbackException(err, "indent") + end) +end + +local handler = function(virtText, lnum, endLnum, width, truncate) + local newVirtText = {} + local suffix = (" 󰁂 %d "):format(endLnum - lnum) + local sufWidth = vim.fn.strdisplaywidth(suffix) + local targetWidth = width - sufWidth + local curWidth = 0 + for _, chunk in ipairs(virtText) do + local chunkText = chunk[1] + local chunkWidth = vim.fn.strdisplaywidth(chunkText) + if targetWidth > curWidth + chunkWidth then + table.insert(newVirtText, chunk) + else + chunkText = truncate(chunkText, targetWidth - curWidth) + local hlGroup = chunk[2] + table.insert(newVirtText, { chunkText, hlGroup }) + chunkWidth = vim.fn.strdisplaywidth(chunkText) + -- str width returned from truncate() may less than 2nd argument, need padding + if curWidth + chunkWidth < targetWidth then + suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth) + end + break + end + curWidth = curWidth + chunkWidth + end + table.insert(newVirtText, { suffix, "MoreMsg" }) + return newVirtText +end + +require("ufo").setup({ + provider_selector = function(_, filetype, _) + return ftMap[filetype] or customizeSelector + end, + fold_virt_text_handler = handler, +}) + +-- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself +require("which-key").register({ + z = { + R = { require("ufo").openAllFolds, "Open all folds" }, + M = { require("ufo").closeAllFolds, "Close all folds" }, + }, +}) diff --git a/modules/programs/nvim/plugins/oil-nvim.lua b/modules/programs/nvim/plugins/oil-nvim.lua index e2afffb..6c9c81e 100644 --- a/modules/programs/nvim/plugins/oil-nvim.lua +++ b/modules/programs/nvim/plugins/oil-nvim.lua @@ -1,4 +1,4 @@ require("oil").setup() require("which-key").register({ - d = { require("oil").toggle_float, "directory (oil)" }, + d = { require("oil").toggle_float, "Directory (oil)" }, }, { prefix = "t" }) diff --git a/modules/programs/nvim/plugins/smartcolumn-nvim.lua b/modules/programs/nvim/plugins/smartcolumn-nvim.lua index 1858689..c095401 100644 --- a/modules/programs/nvim/plugins/smartcolumn-nvim.lua +++ b/modules/programs/nvim/plugins/smartcolumn-nvim.lua @@ -1,4 +1,4 @@ require("smartcolumn").setup({ - colorcolumn = 120, + colorcolumn = "120", disabled_filetypes = { "help", "text", "markdown", "dashboard" }, }) diff --git a/modules/programs/nvim/plugins/statuscol-nvim.lua b/modules/programs/nvim/plugins/statuscol-nvim.lua new file mode 100644 index 0000000..b1e1eb1 --- /dev/null +++ b/modules/programs/nvim/plugins/statuscol-nvim.lua @@ -0,0 +1,22 @@ +vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] +local builtin = require("statuscol.builtin") +require("statuscol").setup({ + segments = { + { + sign = { name = { ".*" }, auto = true }, + click = "v:lua.ScSa", + }, + { + text = { builtin.lnumfunc }, + click = "v:lua.ScLa", + }, + { + sign = { name = { "GitSigns" }, auto = true }, + click = "v:lua.ScSa", + }, + { + text = { builtin.foldfunc, " " }, + click = "v:lua.ScFa", + }, + }, +}) diff --git a/modules/programs/nvim/plugins/telescope-fzf-native-nvim.lua b/modules/programs/nvim/plugins/telescope.lua similarity index 100% rename from modules/programs/nvim/plugins/telescope-fzf-native-nvim.lua rename to modules/programs/nvim/plugins/telescope.lua diff --git a/modules/programs/nvim/plugins/zettelkasten-nvim.lua b/modules/programs/nvim/plugins/zettelkasten-nvim.lua new file mode 100644 index 0000000..6a35570 --- /dev/null +++ b/modules/programs/nvim/plugins/zettelkasten-nvim.lua @@ -0,0 +1,27 @@ +local telekasten = require("telekasten") +telekasten.setup({ + home = vim.fn.expand("~/Nextcloud/Notes/zettelkasten"), + auto_set_filetype = false, + image_subdir = "assets", +}) + +vim.api.nvim_create_autocmd({ "BufReadPost", "BufNewFile" }, { + pattern = "*/zettelkasten/*", + callback = function(_) + require("which-key").register({ + g = { + f = { telekasten.follow_link, "Follow link" }, + r = { telekasten.show_backlinks, "Show backlinks" }, + }, + [""] = { + f = { + f = { telekasten.find_notes, "Find note" }, + n = { telekasten.new_note, "New note" }, + }, + s = { + g = { telekasten.search_note, "Grep notes" }, + }, + }, + }, { buffer = vim.fn.bufnr("%") }) + end, +}) diff --git a/modules/programs/spotify_player.nix b/modules/programs/spotify_player.nix new file mode 100644 index 0000000..435b9c8 --- /dev/null +++ b/modules/programs/spotify_player.nix @@ -0,0 +1,33 @@ +{ config +, lib +, pkgs +, ... +}: + +with lib; +let + cfg = config.my.programs.spotify-player; + toml = pkgs.formats.toml { }; +in +{ + options.my.programs.spotify-player = { + enable = mkEnableOption "spotify-player"; + package = mkOption { + type = types.package; + default = pkgs.spotify-player; + }; + config = mkOption { + inherit (toml) type; + default = { }; + }; + }; + + config = mkIf cfg.enable { + home-manager.users.moritz = { + xdg.configFile."spotify-player/app.toml" = { + source = toml.generate "app.toml" cfg.config; + }; + home.packages = [ cfg.package ]; + }; + }; +} diff --git a/modules/programs/tmux.nix b/modules/programs/tmux/default.nix similarity index 67% rename from modules/programs/tmux.nix rename to modules/programs/tmux/default.nix index 32836bd..6469f96 100644 --- a/modules/programs/tmux.nix +++ b/modules/programs/tmux/default.nix @@ -4,30 +4,6 @@ with lib; let cfg = config.my.programs.tmux; - fzf1 = pkgs.writeShellApplication { - name = "fzf1"; - runtimeInputs = with pkgs; [ coreutils fzf ]; - text = '' - #!/usr/bin/env bash - - options=$(fzf --filter "''$*" < /dev/stdin) - - if [[ -z $options ]]; then - exit 1 - elif [[ $(wc -l <<< "$options") -eq 1 ]]; then - selected="$options" - else - selected=$(echo "$options" | fzf --query="$*") - fi - - if [[ -z $selected ]]; then - exit 0 - fi - - echo "$selected" - ''; - }; - tmux-switch = pkgs.writeShellApplication { name = "tmux-switch"; runtimeInputs = with pkgs; [ tmux ]; @@ -41,32 +17,18 @@ let ''; }; - tmux-sessionizer = pkgs.writeShellApplication { + tmux-sessionizer = pkgs.writeFishApplication { name = "ts"; - runtimeInputs = with pkgs; [ tmux findutils coreutils procps fd fzf ]; - text = '' - #!/usr/bin/env bash - - selected=$(fd -HIg '.git' ~/ --min-depth 1 --max-depth 5 --type d --prune --exec dirname {} | ${getExe fzf1} "$*") - - selected_name=$(basename "$selected" | tr . _) - - if ! tmux has-session -t="$selected_name" 2> /dev/null; then - tmux new-session -ds "$selected_name" -c "$selected" - fi - - ${getExe tmux-switch} "$selected_name" - ''; + runtimeInputs = with pkgs; [ tmux findutils coreutils procps fd fzf1 tmux-switch ]; + text = readFile ./tmux-sessionizer/script.fish; + completions = readFile ./tmux-sessionizer/completions.fish; }; - tmux-attach = pkgs.writeShellApplication { + tmux-attach = pkgs.writeFishApplication { name = "ta"; - runtimeInputs = with pkgs; [ tmux ]; - text = '' - #!/usr/bin/env bash - selected=$(tmux list-sessions -F '#{session_name}' | ${getExe fzf1} "$*") - ${getExe tmux-switch} "$selected" - ''; + runtimeInputs = with pkgs; [ tmux fzf1 tmux-switch ]; + text = readFile ./tmux-attach/script.fish; + completions = readFile ./tmux-attach/completions.fish; }; in diff --git a/modules/programs/tmux/tmux-attach/completions.fish b/modules/programs/tmux/tmux-attach/completions.fish new file mode 100644 index 0000000..6e31f9f --- /dev/null +++ b/modules/programs/tmux/tmux-attach/completions.fish @@ -0,0 +1 @@ +complete -c ta -f -a '(tmux list-sessions -F "#{session_name}" 2>/dev/null)' diff --git a/modules/programs/tmux/tmux-attach/script.fish b/modules/programs/tmux/tmux-attach/script.fish new file mode 100644 index 0000000..442dec2 --- /dev/null +++ b/modules/programs/tmux/tmux-attach/script.fish @@ -0,0 +1,5 @@ +set selected (tmux list-sessions -F '#{session_name}' 2>/dev/null | fzf1 $argv) +if not test -n "$selected" + exit 1 +end +tmux-switch "$selected" diff --git a/modules/programs/tmux/tmux-sessionizer/completions.fish b/modules/programs/tmux/tmux-sessionizer/completions.fish new file mode 100644 index 0000000..f48642c --- /dev/null +++ b/modules/programs/tmux/tmux-sessionizer/completions.fish @@ -0,0 +1 @@ +complete -c ts -f -a '(fd -HIg '.git' ~/ --min-depth 1 --max-depth 5 --type d --prune --exec realpath "{}/.." | xargs -I{} basename {} | string replace "." "")' diff --git a/modules/programs/tmux/tmux-sessionizer/script.fish b/modules/programs/tmux/tmux-sessionizer/script.fish new file mode 100644 index 0000000..d0ca484 --- /dev/null +++ b/modules/programs/tmux/tmux-sessionizer/script.fish @@ -0,0 +1,13 @@ +set selected (fd -HIg '.git' ~/ --min-depth 1 --max-depth 5 --type d --prune --exec dirname {} | fzf1 $argv) + +set selected_name (basename $selected 2>/dev/null | string replace "." "_") + +if not test -n "$selected_name" + exit 1 +end + +if ! tmux has-session -t $selected_name 2> /dev/null + tmux new-session -ds $selected_name -c $selected +end + +tmux-switch $selected_name diff --git a/modules/services/dunst.nix b/modules/services/dunst.nix index 898faaa..db80828 100644 --- a/modules/services/dunst.nix +++ b/modules/services/dunst.nix @@ -12,265 +12,9 @@ in options.my.services.dunst.enable = mkEnableOption "dunst"; config = lib.mkIf cfg.enable { - home-manager.users.moritz = { - services.dunst = { - enable = true; - settings = { - global = { - ### Display ### - - # Which monitor should the notifications be displayed on. - monitor = 0; - - # Display notification on focused monitor. Possible modes are: - # mouse: follow mouse pointer - # keyboard: follow window with keyboard focus - # none: don't follow anything - # - # "keyboard" needs a window manager that exports the - # _NET_ACTIVE_WINDOW property. - # This should be the case for almost all modern window managers. - # - # If this option is set to mouse or keyboard, the monitor option - # will be ignored. - follow = "mouse"; - - # The geometry of the window: - # [{width}]x{height}[+/-{x}+/-{y}] - # The geometry of the message window. - # The height is measured in number of notifications everything else - # in pixels. If the width is omitted but the height is given - # ("-geometry x2"), the message window expands over the whole screen - # (dmenu-like). If width is 0, the window expands to the longest - # message displayed. A positive x is measured from the left, a - # negative from the right side of the screen. Y is measured from - # the top and down respectively. - # The width can be negative. In this case the actual width is the - # screen width minus the width defined in within the geometry option. - geometry = "0x4-25+25"; - - # Show how many messages are currently hidden (because of geometry). - indicate_hidden = "yes"; - - # Shrink window if it's smaller than the width. Will be ignored if - # width is 0. - shrink = "no"; - - # The transparency of the window. Range: [0; 100]. - # This option will only work if a compositing window manager is - # present (e.g. xcompmgr, compiz, etc.). - transparency = "15"; - - # The height of the entire notification. If the height is smaller - # than the font height and padding combined, it will be raised - # to the font height and padding. - notification_height = 0; - - # Draw a line of "separator_height" pixel height between two - # notifications. - # Set to 0 to disable. - separator_height = 1; - - # Padding between text and separator. - padding = 8; - - # Horizontal padding. - horizontal_padding = 10; - - # Defines width in pixels of frame around the notification window. - # Set to 0 to disable. - frame_width = 0; - - # Sort messages by urgency. - sort = "yes"; - - # Don't remove messages, if the user is idle (no mouse or keyboard input) - # for longer than idle_threshold seconds. - # Set to 0 to disable. - # A client can set the 'transient' hint to bypass this. See the rules - # section for how to disable this if necessary - idle_threshold = 120; - - ### Text ### - - font = "Monospace 10"; - - # The spacing between lines. If the height is smaller than the - # font height, it will get raised to the font height. - line_height = 0; - - # Possible values are: - # full: Allow a small subset of html markup in notifications: - # bold - # italic - # strikethrough - # underline - # - # For a complete reference see - # . - # - # strip: This setting is provided for compatibility with some broken - # clients that send markup even though it's not enabled on the - # server. Dunst will try to strip the markup but the parsing is - # simplistic so using this option outside of matching rules for - # specific applications *IS GREATLY DISCOURAGED*. - # - # no: Disable markup parsing, incoming notifications will be treated as - # plain text. Dunst will not advertise that it has the body-markup - # capability if this is set as a global setting. - # - # It's important to note that markup inside the format option will be parsed - # regardless of what this is set to. - markup = "full"; - - # The format of the message. Possible variables are: - # %a appname - # %s summary - # %b body - # %i iconname (including its path) - # %I iconname (without its path) - # %p progress value if set ([ 0%] to [100%]) or nothing - # %n progress value if set without any extra characters - # %% Literal % - # Markup is allowed - format = '' - %s %p - %b''; - - # Alignment of message text. - # Possible values are "left", "center" and "right". - alignment = "left"; - - # Vertical alignment of message text and icon. - # Possible values are "top", "center" and "bottom". - vertical_alignment = "center"; - - # Show age of message if message is older than show_age_threshold - # seconds. - # Set to -1 to disable. - show_age_threshold = 60; - - # Split notifications into multiple lines if they don't fit into - # geometry. - word_wrap = "yes"; - - # When word_wrap is set to no, specify where to make an ellipsis in long lines. - # Possible values are "start", "middle" and "end". - ellipsize = "middle"; - - # Ignore newlines '\n' in notifications. - ignore_newline = "no"; - - # Stack together notifications with the same content - stack_duplicates = true; - - # Hide the count of stacked notifications with the same content - hide_duplicate_count = false; - - # Display indicators for URLs (U) and actions (A). - show_indicators = "yes"; - - ### Icons ### - - # Align icons left/right/off - icon_position = "left"; - - # Scale small icons up to this size, set to 0 to disable. Helpful - # for e.g. small files or high-dpi screens. In case of conflict, - # max_icon_size takes precedence over this. - min_icon_size = 0; - - # Scale larger icons down to this size, set to 0 to disable - max_icon_size = 64; - - # Paths to default icons. - # icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ - - ### History ### - - # Should a notification popped up from history be sticky or timeout - # as if it would normally do. - sticky_history = "yes"; - - # Maximum amount of notifications kept in history - history_length = 20; - - ### Misc/Advanced ### - - # dmenu path. - dmenu = "${pkgs.rofi}/bin/rofi -p dunst"; - - # Browser for opening urls in context menu. - browser = "${pkgs.firefox}/bin/firefox -new-tab"; - - # Always run rule-defined scripts, even if the notification is suppressed - always_run_script = true; - - # Define the title of the windows spawned by dunst - title = "Dunst"; - - # Define the class of the windows spawned by dunst - class = "Dunst"; - - # Print a notification on startup. - # This is mainly for error detection, since dbus (re-)starts dunst - # automatically after a crash. - startup_notification = false; - - # Manage dunst's desire for talking - # Can be one of the following values: - # crit: Critical features. Dunst aborts - # warn: Only non-fatal warnings - # mesg: Important Messages - # info: all unimportant stuff - # debug: all less than unimportant stuff - verbosity = "mesg"; - - # Define the corner radius of the notification window - # in pixel size. If the radius is 0, you have no rounded - # corners. - # The radius will be automatically lowered if it exceeds half of the - # notification height to avoid clipping text and/or icons. - corner_radius = 0; - - # Ignore the dbus closeNotification message. - # Useful to enforce the timeout set by dunst configuration. Without this - # parameter, an application may close the notification sent before the - # user defined timeout. - ignore_dbusclose = false; - - ### Legacy - - # Use the Xinerama extension instead of RandR for multi-monitor support. - # This setting is provided for compatibility with older nVidia drivers that - # do not support RandR and using it on systems that support RandR is highly - # discouraged. - # - # By enabling this setting dunst will not be able to detect when a monitor - # is connected or disconnected which might break follow mode if the screen - # layout changes. - force_xinerama = false; - - ### mouse - - # Defines list of actions for each mouse event - # Possible values are: - # * none: Don't do anything. - # * do_action: If the notification has exactly one action, or one is marked as default, - # invoke it. If there are multiple and no default, open the context menu. - # * close_current: Close current notification. - # * close_all: Close all notifications. - # These values can be strung together for each mouse event, and - # will be executed in sequence. - mouse_left_click = "close_current"; - mouse_middle_click = "do_action, close_current"; - mouse_right_click = "close_all"; - }; - urgency_low.timeout = 10; - urgency_normal.timeeout = 10; - urgency_critical.timeout = 0; - }; - }; + home-manager.users.moritz.services.dunst.enable = true; + home-manager.users.moritz.services.dunst.settings.global = { + font = "Monospace 10"; }; }; } diff --git a/modules/services/spotify_player.nix b/modules/services/spotify_player.nix new file mode 100644 index 0000000..b494c3a --- /dev/null +++ b/modules/services/spotify_player.nix @@ -0,0 +1,58 @@ +{ lib, config, pkgs, ... }: + +with lib; +let + toml = pkgs.formats.toml { }; + cfg = config.my.services.spotify-player; + + tomlConfig = + if cfg.configFile != null + then cfg.configFile + else toml.generate "app.toml" cfg.config; + + configFolder = pkgs.runCommand "spotify-player-config" { } '' + mkdir $out + ln -s "${tomlConfig}" $out/app.toml + ''; +in +{ + options.my.services.spotify-player = { + enable = mkEnableOption "spotify_player"; + config = mkOption { + inherit (toml) type; + default = { }; + }; + configFile = mkOption { + type = with types; nullOr path; + default = null; + }; + package = mkOption { + type = types.package; + default = pkgs.spotify-player; + }; + }; + + config = mkIf cfg.enable { + assertions = [ + { + assertion = cfg.config == { } || cfg.configFile == null; + message = "At least one of the options 'config' or 'configFile' must be set."; + } + { + assertion = cfg.config != { } || cfg.configFile != null; + message = "Only one of the options 'config' or 'configFile' may be set."; + } + ]; + systemd.user.services.spotify-player = { + after = [ "graphical-session.target" "network.target" ]; + partOf = [ "graphical-session.target" ]; + wantedBy = [ "graphical-session.target" ]; + serviceConfig = { + Type = "forking"; + Restart = "always"; + RestartSec = "1s"; + ExecStart = "${getExe cfg.package} --daemon --config-folder ${configFolder}"; + }; + }; + }; +} diff --git a/modules/services/synology-drive.nix b/modules/services/synology-drive.nix index 9ff8384..63776d1 100644 --- a/modules/services/synology-drive.nix +++ b/modules/services/synology-drive.nix @@ -21,7 +21,7 @@ in wantedBy = [ "graphical-session.target" ]; serviceConfig = { ExitType = "cgroup"; - Restart = "on-failure"; + Restart = "always"; RestartSec = "1s"; ExecStartPre = "${pkgs.coreutils}/bin/rm -rf %h/.SynologyDrive/SynologyDrive.app %h/.SynologyDrive/cloud-connect.pid"; ExecStart = "${cfg.package}/bin/synology-drive"; diff --git a/modules/services/timers.nix b/modules/services/timers.nix new file mode 100644 index 0000000..52c4260 --- /dev/null +++ b/modules/services/timers.nix @@ -0,0 +1,32 @@ +{ config +, lib +, pkgs +, ... +}: + +with lib; +let + cfg = config.my.services.timers; +in +{ + options.my.services.timers.enable = mkEnableOption "timers"; + options.my.services.timers.package = mkOption { + type = types.package; + default = pkgs.timers; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + + systemd.user.services.timers-daemon = { + after = [ "graphical-session.target" ]; + partOf = [ "graphical-session.target" ]; + wantedBy = [ "graphical-session.target" ]; + serviceConfig = { + Restart = "always"; + RestartSec = "1s"; + ExecStart = "${getExe cfg.package} daemon"; + }; + }; + }; +} diff --git a/modules/virtualisation/virtualisation.nix b/modules/virtualisation/virtualisation.nix index 67f4c17..0f32600 100644 --- a/modules/virtualisation/virtualisation.nix +++ b/modules/virtualisation/virtualisation.nix @@ -17,6 +17,8 @@ in package = pkgs.libvirt; }; + programs.dconf.enable = true; + users.users.moritz = { extraGroups = [ "libvirtd" ]; packages = with pkgs; [ virt-manager virt-viewer ]; diff --git a/overlays/builders.nix b/overlays/builders.nix new file mode 100644 index 0000000..813b7d3 --- /dev/null +++ b/overlays/builders.nix @@ -0,0 +1,45 @@ +_: + +final: _: +with final.lib; +{ + writeFishApplication = + { name + , text + , completions ? null + , runtimeInputs ? [ ] + , checkPhase ? null + }: + let + fishFile = destination: content: final.writeTextFile { + inherit name destination; + executable = true; + allowSubstitutes = true; + preferLocalBuild = false; + text = '' + #!${getExe final.fish} + + ${optionalString (runtimeInputs != [ ]) ''export PATH="${makeBinPath runtimeInputs}:$PATH"''} + + ${content} + ''; + + checkPhase = + if checkPhase == null then '' + runHook preCheck + ${getExe final.fish} -n "$target" + runHook postCheck + '' + else checkPhase; + }; + + script = fishFile "/bin/${name}" text; + completions_file = fishFile "/share/fish/vendor_completions.d/${name}.fish" completions; + in + final.symlinkJoin { + inherit name; + paths = [ + script + ] ++ optional (completions != null) completions_file; + }; +} diff --git a/overlays/packages.nix b/overlays/packages.nix index bb884a9..66b2624 100644 --- a/overlays/packages.nix +++ b/overlays/packages.nix @@ -1,6 +1,6 @@ { inputs, lib, ... }: -_: prev: +final: prev: { agenix = inputs.agenix.packages.${prev.system}.default; hyprpaper = inputs.hyprpaper.packages.${prev.system}.default; @@ -10,4 +10,20 @@ _: prev: src = inputs.rofi-wayland; version = lib.my.mkVersionInput inputs.rofi-wayland; }); + timers = inputs.timers.packages.${prev.system}.default; + + fzf1 = final.writeShellApplication { + name = "fzf1"; + runtimeInputs = with final; [ coreutils fzf fd ]; + text = '' + #!/usr/bin/env bash + selected=$(fzf --query="$*" -1 < /dev/stdin) + + if [[ -z $selected ]]; then + exit 0 + fi + + echo "$selected" + ''; + }; } diff --git a/overlays/vimPlugins.nix b/overlays/vimPlugins.nix index 4c1e2aa..eba8e54 100644 --- a/overlays/vimPlugins.nix +++ b/overlays/vimPlugins.nix @@ -16,20 +16,16 @@ with lib.my; src = inputs.smartcolumn-nvim; }; - copilot-lua = prev.vimPlugins.copilot-lua.overrideAttrs (_: { - version = mkVersionInput inputs.copilot-lua; - src = inputs.copilot-lua; - }); + telekasten-nvim = prev.vimUtils.buildVimPluginFrom2Nix { + pname = "telekasten-nvim"; + version = mkVersionInput inputs.telekasten-nvim; + src = inputs.telekasten-nvim; + }; - lspsaga-nvim-original = prev.vimPlugins.lspsaga-nvim-original.overrideAttrs (_: { - version = mkVersionInput inputs.lspsaga-nvim; - src = inputs.lspsaga-nvim; - }); - - cmp-async-path = prev.vimPlugins.cmp-path.overrideAttrs (_: { - pname = "cmp-async-path"; - version = mkVersionInput inputs.cmp-async-path; - src = inputs.cmp-async-path; - }); + hmts-nvim = prev.vimUtils.buildVimPluginFrom2Nix { + pname = "hmts-nvim"; + version = mkVersionInput inputs.hmts-nvim; + src = inputs.hmts-nvim; + }; }; } diff --git a/secrets/github.age b/secrets/github.age index b091b3b..fdda25e 100644 --- a/secrets/github.age +++ b/secrets/github.age @@ -1,16 +1,19 @@ age-encryption.org/v1 --> ssh-ed25519 CjuqfA vQgqFrMrdEi4vwNj9qSLO9YVBTpY5OSMoRzH+Wk19lw -GkYkh9FisOcAREJe+CW3gftgWunKH1V7N/hm4l2n2BM --> ssh-ed25519 QRYDmg pRNoHHxbQ7p6bzanDmakpHGc06EVqB8TSn+X7+4fbm8 -O2rpt/OVbGKKzEnGVlMnOhyJaqsMQdeB5ZxjfKf9BNc --> ssh-ed25519 wG6LYg 2aXp/3oo9BbOg7vBHnSPwDY9ycuJHA68Uf6Q9afYmA8 -vd+yYpAqiDYMVIGvJmGD6T6Inwo64dYMRwq4n8kqV7E --> ssh-ed25519 ZYd7Zg c/egc/Me5k/RirfanQY/Qq3Fhdm7q67lUL7SzpBp9Tk -81ubfNCPJOtbo82iKmB/Tq3jgUntKnAQQy+JuiZkeTo --> ssh-ed25519 as9VYQ 6g/5nmOnTK9BWF0bLpk58OGb5iLMaJpNvg955iY5qhs -jWt7sv4r5n5x5zJRvmWuP9moVzqmro8jHrnAIUjH+vU --> wn7ow-grease /PE|\ M5 3a3-e/J+ hv7j2 -fPDfe6t5LKX5MmidzQkudoyFfF+GuUHIhtfz7DTyTAEczkqOCSUGvpGmgR5wckMK -rPUibrMFHW0 ---- ivXm5PXqcdPjqMKGTRTasnf0zgaLc1QovA6gmxPEGQQ -0T`ݓNkg]ج XvȞ ̝9Jd|b,&Sބ- WDߚS \ No newline at end of file +-> ssh-ed25519 CjuqfA G27Yt1FyurlWFuq0397PV2+bivdRG0X//CfFqrSR2Qc +n31SgYLmCGlAsSIpOr/UwQupt92qh5ONU5n4xOGfeJU +-> ssh-ed25519 QRYDmg T36WQmcOabBJRDC18gIwEg+wHOs2k2a+ti4VKE9H+RQ +A8hj7izomU3eGEb7ML3EVZYaqvhQ5ZSHcb/EM2QnBa0 +-> ssh-ed25519 wG6LYg weF/pK+Xxh5Kxt/JTXAd/YXkTibD6yGnewOloDWfszE +VpUC74mIThmgieN5cfljgFl3Os7SQ/HG9iA/nhUdORY +-> ssh-ed25519 ZYd7Zg TRuhGwA6YOxJjodDMhyQm6JiInbIwnSO86Vptoj+lGc +sknbCE94iTQwnwjWPpsbRUKAEqTSY82rXS/17bRXt0E +-> ssh-ed25519 as9VYQ oqaIVShntZXxqkkZP7Mg+Je3k0OvNWVH+6sbsu1Zlgc +gSd1Ecv5gNGxRZjsFYkcIDlJ+uv9ubZn8pgo56GrOHg +-> ssh-ed25519 dWIbQQ hNi/nS5QeE+MPUYvb94XwoN+GOuinzgc2QU/v2+VhkQ +L3p7rRv64DvD+VX7kad7B15kuDCQMxVB+ZE91mJYv74 +-> @l~.-grease m4vSyUw1 +xxt67nUfB58sf7oOIxzYCoiiqX/E4yJQmdJt3tVZ6FHyqNfU7SxrInaFDppl9tiW +WIhtVGjS +--- 6Hp/UXOV+kUSkC+cYQFu4vJ70qctprk/T/pr5tH0gV0 +$U5E\ tn|GBۍ.n} wz& +Zx@ÚI|i^sCOu @ \ No newline at end of file diff --git a/secrets/nordvpn.age b/secrets/nordvpn.age index ebce709..4f0074e 100644 Binary files a/secrets/nordvpn.age and b/secrets/nordvpn.age differ diff --git a/secrets/secrets.nix b/secrets/secrets.nix index 723b0a8..09e13f4 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -6,8 +6,11 @@ let nixos-laptop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDhtwHDGAZshiQWKkCcPWV9tC83b+bKBgjDcjP/N2CKO"; nixos-desktop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKl8gMhwSf1NsP5gp14xbbyjqQLZzcHLb/XKRMoHdXgI"; nixos-work = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGQdruRBgcS3JbX+8DP4GE+28M/ZnxqxhoaMM5EVUkrD"; + scadspc25 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3i/+siSLZmbW/8uM1LCpmR4ErCtS9zdS4aDDSfCESC"; + hosts-personal = [ nixos-laptop nixos-desktop ]; - hosts = hosts-personal ++ [ nixos-work ]; + hosts-work = [ nixos-work scadspc25 ]; + hosts = hosts-personal ++ hosts-work; all = users ++ hosts; in @@ -19,6 +22,6 @@ in "uni-vpn.age".publicKeys = all; "wireguard-preshared-key.age".publicKeys = all; "wireguard-private-key.age".publicKeys = all; - "webis.age".publicKeys = hosts-personal ++ [ moritz ]; - "webis-ssh.age".publicKeys = hosts-personal ++ [ moritz ]; + "webis.age".publicKeys = hosts-personal ++ [ scadspc25 moritz ]; + "webis-ssh.age".publicKeys = hosts-personal ++ [ scadspc25 moritz ]; } diff --git a/secrets/spotifyd.age b/secrets/spotifyd.age index 80c2746..f564d39 100644 --- a/secrets/spotifyd.age +++ b/secrets/spotifyd.age @@ -1,16 +1,17 @@ age-encryption.org/v1 --> ssh-ed25519 CjuqfA eP249XpK70os6x/XG6zr0VWmQ4dDUvbijmYeArRAogs -C/nwUI7ObSuJRt4TfqUM8Z0IxD/mXg392CawE3r52Yw --> ssh-ed25519 QRYDmg gv9JRmJBt0lQV2mx7TiZlyWNOIDXW2flISCN2Tw9kh8 -h5wmTiWn8oX5Sr/yJp/FZ4eGxutCgIkPpDU8E4Dul0A --> ssh-ed25519 wG6LYg 5Pw8gHIEP5rA4aStCC217iNnky9J/t1KsmfK25o6Ylw -TRJ4+3AsT9n0IEMZXyvcFRqSS1J48fFaVWHK9C3DgWw --> ssh-ed25519 ZYd7Zg ns34LIL0NNzrSUFTJGsELNVyfxcknuDfgK9ZE0DGNXM -NUgBXe/HNOz8NKbS0xMzd3Z2cP9zsjLKcc4fDu66nw0 --> ssh-ed25519 as9VYQ kd/k9sA8gUNNKmhi5LcZqSrRg3qUKhHXhYKE7nkQgmY -JVPlAWimRS2QZu0PIvQMwzC21B35miaWpEEsUUEq37Q --> T_b>Tl-grease Xe5~ 2q } -wGqdSY44FDId8JTxJS0/1mMbT/yPvB2L ---- 3g9QhHQwSdmcyWII9LEiUq38yyKfvW/OJFgRZHpQfhk -6}jJoeNL1=OJgr\~*ZmsWA -x \ No newline at end of file +-> ssh-ed25519 CjuqfA /YCi+4iCBCJc2+n5DfEi6yFqYiC6WKyKqMQTC3dxYTM +TXnSGexVJPzsxV3GBoxujBPy4sYFK7tTzpgZd+tL7PY +-> ssh-ed25519 QRYDmg 7ol/1aYbVuD1peL4kMHFifxtfj1LJPQ7ByMgmoIiLG0 +LJyz1aoBxOnxcy/x9yXCcMDG1CM8XSGTIvklShHsLr8 +-> ssh-ed25519 wG6LYg LvuMCPIaXP8gDriTDVIXak2dLUTDgyA+ADnsFDEtpX4 +PSsM5NsSVhsV1xtZPs3VZbJopfkDQg7Gxjkrnf+I5VI +-> ssh-ed25519 ZYd7Zg jt4zPtq1gv/SQ8Zqy2kFQZTUHo57d3BcBOusafU5TwE +FCifF8kUwHqlvokMMhJ/A2zCutshBg9K22gZPeYyK5s +-> ssh-ed25519 as9VYQ 2w+TXKZGnMQ5nRqVPfDiXAjGPLjMQcDzuZ42tXD81zE +GHVNnPD1QrRfjlxymtkIvW/fSH8280ye4ojag/RrL6Y +-> ssh-ed25519 dWIbQQ vFV8rbuDIUhVuWlp1zLKbSZkxWwBpjLGAHZ7TZmlpxA +2qq8R8eGQHMAtTAKJxv7ouXwbw9h9LnoipQ+dtq0bOk +-> eLqn-grease +s21qb67X34dXu+DeHZV4IA9mvegTyQSulJuWZXUyGmlxQT4N7pDAjAgrlrsT8zI +--- ogDMsipm47a5cDUlzX1zPmeakFaqXecpvYfPILf5PGA +;(+\"`qnC:6V싄t0\2o<*?J\TϢV_ \ No newline at end of file diff --git a/secrets/ssh-home.age b/secrets/ssh-home.age index e7b777b..b937b62 100644 Binary files a/secrets/ssh-home.age and b/secrets/ssh-home.age differ diff --git a/secrets/uni-vpn.age b/secrets/uni-vpn.age index 2c7daaa..d17cedf 100644 --- a/secrets/uni-vpn.age +++ b/secrets/uni-vpn.age @@ -1,16 +1,19 @@ age-encryption.org/v1 --> ssh-ed25519 CjuqfA wsRuh5f7FBwEuH60mY/n5B2rfMXmN9loDRI5sgLAmQY -QRNPLd433Ax/F/NMCGdUUl1dXKvpaqErPYlDRPASkLA --> ssh-ed25519 QRYDmg 1TN+ZhZMn3a5Ny/rrWZedHIwf69NCNj82RGfDt4VI1s -I+VsfBTJZ7gIIGROjU5hkvRZ/+OkxxPda9qYn28O5dg --> ssh-ed25519 wG6LYg WhRpXAXmZPYLSmNcqvuLQIkwbOnyP/Fqmt5ZhvNqQx8 -lKyFPSmEgY/BuLKxTOQMrOVf7ScL50WwvghgDQT6gsY --> ssh-ed25519 ZYd7Zg E4VAC6uIuBdXZ0jciRW/835qIaDWixDig6oGi8KqFlw -15J0vEUwCFiViXP7UlKmAmKfm+d6UgjcA3gHvDzSQwg --> ssh-ed25519 as9VYQ +sGqCqiBOgMcF90Rt6xKRHm0fqZMXflg6OBRwAhVU2k -rgzztigEJ1WCdI9AuXcjP2VZrPQxiecYRPfg4RdOyFM --> xA'C-grease s-9 ?tXT 38r l[ -lAYTp6Ot ---- RvWgnW1+4pux4UMOamln/5/xVLsyIgxAZwYOYZJGQo4 -H -I!4HQ uR7~Չ!3\B6 yGN7|v>n+2z'>D \ No newline at end of file +-> ssh-ed25519 CjuqfA G9o6Fr/QDmLnyWzDJ6H7hDbHOiDB+O+YktAPdvU7W3w +lJyk/YTCa5ZjO8dAlkkdhKTHZMSigRbjbKJfqw/fUEE +-> ssh-ed25519 QRYDmg EhRXKZpW6YrK5gnmjknsLw0n/p/6wpKYaxWl8okQmTk +CfhAxfuAslOeBUJ2KwPkOh3Z0iNzpLzWS6RDXf2FoeU +-> ssh-ed25519 wG6LYg QYrpUmxiXhq1j6J8Z2LitWd1B2HLcKN5+AoeKKxq0A8 +cqvR67PV3wfNa9fmJb/WBXfC7A0sdmVaM/rsnVMtbIY +-> ssh-ed25519 ZYd7Zg vL7E7XfhSbk+tMTrtesX6CmzvGWkticcPX/sciDH0ls +i/vSM2S32FE9ehBTNZMMgA44JF35VrsDc4Zj/0XawV8 +-> ssh-ed25519 as9VYQ ySyFU1aWka32ZrVR9psB7STvoBTszdCnL2J1Cp1CBnk +fmKHzYW7fvUnhfUUtK5agqcjK959GiV0RVCMOSx1BaE +-> ssh-ed25519 dWIbQQ 2L8XRok6Pn2pWjEiONRA5AJbRj7JKJY+nmvMaqD9zFA +t96XWaBuCxX/yawMq1DTK96B9rj8MnHL8JDf077lpvU +-> FS#1-grease p/ s |i4Z RP +945g87K4K3dU72Jn79DaImolDd5q+oVX5z4sKiqi2rZe2HbUgoNHlhRF8yyDIQpH +t2tFBx4OJN8NqVXkKw5NXTdmqKVIzCg +--- 9px5+jkQswAox2FjRnHynMCI0o0pnUqdmEcmGqdbqaE +ќK6F +@*֙?j~ !ϺՓxB>+b ssh-ed25519 CjuqfA EQLHOBOVfp+j3x+coXt1isDkG+LvsSYkU8PT1cg97FQ -NJWJKvmN4hUHsC34n1ap4HlipC0rGWlqrbgR4vm91YY --> ssh-ed25519 QRYDmg LOvHPzC4zfX2rlQBxYwHoHhjftCyWnBRLXZ/aB1ekQM -lVtsflczWZwhBx4FZeJK6jtcUCvwQKIA5Gmbth2to9U --> ssh-ed25519 wG6LYg nqcLDqaVL7D0seK7kW52vmG/lm0Nd28lBroYrRMVynI -oYA8E4DDR26gpRCdJMWtzoGvUTErI6GMSdF99kTNKtc --> ssh-ed25519 ZYd7Zg vz3LZxq0+KTx6E4J0X6duivLP0TFtA8WaOQaiSmMcF4 -5g+3H/6J9FjsWifcfmEq8dz0hk4mpZhhJaEndPE3Mpw --> ssh-ed25519 as9VYQ VIQ18yC/qEiP66hfCwWAbAbNCBypB47gbWkFg/TJmWE -MXK5RnuwAlKt676CPO0N/3BeM9gsgMPZNEG1DXq8uXA --> 8kx-grease s%obC ~GOw1 C - ---- V8z981BPe2yVOaMCj2np9Vvvy/6zP8xHCFKRFwsceXs -+Xob_) ssh-ed25519 CjuqfA OoHLAZHlhjUykTdrTL3vR4xOR+M9xUz6PRr8sxM/ikc +MA0ZOeqZoraMOKFLs9XnEzLNGpAt3jJWytC5MXDO0qM +-> ssh-ed25519 QRYDmg uciExW93VcA/9Y1pchLXoWwDr3R47VbMvvxQUmeonxM +lckRRFSnA/MGRYaoBe3PTTTk1O+ZhfBrjhppvU16j5A +-> ssh-ed25519 wG6LYg 8J8epMCx+l9M6KBtVfjgD5+jdCC8//CtBnk1t64+5EM +lLhpx7tk43/gOQTg4L9XRg+EDmupK0bW3hS1PclpZjY +-> ssh-ed25519 ZYd7Zg wTghQ4lU1zbttB1pzWQJZVZAEmWvbZzJ1dh5vOqq90g +AwtibVxQP2AOkq6O0AW8M4BxCXE6DkDkdatoYr8E8rg +-> ssh-ed25519 as9VYQ E4qn+C3VtEKcnOfh2/VTuzQtyR1y3vjyTlEbVQbj604 +vtFR+dBGPXbvfK2HT5J2Tfn++yUUAs5oIOKEoRqITxk +-> ssh-ed25519 dWIbQQ O0PMTuY3HGpLFOiE5QzsX4TkQv6DReuHipvFBxdE2xM +SsJrr8NB3d+ohcftj5CkmtK6GZvoVt8GQeav6le/uwY +-> kkxK-grease Y+ 1G ^ ++17Pd0/0prkcbg/vxL8ews/NtQJrYEXafnHXU7L5NxqtYiokkh9d +--- HerEQyxchdLe0MJl/ZwU/NLtCNewjaNFqNA+KjvDtYg +9jv^7X#BAUC2wDg^Úf^R(2M)I[ |8лFNbBnMcZDr \ No newline at end of file