From fc68fa5ce9084534f9b8d7dc0b32d9eca1eb0327 Mon Sep 17 00:00:00 2001 From: demenik Date: Mon, 1 Dec 2025 18:24:34 +0100 Subject: [PATCH] Initial commit --- flake.lock | 832 ++++++++++++++++++ flake.nix | 151 ++++ home/accounts/default.nix | 5 + home/accounts/mail.nix | 135 +++ home/demenik.nix | 33 + home/desktops/global.nix | 21 + home/desktops/hyprland/animations.nix | 2 + home/desktops/hyprland/binds/app-binds.nix | 5 + home/desktops/hyprland/binds/default.nix | 57 ++ home/desktops/hyprland/binds/vim-binds.nix | 27 + home/desktops/hyprland/default.nix | 75 ++ home/desktops/hyprland/dunst.nix | 45 + home/desktops/hyprland/hypridle.nix | 32 + home/desktops/hyprland/hyprlock.nix | 107 +++ home/desktops/hyprland/rules.nix | 18 + home/desktops/wayland.nix | 22 + home/editors/cursor.nix | 3 + home/editors/intellij.nix | 5 + home/editors/nvim/colorschemes.nix | 32 + home/editors/nvim/default.nix | 47 + home/editors/nvim/keymaps.nix | 43 + home/editors/nvim/options.nix | 38 + home/editors/nvim/plugins/builds.nix | 56 ++ home/editors/nvim/plugins/cmp/cmp.nix | 257 ++++++ home/editors/nvim/plugins/cmp/copilot.nix | 33 + home/editors/nvim/plugins/cmp/default.nix | 10 + .../nvim/plugins/decoration/config.lua | 10 + .../nvim/plugins/decoration/default.nix | 17 + home/editors/nvim/plugins/default.nix | 26 + home/editors/nvim/plugins/editing/default.nix | 38 + .../nvim/plugins/formatting/conform.nix | 128 +++ .../nvim/plugins/formatting/default.nix | 32 + home/editors/nvim/plugins/git/default.nix | 14 + home/editors/nvim/plugins/git/gitsigns.nix | 23 + home/editors/nvim/plugins/lang/default.nix | 8 + .../nvim/plugins/lang/docs/default.nix | 6 + home/editors/nvim/plugins/lang/docs/latex.nix | 22 + .../nvim/plugins/lang/docs/markdown.nix | 23 + home/editors/nvim/plugins/lang/flutter.nix | 3 + home/editors/nvim/plugins/lang/rust.nix | 23 + home/editors/nvim/plugins/lang/tailwind.nix | 3 + home/editors/nvim/plugins/lsp/default.nix | 31 + home/editors/nvim/plugins/lsp/kotlin-lsp.nix | 93 ++ home/editors/nvim/plugins/lsp/lint.nix | 56 ++ home/editors/nvim/plugins/lsp/lspkind.nix | 53 ++ home/editors/nvim/plugins/lsp/servers.nix | 123 +++ home/editors/nvim/plugins/snippet/default.nix | 84 ++ .../nvim/plugins/snippet/nix/ags.flake.nix | 84 ++ .../nvim/plugins/snippet/nix/bevy.flake.nix | 116 +++ .../nvim/plugins/snippet/nix/default.nix | 44 + .../nvim/plugins/snippet/nix/flake.nix | 17 + .../plugins/snippet/nix/flutter.flake.nix | 46 + .../nvim/plugins/snippet/nix/gradle.flake.nix | 22 + .../nvim/plugins/snippet/nix/maven.flake.nix | 21 + .../nvim/plugins/snippet/nix/npm.flake.nix | 39 + .../nvim/plugins/snippet/nix/rust.flake.nix | 81 ++ .../nvim/plugins/snippet/nix/tauri.flake.nix | 51 ++ .../nvim/plugins/treesitter/default.nix | 14 + .../nvim/plugins/treesitter/settings.nix | 83 ++ .../nvim/plugins/treesitter/textobjects.nix | 47 + .../nvim/plugins/utils/alpha/default.nix | 61 ++ .../nvim/plugins/utils/alpha/themes.nix | 53 ++ home/editors/nvim/plugins/utils/debugging.nix | 45 + home/editors/nvim/plugins/utils/default.nix | 33 + home/editors/nvim/plugins/utils/fzf-lua.nix | 12 + home/editors/nvim/plugins/utils/grug-far.nix | 3 + .../nvim/plugins/utils/lualine/colors.nix | 14 + .../nvim/plugins/utils/lualine/default.nix | 78 ++ .../plugins/utils/lualine/hide_statusbar.lua | 4 + .../plugins/utils/lualine/section-left.nix | 48 + .../plugins/utils/lualine/section-right.nix | 64 ++ .../nvim/plugins/utils/lualine/tabline.nix | 39 + home/editors/nvim/plugins/utils/presence.nix | 23 + home/editors/nvim/plugins/utils/silicon.nix | 24 + .../nvim/plugins/utils/todo-comments.nix | 22 + .../editors/nvim/plugins/utils/toggleterm.nix | 14 + .../nvim/plugins/utils/which-key/config.lua | 227 +++++ .../nvim/plugins/utils/which-key/default.nix | 17 + home/editors/nvim/stylua.toml | 2 + home/global.nix | 53 ++ home/programs/cli/ai.nix | 5 + home/programs/cli/bat.nix | 21 + home/programs/cli/btop.nix | 15 + home/programs/cli/debugging.nix | 5 + home/programs/cli/default.nix | 13 + home/programs/cli/eza.nix | 21 + home/programs/cli/fastfetch.nix | 47 + home/programs/cli/jq.nix | 3 + home/programs/cli/ssh.nix | 32 + home/programs/cli/zoxide.nix | 10 + home/programs/default.nix | 44 + home/programs/emulator.nix | 7 + home/programs/firefox.nix | 155 ++++ home/programs/nmgui.nix | 11 + home/programs/obsidian.nix | 7 + home/programs/office.nix | 64 ++ home/programs/overskride.nix | 11 + home/programs/qbittorrent.nix | 22 + home/programs/rofi.nix | 123 +++ home/programs/spicetify.nix | 34 + home/programs/thunderbird.nix | 34 + home/programs/vesktop.nix | 369 ++++++++ home/programs/vpn.nix | 5 + home/services/bisync.nix | 62 ++ home/services/kanshi.nix | 60 ++ home/shells/zsh/aliases.nix | 9 + home/shells/zsh/default.nix | 27 + home/shells/zsh/prompt.nix | 8 + home/shells/zsh/scripts.nix | 33 + home/shells/zsh/theme.omp.toml | 72 ++ home/stylix/cursor.nix | 23 + home/stylix/default.nix | 32 + home/stylix/fonts.nix | 31 + home/stylix/targets.nix | 11 + home/terminals/kitty/cwd.nix | 63 ++ home/terminals/kitty/default.nix | 19 + home/xdg-desktop.nix | 19 + hosts/thinkpad.nix | 38 + hosts/wsl.nix | 4 + nixos/full.nix | 44 + nixos/global/default.nix | 49 ++ nixos/global/nix.nix | 19 + nixos/headless.nix | 19 + nixos/optional/adb.nix | 4 + nixos/optional/backup.nix | 1 + nixos/optional/bluetooth.nix | 3 + nixos/optional/direnv.nix | 6 + nixos/optional/docker.nix | 8 + nixos/optional/eduroam.nix | 19 + nixos/optional/fprint.nix | 7 + nixos/optional/gaming.nix | 15 + nixos/optional/greetd.nix | 17 + nixos/optional/networkmanager.nix | 9 + nixos/optional/vm.nix | 6 + nixos/optional/wireshark.nix | 10 + nixos/users/demenik.nix | 7 + secrets/.gitignore | 3 + secrets/default.nix | 29 + secrets/nextcloud.age | 7 + secrets/obsidian-personal.age | Bin 0 -> 4900 bytes secrets/obsidian-uni-notes.age | Bin 0 -> 4900 bytes secrets/secrets.nix | 14 + 142 files changed, 6273 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 home/accounts/default.nix create mode 100644 home/accounts/mail.nix create mode 100644 home/demenik.nix create mode 100644 home/desktops/global.nix create mode 100644 home/desktops/hyprland/animations.nix create mode 100644 home/desktops/hyprland/binds/app-binds.nix create mode 100644 home/desktops/hyprland/binds/default.nix create mode 100644 home/desktops/hyprland/binds/vim-binds.nix create mode 100644 home/desktops/hyprland/default.nix create mode 100644 home/desktops/hyprland/dunst.nix create mode 100644 home/desktops/hyprland/hypridle.nix create mode 100644 home/desktops/hyprland/hyprlock.nix create mode 100644 home/desktops/hyprland/rules.nix create mode 100644 home/desktops/wayland.nix create mode 100644 home/editors/cursor.nix create mode 100644 home/editors/intellij.nix create mode 100644 home/editors/nvim/colorschemes.nix create mode 100644 home/editors/nvim/default.nix create mode 100644 home/editors/nvim/keymaps.nix create mode 100644 home/editors/nvim/options.nix create mode 100644 home/editors/nvim/plugins/builds.nix create mode 100644 home/editors/nvim/plugins/cmp/cmp.nix create mode 100644 home/editors/nvim/plugins/cmp/copilot.nix create mode 100644 home/editors/nvim/plugins/cmp/default.nix create mode 100644 home/editors/nvim/plugins/decoration/config.lua create mode 100644 home/editors/nvim/plugins/decoration/default.nix create mode 100644 home/editors/nvim/plugins/default.nix create mode 100644 home/editors/nvim/plugins/editing/default.nix create mode 100644 home/editors/nvim/plugins/formatting/conform.nix create mode 100644 home/editors/nvim/plugins/formatting/default.nix create mode 100644 home/editors/nvim/plugins/git/default.nix create mode 100644 home/editors/nvim/plugins/git/gitsigns.nix create mode 100644 home/editors/nvim/plugins/lang/default.nix create mode 100644 home/editors/nvim/plugins/lang/docs/default.nix create mode 100644 home/editors/nvim/plugins/lang/docs/latex.nix create mode 100644 home/editors/nvim/plugins/lang/docs/markdown.nix create mode 100644 home/editors/nvim/plugins/lang/flutter.nix create mode 100644 home/editors/nvim/plugins/lang/rust.nix create mode 100644 home/editors/nvim/plugins/lang/tailwind.nix create mode 100644 home/editors/nvim/plugins/lsp/default.nix create mode 100644 home/editors/nvim/plugins/lsp/kotlin-lsp.nix create mode 100644 home/editors/nvim/plugins/lsp/lint.nix create mode 100644 home/editors/nvim/plugins/lsp/lspkind.nix create mode 100644 home/editors/nvim/plugins/lsp/servers.nix create mode 100644 home/editors/nvim/plugins/snippet/default.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/ags.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/bevy.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/default.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/flutter.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/gradle.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/maven.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/npm.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/rust.flake.nix create mode 100644 home/editors/nvim/plugins/snippet/nix/tauri.flake.nix create mode 100644 home/editors/nvim/plugins/treesitter/default.nix create mode 100644 home/editors/nvim/plugins/treesitter/settings.nix create mode 100644 home/editors/nvim/plugins/treesitter/textobjects.nix create mode 100644 home/editors/nvim/plugins/utils/alpha/default.nix create mode 100644 home/editors/nvim/plugins/utils/alpha/themes.nix create mode 100644 home/editors/nvim/plugins/utils/debugging.nix create mode 100644 home/editors/nvim/plugins/utils/default.nix create mode 100644 home/editors/nvim/plugins/utils/fzf-lua.nix create mode 100644 home/editors/nvim/plugins/utils/grug-far.nix create mode 100644 home/editors/nvim/plugins/utils/lualine/colors.nix create mode 100644 home/editors/nvim/plugins/utils/lualine/default.nix create mode 100644 home/editors/nvim/plugins/utils/lualine/hide_statusbar.lua create mode 100644 home/editors/nvim/plugins/utils/lualine/section-left.nix create mode 100644 home/editors/nvim/plugins/utils/lualine/section-right.nix create mode 100644 home/editors/nvim/plugins/utils/lualine/tabline.nix create mode 100644 home/editors/nvim/plugins/utils/presence.nix create mode 100644 home/editors/nvim/plugins/utils/silicon.nix create mode 100644 home/editors/nvim/plugins/utils/todo-comments.nix create mode 100644 home/editors/nvim/plugins/utils/toggleterm.nix create mode 100644 home/editors/nvim/plugins/utils/which-key/config.lua create mode 100644 home/editors/nvim/plugins/utils/which-key/default.nix create mode 100644 home/editors/nvim/stylua.toml create mode 100644 home/global.nix create mode 100644 home/programs/cli/ai.nix create mode 100644 home/programs/cli/bat.nix create mode 100644 home/programs/cli/btop.nix create mode 100644 home/programs/cli/debugging.nix create mode 100644 home/programs/cli/default.nix create mode 100644 home/programs/cli/eza.nix create mode 100644 home/programs/cli/fastfetch.nix create mode 100644 home/programs/cli/jq.nix create mode 100644 home/programs/cli/ssh.nix create mode 100644 home/programs/cli/zoxide.nix create mode 100644 home/programs/default.nix create mode 100644 home/programs/emulator.nix create mode 100644 home/programs/firefox.nix create mode 100644 home/programs/nmgui.nix create mode 100644 home/programs/obsidian.nix create mode 100644 home/programs/office.nix create mode 100644 home/programs/overskride.nix create mode 100644 home/programs/qbittorrent.nix create mode 100644 home/programs/rofi.nix create mode 100644 home/programs/spicetify.nix create mode 100644 home/programs/thunderbird.nix create mode 100644 home/programs/vesktop.nix create mode 100644 home/programs/vpn.nix create mode 100644 home/services/bisync.nix create mode 100644 home/services/kanshi.nix create mode 100644 home/shells/zsh/aliases.nix create mode 100644 home/shells/zsh/default.nix create mode 100644 home/shells/zsh/prompt.nix create mode 100644 home/shells/zsh/scripts.nix create mode 100644 home/shells/zsh/theme.omp.toml create mode 100644 home/stylix/cursor.nix create mode 100644 home/stylix/default.nix create mode 100644 home/stylix/fonts.nix create mode 100644 home/stylix/targets.nix create mode 100644 home/terminals/kitty/cwd.nix create mode 100644 home/terminals/kitty/default.nix create mode 100644 home/xdg-desktop.nix create mode 100644 hosts/thinkpad.nix create mode 100644 hosts/wsl.nix create mode 100644 nixos/full.nix create mode 100644 nixos/global/default.nix create mode 100644 nixos/global/nix.nix create mode 100644 nixos/headless.nix create mode 100644 nixos/optional/adb.nix create mode 100644 nixos/optional/backup.nix create mode 100644 nixos/optional/bluetooth.nix create mode 100644 nixos/optional/direnv.nix create mode 100644 nixos/optional/docker.nix create mode 100644 nixos/optional/eduroam.nix create mode 100644 nixos/optional/fprint.nix create mode 100644 nixos/optional/gaming.nix create mode 100644 nixos/optional/greetd.nix create mode 100644 nixos/optional/networkmanager.nix create mode 100644 nixos/optional/vm.nix create mode 100644 nixos/optional/wireshark.nix create mode 100644 nixos/users/demenik.nix create mode 100644 secrets/.gitignore create mode 100644 secrets/default.nix create mode 100644 secrets/nextcloud.age create mode 100644 secrets/obsidian-personal.age create mode 100644 secrets/obsidian-uni-notes.age create mode 100644 secrets/secrets.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..409c2c3 --- /dev/null +++ b/flake.lock @@ -0,0 +1,832 @@ +{ + "nodes": { + "agenix": { + "inputs": { + "darwin": "darwin", + "home-manager": "home-manager", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1762618334, + "narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=", + "owner": "ryantm", + "repo": "agenix", + "rev": "fcdea223397448d35d9b31f798479227e80183f6", + "type": "github" + }, + "original": { + "owner": "ryantm", + "repo": "agenix", + "type": "github" + } + }, + "ags": { + "inputs": { + "astal": "astal", + "nixpkgs": [ + "statusbar", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762046771, + "narHash": "sha256-baVZvZZN0t9F3fvVhxmQA1/oNykXGd/YhlF19JqCLc8=", + "owner": "aylur", + "repo": "ags", + "rev": "fe13af2daec716226ccdb3158606a8577853e0ff", + "type": "github" + }, + "original": { + "owner": "aylur", + "repo": "ags", + "type": "github" + } + }, + "astal": { + "inputs": { + "nixpkgs": [ + "statusbar", + "ags", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762012522, + "narHash": "sha256-ncEN4OVFM5M9VFc4oR3gOI5K8r99GcYxtU+Cf4Z8pbs=", + "owner": "aylur", + "repo": "astal", + "rev": "671d4229c798834190a50fb8b8d8addd19b529e9", + "type": "github" + }, + "original": { + "owner": "aylur", + "repo": "astal", + "type": "github" + } + }, + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1755819240, + "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "base16-fish": { + "flake": false, + "locked": { + "lastModified": 1754405784, + "narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=", + "owner": "tomyun", + "repo": "base16-fish", + "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561", + "type": "github" + }, + "original": { + "owner": "tomyun", + "repo": "base16-fish", + "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561", + "type": "github" + } + }, + "base16-helix": { + "flake": false, + "locked": { + "lastModified": 1752979451, + "narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "27cf1e66e50abc622fb76a3019012dc07c678fac", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + } + }, + "bettersoundcloud": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1758915997, + "narHash": "sha256-alfX86Dk0NfhQu8PwonzKFxhA4XR40LoOhhdiIsFztc=", + "owner": "demenik", + "repo": "BetterSoundCloud-nix", + "rev": "c79babf9a51269b55924fdec69670ce76e0abcf3", + "type": "github" + }, + "original": { + "owner": "demenik", + "repo": "BetterSoundCloud-nix", + "type": "github" + } + }, + "darwin": { + "inputs": { + "nixpkgs": [ + "agenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1744478979, + "narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "43975d782b418ebf4969e9ccba82466728c2851b", + "type": "github" + }, + "original": { + "owner": "lnl7", + "ref": "master", + "repo": "nix-darwin", + "type": "github" + } + }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1758112371, + "narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1761588595, + "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1763759067, + "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1756770412, + "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "4524271976b625a4a605beefd893f270620fd751", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "inputs": { + "systems": "systems_6" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "gnome-shell": { + "flake": false, + "locked": { + "host": "gitlab.gnome.org", + "lastModified": 1762869044, + "narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=", + "owner": "GNOME", + "repo": "gnome-shell", + "rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad", + "type": "gitlab" + }, + "original": { + "host": "gitlab.gnome.org", + "owner": "GNOME", + "ref": "gnome-49", + "repo": "gnome-shell", + "type": "gitlab" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "agenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1745494811, + "narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1763992752, + "narHash": "sha256-iinKiBTAx7F9EkMqKFSqaWTCaay463toAPtQiA8RRyc=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "55af952c5612190c3e7862f4e2504048c50841aa", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "ixx": { + "inputs": { + "flake-utils": [ + "nixvim", + "nuschtosSearch", + "flake-utils" + ], + "nixpkgs": [ + "nixvim", + "nuschtosSearch", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1754860581, + "narHash": "sha256-EM0IE63OHxXCOpDHXaTyHIOk2cNvMCGPqLt/IdtVxgk=", + "owner": "NuschtOS", + "repo": "ixx", + "rev": "babfe85a876162c4acc9ab6fb4483df88fa1f281", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "ref": "v0.1.1", + "repo": "ixx", + "type": "github" + } + }, + "mcmojave-cursors": { + "flake": false, + "locked": { + "lastModified": 1614124859, + "narHash": "sha256-4YqSucpxA7jsuJ9aADjJfKRPgPR89oq2l0T1N28+GV0=", + "owner": "vinceliuice", + "repo": "McMojave-cursors", + "rev": "7d0bfc1f91028191cdc220b87fd335a235ee4439", + "type": "github" + }, + "original": { + "owner": "vinceliuice", + "repo": "McMojave-cursors", + "type": "github" + } + }, + "nixos-wsl": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1763946063, + "narHash": "sha256-mxIPAXPmkf5aG7/pj59+82gvtgw2qi8pWIolMPTswu8=", + "owner": "nix-community", + "repo": "nixos-wsl", + "rev": "8d8506cea352fba187cfc748078e0c920c4e2129", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "main", + "repo": "nixos-wsl", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1763835633, + "narHash": "sha256-HzxeGVID5MChuCPESuC0dlQL1/scDKu+MmzoVBJxulM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "050e09e091117c3d7328c7b2b7b577492c43c134", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1763618868, + "narHash": "sha256-v5afmLjn/uyD9EQuPBn7nZuaZVV9r+JerayK/4wvdWA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a8d610af3f1a5fb71e23e08434d8d61a466fc942", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixvim": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2", + "nuschtosSearch": "nuschtosSearch", + "systems": "systems_4" + }, + "locked": { + "lastModified": 1763984728, + "narHash": "sha256-i07UsSg+kedev5Bh/p/ERG1xrbRivOztih8laHZR6W8=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "3dc952d69cd38cdc3ad3ec7570fc4a1caed2bfea", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixvim", + "type": "github" + } + }, + "nur": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1758998580, + "narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=", + "owner": "nix-community", + "repo": "NUR", + "rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, + "nuschtosSearch": { + "inputs": { + "flake-utils": "flake-utils_2", + "ixx": "ixx", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1761730856, + "narHash": "sha256-t1i5p/vSWwueZSC0Z2BImxx3BjoUDNKyC2mk24krcMY=", + "owner": "NuschtOS", + "repo": "search", + "rev": "e29de6db0cb3182e9aee75a3b1fd1919d995d85b", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "repo": "search", + "type": "github" + } + }, + "root": { + "inputs": { + "agenix": "agenix", + "bettersoundcloud": "bettersoundcloud", + "home-manager": "home-manager_2", + "mcmojave-cursors": "mcmojave-cursors", + "nixos-wsl": "nixos-wsl", + "nixpkgs": "nixpkgs", + "nixvim": "nixvim", + "spicetify-nix": "spicetify-nix", + "statusbar": "statusbar", + "stylix": "stylix" + } + }, + "spicetify-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems_5" + }, + "locked": { + "lastModified": 1763985453, + "narHash": "sha256-vUqODgLIjeyHN7DP8dVx7oH9yB/L8qcxpN//4EmMQcM=", + "owner": "gerg-l", + "repo": "spicetify-nix", + "rev": "89cd40c646ec5b12e5c20c0e18f082e7629d4819", + "type": "github" + }, + "original": { + "owner": "gerg-l", + "repo": "spicetify-nix", + "type": "github" + } + }, + "statusbar": { + "inputs": { + "ags": "ags", + "flake-utils": "flake-utils_3", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762946029, + "narHash": "sha256-GTYYOh/Bl++Ddi0g5y29Kne7g0LqemcfSkEfWGxrJo4=", + "owner": "demenik", + "repo": "statusbar", + "rev": "3256d7a50059c72599b4f6ca940bcf4054216263", + "type": "github" + }, + "original": { + "owner": "demenik", + "repo": "statusbar", + "type": "github" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-parts": "flake-parts_2", + "gnome-shell": "gnome-shell", + "nixpkgs": [ + "nixpkgs" + ], + "nur": "nur", + "systems": "systems_7", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1763845141, + "narHash": "sha256-o8TKdZluj/yC8qPIVNe2g4qopyFmQglH52+lvQx82kE=", + "owner": "nix-community", + "repo": "stylix", + "rev": "adc650610085adbe130b9860d5bdb869f96050af", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "stylix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "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" + } + }, + "systems_6": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_7": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tinted-foot": { + "flake": false, + "locked": { + "lastModified": 1726913040, + "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + } + }, + "tinted-kitty": { + "flake": false, + "locked": { + "lastModified": 1735730497, + "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1757716333, + "narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "317a5e10c35825a6c905d912e480dfe8e71c7559", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1757811970, + "narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1757811247, + "narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..386d07c --- /dev/null +++ b/flake.nix @@ -0,0 +1,151 @@ +{ + description = "demenik's dots"; + + nixConfig.experimentalFeatures = ["nix-command" "flakes"]; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + nixos-wsl = { + url = "github:nix-community/nixos-wsl/main"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + agenix = { + url = "github:ryantm/agenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + stylix = { + url = "github:nix-community/stylix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + nixvim.url = "github:nix-community/nixvim"; + spicetify-nix = { + url = "github:gerg-l/spicetify-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + mcmojave-cursors = { + url = "github:vinceliuice/McMojave-cursors"; + flake = false; + }; + bettersoundcloud = { + url = "github:demenik/BetterSoundCloud-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + statusbar = { + url = "github:demenik/statusbar"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { + nixpkgs, + home-manager, + agenix, + stylix, + nixos-wsl, + statusbar, + ... + } @ inputs: { + nixosConfigurations = let + mkNixConfig = { + hostName, + system ? "x86_64-linux", + user ? "demenik", + stateVersion ? "25.05", + dotsDir ? "/home/${user}/dots", + nixOsModules ? [], + hmModules ? [], + }: let + specialArgs = {inherit inputs stateVersion user dotsDir;}; + in + nixpkgs.lib.nixosSystem { + inherit system specialArgs; + + modules = + [ + { + networking.hostName = hostName; + } + + home-manager.nixosModules.home-manager + { + home-manager = { + # useGlobalPkgs = true; + backupFileExtension = "backup"; + + users."${user}".imports = hmModules; + extraSpecialArgs = specialArgs; + }; + } + ] + ++ nixOsModules; + }; + in { + thinkpad = mkNixConfig { + hostName = "thinkpad"; + nixOsModules = [ + ./hosts/thinkpad.nix + ./nixos/full.nix + + statusbar.nixosModules.default + ]; + hmModules = [ + ./home/demenik.nix + + agenix.homeManagerModules.default + ./secrets + + stylix.homeModules.stylix + ./home/stylix + ]; + }; + + wsl = mkNixConfig rec { + hostName = "wsl"; + nixOsModules = [ + ./hosts/wsl.nix + ./nixos/headless.nix + + nixos-wsl.nixosModules.default + + ]; + hmModules = [ + ./home/headless.nix + ]; + }; + }; + + homeConfigurations = let + mkHomeConfig = { + system ? "x86_64-linux", + user ? "demenik", + stateVersion ? "25.05", + dotsDir ? "/home/${user}/dots", + modules ? [], + }: + home-manager.lib.homeManagerConfiguration { + pkgs = import nixpkgs {inherit system;}; + inherit modules; + extraSpecialArgs = {inherit inputs stateVersion user dotsDir;}; + }; + in { + "nix@homelab" = mkHomeConfig { + user = "nix"; + dotsDir = "/home/homelab-dots"; + modules = [ + ./home/headless.nix + ]; + }; + "db56@wsl50" = mkHomeConfig { + user = "db56"; + modules = [ + ./home/headless.nix + ]; + }; + }; + }; +} diff --git a/home/accounts/default.nix b/home/accounts/default.nix new file mode 100644 index 0000000..779cc3f --- /dev/null +++ b/home/accounts/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./mail.nix + ]; +} diff --git a/home/accounts/mail.nix b/home/accounts/mail.nix new file mode 100644 index 0000000..fbb99a2 --- /dev/null +++ b/home/accounts/mail.nix @@ -0,0 +1,135 @@ +{ + lib, + pkgs, + ... +}: { + home.packages = with pkgs; [ + pass + ]; + + accounts.email.accounts = let + getPass = address: "${lib.getExe pkgs.pass} show ${address}"; + in { + "iCloud" = rec { + primary = true; + address = "dominik.bernroider@icloud.com"; + userName = address; + realName = "Dominik Bernroider"; + + passwordCommand = getPass address; + + imap = { + host = "imap.mail.me.com"; + port = 993; + tls.enable = true; + }; + + smtp = { + host = "smtp.mail.me.com"; + port = 587; + tls = { + enable = true; + useStartTls = true; + }; + }; + + thunderbird.enable = true; + }; + + "Gmail" = rec { + address = "domerepu@gmail.com"; + userName = address; + realName = "Dominik Bernroider"; + flavor = "gmail.com"; + + passwordCommand = getPass address; + + imap = { + host = "imap.gmail.com"; + port = 993; + tls.enable = true; + }; + + smtp = { + host = "smtp.gmail.com"; + port = 465; + tls.enable = true; + }; + + thunderbird.enable = true; + }; + + "Uni-Ulm" = rec { + address = "dominik.bernroider@uni-ulm.de"; + userName = "tct47"; + realName = "Dominik Bernroider"; + + passwordCommand = getPass address; + + imap = { + host = "imap.uni-ulm.de"; + port = 993; + tls.enable = true; + }; + + smtp = { + host = "mail.uni-ulm.de"; + port = 587; + tls = { + enable = true; + useStartTls = true; + }; + }; + + thunderbird.enable = true; + }; + + "Self-hosted" = rec { + address = "mail@demenik.tech"; + userName = address; + realName = "Dominik Bernroider"; + + passwordCommand = getPass address; + + imap = { + host = "mail.demenik.tech"; + port = 993; + tls.enable = true; + }; + + smtp = { + host = "mail.demenik.tech"; + port = 587; + tls = { + enable = true; + useStartTls = true; + }; + }; + + thunderbird.enable = true; + }; + + "Alte Gmail" = rec { + address = "domemc.netzwerk@gmail.com"; + flavor = "gmail.com"; + userName = address; + realName = "Dominik Bernroider"; + + passwordCommand = getPass address; + + imap = { + host = "imap.gmail.com"; + port = 993; + tls.enable = true; + }; + + smtp = { + host = "smtp.gmail.com"; + port = 465; + tls.enable = true; + }; + + thunderbird.enable = true; + }; + }; +} diff --git a/home/demenik.nix b/home/demenik.nix new file mode 100644 index 0000000..89ebfa7 --- /dev/null +++ b/home/demenik.nix @@ -0,0 +1,33 @@ +{pkgs, ...}: { + imports = [ + ./global.nix + ./xdg-desktop.nix + ./accounts + + ./desktops/hyprland + + ./services/kanshi.nix + ./services/bisync.nix + + ./shells/zsh + ./terminals/kitty + + ./programs + ./editors/nvim + ./editors/intellij.nix + ./editors/cursor.nix + ]; + + home.file.".face" = { + source = pkgs.fetchurl { + url = "https://github.com/demenik.png"; + hash = "sha256-+1ugmn5qeAvijj5Lm3Ye0rW9UEF9OCGxiSMfZKVjxI4="; + }; + }; + + home.packages = with pkgs; [ + mpvpaper + ]; + + services.swww.enable = true; +} diff --git a/home/desktops/global.nix b/home/desktops/global.nix new file mode 100644 index 0000000..dbaf075 --- /dev/null +++ b/home/desktops/global.nix @@ -0,0 +1,21 @@ +{ + pkgs, + inputs, + ... +}: { + home = { + sessionVariables = { + GTK_USE_PORTAL = "1"; + NIXOS_OZONE_WL = "1"; + QT_SCALE_FACTOR = "1"; + DISABLE_QT5_COMPAT = "0"; + _JAVA_AWT_WM_NONREPARENTING = "1"; + QT_AUTO_SCREEN_SCALE_FACTOR = "1"; + }; + }; + + qt = { + enable = true; + platformTheme.name = "qtct"; + }; +} diff --git a/home/desktops/hyprland/animations.nix b/home/desktops/hyprland/animations.nix new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/home/desktops/hyprland/animations.nix @@ -0,0 +1,2 @@ +[ +] diff --git a/home/desktops/hyprland/binds/app-binds.nix b/home/desktops/hyprland/binds/app-binds.nix new file mode 100644 index 0000000..0efc421 --- /dev/null +++ b/home/desktops/hyprland/binds/app-binds.nix @@ -0,0 +1,5 @@ +# hyprlang +'' + bind = SUPER, b, exec, [workspace 2] firefox + bind = SUPER, Return, exec, kitty-cwd +'' diff --git a/home/desktops/hyprland/binds/default.nix b/home/desktops/hyprland/binds/default.nix new file mode 100644 index 0000000..b45432c --- /dev/null +++ b/home/desktops/hyprland/binds/default.nix @@ -0,0 +1,57 @@ +{pkgs, ...}: { + wayland.windowManager.hyprland = { + settings = { + bind = let + numbers = [1 2 3 4 5 6 7 8 9]; + workspace = num: "SUPER, ${toString num}, workspace, ${toString num}"; + move-to-workspace = num: "SUPER SHIFT, ${toString num}, movetoworkspace, ${toString num}"; + in + [ + "SUPER SHIFT, q, exit" + + "SUPER, x, killactive" + "SUPER, t, togglefloating" + "SUPER SHIFT, p, pin" + "SUPER, f, fullscreen, 0" + "SUPER, m, fullscreen, 1" + "SUPER SHIFT, f, fullscreenstate, -1 2" + + "SUPER, 0, workspace, 10" + "SUPER SHIFT, 0, movetoworkspace, 10" + ] + ++ map move-to-workspace numbers + ++ map workspace numbers; + + bindm = [ + "SUPER, mouse:272, movewindow" + "SUPER, mouse:273, resizewindow" + ]; + + binde = let + volume-value = 5; + brightness-value = 5; + volume-cmd = "wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ ${toString volume-value}%"; + in [ + ",XF86MonBrightnessUp, exec, light -A ${toString brightness-value}" + ",XF86MonBrightnessDown, exec, light -U ${toString brightness-value}" + # TODO: these dont work on the ThinkPad + + ",XF86AudioRaiseVolume, exec, ${volume-cmd}+" + ",XF86AudioLowerVolume, exec, ${volume-cmd}-" + ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + ]; + + bindl = [ + ",XF86AudioPlay, exec, playerctl play-pause" + ",XF86AudioNext, exec, playerctl next" + ",XF86AudioPrev, exec, playerctl previous" + ]; + }; + + extraConfig = import ./vim-binds.nix + import ./app-binds.nix; + }; + + services.playerctld.enable = true; + home.packages = with pkgs; [light]; +} diff --git a/home/desktops/hyprland/binds/vim-binds.nix b/home/desktops/hyprland/binds/vim-binds.nix new file mode 100644 index 0000000..89f6d83 --- /dev/null +++ b/home/desktops/hyprland/binds/vim-binds.nix @@ -0,0 +1,27 @@ +# hyprlang +'' + bind = SUPER, h, bringactivetotop + bind = SUPER, j, bringactivetotop + bind = SUPER, k, bringactivetotop + bind = SUPER, l, bringactivetotop + + bind = SUPER, h, movefocus, l + bind = SUPER, j, movefocus, d + bind = SUPER, k, movefocus, u + bind = SUPER, l, movefocus, r + + bind = SUPER ALT, h, swapwindow, l + bind = SUPER ALT, j, swapwindow, d + bind = SUPER ALT, k, swapwindow, u + bind = SUPER ALT, l, swapwindow, r + + bind = SUPER CTRL, h, moveactive, l + bind = SUPER CTRL, j, moveactive, d + bind = SUPER CTRL, k, moveactive, u + bind = SUPER CTRL, l, moveactive, r + + bind = SUPER SHIFT, h, resizeactive, -20 0 + bind = SUPER SHIFT, j, resizeactive, 0 20 + bind = SUPER SHIFT, k, resizeactive, 0 -20 + bind = SUPER SHIFT, l, resizeactive, 20 0 +'' diff --git a/home/desktops/hyprland/default.nix b/home/desktops/hyprland/default.nix new file mode 100644 index 0000000..92c5f2c --- /dev/null +++ b/home/desktops/hyprland/default.nix @@ -0,0 +1,75 @@ +{pkgs, ...}: { + imports = [ + ../global.nix + ../wayland.nix + + ./binds + ./hyprlock.nix + ./dunst.nix + ]; + + home.packages = with pkgs; [ + hyprland + hyprshade + + xdg-desktop-portal-hyprland + xdg-desktop-portal-gtk + ]; + + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = true; + xwayland.enable = true; + + settings = let + rules = import ./rules.nix; + in { + monitor = [",preferred,auto,1"]; + + misc.disable_hyprland_logo = true; + misc.focus_on_activate = true; + xwayland.force_zero_scaling = true; + + layerrule = rules.layer; + windowrulev2 = rules.window; + inherit (rules) workspace; + + input = { + kb_layout = "de"; + kb_variant = "nodeadkeys"; + repeat_delay = 300; + + touchpad = { + natural_scroll = true; + clickfinger_behavior = true; + disable_while_typing = false; + }; + }; + + general = { + gaps_in = 5; + gaps_out = 5; + border_size = 2; + layout = "master"; + }; + + decoration = { + rounding = 8; + blur = { + size = 4; + passes = 3; + }; + dim_around = 0.6; + }; + + animation = import ./animations.nix; + }; + }; + + services.hypridle = import ./hypridle.nix; + + home.sessionVariables = { + XDG_SESSION_DESKTOP = "Hyprland"; + XDG_CURRENT_DESKTOP = "Hyprland"; + }; +} diff --git a/home/desktops/hyprland/dunst.nix b/home/desktops/hyprland/dunst.nix new file mode 100644 index 0000000..a939d24 --- /dev/null +++ b/home/desktops/hyprland/dunst.nix @@ -0,0 +1,45 @@ +{config, ...}: { + services.dunst = { + enable = true; + + iconTheme = { + name = config.stylix.icons.dark; + inherit (config.stylix.icons) package; + }; + + settings = let + inherit (config.lib.stylix) colors; + in { + global = { + width = 400; + offset = "5x5"; + corner_radius = 4; + + progress_bar_min_width = 380; + progress_bar_max_width = 380; + progress_bar_corner_radius = 8; + + padding = 10; + horizontal_padding = 10; + frame_width = 1; + gap_size = 3; + }; + + urgency_low = { + format = "%s\n%b"; + }; + + urgency_normal = { + highlight = colors.base0A; + default_icon = "dialog-information"; + format = "%s\n%b"; + }; + + urgency_critical = { + highlight = colors.base08; + default_icon = "dialog-error"; + format = "%s\n%b"; + }; + }; + }; +} diff --git a/home/desktops/hyprland/hypridle.nix b/home/desktops/hyprland/hypridle.nix new file mode 100644 index 0000000..18ba777 --- /dev/null +++ b/home/desktops/hyprland/hypridle.nix @@ -0,0 +1,32 @@ +{ + enable = true; + settings = { + general = { + lock_cmd = "pidof hyprlock || hyprlock"; + before_sleep_cmd = "hyprlock"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 300; # 5min + on-timeout = "light -S 10"; + on-resume = "brightnessctl -r"; + } + { + timeout = 150; # 2.5min + on-timeout = "brightnessctl -sd rgb:kbd_backlight set 0"; + on-resume = "brightnessctl -rd rgb:kbd_backlight"; + } + { + timeout = 600; # 10min + on-timeout = "hyprlock"; + } + { + timeout = 900; # 15min + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + ]; + }; +} diff --git a/home/desktops/hyprland/hyprlock.nix b/home/desktops/hyprland/hyprlock.nix new file mode 100644 index 0000000..467d675 --- /dev/null +++ b/home/desktops/hyprland/hyprlock.nix @@ -0,0 +1,107 @@ +{ + config, + lib, + ... +}: { + programs.hyprlock = { + enable = true; + + settings = let + profilePhoto = "$HOME/Pictures/pfp/bladee/egobaby.jpg"; + wallpaper = "$HOME/Pictures/wallpapers/takopi/class.png"; + font_family = config.stylix.fonts.sansSerif.name; + + inherit (config.lib.stylix) colors; + text = colors.base05; + yellow = colors.base0A; + accent = colors.base0D; + in { + authentication.fingerprint.enabled = true; + + background = { + monitor = ""; + path = wallpaper; + blur_passes = 0; + blur_size = 8; + }; + + general = { + hide_cursor = true; + ignore_empty_input = true; + }; + + input-field = { + monitor = ""; + size = "250, 60"; + position = "0, -225"; + outline_thickness = 2; + dots_size = 0.2; + dots_spacing = 0.2; + dots_center = true; + outer_color = lib.mkForce "rgba(0, 0, 0, 0)"; + inner_color = lib.mkForce "rgba(100, 114, 125, 0.4)"; + font_color = lib.mkForce "rgb(${text})"; + fade_on_empty = false; + inherit font_family; + placeholder_text = "󰌾 Login as $USER"; + fail_text = "$FAIL ($ATTEMPTS)"; + capslock_color = "rgb(${yellow})"; + check_color = lib.mkForce "rgb(${accent})"; + }; + + label = [ + # Layout + { + monitor = ""; + text = "Layout: $LAYOUT"; + color = "#rgb(${text})"; + font_size = 12; + inherit font_family; + position = "30, -30"; + halign = "left"; + valign = "top"; + } + # Time + { + monitor = ""; + text = "cmd[update:1000] echo \"$(date +\"%H:%M\")\""; + color = "rgb(${text})"; + font_size = 130; + inherit font_family; + position = "0, 240"; + } + # Day-Month + { + monitor = ""; + text = "cmd[update:43200000] echo -e \"$(date +\"%A, %d. %B %Y\")\""; + color = "rgb(${text})"; + font_size = 30; + inherit font_family; + position = "0, 105"; + } + # Fingerprint + { + monitor = ""; + text = "$FPRINTPROMPT"; + color = "rgb(${text})"; + font_size = 14; + inherit font_family; + position = "0, -130"; + } + ]; + + # image = [ + # # Profile Photo + # { + # monitor = ""; + # path = profilePhoto; + # border_size = 0; + # size = 120; + # rounding = -1; + # rotate = 0; + # position = "0, -20"; + # } + # ]; + }; + }; +} diff --git a/home/desktops/hyprland/rules.nix b/home/desktops/hyprland/rules.nix new file mode 100644 index 0000000..4b327f9 --- /dev/null +++ b/home/desktops/hyprland/rules.nix @@ -0,0 +1,18 @@ +{ + layer = []; + + window = + [ + "float, class:^(hyprland-share-picker)$" + "workspace 3, class:^(Electron)$, title:^(BSC)$" # BetterSoundCloud + "workspace 3, class:^(opensoundcloud)$" + ] + ++ map (rule: "${rule}, class:^(xdg-desktop-portal-gtk)$") [ + "float" + "size 800 600" + "center 1" + "dimaround" + ]; + + workspace = []; +} diff --git a/home/desktops/wayland.nix b/home/desktops/wayland.nix new file mode 100644 index 0000000..dcac9ab --- /dev/null +++ b/home/desktops/wayland.nix @@ -0,0 +1,22 @@ +{pkgs, ...}: { + imports = [ + ./global.nix + ]; + + home = { + packages = with pkgs; [ + wl-clipboard + ]; + + sessionVariables = { + GDK_BACKEND = "wayland"; + QT_QPA_PLATFORM = "wayland"; + CLUTTER_BACKEND = "wayland"; + SDL_VIDEODRIVER = "wayland"; + XDG_SESSION_TYPE = "wayland"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + }; + }; + + services.clipman.enable = true; +} diff --git a/home/editors/cursor.nix b/home/editors/cursor.nix new file mode 100644 index 0000000..cf93559 --- /dev/null +++ b/home/editors/cursor.nix @@ -0,0 +1,3 @@ +{pkgs, ...}: { + home.packages = with pkgs; [code-cursor-fhs]; +} diff --git a/home/editors/intellij.nix b/home/editors/intellij.nix new file mode 100644 index 0000000..fa91dac --- /dev/null +++ b/home/editors/intellij.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + jetbrains.idea-community + ]; +} diff --git a/home/editors/nvim/colorschemes.nix b/home/editors/nvim/colorschemes.nix new file mode 100644 index 0000000..339e461 --- /dev/null +++ b/home/editors/nvim/colorschemes.nix @@ -0,0 +1,32 @@ +{ + programs.nixvim = { + colorscheme = "catppuccin"; + + colorschemes.catppuccin = { + enable = true; + settings = { + flavour = "mocha"; + transparent_background = true; + integrations = { + cmp = true; + gitsigns = true; + mini = { + enable = true; + indentscope_color = "lavender"; + }; + nvimtree = true; + treesitter = true; + alpha = true; + fzf = true; + grug_far = true; + harpoon = true; + markdown = true; + noice = true; + copilot_vim = true; + lsp_trouble = true; + which_key = true; + }; + }; + }; + }; +} diff --git a/home/editors/nvim/default.nix b/home/editors/nvim/default.nix new file mode 100644 index 0000000..43aafb5 --- /dev/null +++ b/home/editors/nvim/default.nix @@ -0,0 +1,47 @@ +{inputs, ...}: { + imports = [ + inputs.nixvim.homeModules.nixvim + ./plugins + ./colorschemes.nix + ]; + + programs.nixvim = { + enable = true; + defaultEditor = true; + + globals.mapleader = " "; + clipboard.register = "unnamedplus"; + luaLoader.enable = true; + + opts = import ./options.nix; + keymaps = import ./keymaps.nix; + + extraConfigLua = + # lua + '' + -- Disable netrw + g.loaded_netrw = 1 + g.loaded_netrwPlugin = 1 + + -- Hide line numbers in terminal mode + vim.cmd [[ autocmd TermOpen * setlocal nonumber norelativenumber ]] + + -- Disable arrow keys + -- vim.cmd [[ :map ]] + -- vim.cmd [[ :map ]] + -- vim.cmd [[ :map ]] + -- vim.cmd [[ :map ]] + + -- Enable diagnostics virtual text + vim.diagnostic.config({ virtual_text = true }) + + -- Add filetypes + vim.filetype.add({ + pattern = { + [".*%.arb"] = "json", + ["%.sqruff"] = "toml", + }, + }) + ''; + }; +} diff --git a/home/editors/nvim/keymaps.nix b/home/editors/nvim/keymaps.nix new file mode 100644 index 0000000..c12b50b --- /dev/null +++ b/home/editors/nvim/keymaps.nix @@ -0,0 +1,43 @@ +let + toggle = key: action: { + key = "\\${key}"; + options.desc = "Toggle ${action}"; + action = "setlocal ${action}!"; + }; + window-jump = key: { + key = ""; + action = "${key}"; + }; +in + [ + { + key = ""; + options.desc = "Redo"; + action = ""; + } + + { + key = ""; + options.desc = "Comment line"; + action = "normal gcc"; + } + + (toggle "w" "wrap") + (toggle "n" "number") + (toggle "r" "relativenumber") + (toggle "i" "ignorecase") + (toggle "c" "cursorline") + (toggle "C" "cursorcolumn") + + { + key = ""; + options.desc = "Previous buffer"; + action = "bprevious"; + } + { + key = ""; + options.desc = "Next Buffer"; + action = "bnext"; + } + ] + ++ map window-jump ["h" "j" "k" "l"] diff --git a/home/editors/nvim/options.nix b/home/editors/nvim/options.nix new file mode 100644 index 0000000..844d7a5 --- /dev/null +++ b/home/editors/nvim/options.nix @@ -0,0 +1,38 @@ +{ + # General + undofile = true; + backup = false; + writebackup = false; + mouse = "a"; + + # Appearance + breakindent = true; + cursorline = false; + linebreak = true; + number = true; + relativenumber = true; + + # Editing + ignorecase = true; + incsearch = true; + infercase = true; + smartcase = true; + smartindent = true; + + hidden = true; + title = true; + tabstop = 2; + scrolloff = 8; + shiftwidth = 2; + numberwidth = 4; + showcmd = true; + hlsearch = true; + swapfile = false; + expandtab = true; + updatetime = 100; + timeoutlen = 1000; + sidescrolloff = 8; + termguicolors = true; + splitkeep = "screen"; + fileencoding = "utf-8"; +} diff --git a/home/editors/nvim/plugins/builds.nix b/home/editors/nvim/plugins/builds.nix new file mode 100644 index 0000000..eade126 --- /dev/null +++ b/home/editors/nvim/plugins/builds.nix @@ -0,0 +1,56 @@ +pkgs: let + build = { + version, + owner, + name, + rev, + hash, + }: + pkgs.vimUtils.buildVimPlugin { + pname = name; + inherit version; + src = pkgs.fetchFromGitHub { + repo = name; + inherit owner rev; + sha256 = hash; + }; + }; +in { + # INFO: Last update: 18. Aug. 2025 | Sort latest -> oldest + + # https://github.com/SCJangra/table-nvim + table-nvim = build { + version = "27-09-2024"; + owner = "SCJangra"; + name = "table-nvim"; + rev = "c044fd37169eb10376962b0d0cec5f94d58ca626"; + hash = "1ygn4bvnpbd49gcgbkh0cdj3p75jsmwi87hby78w0fd22205pvmi"; + }; + + # https://github.com/michaelrommel/nvim-silicon + silicon = build { + version = "09-01-2025"; + owner = "michaelrommel"; + name = "nvim-silicon"; + rev = "7f66bda8f60c97a5bf4b37e5b8acb0e829ae3c32"; + hash = "1zk6lgghvdcys20cqvh2g1kjf661q1w97niq5nx1zz4yppy2f9jy"; + }; + + # https://github.com/b0o/incline.nvim + incline = build { + version = "05-06-2025"; + owner = "b0o"; + name = "incline.nvim"; + rev = "0fd2d5a27504dba7fdc507a53275f22c081fe640"; + hash = "19x35z2sj3hl3icrxzbs67xhxgq9d237vhgzqrz8ppdc74p8wgaz"; + }; + + # https://github.com/Aasim-A/scrollEOF.nvim + scrollEOF = build { + version = "31-05-2025"; + owner = "Aasim-A"; + name = "scrollEOF.nvim"; + rev = "2575109749b4bf3a0bf979a17947b3c1e8c5137e"; + hash = "1s66v9n0arg81wgw1z8iv9s304j78cd506z522avpc88d3ji4yl4"; + }; +} diff --git a/home/editors/nvim/plugins/cmp/cmp.nix b/home/editors/nvim/plugins/cmp/cmp.nix new file mode 100644 index 0000000..9cc994a --- /dev/null +++ b/home/editors/nvim/plugins/cmp/cmp.nix @@ -0,0 +1,257 @@ +{lib, ...}: { + plugins = { + cmp = { + enable = true; + autoEnableSources = true; + settings = { + experimental.ghost_text = true; + mapping.__raw = '' + cmp.mapping.preset.insert({ + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = true + }), + [""] = cmp.mapping(function(fallback) + local luasnip = require("luasnip") + + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.locally_jumpable(1) then + luasnip.jump(1) + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + local luasnip = require("luasnip") + + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }) + ''; + + window = { + completion = { + winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None"; + col_offset = -3; + side_padding = 0; + }; + documentation = { + winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None"; + col_offset = -3; + side_padding = 0; + }; + }; + + snippet.expand = + # lua + '' + function(args) + require'luasnip'.lsp_expand(args.body) + end + ''; + + formatting = { + # expandable_indicator = true; + fields = ["kind" "abbr" "menu"]; + + format = + lib.mkForce + # lua + '' + function(entry, vim_item) + local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50 })(entry, vim_item) + local strings = vim.split(kind.kind, "%s", { trimempty = true }) + kind.kind = " " .. (strings[1] or "") .. " " + kind.menu = " (" .. (strings[2] or "") .. ")" + return kind + end + ''; + }; + + completion.completeopt = "menu,menuone,preview,noinsert"; + + sources = [ + {name = "nvim_lsp";} + {name = "buffer";} + {name = "path";} + {name = "luasnip";} + ]; + }; + + cmdline = { + "/" = { + mapping.__raw = "cmp.mapping.preset.cmdline()"; + sources = [{name = "buffer";}]; + }; + ":" = { + mapping.__raw = "cmp.mapping.preset.cmdline()"; + sources = [ + { + name = "path"; + } + { + name = "cmdline"; + option.ignore_cmds = ["Man" "!"]; + } + ]; + }; + }; + }; + + cmp-nvim-lsp.enable = true; + cmp-buffer.enable = true; + cmp-path.enable = true; + cmp-cmdline.enable = true; + cmp_luasnip.enable = true; + }; + + # TODO: fix (https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance#how-to-get-types-on-the-left-and-offset-the-menu) + highlight = { + PmenuSel = { + bg = "#282C34"; + fg = "NONE"; + }; + Pmenu = { + fg = "#C5CDD9"; + bg = "#22252A"; + }; + + CmpItemAbbrDeprecated = { + fg = "#7E8294"; + bg = "NONE"; + strikethrough = true; + }; + CmpItemAbbrMatch = { + fg = "#82AAFF"; + bg = "NONE"; + bold = true; + }; + CmpItemAbbrMatchFuzzy = { + fg = "#82AAFF"; + bg = "NONE"; + bold = true; + }; + CmpItemMenu = { + fg = "#C792EA"; + bg = "NONE"; + italic = true; + }; + + CmpItemKindField = { + fg = "#EED8DA"; + bg = "#B5585F"; + }; + CmpItemKindProperty = { + fg = "#EED8DA"; + bg = "#B5585F"; + }; + CmpItemKindEvent = { + fg = "#EED8DA"; + bg = "#B5585F"; + }; + + CmpItemKindText = { + fg = "#C3E88D"; + bg = "#9FBD73"; + }; + CmpItemKindEnum = { + fg = "#C3E88D"; + bg = "#9FBD73"; + }; + CmpItemKindKeyword = { + fg = "#C3E88D"; + bg = "#9FBD73"; + }; + + CmpItemKindConstant = { + fg = "#FFE082"; + bg = "#D4BB6C"; + }; + CmpItemKindConstructor = { + fg = "#FFE082"; + bg = "#D4BB6C"; + }; + CmpItemKindReference = { + fg = "#FFE082"; + bg = "#D4BB6C"; + }; + + CmpItemKindFunction = { + fg = "#EADFF0"; + bg = "#A377BF"; + }; + CmpItemKindStruct = { + fg = "#EADFF0"; + bg = "#A377BF"; + }; + CmpItemKindClass = { + fg = "#EADFF0"; + bg = "#A377BF"; + }; + CmpItemKindModule = { + fg = "#EADFF0"; + bg = "#A377BF"; + }; + CmpItemKindOperator = { + fg = "#EADFF0"; + bg = "#A377BF"; + }; + + CmpItemKindVariable = { + fg = "#C5CDD9"; + bg = "#7E8294"; + }; + CmpItemKindFile = { + fg = "#C5CDD9"; + bg = "#7E8294"; + }; + + CmpItemKindUnit = { + fg = "#F5EBD9"; + bg = "#D4A959"; + }; + CmpItemKindSnippet = { + fg = "#F5EBD9"; + bg = "#D4A959"; + }; + CmpItemKindFolder = { + fg = "#F5EBD9"; + bg = "#D4A959"; + }; + + CmpItemKindMethod = { + fg = "#DDE5F5"; + bg = "#6C8ED4"; + }; + CmpItemKindValue = { + fg = "#DDE5F5"; + bg = "#6C8ED4"; + }; + CmpItemKindEnumMember = { + fg = "#DDE5F5"; + bg = "#6C8ED4"; + }; + + CmpItemKindInterface = { + fg = "#D8EEEB"; + bg = "#58B5A8"; + }; + CmpItemKindColor = { + fg = "#D8EEEB"; + bg = "#58B5A8"; + }; + CmpItemKindTypeParameter = { + fg = "#D8EEEB"; + bg = "#58B5A8"; + }; + }; +} diff --git a/home/editors/nvim/plugins/cmp/copilot.nix b/home/editors/nvim/plugins/cmp/copilot.nix new file mode 100644 index 0000000..1d8b4fd --- /dev/null +++ b/home/editors/nvim/plugins/cmp/copilot.nix @@ -0,0 +1,33 @@ +{ + enable = true; + + settings = { + panel.enabled = false; + + suggestion = { + autoTrigger = true; + keymap = { + accept = ""; + next = ""; + prev = ""; + dismiss = ""; + }; + }; + + filetypes = { + yaml = true; + markdown = true; + + javascript = true; + typescript = true; + + help = false; + gitcommit = false; + gitrebase = false; + hgcommit = false; + svn = false; + cvs = false; + "." = false; + }; + }; +} diff --git a/home/editors/nvim/plugins/cmp/default.nix b/home/editors/nvim/plugins/cmp/default.nix new file mode 100644 index 0000000..e734c0d --- /dev/null +++ b/home/editors/nvim/plugins/cmp/default.nix @@ -0,0 +1,10 @@ +{ + imports = [ + ./cmp.nix + ]; + + plugins = { + emmet.enable = true; + # copilot-lua = import ./copilot.nix; + }; +} diff --git a/home/editors/nvim/plugins/decoration/config.lua b/home/editors/nvim/plugins/decoration/config.lua new file mode 100644 index 0000000..7bca64a --- /dev/null +++ b/home/editors/nvim/plugins/decoration/config.lua @@ -0,0 +1,10 @@ +require("incline").setup {} + +-- vim_current_word +vim.cmd [[ + hi CurrentWord guifg=#cba6f7 + let g:vim_current_word#hightlight_twins = 0 + let g:vim_current_word#excluded_filetypes = ["minifiles", "netrw", "alpha"] +]] + +local g = vim.g diff --git a/home/editors/nvim/plugins/decoration/default.nix b/home/editors/nvim/plugins/decoration/default.nix new file mode 100644 index 0000000..7e17725 --- /dev/null +++ b/home/editors/nvim/plugins/decoration/default.nix @@ -0,0 +1,17 @@ +{pkgs, ...}: { + extraPlugins = let + builds = import ../builds.nix pkgs; + in + with builds; + with pkgs.vimPlugins; [ + incline + scrollEOF + + vim-hexokinase + vim_current_word + ]; + + plugins.noice.enable = true; + + extraConfigLua = builtins.readFile ./config.lua; +} diff --git a/home/editors/nvim/plugins/default.nix b/home/editors/nvim/plugins/default.nix new file mode 100644 index 0000000..11cc999 --- /dev/null +++ b/home/editors/nvim/plugins/default.nix @@ -0,0 +1,26 @@ +{pkgs, ...}: { + imports = [ + ./lsp + ]; + + programs.nixvim = { + # TODO: make these hm level + imports = [ + ./cmp + ./decoration + ./editing + ./formatting + ./git + ./lang + ./snippet + ./treesitter + ./utils + ]; + + plugins.mini.enable = true; + plugins.web-devicons.enable = true; + + + extraPlugins = with pkgs.vimPlugins; [plenary-nvim dressing-nvim]; + }; +} diff --git a/home/editors/nvim/plugins/editing/default.nix b/home/editors/nvim/plugins/editing/default.nix new file mode 100644 index 0000000..6d31ce1 --- /dev/null +++ b/home/editors/nvim/plugins/editing/default.nix @@ -0,0 +1,38 @@ +{ + plugins = { + nvim-autopairs = { + enable = true; + settings = { + mapBs = false; + checkTs = true; + tsConfig = { + lua = ["string" "source"]; + javascript = ["string" "template_string"]; + }; + disabledFiletypes = ["minifiles"]; + }; + }; + + mini = { + modules = { + move = {}; + splitjoin = {}; + # surround = {}; + trailspace = {}; + }; + }; + + rainbow-delimiters.enable = true; + twilight.enable = true; + zen-mode.enable = true; + + nvim-tree = { + enable = true; + settings = { + renderer = { + group_empty = true; + }; + }; + }; + }; +} diff --git a/home/editors/nvim/plugins/formatting/conform.nix b/home/editors/nvim/plugins/formatting/conform.nix new file mode 100644 index 0000000..57ac7a8 --- /dev/null +++ b/home/editors/nvim/plugins/formatting/conform.nix @@ -0,0 +1,128 @@ +{pkgs, ...}: { + extraPackages = with pkgs; [ + shfmt + shellcheck + stylua + alejandra + + prettier + prettierd + + sqruff + + yamlfmt + + black + + go + gotools + google-java-format + ktlint + rustfmt + clang-tools + cmake-format + + kdePackages.qtdeclarative # qmlformat + ]; + + plugins.conform-nvim = { + enable = true; + + settings = { + notifyOnError = true; + + formatters_by_ft = let + prettier = { + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + timeout_ms = 2000; + stop_after_first = true; + }; + in { + sh = ["shellcheck" "shfmt"]; + lua = ["stylua"]; + nix = ["alejandra"]; + + html = prettier; + css = prettier; + javascript = prettier; + typescript = prettier; + javascriptreact = prettier; + typescriptreact = prettier; + + sql = ["sqruff"]; + + json = prettier; + yaml = ["yamlfmt"]; + + python = ["black"]; + + go = ["goimports" "gofmt"]; + java = ["google-java-format"]; + kotlin = ["ktlint"]; + rust = ["rustfmt"]; + c = ["clang_format"]; + cmake = ["cmake_format"]; + cpp = ["clang_format"]; + + qml = ["qmlformat"]; + qmljs = ["qmlformat"]; + + "_" = ["trim_whitespace" "trim_newlines"]; + }; + + formatters = { + prettier = { + command = "prettier"; + prepend_args = ["-w"]; + }; + prettierd = { + command = "prettierd"; + prepend_args = ["-w"]; + }; + }; + + format_on_save = + # lua + '' + function(bufnr) + if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + return + end + + if vim.g.slow_format_filetypes[vim.bo[bufnr].filetype] then + return + end + + local function on_format(err) + if err and err:match("timeout$") then + slow_format_filetypes[vim.bo[bufnr].filetype] = true + end + end + + return { timeout_ms = 200, lsp_fallback = true }, on_format + end + ''; + + format_after_save = + # lua + '' + function (bufnr) + if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + return + end + + if not vim.g.slow_format_filetypes[vim.bo[bufnr].filetype] then + return + end + + return { lsp_fallback = true } + end + ''; + }; + }; + + extraConfigLua = '' + vim.g.slow_format_filetypes = {}; + ''; +} diff --git a/home/editors/nvim/plugins/formatting/default.nix b/home/editors/nvim/plugins/formatting/default.nix new file mode 100644 index 0000000..2386f4c --- /dev/null +++ b/home/editors/nvim/plugins/formatting/default.nix @@ -0,0 +1,32 @@ +{ + imports = [./conform.nix]; + + plugins.mini = { + modules = { + align = {}; + indentscope = { + symbol = "▏"; + draw.delay = 0; + options.try_as_border = true; + }; + }; + }; + + extraConfigLua = + # lua + '' + vim.api.nvim_create_autocmd("FileType", { + desc = "Disable indentscope for certain filetypes", + pattern = { + "alpha", + "help", + "NvimTree", + "toggleterm", + "Trouble", + }, + callback = function() + vim.b.miniindentscope_disable = true + end, + }) + ''; +} diff --git a/home/editors/nvim/plugins/git/default.nix b/home/editors/nvim/plugins/git/default.nix new file mode 100644 index 0000000..d71f925 --- /dev/null +++ b/home/editors/nvim/plugins/git/default.nix @@ -0,0 +1,14 @@ +{ + plugins = { + fugitive.enable = true; + diffview.enable = true; + gitmessenger = { + enable = true; + settings = { + include_diff = "current"; + no_default_mappings = true; + }; + }; + gitsigns = import ./gitsigns.nix; + }; +} diff --git a/home/editors/nvim/plugins/git/gitsigns.nix b/home/editors/nvim/plugins/git/gitsigns.nix new file mode 100644 index 0000000..65609e3 --- /dev/null +++ b/home/editors/nvim/plugins/git/gitsigns.nix @@ -0,0 +1,23 @@ +{ + enable = true; + + settings = { + numhl = true; + current_line_blame = true; + signs = { + add.text = "▎"; + change.text = "▎"; + delete.text = ""; + topdelete.text = ""; + changedelete.text = "▎"; + untracked.text = "▎"; + }; + signs_staged = { + add.text = "▎"; + change.text = "▎"; + delete.text = ""; + topdelete.text = ""; + changedelete.text = "▎"; + }; + }; +} diff --git a/home/editors/nvim/plugins/lang/default.nix b/home/editors/nvim/plugins/lang/default.nix new file mode 100644 index 0000000..016989a --- /dev/null +++ b/home/editors/nvim/plugins/lang/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./docs + ./flutter.nix + ./tailwind.nix + ./rust.nix + ]; +} diff --git a/home/editors/nvim/plugins/lang/docs/default.nix b/home/editors/nvim/plugins/lang/docs/default.nix new file mode 100644 index 0000000..db751af --- /dev/null +++ b/home/editors/nvim/plugins/lang/docs/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./latex.nix + ./markdown.nix + ]; +} diff --git a/home/editors/nvim/plugins/lang/docs/latex.nix b/home/editors/nvim/plugins/lang/docs/latex.nix new file mode 100644 index 0000000..c062d0a --- /dev/null +++ b/home/editors/nvim/plugins/lang/docs/latex.nix @@ -0,0 +1,22 @@ +{pkgs, ...}: { + extraPackages = with pkgs; [sioyek tectonic]; + + plugins.vimtex.enable = true; + + extraConfigLua = '' + vim.g["vimtex_view_method"] = "sioyek" + vim.g["vimtex_quickfix_mode"] = 0 -- supress error reporting on save and build + vim.g["vimtex_mappings_enable"] = 0 -- ignore mappings + vim.g["vimtex_indent_enabled"] = 0 -- auto indent + vim.g["tex_flavor"] = "latex" -- how to read tex files + vim.g["tex_indent_items"] = 0 -- turn off enumerate indent + vim.g["tex_indent_brace"] = 0 -- turn off brace indent + vim.g["vimtex_compiler_method"] = "tectonic" -- tex compiler + vim.g["vimtex_log_ignore"] = ({ -- Error supression: + "Underfull", + "Overfull", + "specifier changed to", + "Token not allowed in a PDF string", + }) + ''; +} diff --git a/home/editors/nvim/plugins/lang/docs/markdown.nix b/home/editors/nvim/plugins/lang/docs/markdown.nix new file mode 100644 index 0000000..b4cca62 --- /dev/null +++ b/home/editors/nvim/plugins/lang/docs/markdown.nix @@ -0,0 +1,23 @@ +{pkgs, ...}: { + plugins = { + markdown-preview = { + enable = true; + settings = { + auto_close = 0; + browser = "firefox"; + page_title = "Markdown Preview"; + }; + }; + + render-markdown = { + enable = true; + settings = { + pipe_table.border = ["╭" "┬" "╮" "├" "┼" "┤" "╰" "┴" "╯" "│" "─"]; + }; + }; + }; + + extraPlugins = let + builds = import ../../builds.nix pkgs; + in [builds.table-nvim]; +} diff --git a/home/editors/nvim/plugins/lang/flutter.nix b/home/editors/nvim/plugins/lang/flutter.nix new file mode 100644 index 0000000..f3387c3 --- /dev/null +++ b/home/editors/nvim/plugins/lang/flutter.nix @@ -0,0 +1,3 @@ +{ + plugins.flutter-tools.enable = true; +} diff --git a/home/editors/nvim/plugins/lang/rust.nix b/home/editors/nvim/plugins/lang/rust.nix new file mode 100644 index 0000000..049ef7c --- /dev/null +++ b/home/editors/nvim/plugins/lang/rust.nix @@ -0,0 +1,23 @@ +{pkgs, ...}: { + plugins = { + crates.enable = true; + + rustaceanvim = { + enable = false; + settings = { + server.cmd = ["rust-analyzer"]; + dap.adapter.__raw = let + codelldb = pkgs.vscode-extensions.vadimcn.vscode-lldb; + extensionPath = "${codelldb}/share/vscode/extensions/vadimcn.vscode-lldb"; + codelldbPath = "${extensionPath}/adapter/codelldb"; + liblldbPath = "${extensionPath}/lldb/lib/liblldb.so"; + in '' + require("rustaceanvim.config").get_codelldb_adapter( + "${codelldbPath}", + "${liblldbPath}" + ) + ''; + }; + }; + }; +} diff --git a/home/editors/nvim/plugins/lang/tailwind.nix b/home/editors/nvim/plugins/lang/tailwind.nix new file mode 100644 index 0000000..0991b3e --- /dev/null +++ b/home/editors/nvim/plugins/lang/tailwind.nix @@ -0,0 +1,3 @@ +{ + plugins.tailwind-tools.enable = true; +} diff --git a/home/editors/nvim/plugins/lsp/default.nix b/home/editors/nvim/plugins/lsp/default.nix new file mode 100644 index 0000000..8f28858 --- /dev/null +++ b/home/editors/nvim/plugins/lsp/default.nix @@ -0,0 +1,31 @@ +{ + imports = [./servers.nix ./lint.nix]; + + programs.nixvim = { + plugins = { + lspkind = import ./lspkind.nix; + lspconfig.enable = true; + trouble.enable = true; + }; + + keymaps = let + trouble-lsp = key: action: { + mode = ""; + inherit key; + options.desc = action; + action = "Trouble lsp_${action}"; + }; + in [ + { + mode = ""; + key = "K"; + options.desc = "Hover"; + action = "Lspsaga hover_doc"; + } + + (trouble-lsp "gd" "definitions") + (trouble-lsp "gr" "references") + (trouble-lsp "gi" "implementations") + ]; + }; +} diff --git a/home/editors/nvim/plugins/lsp/kotlin-lsp.nix b/home/editors/nvim/plugins/lsp/kotlin-lsp.nix new file mode 100644 index 0000000..753415c --- /dev/null +++ b/home/editors/nvim/plugins/lsp/kotlin-lsp.nix @@ -0,0 +1,93 @@ +{ + stdenv, + lib, + fetchzip, + makeWrapper, + unzip, + jdk17_headless, +}: +stdenv.mkDerivation rec { + pname = "kotlin-lsp"; + version = "0.253.10629"; + + src = fetchzip { + url = "https://download-cdn.jetbrains.com/kotlin-lsp/${version}/kotlin-${version}.zip"; + hash = "sha256-LCLGo3Q8/4TYI7z50UdXAbtPNgzFYtmUY/kzo2JCln0="; + stripRoot = false; + }; + + nativeBuildInputs = [ + makeWrapper + unzip + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/libexec/kotlin-lsp + cp -r $src/* $out/libexec/kotlin-lsp/ + + makeWrapper ${jdk17_headless}/bin/java $out/bin/kotlin-lsp \ + --add-flags "--add-opens java.base/java.io=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.lang=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.lang.ref=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.lang.reflect=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.net=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.nio=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.nio.charset=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.text=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.time=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.util=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.util.concurrent=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/jdk.internal.vm=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/sun.net.dns=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/sun.nio.ch=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/sun.nio.fs=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/sun.security.ssl=ALL-UNNAMED" \ + --add-flags "--add-opens java.base/sun.security.util=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/com.apple.eawt=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/com.apple.eawt.event=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/com.apple.laf=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/com.sun.java.swing=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/java.awt=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/java.awt.dnd.peer=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/java.awt.event=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/java.awt.font=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/java.awt.image=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/java.awt.peer=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/javax.swing=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/javax.swing.plaf.basic=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/javax.swing.text=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/javax.swing.text.html=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.awt=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.awt.X11=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.awt.datatransfer=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.awt.image=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.awt.windows=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.font=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.java2d=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.lwawt=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.lwawt.macosx=ALL-UNNAMED" \ + --add-flags "--add-opens java.desktop/sun.swing=ALL-UNNAMED" \ + --add-flags "--add-opens java.management/sun.management=ALL-UNNAMED" \ + --add-flags "--add-opens jdk.attach/sun.tools.attach=ALL-UNNAMED" \ + --add-flags "--add-opens jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED" \ + --add-flags "--add-opens jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED" \ + --add-flags "--add-opens jdk.jdi/com.sun.tools.jdi=ALL-UNNAMED" \ + --add-flags "--enable-native-access=ALL-UNNAMED" \ + --add-flags "-Djdk.lang.Process.launchMechanism=FORK" \ + --add-flags "-cp \"$out/libexec/kotlin-lsp/lib/*\" com.jetbrains.ls.kotlinLsp.KotlinLspServerKt" + + runHook postInstall + ''; + + meta = { + description = "Kotlin Language Server (Standalone Binary)"; + homepage = "https://github.com/Kotlin/kotlin-lsp"; + license = lib.licenses.asl20; + platforms = lib.platforms.linux ++ lib.platforms.darwin; + }; +} diff --git a/home/editors/nvim/plugins/lsp/lint.nix b/home/editors/nvim/plugins/lsp/lint.nix new file mode 100644 index 0000000..3e7007d --- /dev/null +++ b/home/editors/nvim/plugins/lsp/lint.nix @@ -0,0 +1,56 @@ +{pkgs, ...}: { + programs.nixvim = { + extraPackages = with pkgs; [ + statix + selene + + eslint_d + stylelint + + yamllint + sqlfluff + + markdownlint-cli2 + + ruff + rubocop + checkstyle + golangci-lint + python312Packages.flake8 + + clippy + cppcheck + cmake-lint + ]; + + plugins.lint = { + enable = true; + lintersByFt = { + bash = ["bash"]; + nix = ["statix"]; + lua = ["selene"]; + + css = ["stylelint"]; + javascript = ["eslint_d"]; + javascriptreact = ["eslint_d"]; + typescript = ["eslint_d"]; + typescriptreact = ["eslint_d"]; + + sql = ["sqlfluff"]; + + yaml = ["yamllint"]; + + markdown = ["markdownlint-cli2"]; + + python = ["ruff"]; + ruby = ["rubocop"]; + go = ["golangcilint"]; + java = ["checkstyle"]; + + rust = ["clippy"]; + cpp = ["cppcheck"]; + cmake = ["cmakelint"]; + }; + }; + }; +} diff --git a/home/editors/nvim/plugins/lsp/lspkind.nix b/home/editors/nvim/plugins/lsp/lspkind.nix new file mode 100644 index 0000000..d6e0106 --- /dev/null +++ b/home/editors/nvim/plugins/lsp/lspkind.nix @@ -0,0 +1,53 @@ +{ + enable = true; + settings = { + preset = "colorful"; + + symbolMap = { + Copilot = ""; + Text = "󰉿"; + Method = "󰆧"; + Function = "󰊕"; + Constructor = ""; + Field = "󰜢"; + Variable = "󰀫"; + Class = "󰠱"; + Interface = ""; + Module = ""; + Property = "󰜢"; + Unit = "󰑭"; + Value = "󰎠"; + Enum = ""; + Keyword = "󰌋"; + Snippet = ""; + Color = "󰏘"; + File = "󰈙"; + Reference = "󰈇"; + Folder = "󰉋"; + EnumMember = ""; + Constant = "󰏿"; + Struct = "󰙅"; + Event = ""; + Operator = "󰆕"; + TypeParameter = ""; + }; + + extraOptions = { + maxwidth = 50; + mode = "symbol"; + ellipsisChar = "..."; + menu = { + path = "[Path]"; + cmdline = "[CMD]"; + nvim_lsp = "[LSP]"; + buffer = "[Buffer]"; + luasnip = "[Snippet]"; + }; + + show_labelDetails = true; + before.__raw = '' + require'tailwind-tools.cmp'.lspkind_format + ''; + }; + }; +} diff --git a/home/editors/nvim/plugins/lsp/servers.nix b/home/editors/nvim/plugins/lsp/servers.nix new file mode 100644 index 0000000..0d40b8e --- /dev/null +++ b/home/editors/nvim/plugins/lsp/servers.nix @@ -0,0 +1,123 @@ +{pkgs, ...}: { + programs.nixvim = { + extraPlugins = with pkgs.vimPlugins; [SchemaStore-nvim]; + + extraPackages = let + kotlin-lsp = pkgs.callPackage ./kotlin-lsp.nix {}; + in [kotlin-lsp]; + + plugins = { + jdtls.enable = true; + }; + + lsp.servers = { + "*".config = { + root_markers = [ + ".git" + "flake.nix" + ]; + }; + + bashls.enable = true; + nixd.enable = true; + lua_ls = { + enable = true; + config.on_init.__raw = + # lua + '' + function(client) + if client.workspace_folders then + local path = client.workspace_folders[1].name + if + path ~= vim.fn.stdpath('config') + and (vim.uv.fs_stat(path .. '/.luarc.json') or vim.uv.fs_stat(path .. '/.luarc.jsonc')) + then + return + end + end + client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { + runtime = { + version = 'LuaJIT', + path = { + 'lua/?.lua', + 'lua/?/init.lua', + }, + }, + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME + } + } + }) + end + ''; + }; + + typos_lsp = { + enable = true; + config.init_options.diagnosticSeverity = "Hint"; + }; + + html.enable = true; + ts_ls.enable = true; + cssls.enable = true; + eslint.enable = true; + tailwindcss.enable = true; + + taplo.enable = true; + jsonls = { + enable = true; + config.json = { + schemas.__raw = "require('schemastore').json.schemas()"; + validate.enable = true; + }; + }; + yamlls = { + enable = true; + config.yaml = { + schemaStore = { + enable = false; + url = ""; + }; + schemas.__raw = "require('schemastore').yaml.schemas()"; + }; + }; + + texlab.enable = true; + marksman.enable = true; + + sqruff = { + enable = true; + config.sqruff.indentation = { + indent_unit = "space"; + tab_space_size = 2; + }; + }; + graphql.enable = true; + + dockerls.enable = true; + docker_compose_language_service.enable = true; + + gopls.enable = true; + dartls.enable = true; + pylyzer.enable = true; + solargraph.enable = true; + + jdtls.enable = true; + kotlin_lsp.enable = true; + + # also see lang/rust.nix + rust_analyzer = { + enable = true; + packageFallback = true; + }; + clangd.enable = true; + cmake.enable = true; + + glslls.enable = true; + + qmlls.enable = true; + }; + }; +} diff --git a/home/editors/nvim/plugins/snippet/default.nix b/home/editors/nvim/plugins/snippet/default.nix new file mode 100644 index 0000000..6df7acf --- /dev/null +++ b/home/editors/nvim/plugins/snippet/default.nix @@ -0,0 +1,84 @@ +{pkgs, ...}: { + plugins.luasnip = { + enable = true; + settings = { + enable_autosnippets = true; + store_selection_keys = ""; + }; + fromVscode = [ + { + lazyLoad = true; + paths = pkgs.vimPlugins.friendly-snippets; + } + ]; + }; + + extraConfigLua = let + snippets = { + nix = import ./nix; + }; + + escape = text: pkgs.lib.generators.toLua {} text; + escapeLines = text: pkgs.lib.generators.toLua {} (pkgs.lib.strings.splitString "\n" text); + + escapeLua = pkgs.lib.escape ["\\" "\"" "\n"]; + + generateSnippetBody = { + template, + placeholders ? {}, + delimiters ? "<>", + ... + }: + if placeholders == {} + then "t(${escapeLines template})" + else let + templateStr = escape template; + + generatePlaceholderEntry = index: defaultValue: let + node = + if defaultValue == null + then "i(${index})" + else "i(${index}, \"${escapeLua defaultValue}\")"; + in "[${index}] = ${node}"; + + placeholderEntries = pkgs.lib.attrsets.mapAttrsToList generatePlaceholderEntry placeholders; + placeholderTable = "{ ${pkgs.lib.strings.concatStringsSep ", " placeholderEntries} }"; + delimitersTable = "{ delimiters = \"${escapeLua delimiters}\" }"; + in "fmt(${templateStr}, ${placeholderTable}, ${delimitersTable})"; + + generateLanguageSnippets = langSnippets: let + snippetEntries = + pkgs.lib.attrsets.mapAttrsToList ( + name: definition: let + snippetName = escapeLua name; + snippetBody = generateSnippetBody definition; + in " s(\"${snippetName}\", ${snippetBody})" + ) + langSnippets; + in + pkgs.lib.strings.concatStringsSep ",\n" snippetEntries; + + buildLuasnipConfig = snippets: let + languageBlocks = + pkgs.lib.attrsets.mapAttrsToList ( + langName: langSnippets: '' + ls.add_snippets("${langName}", { + ${generateLanguageSnippets langSnippets} + }) + '' + ) + snippets; + + allLanguageBlocks = pkgs.lib.strings.concatStringsSep "\n\n" languageBlocks; + in '' + local ls = require("luasnip") + local s = ls.snippet + local i = ls.insert_node + local t = ls.text_node + local fmt = require("luasnip.extras.fmt").fmt + + ${allLanguageBlocks} + ''; + in + buildLuasnipConfig snippets; +} diff --git a/home/editors/nvim/plugins/snippet/nix/ags.flake.nix b/home/editors/nvim/plugins/snippet/nix/ags.flake.nix new file mode 100644 index 0000000..f58928e --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/ags.flake.nix @@ -0,0 +1,84 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + + ags = { + url = "github:aylur/ags"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { + self, + nixpkgs, + flake-utils, + ags, + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + + name = "<1>"; + version = "<2>"; + entry = "<3>"; + + watchScript = pkgs.writeShellScriptBin "watch" '' + set -euo pipefail + + export FILES=$(find . -not \( -path "./node_modules*" -o -path "./@girs*" \) -type f -name "*.ts*") + echo "$FILES" | ${pkgs.lib.getExe pkgs.entr} -crs 'echo "Change detected, restarting..." && ags run ./main.tsx' + ''; + + astalPackages = with ags.packages.${system}; [ + io + astal4 + <0> + ]; + + buildInputs = with pkgs; [ + gjs + watchScript + ]; + + extraPackages = with pkgs; [ + libadwaita + libsoup_3 + ]; + in { + packages.default = pkgs.stdenv.mkDerivation { + inherit name version; + src = ./.; + + nativeBuildInputs = with pkgs; [ + wrapGAppsHook3 + gobject-introspection + ags.packages.${system}.default + ]; + + buildInputs = + astalPackages + ++ buildInputs + ++ extraPackages; + + installPhase = '' + mkdir -p $out/bin $out/share + cp -r * $out/share + ags bundle ${entry} $out/bin/${name} -d "SRC='$out/share'" + ''; + }; + + apps.default = flake-utils.lib.mkApp { + drv = self.packages.${system}.default; + }; + + devShells.default = pkgs.mkShell { + buildInputs = + [ + (ags.packages.${system}.default.override { + extraPackages = astalPackages ++ extraPackages; + }) + ] + ++ buildInputs; + }; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/bevy.flake.nix b/home/editors/nvim/plugins/snippet/nix/bevy.flake.nix new file mode 100644 index 0000000..4d35cc0 --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/bevy.flake.nix @@ -0,0 +1,116 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + fenix = { + url = "github:nix-community/fenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + crane.url = "github:ipetkov/crane"; + }; + + outputs = { + nixpkgs, + fenix, + crane, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + + pname = "<1>"; + version = "<2>"; + + rust-toolchain = with fenix.packages.${system}; + combine [ + stable.rustc + stable.cargo + stable.rust-src + stable.rust-analyzer + ]; + + bevyDeps = with pkgs; [ + pkg-config + # Audio + alsa-lib + # Vulkan + vulkan-loader + vulkan-tools + libudev-zero + # X11 + xorg.libX11 + xorg.libXcursor + xorg.libXi + xorg.libXrandr + # Wayland + wayland + libxkbcommon + # linker + lld + ]; + runtimeLibs = pkgs.lib.makeLibraryPath bevyDeps; + + craneLib = (crane.mkLib pkgs).overrideToolchain rust-toolchain; + + cargoArtifacts = craneLib.buildDepsOnly { + pname = "${pname}-deps"; + src = craneLib.cleanCargoSource (craneLib.path ./.); + nativeBuildInputs = with pkgs; [pkg-config]; + buildInputs = bevyDeps; + }; + in { + packages.default = craneLib.buildPackage { + inherit pname version; + src = craneLib.cleanCargoSource (craneLib.path ./.); + inherit cargoArtifacts; + + nativeBuildInputs = with pkgs; [ + pkg-config + rust-toolchain + lld + makeWrapper + ]; + + buildInputs = bevyDeps; + + CARGO_PROFILE_RELEASE_LTO = "thin"; + CARGO_PROFILE_RELEASE_CODEGEN_UNITS = 1; + CARGO_PROFILE_RELEASE_STRIP = true; + RUSTFLAGS = "-C link-arg=-fuse-ld=lld"; + + postInstall = '' + wrapProgram "$out/bin/${pname}" \ + --prefix LD_LIBRARY_PATH : ${runtimeLibs} + ''; + + meta = with pkgs.lib; { + description = "<3>"; + license = licenses.mit; + }; + }; + + devShells.default = pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + pkg-config + lld + ]; + + packages = with pkgs; + [ + rust-toolchain + cargo-watch + cargo-edit + cargo-tarpaulin + ] + ++ bevyDeps; + + shellHook = '' + export RUST_SRC_PATH=${fenix.packages.${system}.stable.rust-src}/lib/rustlib/src/rust/library + export LD_LIBRARY_PATH=${runtimeLibs}:$LD_LIBRARY_PATH + ''; + }; + + formatter = pkgs.nixpkgs-fmt; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/default.nix b/home/editors/nvim/plugins/snippet/nix/default.nix new file mode 100644 index 0000000..91308ab --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/default.nix @@ -0,0 +1,44 @@ +{ + flake = { + template = builtins.readFile ./flake.nix; + placeholders = { + "0" = null; + }; + }; + flaketauri.template = builtins.readFile ./tauri.flake.nix; + flakeflutter.template = builtins.readFile ./flutter.flake.nix; + flakeags = { + template = builtins.readFile ./ags.flake.nix; + placeholders = { + "1" = "project-name"; + "2" = "0.1.0"; + "3" = "main.tsx"; + "0" = null; + }; + }; + flakerust = { + template = builtins.readFile ./rust.flake.nix; + placeholders = { + "1" = "rust-app"; + "2" = "0.1.0"; + "3" = "A Rust application"; + "0" = null; + }; + }; + flakebevy = { + template = builtins.readFile ./bevy.flake.nix; + placeholders = { + "1" = "bevy-app"; + "2" = "0.1.0"; + "3" = "A Bevy application"; + }; + }; + flakemaven = { + template = builtins.readFile ./maven.flake.nix; + placeholders."0" = "25"; + }; + flakegradle = { + template = builtins.readFile ./gradle.flake.nix; + placeholders."0" = "25"; + }; +} diff --git a/home/editors/nvim/plugins/snippet/nix/flake.nix b/home/editors/nvim/plugins/snippet/nix/flake.nix new file mode 100644 index 0000000..e5c4649 --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/flake.nix @@ -0,0 +1,17 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + in { + <0> + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/flutter.flake.nix b/home/editors/nvim/plugins/snippet/nix/flutter.flake.nix new file mode 100644 index 0000000..be4f15b --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/flutter.flake.nix @@ -0,0 +1,46 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = true; + android_sdk.accept_license = true; + }; + }; + + buildToolsVersion = "35.0.0"; + androidComposition = pkgs.androidenv.composeAndroidPackages { + buildToolsVersions = [buildToolsVersion "28.0.3"]; + platformVersions = ["36" "28"]; + abiVersions = ["armeabi-v7a" "arm64-v8a"]; + includeNDK = true; + ndkVersions = ["27.0.12077973"]; + cmakeVersions = ["3.22.1"]; + }; + androidSdk = androidComposition.androidsdk; + jdk = pkgs.jdk17; + in { + devShells.default = pkgs.mkShell rec { + buildImports = with pkgs; [ + flutter + androidSdk + jdk + ]; + + ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk"; + ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle"; + + GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${buildToolsVersion}/aapt2"; + }; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/gradle.flake.nix b/home/editors/nvim/plugins/snippet/nix/gradle.flake.nix new file mode 100644 index 0000000..edd0db8 --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/gradle.flake.nix @@ -0,0 +1,22 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + jdk = pkgs.jdk <0>; + in { + devShells.default = pkgs.mkShell { + buildInputs = [pkgs.gradle jdk]; + JAVA_HOME = jdk.home; + GRADLE_OPTS = "-Dorg.gradle.java.installations.auto-download=false -Dorg.gradle.java.installations.fromEnv=true"; + }; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/maven.flake.nix b/home/editors/nvim/plugins/snippet/nix/maven.flake.nix new file mode 100644 index 0000000..a6bb1a9 --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/maven.flake.nix @@ -0,0 +1,21 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + jdk = pkgs.jdk<0>; + in { + devShells.default = pkgs.mkShell { + nativeBuildInputs = [pkgs.maven jdk]; + JAVA_HOME = jdk.home; + }; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/npm.flake.nix b/home/editors/nvim/plugins/snippet/nix/npm.flake.nix new file mode 100644 index 0000000..f230daa --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/npm.flake.nix @@ -0,0 +1,39 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + + name = "npm-app"; + version = "0.1.0"; + + buildInputs = with pkgs; [ + nodejs + ]; + in { + packages.default = pkgs.buildNpmPackage { + inherit name version buildInputs; + + npmDeps = pkgs.importNpmLock { + npmRoot = ./.; + }; + inherit (pkgs.importNpmLock) npmConfigHook; + + installPhase = '' + # ... + ''; + }; + + devShells.default = pkgs.mkShell { + packages = buildInputs; + }; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/rust.flake.nix b/home/editors/nvim/plugins/snippet/nix/rust.flake.nix new file mode 100644 index 0000000..299c393 --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/rust.flake.nix @@ -0,0 +1,81 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + fenix = { + url = "github:nix-community/fenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + crane.url = "github:ipetkov/crane"; + }; + + outputs = { + nixpkgs, + fenix, + crane, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system;}; + + pname = "<1>"; + version = "<2>"; + + rust-toolchain = with fenix.packages.${system}; + combine [ + stable.rustc + stable.cargo + stable.rust-src + stable.rust-analyzer + ]; + + craneLib = (crane.mkLib pkgs).overrideToolchain rust-toolchain; + + cargoArtifacts = craneLib.buildDepsOnly { + pname = "${pname}-deps"; + src = craneLib.cleanCargoSource (craneLib.path ./.); + }; + in { + packages.default = craneLib.buildPackage { + inherit pname version; + src = craneLib.cleanCargoSource (craneLib.path ./.); + inherit cargoArtifacts; + + nativeBuildInputs = [rust-toolchain pkgs.lld]; + buildInputs = with pkgs; + [ + <0> + ] + ++ lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.Security + ]; + + RUSTFLAGS = "-C link-arg=-fuse-ld=lld"; + + meta = with pkgs.lib; { + description = "<3>"; + license = licenses.mit; + }; + }; + + devShells.default = pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + lld + ]; + + buildInputs = with pkgs; [ + rust-toolchain + cargo-watch + cargo-edit + cargo-tarpaulin + ]; + + shellHook = '' + export RUST_SRC_PATH=${fenix.packages.${system}.stable.rust-src}/lib/rustlib/src/rust/library + ''; + }; + + formatter = pkgs.nixpkgs-fmt; + }); +} diff --git a/home/editors/nvim/plugins/snippet/nix/tauri.flake.nix b/home/editors/nvim/plugins/snippet/nix/tauri.flake.nix new file mode 100644 index 0000000..a314637 --- /dev/null +++ b/home/editors/nvim/plugins/snippet/nix/tauri.flake.nix @@ -0,0 +1,51 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + rust-overlay.url = "github:oxalica/rust-overlay"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + rust-overlay, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + overlays = [(import rust-overlay)]; + pkgs = import nixpkgs {inherit system overlays;}; + + rustToolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = ["rust-src"]; + }; + + linuxDeps = with pkgs; [ + webkitgtk_4_1 + gtk3 + cairo + gdk-pixbuf + glib + dbus + openssl + pkg-config + librsvg + ]; + in { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; + [ + rustToolchain + rust-analyzer + + nodejs + cargo-tauri + ] + ++ linuxDeps; + + shellHook = '' + export WEBKIT_DISABLE_COMPOSITING_MODE=1 + export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath linuxDeps}" + ''; + }; + }); +} diff --git a/home/editors/nvim/plugins/treesitter/default.nix b/home/editors/nvim/plugins/treesitter/default.nix new file mode 100644 index 0000000..9ceefd0 --- /dev/null +++ b/home/editors/nvim/plugins/treesitter/default.nix @@ -0,0 +1,14 @@ +{ + plugins = { + treesitter = { + enable = true; + folding = false; + nixGrammars = true; + nixvimInjections = true; + settings = import ./settings.nix; + }; + + ts-autotag.enable = true; + treesitter-textobjects = import ./textobjects.nix; + }; +} diff --git a/home/editors/nvim/plugins/treesitter/settings.nix b/home/editors/nvim/plugins/treesitter/settings.nix new file mode 100644 index 0000000..6f9fe6a --- /dev/null +++ b/home/editors/nvim/plugins/treesitter/settings.nix @@ -0,0 +1,83 @@ +{ + indent.enable = true; + highlight.enable = true; + + ensureInstalled = [ + "bash" + "lua" + "nix" + + "c" + "cpp" + "make" + "cmake" + + "rust" + + "dockerfile" + + "go" + "gomod" + "gosum" + + "css" + "html" + "templ" + + "tsx" + "astro" + "javascript" + "typescript" + + "xml" + "json" + "yaml" + "toml" + + "sql" + "http" + "graphql" + + "python" + "requirements" + + "regex" + "comment" + + "latex" + "markdown" + "markdown_inline" + + "diff" + "gitignore" + "git_config" + "gitattributes" + + "dart" + "java" + + "hyprlang" + ]; + + refactor = { + highlight_definitions.enable = true; + highlight_current_scope = true; + }; + endwise.enable = true; + matchup = { + enable = true; + include_match_words = true; + }; + + incremental_selection = { + enable = true; + keymaps = { + init_selection = ""; + node_incremental = "v"; + scope_incremental = false; + node_decremental = "V"; + }; + }; + + playground.enable = true; +} diff --git a/home/editors/nvim/plugins/treesitter/textobjects.nix b/home/editors/nvim/plugins/treesitter/textobjects.nix new file mode 100644 index 0000000..f67812d --- /dev/null +++ b/home/editors/nvim/plugins/treesitter/textobjects.nix @@ -0,0 +1,47 @@ +{ + enable = true; + + settings = { + select = { + enable = true; + lookahead = true; + keymaps = { + "af" = "@function.outer"; + "if" = "@function.inner"; + "ac" = "@class.outer"; + "ic" = "@class.inner"; + "a," = "@parameter.outer"; + "i," = "@parameter.inner"; + }; + }; + + move = { + enable = true; + setJumps = true; + gotoNextStart = { + "]f" = "@function.outer"; + "]c" = "@class.outer"; + "]," = "@parameter.inner"; + }; + gotoNextEnd = { + "]F" = "@function.outer"; + "]C" = "@function.outer"; + }; + gotoPreviousStart = { + "[f" = "@function.outer"; + "[c" = "@class.outer"; + "[," = "@parameter.inner"; + }; + gotoPreviousEnd = { + "[F" = "@function.outer"; + "[C" = "@class.outer"; + }; + }; + + swap = { + enable = true; + swapNext = {">," = "@parameter.inner";}; + swapPrevious = {"<," = "@parameter.inner";}; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/alpha/default.nix b/home/editors/nvim/plugins/utils/alpha/default.nix new file mode 100644 index 0000000..d780400 --- /dev/null +++ b/home/editors/nvim/plugins/utils/alpha/default.nix @@ -0,0 +1,61 @@ +let + themes = import ./themes.nix; + theme = themes.dg_baby; +in { + plugins.alpha = { + enable = true; + settings = { + layout = [ + { + type = "padding"; + val = 2; + } + { + type = "text"; + val = theme.image; + opts = { + position = "center"; + hl = "Type"; + }; + } + { + type = "padding"; + val = 2; + } + { + type = "group"; + val = let + button = shortcut: val: { + type = "button"; + inherit val; + opts = { + position = "center"; + inherit shortcut; + cursor = 3; + width = 50; + align_shortcut = "right"; + hl_shortcut = "Keyword"; + }; + }; + in [ + (button "󱁐 ff" "󰱼 Find file") + (button "󱁐 fo" "󱋡 Recently opened files") + (button "󱁐 fl" " Live-Grep") + ]; + } + { + type = "padding"; + val = 2; + } + { + type = "text"; + val = theme.quote; + opts = { + position = "center"; + hl = "Keyword"; + }; + } + ]; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/alpha/themes.nix b/home/editors/nvim/plugins/utils/alpha/themes.nix new file mode 100644 index 0000000..6d62b45 --- /dev/null +++ b/home/editors/nvim/plugins/utils/alpha/themes.nix @@ -0,0 +1,53 @@ +{ + rei = { + quote = "「私は人形じゃない。」"; + image = [ + "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⣠⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣡⣾⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣟⠻⣿⣿⣿⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⣿⡿⢫⣷⣿⣿⣿⣿⣿⣿⣿⣾⣯⣿⡿⢧⡚⢷⣌⣽⣿⣿⣿⣿⣿⣶⡌⣿⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⣿⠇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣮⣇⣘⠿⢹⣿⣿⣿⣿⣿⣻⢿⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⣿⠀⢸⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⡟⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣻⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⡇⠀⣬⠏⣿⡇⢻⣿⣿⣿⣿⣿⣿⣿⣷⣼⣿⣿⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⢻⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⠀⠈⠁⠀⣿⡇⠘⡟⣿⣿⣿⣿⣿⣿⣿⣿⡏⠿⣿⣟⣿⣿⣿⣿⣿⣿⣿⣿⣇⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⡏⠀⠀⠐⠀⢻⣇⠀⠀⠹⣿⣿⣿⣿⣿⣿⣩⡶⠼⠟⠻⠞⣿⡈⠻⣟⢻⣿⣿⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⢿⠀⡆⠀⠘⢿⢻⡿⣿⣧⣷⢣⣶⡃⢀⣾⡆⡋⣧⠙⢿⣿⣿⣟⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⡥⠂⡐⠀⠁⠑⣾⣿⣿⣾⣿⣿⣿⡿⣷⣷⣿⣧⣾⣿⣿⣿⣿⣿⣿⣿" + "⣿⣿⡿⣿⣍⡴⠆⠀⠀⠀⠀⠀⠀⠀⠀⣼⣄⣀⣷⡄⣙⢿⣿⣿⣿⣿⣯⣶⣿⣿⢟⣾⣿⣿⢡⣿⣿⣿⣿⣿" + "⣿⡏⣾⣿⣿⣿⣷⣦⠀⠀⠀⢀⡀⠀⠀⠠⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⣡⣾⣿⣿⢏⣾⣿⣿⣿⣿⣿" + "⣿⣿⣿⣿⣿⣿⣿⣿⡴⠀⠀⠀⠀⠀⠠⠀⠰⣿⣿⣿⣷⣿⠿⠿⣿⣿⣭⡶⣫⠔⢻⢿⢇⣾⣿⣿⣿⣿⣿⣿" + "⣿⣿⣿⡿⢫⣽⠟⣋⠀⠀⠀⠀⣶⣦⠀⠀⠀⠈⠻⣿⣿⣿⣾⣿⣿⣿⣿⡿⣣⣿⣿⢸⣾⣿⣿⣿⣿⣿⣿⣿" + "⡿⠛⣹⣶⣶⣶⣾⣿⣷⣦⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠉⠛⠻⢿⣿⡿⠫⠾⠿⠋⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿" + "⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣀⡆⣠⢀⣴⣏⡀⠀⠀⠀⠉⠀⠀⢀⣠⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿" + "⠿⠛⠛⠛⠛⠛⠛⠻⢿⣿⣿⣿⣿⣯⣟⠷⢷⣿⡿⠋⠀⠀⠀⠀⣵⡀⢠⡿⠋⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⢿⣿⣿⠂⠀⠀⠀⠀⠀⢀⣽⣿⣿⣿⣿⣿⣿⣿⣍⠛⠿⣿⣿⣿⣿⣿⣿" + ]; + }; + + dg_baby = { + quote = "Official Drain © Licensed Product"; + image = [ + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⣄⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣄⡀⠀⠀⠀⠀⠀⢀⡞⠀⠈⠛⢶⡶⢎⡹⠶⠶⠒⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠀⠀⠀⢀⡼⠁⠀⠳⢄⣀⡤⠴⠚⠉⠀⠀⠀⠀⠀⠙⢮⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⢀⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⣄⠀⠀⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣠⠞⢦⣀⣾⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣆⠀⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢳⠋⣸⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⡆⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡇⠀⠀⢹⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣇⠀⠀⢸⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⢣⡼⠛⠋⡟⠁⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⡼⠁⠀⠀⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠹⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢃⡼⠁⠀⢨⡇⠀⠀⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⡀⣀⣰⣇⣀⡖⠒⠚⠿⣦⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⣠⣶⠯⢄⠉⠉⠱⡎⠉⠁⠀⠀" + "⠀⠀⠀⠀⣿⠀⠀⡴⠚⠛⠻⣏⡁⠳⣄⡀⠀⣀⠽⢚⣽⣏⣹⡋⢩⡙⢻⠛⣿⠛⣿⠀⠀⢀⡴⠁⠀⠀⠃⠀⠀⠀⠀" + "⢀⣀⣀⣤⠿⣤⣰⣇⠀⠀⠀⠃⠙⡦⢞⣒⣚⣓⠶⣯⡽⠿⠛⠿⢿⣷⡞⠒⠺⡾⣩⣗⣶⠿⠒⠒⠒⠦⡄⠀⠀⠀⠀" + "⠀⠀⠀⠀⢿⠀⠘⡇⠀⠀⠀⠀⡞⣰⢯⡄⠈⠙⠻⣦⣖⡭⠭⣍⠳⡌⢿⡆⠀⣷⠟⠉⠀⠀⠀⠀⠀⠀⢹⡀⠀⠀⠀" + "⠀⠀⠀⠀⠘⠀⠀⢳⠀⠀⠀⠀⡇⢧⢸⠀⢸⡆⠀⡾⠁⡰⡄⠈⡇⡽⢸⣕⡞⠁⠉⠀⠀⠀⠀⠀⠀⠀⢸⠳⡇⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠈⢧⠀⠀⠀⠹⣌⢾⡀⠘⠃⣀⣅⠀⠓⠃⠀⠿⠁⠳⣿⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣏⡸⢧⣀⣀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⣄⡀⠀⠈⠳⣍⠻⣍⢡⣞⠁⠘⠃⣀⣾⠶⠾⣟⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠱⡎⠉⠉" + "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣙⣲⣤⣴⣚⣑⣮⡓⣚⣥⣶⣛⠉⠁⣀⣴⣻⡀⠀⠀⠀⠀⢀⣠⠞⠁⠀⠀⠀⡇⠀⠀" + "⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠛⠛⠛⠛⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠲⠶⠒⠚⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀" + ]; + }; +} diff --git a/home/editors/nvim/plugins/utils/debugging.nix b/home/editors/nvim/plugins/utils/debugging.nix new file mode 100644 index 0000000..768573f --- /dev/null +++ b/home/editors/nvim/plugins/utils/debugging.nix @@ -0,0 +1,45 @@ +{ + plugins.neotest.enable = true; + extraConfigLua = + # lua + '' + -- require("neotest").setup({ + -- adapters = { + -- require("rustaceanvim.neotest") + -- }, + -- }) + ''; + + plugins.dap = { + enable = true; + + signs = { + dapBreakpoint = { + text = ""; + texthl = "DiagnosticError"; + numhl = "DapBreakpoint"; + }; + dapBreakpointCondition = { + text = ""; + texthl = "DiagnosticWarn"; + numhl = "DiagnosticWarn"; + }; + dapLogPoint = { + text = "󱂅"; + texthl = "Comment"; + numhl = "Comment"; + }; + dapStopped = { + text = ""; + texthl = "IncSearch"; + linehl = "CursorLine"; + numhl = "IncSearch"; + }; + dapBreakpointRejected = { + text = ""; + texthl = "DiagnosticError"; + numhl = "DiagnosticError"; + }; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/default.nix b/home/editors/nvim/plugins/utils/default.nix new file mode 100644 index 0000000..688b929 --- /dev/null +++ b/home/editors/nvim/plugins/utils/default.nix @@ -0,0 +1,33 @@ +{ + imports = [ + ./alpha + ./lualine + ./toggleterm.nix + ./which-key + ./fzf-lua.nix + ./grug-far.nix + ./presence.nix + ./silicon.nix + ./todo-comments.nix + ./debugging.nix + ]; + + plugins = { + nix-develop = { + enable = true; + ignoredVariables = { + SHELL = false; + }; + }; + wakatime.enable = true; + }; + + extraConfigLua = + #lua + '' + vim.api.nvim_create_autocmd("VimEnter", { + desc = "Automatically enter Nix devshell", + command = "NixDevelop", + }) + ''; +} diff --git a/home/editors/nvim/plugins/utils/fzf-lua.nix b/home/editors/nvim/plugins/utils/fzf-lua.nix new file mode 100644 index 0000000..4ddda90 --- /dev/null +++ b/home/editors/nvim/plugins/utils/fzf-lua.nix @@ -0,0 +1,12 @@ +{ + plugins.fzf-lua = { + enable = true; + settings = { + winopts = {}; + files = { + git_icons = true; + file_icons = true; + }; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/grug-far.nix b/home/editors/nvim/plugins/utils/grug-far.nix new file mode 100644 index 0000000..d54f175 --- /dev/null +++ b/home/editors/nvim/plugins/utils/grug-far.nix @@ -0,0 +1,3 @@ +{ + plugins.grug-far.enable = true; +} diff --git a/home/editors/nvim/plugins/utils/lualine/colors.nix b/home/editors/nvim/plugins/utils/lualine/colors.nix new file mode 100644 index 0000000..0ccb82e --- /dev/null +++ b/home/editors/nvim/plugins/utils/lualine/colors.nix @@ -0,0 +1,14 @@ +{ + bg = "#1e1e2e"; + fg = "#cdd6f4"; + yellow = "#f9e2af"; + cyan = "#89dceb"; + green = "#a6e3a1"; + orange = "#fab387"; + violet = "#b4befe"; + blue = "#89b4fa"; + red = "#f38ba8"; + magenta = "#cba6f7"; + grey = "#585b70"; + pink = "#f5c2e7"; +} diff --git a/home/editors/nvim/plugins/utils/lualine/default.nix b/home/editors/nvim/plugins/utils/lualine/default.nix new file mode 100644 index 0000000..9da534a --- /dev/null +++ b/home/editors/nvim/plugins/utils/lualine/default.nix @@ -0,0 +1,78 @@ +{ + extraConfigLua = builtins.readFile ./hide_statusbar.lua; + + plugins.lualine = let + colors = import ./colors.nix; + in { + enable = true; + settings = { + options = { + section_separators = ""; + component_separators = ""; + theme = { + normal.c = { + bg = ""; + inherit (colors) fg; + }; + inactive.c = { + bg = ""; + inherit (colors) fg; + }; + }; + + refresh.events = [ + "WinEnter" + "BufEnter" + "BufWritePost" + "SessionLoadPost" + "FileChangedShellPost" + "VimResized" + "Filetype" + "CursorMoved" + "CursorMovedI" + "ModeChanged" + "RecordingEnter" + "RecordingLeave" + ]; + }; + + # to be visible, change laststatus option value at options.nix + sections = { + # these are to remove the defaults + lualine_a = [{}]; + lualine_b = [{}]; + lualine_c = [{}]; + lualine_x = [{}]; + lualine_y = [{}]; + lualine_z = [{}]; + }; + + inactive_sections = { + # these are to remove the defaults + lualine_a = [{}]; + lualine_b = [{}]; + lualine_c = [{}]; + lualine_x = [{}]; + lualine_y = [{}]; + lualine_z = [{}]; + }; + + tabline = import ./tabline.nix; + }; + }; + + keymaps = let + buffers = bind: let + num = + if (bind == 0) + then 10 + else bind; + in { + key = ""; + mode = ["n" "i" "v" "s" "t" "o"]; + options.desc = "Buffer ${toString num}"; + action = "LualineBuffersJump ${toString num}"; + }; + in + map buffers [1 2 3 4 5 6 7 8 9 10]; +} diff --git a/home/editors/nvim/plugins/utils/lualine/hide_statusbar.lua b/home/editors/nvim/plugins/utils/lualine/hide_statusbar.lua new file mode 100644 index 0000000..ebdf075 --- /dev/null +++ b/home/editors/nvim/plugins/utils/lualine/hide_statusbar.lua @@ -0,0 +1,4 @@ +vim.api.nvim_create_autocmd('WinEnter', { + once = true, + command = [[ set laststatus=0 ]], +}) diff --git a/home/editors/nvim/plugins/utils/lualine/section-left.nix b/home/editors/nvim/plugins/utils/lualine/section-left.nix new file mode 100644 index 0000000..d569989 --- /dev/null +++ b/home/editors/nvim/plugins/utils/lualine/section-left.nix @@ -0,0 +1,48 @@ +colors: get-mode-color: [ + { + __unkeyed-1 = "mode"; + color.__raw = get-mode-color; + } + + { + __unkeyed-1.__raw = '' + function() + local reg_rec = vim.fn.reg_recording() + if reg_rec ~= "" then + return "󰑊 rec (" .. reg_rec .. ")" + else + return "" + end + end + ''; + color = { + fg = colors.red; + gui = "bold"; + }; + } + + { + icon = ""; + __unkeyed-1 = "branch"; + color = { + fg = colors.violet; + gui = "bold"; + }; + } + + { + mode = 2; + __unkeyed-1 = "buffers"; + symbols = { + modified = ""; + alternate_file = ""; + }; + buffers_color = { + inactive.fg = colors.grey; + active = { + fg = colors.magenta; + gui = "bold"; + }; + }; + } +] diff --git a/home/editors/nvim/plugins/utils/lualine/section-right.nix b/home/editors/nvim/plugins/utils/lualine/section-right.nix new file mode 100644 index 0000000..260200d --- /dev/null +++ b/home/editors/nvim/plugins/utils/lualine/section-right.nix @@ -0,0 +1,64 @@ +colors: get-mode-color: [ + { + path = 1; + shorting_target = 150; + color.fg = colors.grey; + __unkeyed-1 = "filename"; + disabled_buftypes = ["terminal"]; + } + + { + sources = ["nvim_lsp"]; + __unkeyed-1 = "diagnostics"; + diagnostics_color = { + color_error.fg = colors.red; + color_warn.fg = colors.yellow; + color_info.fg = colors.blue; + color_hint.fg = colors.cyan; + }; + symbols = { + error = " "; + warn = " "; + info = " "; + }; + } + { + __unkeyed-1 = "lsp_status"; + icon = "lsp:"; + disabled_buftypes = ["terminal"]; + color = { + fg = colors.magenta; + gui = "bold"; + }; + ignore_lsp = [ + "typos_lsp" + ]; + } + + { + __unkeyed-1 = "diff"; + symbols = { + added = " "; + modified = "󰝤 "; + removed = " "; + }; + diff_color = { + added.fg = colors.green; + removed.fg = colors.red; + modified.fg = colors.orange; + }; + } + + { + # icon = ""; # NOTE: IDK why it shows twice + icon = ""; + padding.right = 1; + color.fg = colors.violet; + __unkeyed-1 = "gh-actions"; + } + + { + color.fg = colors.pink; + __unkeyed-1 = "progress"; + } +] diff --git a/home/editors/nvim/plugins/utils/lualine/tabline.nix b/home/editors/nvim/plugins/utils/lualine/tabline.nix new file mode 100644 index 0000000..e45bd49 --- /dev/null +++ b/home/editors/nvim/plugins/utils/lualine/tabline.nix @@ -0,0 +1,39 @@ +let + colors = import ./colors.nix; + get-mode-color = + # lua + " + function() + local mode_color = { + n = '${colors.blue}', + i = '${colors.green}', + + v = '${colors.violet}', + [''] = '${colors.violet}', + V = '${colors.violet}', + + c = '${colors.magenta}', + no = '${colors.red}', + + s = '${colors.orange}', + S = '${colors.orange}', + [''] = '${colors.orange}', + + ic = '${colors.yellow}', + R = '${colors.magenta}', + Rv = '${colors.magenta}', + cv = '${colors.red}', + ce = '${colors.red}', + r = '${colors.cyan}', + rm = '${colors.cyan}', + ['r?'] = '${colors.cyan}', + ['!'] = '${colors.red}', + t = '${colors.pink}', + } + return { fg = mode_color[vim.fn.mode()] } + end + "; +in { + lualine_c = import ./section-left.nix colors get-mode-color; + lualine_x = import ./section-right.nix colors get-mode-color; +} diff --git a/home/editors/nvim/plugins/utils/presence.nix b/home/editors/nvim/plugins/utils/presence.nix new file mode 100644 index 0000000..0234927 --- /dev/null +++ b/home/editors/nvim/plugins/utils/presence.nix @@ -0,0 +1,23 @@ +{ + plugins.presence = { + enable = true; + settings = { + neovim_image_text = "Neovim"; + main_image = "file"; + buttons.__raw = '' + function (buffer, repo_url) + local buttons = {} + + if repo_url ~= nil then + table.insert(buttons, { + label = "Git Repository", + url = repo_url + }) + end + + return buttons + end + ''; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/silicon.nix b/home/editors/nvim/plugins/utils/silicon.nix new file mode 100644 index 0000000..f669eca --- /dev/null +++ b/home/editors/nvim/plugins/utils/silicon.nix @@ -0,0 +1,24 @@ +{pkgs, ...}: let + theme = "Catppuccin"; + font = "JetBrainsMono Nerd Font=32;Noto Color Emoji=34"; +in { + extraPackages = with pkgs; [ + silicon + jetbrains-mono + noto-fonts-color-emoji + ]; + + extraPlugins = let + builds = import ../builds.nix pkgs; + in + with builds; [silicon]; + + extraConfigLua = '' + require 'nvim-silicon'.setup { + font = '${font}', + theme = '${theme}', + no_line_number = true, + no_window_controls = true, + } + ''; +} diff --git a/home/editors/nvim/plugins/utils/todo-comments.nix b/home/editors/nvim/plugins/utils/todo-comments.nix new file mode 100644 index 0000000..3d7f94d --- /dev/null +++ b/home/editors/nvim/plugins/utils/todo-comments.nix @@ -0,0 +1,22 @@ +{ + plugins.todo-comments = { + enable = true; + settings.keywords = let + word = icon: color: {inherit icon color;}; + hint = icon: word icon "hint"; + info = icon: word icon "info"; + test = icon: word icon "test"; + in { + NOTE = hint ""; + TODO = hint ""; + REFACTOR = hint ""; + + INFO = info ""; + DOCS = info ""; + LINK = info ""; + GITHUB = info ""; + + TEST = test "󰙨"; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/toggleterm.nix b/home/editors/nvim/plugins/utils/toggleterm.nix new file mode 100644 index 0000000..2e10cf7 --- /dev/null +++ b/home/editors/nvim/plugins/utils/toggleterm.nix @@ -0,0 +1,14 @@ +{ + plugins.toggleterm = { + enable = true; + settings = { + float_opts = {}; + persistent_size = true; + direction = "horizontal"; + open_mapping = "[[]]"; + shade_filetypes = ["lazygit"]; + + highlights.FloatBorder.guifg = "#7b8496"; + }; + }; +} diff --git a/home/editors/nvim/plugins/utils/which-key/config.lua b/home/editors/nvim/plugins/utils/which-key/config.lua new file mode 100644 index 0000000..f6e6c53 --- /dev/null +++ b/home/editors/nvim/plugins/utils/which-key/config.lua @@ -0,0 +1,227 @@ +local wk = require "which-key" +local gitsigns = require "gitsigns" +local Terminal = require("toggleterm.terminal").Terminal + +local set_key = { + cmd = function(key, action, desc, hidden) + return { + "" .. key, + type(action) == "string" and "" .. action .. "" or action, + desc = desc:gsub("^%l", string.upper), + hidden = hidden or false, + } + end, +} + +local function smart_buffer_delete() + local current_buf = vim.api.nvim_get_current_buf() + pcall(vim.cmd.bnext) + if current_buf == vim.api.nvim_get_current_buf() then + vim.cmd.enew() + end + pcall(vim.cmd, "bdelete " .. current_buf) +end + +wk.add { + set_key.cmd("e", require("nvim-tree.api").tree.toggle, "Files"), + set_key.cmd("w", "w!", "Write buffer"), + set_key.cmd("d", smart_buffer_delete, "Delete buffer"), + set_key.cmd("Q", "qa", "Quit all", true), + set_key.cmd("q", "quit", "Quit window", true), +} + +set_key.git_signs = function(key, action, desc) + return set_key.cmd("g" .. key, function() + gitsigns[action]() + end, desc) +end + +local function lazygit_toggle() + local lazygit = Terminal:new { + cmd = "lazygit", + hidden = true, + direction = "float", + } + lazygit:toggle() +end + +wk.add { + { "g", group = "Git" }, + + -- Gitsigns -- + set_key.git_signs("s", "stage_buffer", "Stage buffer"), + set_key.git_signs("R", "reset_buffer", "Reset buffer"), + set_key.git_signs("t", "toggle_signs", "Toggle signs"), + set_key.git_signs("n", "toggle_numhl", "Toggle numhl"), + set_key.git_signs("L", "toggle_linehl", "Toggle linehl"), + set_key.git_signs("d", "toggle_deleted", "Toggle deleted"), + + set_key.cmd("gg", lazygit_toggle, "Lazygit"), + set_key.cmd("gH", "GhActions", "Github Actions"), + set_key.cmd("gm", "GitMessenger", "Show Message"), + + { "gh", group = "Hunk" }, + + set_key.git_signs("hs", "stage_hunk", "Stage"), + set_key.git_signs("hr", "reset_hunk", "Reset"), + set_key.git_signs("hv", "preview_hunk", "Preview"), + set_key.git_signs("hu", "undo_stage_hunk", "Undo Stage"), + set_key.cmd("ghn", function() + gitsigns.nav_hunk "next" + end, "Next"), + set_key.cmd("ghp", function() + gitsigns.nav_hunk "prev" + end, "Previous"), + set_key.git_signs("hd", "diffthis", "Diff this"), + set_key.cmd("ghD", function() + gitsigns.diffthis "~" + end, "Diff this"), +} + +--- LSP keys --- +set_key.lsp = function(key, action) + return set_key.cmd("l" .. key, "Lsp" .. action, action) +end +set_key.lsp_saga = function(key, action, desc) + return set_key.cmd("l" .. key, "Lspsaga " .. action, desc or action) +end +wk.add { + { "l", group = "Lsp" }, + set_key.lsp("i", "Info"), + set_key.lsp("R", "Restart"), + set_key.lsp("s", "Start"), + set_key.lsp("x", "Stop"), + set_key.cmd("lf", require("conform").format, "Format"), + set_key.cmd("lF", "ConformInfo", "Format"), + + set_key.lsp_saga("r", "rename"), + set_key.lsp_saga("o", "outline"), + set_key.lsp_saga("a", "code_action", "Code Action"), +} + +--- FZF keys --- +set_key.fzf = function(key, action, desc) + return set_key.cmd("f" .. key, function() + local fzf = require "fzf-lua" + fzf[action]() + end, desc or action) +end + +wk.add { + { "f", group = "FZF" }, + set_key.fzf("f", "files", "Files"), + set_key.fzf("o", "oldfiles", "Old files"), + set_key.fzf("l", "live_grep", "Live grep"), + set_key.fzf("b", "buffers", "Buffers"), + set_key.fzf("k", "keymaps", "Keymaps"), + set_key.fzf("j", "jumps", "Jumps"), + set_key.fzf("c", "commands", "Commands"), + set_key.fzf("C", "colorschemes", "Colorschemes"), + set_key.fzf("t", "tabs", "Tabs"), + set_key.fzf("T", "treesitter", "Treesitter"), + -- set_key.cmd("fh", "FzfHarpoon", "Harpoon"), + set_key.fzf("s", "spell_suggest", "Spelling suggest"), + + { "fg", group = "Git" }, + set_key.fzf("gg", "git_files", "Files"), + set_key.fzf("gs", "git_status", "Status"), + set_key.fzf("gb", "git_bcommits", "Buffer commits"), + set_key.fzf("gB", "git_branches", "Branches"), + + { "fL", group = "LSP" }, + set_key.fzf("Lr", "lsp_references", "References"), + set_key.fzf("Ld", "lsp_definitions", "Definitions"), + set_key.fzf("LD", "lsp_declarations", "Declarations"), + set_key.fzf("Lt", "lsp_typedefs", "Type definitions"), + set_key.fzf("Li", "lsp_implementations", "Implementations"), + set_key.fzf("Ls", "lsp_document_symbols", "Symbols"), + set_key.fzf("LS", "lsp_workspace_symbols", "Workspace symbols"), + -- set_key.fzf("LS", "lsp_live_workspace_symbols", "Live workspace symbols"), + set_key.fzf("LI", "lsp_incoming_calls", "Incoming calls"), + set_key.fzf("Lc", "lsp_code_actions", "Code actions"), + set_key.fzf("Lf", "lsp_finder", "Finder"), + set_key.fzf("Lo", "lsp_outgoing_calls", "Outgoing calls"), + -- set_key.fzf("LD", "diagnostics_document", "Diagnostics document"), + -- set_key.fzf("LD", "diagnostics_workspace", "Diagnostics workspace"), +} + +set_key.trouble = function(key, action, desc) + return set_key.cmd("x" .. key, "Trouble " .. action .. " focus=true win.position=bottom", desc) +end +wk.add { + { "x", group = "Trouble" }, + set_key.trouble("x", "diagnostics filter.buf=0", "Buffer Diagnostics"), + set_key.trouble("X", "diagnostics", "Diagnostics"), + set_key.trouble("t", "todo", "Todo"), + set_key.trouble("q", "qflist", "QuickFix List"), + set_key.trouble("L", "loclist", "Location List"), + set_key.cmd("xv", function() + local current_value = vim.diagnostic.config().virtual_text + vim.diagnostic.config({ virtual_text = not current_value }) + end, "Toggle virtual text"), + + --- LSP --- + set_key.trouble("l", "lsp", "LSP"), + set_key.trouble("D", "lsp_declarations", "declarations"), + set_key.trouble("d", "lsp_definitions", "definitions"), + set_key.trouble("s", "symbols", "Symbols"), + set_key.trouble("i", "lsp_implementations", "implementations"), + set_key.trouble("I", "lsp_incoming_calls", "Incoming calls"), + set_key.trouble("O", "lsp_outgoing_calls", "Outgoing calls"), + set_key.trouble("r", "lsp_references", "references"), + set_key.trouble("T", "lsp_type_definitions", "type definitions"), +} + +set_key.latex = function(key, action) + return set_key.cmd("L" .. key, "Vimtex" .. action, action) +end + +wk.add { + { "m", group = "Markdown" }, + set_key.cmd("mr", "RenderMarkdown toggle", "Toggle render"), + set_key.cmd("mv", "MarkdownPreviewToggle", "Browser preview"), + + --- Snap (Silicon) -- + { "S", group = "Snap(Silicon)" }, + set_key.cmd("Ss", require("silicon").file, "Save as file"), + set_key.cmd("Sc", require("silicon").clip, "Copy to clipboard"), + + --- Latex (Vimtex) -- + { "L", group = "Latex" }, + set_key.latex("v", "View"), + set_key.latex("e", "Errors"), + set_key.latex("r", "Reload"), + set_key.latex("c", "Compile"), + + set_key.cmd("r", require("grug-far").open, "Replace"), + set_key.cmd("z", function() + vim.wo.number = false + require("zen-mode").toggle() + end, "Zen Mode"), + set_key.cmd("u", "UndotreeToggle", "Undo Tree"), + set_key.cmd("H", "HexokinaseToggle", "Hexokinase"), +} + +wk.add { + { "t", group = "Debugging" }, + --- dap --- + set_key.cmd("tb", "DapToggleBreakpoint", "Toggle Breakpoint"), + set_key.cmd("td", "DapContinue", "Continue Debug Session"), + set_key.cmd("tD", "DapNew", "New Debug Session"), + set_key.cmd("ts", "DapStepInto", "Step Into"), + set_key.cmd("tS", "DapStepOver", "Step Over"), + set_key.cmd("tr", function() + require("dap").repl.toggle() + end, "Toggle Debug REPL"), + + --- neotest --- + set_key.cmd("tt", function() + require("neotest").run.run() + end, "Run nearest test"), + set_key.cmd("tT", function() + require("neotest").run.run({strategy = "dap"}) + end, "Debug nearest test"), + set_key.cmd("ta", function() + require("neotest").run.run(vim.fn.expand("%")) + end, "Run all tests in file"), +} diff --git a/home/editors/nvim/plugins/utils/which-key/default.nix b/home/editors/nvim/plugins/utils/which-key/default.nix new file mode 100644 index 0000000..5d6dca2 --- /dev/null +++ b/home/editors/nvim/plugins/utils/which-key/default.nix @@ -0,0 +1,17 @@ +{pkgs, ...}: { + extraPackages = with pkgs; [lazygit]; + + plugins.which-key = { + enable = true; + settings = { + preset = "helix"; # "classic" | "modern" | "helix" + sort = ["manual"]; + win = { + border = "rounded"; + }; + icon.mappings = false; + }; + }; + + extraConfigLua = builtins.readFile ./config.lua; +} diff --git a/home/editors/nvim/stylua.toml b/home/editors/nvim/stylua.toml new file mode 100644 index 0000000..f8471d5 --- /dev/null +++ b/home/editors/nvim/stylua.toml @@ -0,0 +1,2 @@ +quote_style = "AutoPreferSignle" +call_parentheses = "None" diff --git a/home/global.nix b/home/global.nix new file mode 100644 index 0000000..c1c9636 --- /dev/null +++ b/home/global.nix @@ -0,0 +1,53 @@ +{ + user, + pkgs, + stateVersion, + lib, + ... +}: { + nixpkgs.config.allowUnfree = true; + + nix = { + package = lib.mkDefault pkgs.nix; + settings.experimental-features = ["nix-command" "flakes"]; + }; + + programs = { + home-manager.enable = true; + git = { + enable = true; + settings = { + commit.gpgsign = true; + + url = { + "ssh://git@gitlab.uni-ulm.de".insteadOf = "https://gitlab.uni-ulm.de"; + "ssh://git@github.com".insteadOf = "https://github.com"; + }; + + user = { + email = "dominik.bernroider@icloud.com"; + name = "demenik"; + signingkey = "D3EC91B5457F4864"; + }; + + "includeIf \"hasconfig:remote.*.url:git@gitlab.uni-ulm.de:*/**\"" = { + path = "${pkgs.writeText ".gitconfig-gitlab.uni-ulm.de" '' + [user] + email = "dominik.bernroider@uni-ulm.de" + name = "Dominik Bernroider" + ''}"; + }; + + init.defaultBranch = "main"; + }; + }; + gpg.enable = true; + }; + + home = { + inherit stateVersion; + username = lib.mkDefault user; + homeDirectory = lib.mkDefault "/home/${user}"; + sessionPath = ["$HOME/.local/bin"]; + }; +} diff --git a/home/programs/cli/ai.nix b/home/programs/cli/ai.nix new file mode 100644 index 0000000..b409a66 --- /dev/null +++ b/home/programs/cli/ai.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + gemini-cli + ]; +} diff --git a/home/programs/cli/bat.nix b/home/programs/cli/bat.nix new file mode 100644 index 0000000..5ac8103 --- /dev/null +++ b/home/programs/cli/bat.nix @@ -0,0 +1,21 @@ +{pkgs, ...}: { + programs.bat = { + enable = true; + # config.theme = "Catppuccin Mocha"; + themes = { + "Catppuccin Mocha" = { + src = pkgs.fetchFromGitHub { + owner = "catppuccin"; + repo = "bat"; + rev = "6810349"; + sha256 = "1y5sfi7jfr97z1g6vm2mzbsw59j1jizwlmbadvmx842m0i5ak5ll"; + }; + file = "themes/Catppuccin Mocha.tmTheme"; + }; + }; + }; + + programs.zsh.shellAliases = { + cat = "bat"; + }; +} diff --git a/home/programs/cli/btop.nix b/home/programs/cli/btop.nix new file mode 100644 index 0000000..ecb278e --- /dev/null +++ b/home/programs/cli/btop.nix @@ -0,0 +1,15 @@ +{pkgs, ...}: { + programs.btop = { + enable = true; + # settings = { + # color_theme = "catppuccin-mocha"; + # theme_background = false; + # }; + themes = { + catppuccin-mocha = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/catppuccin/btop/f437574b600f1c6d932627050b15ff5153b58fa3/themes/catppuccin_mocha.theme"; + sha256 = "0i263xwkkv8zgr71w13dnq6cv10bkiya7b06yqgjqa6skfmnjx2c"; + }; + }; + }; +} diff --git a/home/programs/cli/debugging.nix b/home/programs/cli/debugging.nix new file mode 100644 index 0000000..9ab4cd7 --- /dev/null +++ b/home/programs/cli/debugging.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + vscode-extensions.vadimcn.vscode-lldb + ]; +} diff --git a/home/programs/cli/default.nix b/home/programs/cli/default.nix new file mode 100644 index 0000000..899e347 --- /dev/null +++ b/home/programs/cli/default.nix @@ -0,0 +1,13 @@ +{ + imports = [ + ./zoxide.nix + ./bat.nix + ./eza.nix + ./btop.nix + ./ssh.nix + ./fastfetch.nix + ./jq.nix + ./ai.nix + ./debugging.nix + ]; +} diff --git a/home/programs/cli/eza.nix b/home/programs/cli/eza.nix new file mode 100644 index 0000000..42f8755 --- /dev/null +++ b/home/programs/cli/eza.nix @@ -0,0 +1,21 @@ +{pkgs, ...}: { + programs.eza = { + enable = true; + enableZshIntegration = true; + + colors = "auto"; + extraOptions = [ + "--classify" + "--group-directories-first" + ]; + + theme = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/eza-community/eza-themes/17095bff4792eecd7f4f1ed8301b15000331c906/themes/catppuccin.yml"; + sha256 = "0hpchiiadyxfl5rx12msww94jbj5hvqma5b2jgcvllv1b2pd1ghd"; + }; + }; + + programs.zsh.shellAliases = { + ls = "eza"; + }; +} diff --git a/home/programs/cli/fastfetch.nix b/home/programs/cli/fastfetch.nix new file mode 100644 index 0000000..7df4006 --- /dev/null +++ b/home/programs/cli/fastfetch.nix @@ -0,0 +1,47 @@ +{ + programs.fastfetch = { + enable = true; + + settings = { + display = { + separator = " = "; + }; + + modules = let + mkLiteral = type: key: format: { + inherit type; + key = " ${key}"; + format = "${format};"; + }; + mkString = type: key: format: mkLiteral type key "\"${format}\""; + emptyLine = { + type = "custom"; + format = ""; + }; + in [ + { + type = "title"; + format = "{host-name-colored}.users.{user-name-colored} = {"; # {} + } + + (mkString "host" "host" "{family}") + (mkString "cpu" "cpu" "{name} ({cores-physical}C/{cores-logical}T) @ {freq-max}") + (mkString "memory" "memory" "{used}/{total} ({percentage})") + (mkString "disk" "disk" "{name} ({filesystem}) {size-used}/{size-total} ({size-percentage})") + (mkString "os" "os" "{name} {release}") + (mkString "kernel" "kernel" "{sysname} {arch} {display-version}") + (mkString "localip" "ip" "{ipv4} {ifname}") # last seen + + emptyLine + + (mkString "wm" "wm" "{pretty-name} {version} ({protocol-name})") + (mkString "editor" "editor" "{name} {version}") + + { + type = "custom"; + format = "};"; + } + ]; + }; + }; +} diff --git a/home/programs/cli/jq.nix b/home/programs/cli/jq.nix new file mode 100644 index 0000000..825fbf2 --- /dev/null +++ b/home/programs/cli/jq.nix @@ -0,0 +1,3 @@ +{ + programs.jq.enable = true; +} diff --git a/home/programs/cli/ssh.nix b/home/programs/cli/ssh.nix new file mode 100644 index 0000000..865f773 --- /dev/null +++ b/home/programs/cli/ssh.nix @@ -0,0 +1,32 @@ +{ + programs.ssh = { + enable = true; + enableDefaultConfig = false; + + matchBlocks = { + "*" = { + identityFile = "~/.ssh/id_rsa"; + }; + "homelab" = { + hostname = "46.5.154.149"; + user = "nix"; + }; + "hyperion" = { + hostname = "192.168.178.55"; + user = "demenik"; + }; + "sgi-uni-ulm" = { + hostname = "login.informatik.uni-ulm.de"; + user = "db56"; + }; + "github.com" = { + user = "git"; + identitiesOnly = true; + }; + "gitlab.uni-ulm.de" = { + user = "git"; + identitiesOnly = true; + }; + }; + }; +} diff --git a/home/programs/cli/zoxide.nix b/home/programs/cli/zoxide.nix new file mode 100644 index 0000000..1bc2b56 --- /dev/null +++ b/home/programs/cli/zoxide.nix @@ -0,0 +1,10 @@ +{ + programs.zoxide = { + enable = true; + enableZshIntegration = true; + }; + + programs.zsh.shellAliases = { + cd = "z"; + }; +} diff --git a/home/programs/default.nix b/home/programs/default.nix new file mode 100644 index 0000000..db130d1 --- /dev/null +++ b/home/programs/default.nix @@ -0,0 +1,44 @@ +{ + inputs, + pkgs, + ... +}: { + imports = [ + ./cli + + ./firefox.nix + ./qbittorrent.nix + + ./nmgui.nix + ./overskride.nix + ./rofi.nix + ./emulator.nix + ./vpn.nix + + ./spicetify.nix + + ./thunderbird.nix + ./obsidian.nix + ./office.nix + + ./vesktop.nix + ]; + + home.packages = with pkgs; [ + inputs.bettersoundcloud.packages.${system}.default + + gimp + aseprite + + nautilus + nautilus-open-any-terminal + rquickshare + flameshot + + openvpn3 + + libreoffice + + prismlauncher + ]; +} diff --git a/home/programs/emulator.nix b/home/programs/emulator.nix new file mode 100644 index 0000000..7f14d88 --- /dev/null +++ b/home/programs/emulator.nix @@ -0,0 +1,7 @@ +{ + wayland.windowManager.hyprland.settings.windowrulev2 = map (rule: "${rule}, class:^(Emulator)$") [ + "float" + "keepaspectratio" + "pin" + ]; +} diff --git a/home/programs/firefox.nix b/home/programs/firefox.nix new file mode 100644 index 0000000..2f9c871 --- /dev/null +++ b/home/programs/firefox.nix @@ -0,0 +1,155 @@ +{lib, ...}: { + home.sessionVariables."BROWSER" = "firefox"; + wayland.windowManager.hyprland.settings = { + env = ["BROWSER,firefox"]; + + windowrulev2 = + [ + "workspace 2, class:^(firefox)$" + "fullscreenstate -1 2, class:^(firefox)$" + "float, title:^(Firefox - Sharing Indicator)$" + "suppressevent maximize, class:^(firefox)$" + ] + ++ map (rule: "${rule}, class:^(firefox)$, title:^(Picture-in-Picture)$") [ + "float" + "keepaspectratio" + "pin" + "move 100%-w-5 100%-w-5" + ]; + }; + + xdg = { + mimeApps.defaultApplications = builtins.listToAttrs (builtins.map (key: { + name = key; + value = ["firefox.desktop"]; + }) [ + "x-scheme-handler/http" + "x-scheme-handler/https" + + "text/html" + "text/xml" + "application/pdf" + ]); + }; + + programs.firefox = { + enable = true; + profiles.default = { + name = "Default"; + + settings = { + "extensions.pocket.enabled" = false; + + "browser.uidensity" = 0; + "browser.urlbar.suggest.engines" = false; + "browser.urlbar.suggest.openpage" = false; + "browser.urlbar.suggest.bookmark" = true; + "browser.toolbars.bookmarks.visibility" = "only show on new tab"; + "browser.urlbar.suggest.addons" = false; + "browser.urlbar.suggest.pocket" = false; + + "widget.use-xdg-desktop-portal.file-picker" = 1; + + "browser.formfill.enable" = false; + "extensions.formautofill.addresses.enabled" = false; + }; + + search = { + force = true; + + default = "ud"; + order = [ + "ud" + + "no" + "np" + "hm" + + "nv" + "lsp" + + "crates" + ]; + + engines = let + mkParams = lib.mapAttrsToList (name: value: { + inherit name value; + }); + + mkEngine = { + icon, + template, + params ? {}, + definedAliases ? [], + }: { + inherit icon definedAliases; + urls = [ + { + inherit template; + params = mkParams params; + } + ]; + }; + in { + ud = mkEngine { + icon = "https://www.gstatic.com/images/branding/searchlogo/ico/favicon.ico"; + template = "https://unduck.demenik.tech"; + params = {q = "{searchTerms}";}; + }; + + np = mkEngine { + icon = "https://search.nixos.org/images/nix-logo.png"; + definedAliases = ["@np"]; + template = "https://search.nixos.org/packages"; + params = { + type = "packages"; + channel = "unstable"; + query = "{searchTerms}"; + }; + }; + no = mkEngine { + icon = "https://search.nixos.org/images/nix-logo.png"; + definedAliases = ["@no"]; + template = "https://search.nixos.org/options"; + params = { + channel = "unstable"; + query = "{searchTerms}"; + }; + }; + hm = mkEngine { + icon = "https://home-manager-options.extranix.com/images/favicon.png"; + definedAliases = ["@hm"]; + template = "https://home-manager-options.extranix.com"; + params = { + release = "master"; + query = "{searchTerms}"; + }; + }; + + nv = mkEngine { + icon = "https://raw.githubusercontent.com/nix-community/nixvim/main/assets/nixvim_logo.svg"; + definedAliases = ["@nv"]; + template = "https://nix-community.github.io/nixvim/"; + params = { + search = "{searchTerms}"; + }; + }; + lsp = mkEngine { + icon = "https://github.com/neovim.png"; + definedAliases = ["@lsp"]; + template = "https://github.com/neovim/nvim-lspconfig/blob/master/doc/configs.md#{searchTerms}"; + }; + + crates = mkEngine { + icon = "https://crates.io/assets/cargo.png"; + definedAliases = ["@crates"]; + template = "https://crates.io/search"; + params = { + q = "{searchTerms}"; + }; + }; + }; + }; + }; + }; +} diff --git a/home/programs/nmgui.nix b/home/programs/nmgui.nix new file mode 100644 index 0000000..74a0070 --- /dev/null +++ b/home/programs/nmgui.nix @@ -0,0 +1,11 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + nmgui + ]; + + wayland.windowManager.hyprland.settings.windowrulev2 = map (rule: "${rule}, class:^(com.network.manager)$") [ + "float" + "size 500 600" + "center" + ]; +} diff --git a/home/programs/obsidian.nix b/home/programs/obsidian.nix new file mode 100644 index 0000000..66a3a2b --- /dev/null +++ b/home/programs/obsidian.nix @@ -0,0 +1,7 @@ +{pkgs, ...}: { + home.packages = with pkgs; [obsidian]; + + wayland.windowManager.hyprland.settings.windowrulev2 = [ + "workspace 1, class:^(obsidian)$" + ]; +} diff --git a/home/programs/office.nix b/home/programs/office.nix new file mode 100644 index 0000000..e3c09da --- /dev/null +++ b/home/programs/office.nix @@ -0,0 +1,64 @@ +{ + pkgs, + config, + ... +}: let + catppuccin = { + flavour = "mocha"; + accent = "mauve"; + socHash = "sha256-c7BIwKlwUpD+rLKQQi43mHi2s/hlNkxPE+eX7iWb2vI="; + }; + + themeName = "catppuccin-${catppuccin.flavour}-${catppuccin.accent}"; + themeUrl = "https://raw.githubusercontent.com/catppuccin/libreoffice/main/themes/${catppuccin.flavour}/${catppuccin.accent}/${themeName}.soc"; + + themeFile = pkgs.fetchurl { + url = themeUrl; + hash = catppuccin.socHash; + }; +in { + home.packages = with pkgs; [libreoffice]; + + xdg.configFile."libreoffice/4/user/config/catppuccin-mocha-mauve.soc" = { + source = themeFile; + executable = false; + }; + + # https://github.com/catppuccin/libreoffice/blob/main/scripts/install_theme.sh (edited for nix) + # home.activation.installCatppuccinLibreofficeTheme = '' + # PATH=${pkgs.lib.makeBinPath [pkgs.gawk pkgs.gnugrep pkgs.findutils pkgs.coreutils pkgs.gettext]} + + # echo "Applying Catppuccin theme to LibreOffice..." + + # configFile=$(find "${config.xdg.configHome}/libreoffice" -path '*/user/registrymodifications.xcu' -print -quit) + + # if [[ -z "$configFile" || ! -f "$configFile" ]]; then + # echo "LibreOffice registrymodifications.xcu not found. Skipping." + # exit 0 + # fi + + # echo "Found config at: $configFile" + + # if grep -q 'oor:name="${themeName}"' "$configFile"; then + # echo "Theme '${themeName}' is already installed. Nothing to do." + # exit 0 + # fi + + # echo "Injecting theme '${themeName}' into $configFile..." + + # gawk -i inplace -v themePath="${themeFile}" ' + # BEGIN { + # while ((getline line < themePath) > 0) { + # themeContent = themeContent line "\n" + # } + # close(themePath) + # } + # /<\/oor:items>/ { + # printf "%s", themeContent + # } + # { print } + # ' "$configFile" + + # echo "Successfully applied theme." + # ''; +} diff --git a/home/programs/overskride.nix b/home/programs/overskride.nix new file mode 100644 index 0000000..3961ed0 --- /dev/null +++ b/home/programs/overskride.nix @@ -0,0 +1,11 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + overskride + ]; + + wayland.windowManager.hyprland.settings.windowrulev2 = map (rule: "${rule}, class:^(io.github.kaii_lb.Overskride)$") [ + "float" + "size 850 650" + "center" + ]; +} diff --git a/home/programs/qbittorrent.nix b/home/programs/qbittorrent.nix new file mode 100644 index 0000000..7149efc --- /dev/null +++ b/home/programs/qbittorrent.nix @@ -0,0 +1,22 @@ +{pkgs, ...}: { + home.packages = with pkgs; [qbittorrent]; + + xdg.mimeApps = { + enable = true; + defaultApplications = { + "x-scheme-handler/magnet" = ["org.qbittorrent.qBittorrent.desktop"]; + }; + }; + + programs.firefox.policies.Handlers = { + schemes.magnet = { + action = "useHelperApp"; + handlers = [ + { + name = "qBittorrent"; + path = "${pkgs.qbittorrent}/share/application/org.qbittorrent.qBittorrent.desktop"; + } + ]; + }; + }; +} diff --git a/home/programs/rofi.nix b/home/programs/rofi.nix new file mode 100644 index 0000000..2493618 --- /dev/null +++ b/home/programs/rofi.nix @@ -0,0 +1,123 @@ +{config, ...}: { + wayland.windowManager.hyprland.settings = { + bind = [ + "SUPER, Space, exec, rofi -show drun -show-icons" + ]; + + windowrulev2 = map (rule: "${rule}, class:^(Rofi)$") [ + "float" + "dimaround" + "pin" + "stayfocused" + "persistentsize" + "decorate 0" + "center 1" + ]; + }; + + stylix.targets.rofi.enable = false; + + programs.rofi = { + enable = true; + extraConfig = { + modi = "drun,run"; + display-drun = "drun"; + display-run = "run"; + }; + + font = "sans-serif 12"; + + theme = let + inherit (config.lib.formats.rasi) mkLiteral; + in { + "*" = let + inherit (config.lib.stylix) colors; + in { + bg0 = mkLiteral "#${colors.base00}F2"; + bg1 = mkLiteral "#${colors.base01}"; + bg2 = mkLiteral "#${colors.base02}"; + bg3 = mkLiteral "#${colors.base0E}"; + fg0 = mkLiteral "#${colors.base05}"; + fg1 = mkLiteral "#${colors.base04}"; + fg2 = mkLiteral "#${colors.base03}"; + fg3 = mkLiteral "#${colors.base02}"; + + background-color = mkLiteral "transparent"; + text-color = mkLiteral "@fg0"; + + margin = mkLiteral "0px"; + padding = mkLiteral "0px"; + spacing = mkLiteral "0px"; + }; + + "window" = { + location = mkLiteral "north"; + y-offset = mkLiteral "calc(50% - 176px)"; + width = 480; + border-radius = mkLiteral "8px"; + + background-color = mkLiteral "@bg0"; + }; + + "mainbox".padding = mkLiteral "12px"; + + "inputbar" = { + background-color = mkLiteral "@bg1"; + border-color = mkLiteral "@bg3"; + + border = mkLiteral "2px"; + border-radius = mkLiteral "8px"; + + padding = mkLiteral "8px 16px"; + spacing = mkLiteral "8px"; + children = map mkLiteral ["prompt" "entry"]; + }; + + "prompt".text-color = mkLiteral "@fg2"; + + "entry" = { + placeholder = " Search..."; + placeholder-color = mkLiteral "@fg3"; + }; + + "message" = { + margin = mkLiteral "12px 0 0"; + border-radius = mkLiteral "8px"; + border-color = mkLiteral "@bg2"; + background-color = mkLiteral "@bg2"; + }; + + "textbox".padding = mkLiteral "8px 24px"; + + "listview" = { + background-color = mkLiteral "transparent"; + + margin = mkLiteral "12px 0 0"; + lines = 8; + columns = 1; + + fixed-height = true; + }; + + "element" = { + padding = mkLiteral "8px 16px"; + spacing = mkLiteral "8px"; + border-radius = mkLiteral "8px"; + }; + + "element normal active".text-color = mkLiteral "@bg3"; + "element alternate active".text-color = mkLiteral "@bg3"; + "element selected normal, element selected active" = { + text-color = mkLiteral "@bg0"; + background-color = mkLiteral "@bg3"; + }; + + "element-icon" = { + size = mkLiteral "1em"; + vertical-align = mkLiteral "0.5"; + }; + + "element-text".text-color = mkLiteral "inherit"; + }; + }; +} diff --git a/home/programs/spicetify.nix b/home/programs/spicetify.nix new file mode 100644 index 0000000..1d765a4 --- /dev/null +++ b/home/programs/spicetify.nix @@ -0,0 +1,34 @@ +{ + inputs, + pkgs, + ... +}: let + inherit (inputs) spicetify-nix; +in { + imports = [spicetify-nix.homeManagerModules.default]; + + programs.spicetify = let + spicePkgs = spicetify-nix.legacyPackages.${pkgs.system}; + in { + enable = true; + + spotifyLaunchFlags = "--enable-features=UseOzonePlatform --ozone-platform=wayland"; + + enabledExtensions = with spicePkgs.extensions; [ + keyboardShortcut + shuffle + groupSession + fullAlbumDate + showQueueDuration + betterGenres + lastfm + playNext + volumePercentage + allOfArtist + ]; + }; + + wayland.windowManager.hyprland.settings.windowrulev2 = [ + "workspace 3, class:^(Spotify)$" + ]; +} diff --git a/home/programs/thunderbird.nix b/home/programs/thunderbird.nix new file mode 100644 index 0000000..09797d6 --- /dev/null +++ b/home/programs/thunderbird.nix @@ -0,0 +1,34 @@ +{pkgs, ...}: { + programs.thunderbird = { + enable = true; + + profiles.default = { + isDefault = true; + + settings = { + "mail.ui.folderpane.view" = 2; + # "mail.account.special_folders.global_inbox" = 1; + "extensions.autoDisableScopes" = 0; + }; + + extensions = let + catppuccin-theme = pkgs.stdenv.mkDerivation { + name = "catppuccin-thunderbird"; + src = pkgs.fetchFromGitHub { + owner = "catppuccin"; + repo = "thunderbird"; + rev = "0289f3bd9566f9666682f66a3355155c0d0563fc"; + hash = "sha256-07gT37m1+OhRTbUk51l0Nhx+I+tl1il5ayx2ow23APY="; + }; + + installPhase = '' + mkdir -p $out + cp -r $src/themes/mocha/mocha-mauve.xpi $out/catppuccin-mocha-mauve.xpi + ''; + }; + in [ + catppuccin-theme + ]; + }; + }; +} diff --git a/home/programs/vesktop.nix b/home/programs/vesktop.nix new file mode 100644 index 0000000..5ccc97c --- /dev/null +++ b/home/programs/vesktop.nix @@ -0,0 +1,369 @@ +{config, ...}: let + inherit (config.lib.stylix) colors; +in { + stylix.targets.vesktop.enable = false; + + wayland.windowManager.hyprland.settings.windowrulev2 = + [ + "workspace 4, class:^(vesktop)$" + ] + ++ map (rule: "${rule}, class:^(vesktop)$, title:^(Discord Popout)$") [ + "float" + "size 640 360" + "keepaspectratio" + "pin" + "move 100%-w-5 100%-w-5" + ]; + + programs.vesktop = { + enable = true; + + settings = { + discordBranch = "stable"; + minimizeToTray = false; + arRPC = true; + splashColor = "#${colors.base0E}"; + splashBackground = "#${colors.base00}"; + }; + + vencord = { + settings = { + autoUpdate = true; + autpUpdateNotification = true; + useQuickCss = true; + eagerPatches = false; + enableReactDevtools = true; + frameless = false; + transparent = true; + winCtrlQ = false; + disableMinSize = true; + winNativeTitleBar = false; + + themeLinks = [ + "https://catppuccin.github.io/discord/dist/catppuccin-mocha-mauve.theme.css" + ]; + + notifications = { + timeout = 5000; + position = "bottom-right"; + useNative = "not-focused"; + logLimit = 50; + }; + + cloud = { + authenticated = false; + url = "https://api.vencord.dev/"; + settingsSync = false; + settingsSyncVersion = 0; + }; + + plugins = { + ChatInputButtonAPI.enabled = true; + CommandsAPI.enabled = true; + DynamicImageModalAPI.enabled = true; + MemberListDecoratorsAPI.enabled = true; + MessageAccessoriesAPI.enabled = true; + MessageDecorationsAPI.enabled = true; + MessageEventsAPI.enabled = true; + MessagePopoverAPI.enabled = true; + UserSettingsAPI.enabled = true; + AlwaysTrust = { + enabled = true; + domain = true; + file = true; + }; + AnonymiseFileNames = { + enabled = true; + anonymiseByDefault = true; + method = 2; + randomisedLength = 7; + consistent = "image"; + }; + BetterFolders = { + enabled = true; + sidebarAnim = false; + sidebar = true; + closeAllFolders = false; + closeAllHomeButton = false; + closeOthers = false; + forceOpen = false; + keepIcons = false; + showFolderIcon = 1; + }; + BetterGifAltText.enabled = true; + BetterGifPicker.enabled = true; + BetterSettings = { + enabled = true; + disableFade = true; + organizeMenu = true; + eagerLoad = true; + }; + BetterUploadButton.enabled = true; + BiggerStreamPreview.enabled = true; + BlurNSFW = { + enabled = true; + blurAmount = 10; + }; + CallTimer = { + enabled = true; + format = "stopwatch"; + }; + ClearURLs.enabled = true; + ConsoleJanitor = { + enabled = true; + disableLoggers = false; + disableSpotifyLogger = true; + whitelistedLoggers = "GatewaySocket; Routing/Utils"; + }; + CopyEmojiMarkdown.enabled = true; + CopyFileContents.enabled = true; + CopyUserURLs.enabled = true; + CrashHandler.enabled = true; + Decor.enabled = true; + DisableCallIdle.enabled = true; + DontRoundMyTimestamps.enabled = true; + FakeNitro = { + enabled = true; + enableEmojiBypass = true; + emojiSize = 48; + transformEmojis = true; + enableStickerBypass = true; + stickerSize = 160; + transformStickers = true; + transformCompoundSentence = false; + enableStreamQualityBypass = true; + useHyperLinks = true; + hyperLinkText = "{{NAME}}"; + disableEmbedPermissionCheck = false; + }; + FakeProfileThemes = { + enabled = true; + nitroFirst = true; + }; + FavoriteEmojiFirst.enabled = true; + FavoriteGifSearch.enabled = true; + FixCodeblockGap.enabled = true; + FixImagesQuality.enabled = true; + FixSpotifyEmbeds = { + enabled = true; + volume = 10; + }; + ForceOwnerCrown.enabled = true; + FriendInvites.enabled = true; + FriendsSince.enabled = true; + FullSearchContext.enabled = true; + GameActivityToggle = { + enabled = true; + oldIcon = false; + }; + GifPaste.enabled = true; + GreetStickerPicker = { + enabled = true; + greetMode = "Greet"; + }; + iLoveSpam.enabled = true; + IgnoreActivities = { + enabled = false; + listMode = 0; + idsList = ""; + ignorePlaying = false; + ignoreStreaming = false; + ignoreListening = false; + ignoreWatching = false; + ignoreCompeting = false; + }; + ImplicitRelationships = { + enabled = true; + sortByAffinity = true; + }; + MemberCount = { + enabled = true; + toolTip = true; + memberList = true; + }; + MessageClickActions = { + enabled = true; + enableDeleteOnClick = true; + enableDoubleClickToEdit = true; + enableDoubleClickToReply = true; + requireModifier = false; + }; + MessageLogger.enabled = true; + MoreCommands.enabled = true; + MoreKaomoji.enabled = true; + MutualGroupDMs.enabled = true; + NewGuildSettings = { + enabled = true; + guild = true; + messages = 3; + everyone = true; + role = true; + highlights = true; + events = true; + showAllChannels = true; + }; + NoDevtoolsWarning.enabled = true; + NoMaskedUrlPaste.enabled = true; + NoMosaic = { + enabled = false; + inlineVideo = true; + }; + NoOnboardingDelay.enabled = true; + NoPendingCount = { + enabled = true; + friendRequest = false; + messageRequest = false; + }; + NoUnblockToJump.enabled = true; + NSFWGateBypass.enabled = true; + OnePingPerDM = { + enabled = true; + channelToAffect = "both_dms"; + allowMentions = false; + allowEveryone = false; + }; + OpenInApp = { + enabled = true; + spotify = true; + steam = true; + epic = true; + tidal = true; + itunes = true; + }; + PauseInvitesForever.enabled = true; + PermissionFreeWill = { + enabled = true; + lockout = true; + onboarding = true; + }; + PermissionsViewer.enabled = true; + petpet.enabled = true; + PictureInPicture.enabled = true; + PinDMs.enabled = true; + PlatformIndicators = { + enabled = true; + colorMobileIndicator = true; + list = true; + badges = true; + messages = true; + }; + ReactErrorDecoder.enabled = true; + ReadAllNotificationsButton.enabled = true; + RelationshipNotifier = { + enabled = true; + offlineRemovals = true; + groups = true; + servers = true; + friends = true; + friendRequestCancels = true; + }; + ReverseImageSearch.enabled = true; + ReviewDB = { + enabled = true; + notifyReviews = true; + showWarning = true; + hideTimestamps = false; + hideBlockedUsers = true; + }; + ServerInfo.enabled = true; + ShikiCodeblocks = { + enabled = true; + theme = "https://raw.githubusercontent.com/shikijs/shiki/0b28ad8ccfbf2615f2d9d38ea8255416b8ac3043/packages/shiki/themes/dark-plus.json"; + tryHljs = "SECONDARY"; + useDevIcon = "COLOR"; + bgOpacity = 100; + customTheme = ""; + }; + ShowConnections.enabled = true; + ShowHiddenChannels = { + enabled = true; + hideUnreads = true; + showMode = 0; + defaultAllowedUsersAndRolesDropdownState = true; + }; + ShowTimeoutDuration = { + enabled = true; + displayStyle = "ssalggnikool"; + }; + SilentTyping = { + enabled = true; + showIcon = false; + contextMenu = true; + isEnabled = true; + }; + SpotifyCrack = { + enabled = true; + noSpotifyAutoPause = true; + keepSpotifyActivityOnIdle = false; + }; + SpotifyShareCommands.enabled = true; + ThemeAttributes.enabled = true; + Translate = { + enabled = true; + showChatBarButton = true; + service = "google"; + deeplApiKey = ""; + autoTranslate = false; + showAutoTranslateTooltip = true; + receivedInput = "auto"; + receivedOutput = "en"; + sentInput = "auto"; + sentOutput = "zh-CN"; + showAutoTranslateAlert = false; + }; + TypingIndicator.enabled = true; + Unindent.enabled = true; + UnlockedAvatarZoom.enabled = true; + UnsuppressEmbeds.enabled = true; + UserMessagesPronouns = { + enabled = true; + pronounsFormat = "LOWERCASE"; + showSelf = true; + }; + UserVoiceShow = { + enabled = true; + showInUserProfileModal = true; + showInMemberList = true; + showInMessages = true; + }; + USRBG = { + enabled = true; + nitroFirst = true; + voiceBackground = true; + }; + ValidReply.enabled = true; + ValidUser.enabled = true; + ViewIcons.enabled = true; + VoiceDownload.enabled = true; + VoiceMessages = { + enabled = true; + noiseSuppression = true; + echoCancellation = true; + }; + VolumeBooster = { + enabled = true; + multiplier = 2; + }; + WebKeybinds.enabled = true; + WebScreenShareFixes.enabled = true; + YoutubeAdblock.enabled = true; + NoTrack = { + enabled = true; + disableAnalytics = true; + }; + WebContextMenus = { + enabled = true; + addBack = true; + }; + Settings = { + enabled = true; + settingsLocation = "aboveNitro"; + }; + SupportHelper.enabled = true; + FullUserInChatbox.enabled = true; + BadgeAPI.enabled = true; + }; + }; + }; + }; +} diff --git a/home/programs/vpn.nix b/home/programs/vpn.nix new file mode 100644 index 0000000..dcf62c8 --- /dev/null +++ b/home/programs/vpn.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + openconnect + ]; +} diff --git a/home/services/bisync.nix b/home/services/bisync.nix new file mode 100644 index 0000000..1eb26ff --- /dev/null +++ b/home/services/bisync.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [rclone]; + + systemd.user = let + mkBiSync = { + name, + ageName, + localDir, + remoteDir, + }: { + services."sync-${name}" = { + Unit = { + Description = "Rclone bi-directional ${name} syncing"; + After = ["network-online.target"]; + }; + Service = { + EnvironmentFile = "%t/agenix/${ageName}"; + ExecStart = '' + ${pkgs.lib.getExe pkgs.rclone} bisync \ + "${localDir}" \ + "NEXTCLOUD:${remoteDir}" \ + --resync \ + --verbose + ''; + }; + }; + + paths."sync-${name}" = { + Unit.Description = "Rclone bi-directional ${name} syncing watch path"; + Path = { + PathChanged = localDir; + PathModified = localDir; + }; + Install.WantedBy = ["default.target"]; + }; + + timers."sync-${name}" = { + Unit.Description = "Rclone bi-directional ${name} syncing timer"; + Timer = { + OnBootSec = "5min"; + OnUnitActiveSec = "1h"; + Unit = "sync-${name}.service"; + }; + Install.WantedBy = ["timers.target"]; + }; + }; + + combine = builtins.foldl' (acc: set: acc // set) {}; + in + combine [ + (mkBiSync { + name = "music"; + ageName = "nextcloud"; + localDir = "${config.home.homeDirectory}/Music/"; + remoteDir = "Musik"; + }) + ]; +} diff --git a/home/services/kanshi.nix b/home/services/kanshi.nix new file mode 100644 index 0000000..2bf6ac8 --- /dev/null +++ b/home/services/kanshi.nix @@ -0,0 +1,60 @@ +{ + services.kanshi = { + enable = true; + settings = let + enableLaptopDock = false; + + laptop = { + criteria = "eDP-1"; + mode = "1920x1200@60"; + scale = 1.25; + status = "enable"; + }; + laptopDock = + if enableLaptopDock + then laptop + else { + inherit (laptop) criteria; + status = "disable"; + }; + + samsungDock = { + criteria = "Samsung Electric Company LC24RG50 HTHM300134"; + mode = "1920x1080@144"; + scale = 1.0; + status = "enable"; + }; + + collegeDock = { + criteria = "Dell Inc. DELL U2515H 9X2VY54S0QNL"; + mode = "1920x1080@60"; + scale = 1.0; + status = "enable"; + }; + + mkSensitivity = val: "hyprctl keyword input:sensitivity ${val}"; + in [ + { + profile = { + name = "laptop"; + outputs = [laptop]; + exec = [(mkSensitivity "0.0")]; + }; + } + { + profile = { + name = "dock@home"; + outputs = [samsungDock laptopDock]; + exec = [(mkSensitivity "-0.5")]; + }; + } + { + profile = { + name = "dock@college"; + outputs = [collegeDock laptopDock]; + exec = [(mkSensitivity "-0.5")]; + }; + } + ]; + }; +} diff --git a/home/shells/zsh/aliases.nix b/home/shells/zsh/aliases.nix new file mode 100644 index 0000000..eb5570e --- /dev/null +++ b/home/shells/zsh/aliases.nix @@ -0,0 +1,9 @@ +{ + programs.zsh.shellAliases = { + v = "nvim"; + c = "clear"; + cp = "cp -riv"; + + "nix-shell" = "nix-shell --command zsh"; + }; +} diff --git a/home/shells/zsh/default.nix b/home/shells/zsh/default.nix new file mode 100644 index 0000000..e702d2a --- /dev/null +++ b/home/shells/zsh/default.nix @@ -0,0 +1,27 @@ +{ + lib, + pkgs, + ... +}: { + imports = [ + ./prompt.nix + ./aliases.nix + ./scripts.nix + ]; + + home.sessionVariables."SHELL" = "${lib.getExe pkgs.zsh}"; + + programs.zsh = { + enable = true; + + autosuggestion.enable = true; + enableCompletion = true; + syntaxHighlighting.enable = true; + + initContent = '' + bindkey -e + + export SHELL="${lib.getExe pkgs.zsh}" + ''; + }; +} diff --git a/home/shells/zsh/prompt.nix b/home/shells/zsh/prompt.nix new file mode 100644 index 0000000..b45f12c --- /dev/null +++ b/home/shells/zsh/prompt.nix @@ -0,0 +1,8 @@ +{ + programs.oh-my-posh = { + enable = true; + enableZshIntegration = true; + + settings = builtins.fromTOML (builtins.readFile ./theme.omp.toml); + }; +} diff --git a/home/shells/zsh/scripts.nix b/home/shells/zsh/scripts.nix new file mode 100644 index 0000000..7998889 --- /dev/null +++ b/home/shells/zsh/scripts.nix @@ -0,0 +1,33 @@ +{ + pkgs, + dotsDir, + ... +}: { + home.packages = with pkgs; [ + (writeScriptBin "rebuild" '' + cd ${dotsDir} + git add -A 2>/dev/null + sudo nixos-rebuild $@ switch --flake . + cd - >/dev/null + '') + + (writeScriptBin "update" '' + cd ${dotsDir} + git add -A 2>/dev/null + sudo nix flake $@ update + cd - >/dev/null + '') + + (writeScriptBin "nix" '' + NIX=${pkgs.lib.getExe pkgs.nix} + + if [[ $1 == "develop" || $1 == "shell" ]]; then + cmd=$1 + shift + exec "$NIX" "$cmd" -c "$SHELL" "$@" + else + exec "$NIX" "$@" + fi + '') + ]; +} diff --git a/home/shells/zsh/theme.omp.toml b/home/shells/zsh/theme.omp.toml new file mode 100644 index 0000000..960f6a5 --- /dev/null +++ b/home/shells/zsh/theme.omp.toml @@ -0,0 +1,72 @@ +version = 3 +final_space = true + +[transient_prompt] + template = ' ' + foreground = '#f9e2af' + background = 'transparent' + +[[blocks]] + type = 'prompt' + alignment = 'left' + newline = true + + [[blocks.segments]] + template = '{{ if .Root }}root{{ else }}{{ .UserName }}{{ end }}@{{ .HostName }} ' + foreground = '#cba6f7' + type = 'session' + style = 'plain' + + [blocks.segments.properties] + cache_duration = 'none' + + [[blocks.segments]] + template = '{{ if ne .Type "unknown" }}󱄅 {{ end }}' + foreground = '#89b4fa' + type = 'nix-shell' + style = 'plain' + + [blocks.segments.properties] + cache_duration = 'none' + + [[blocks.segments]] + template = 'in' + foreground = '#585b70' + type = 'text' + style = 'plain' + + [blocks.segments.properties] + cache_duration = 'none' + + [[blocks.segments]] + foreground = '#89dceb' + type = 'path' + style = 'powerline' + + [blocks.segments.properties] + cache_duration = 'none' + style = 'full' + + [[blocks.segments]] + template = '{{if .UpstreamIcon}}{{ .UpstreamIcon }} {{end}}{{ .HEAD }}{{if .BranchStatus }} {{ .BranchStatus }}{{ end }}{{ if .Working.Changed }}  {{ .Working.String }}{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} |{{ end }}{{ if .Staging.Changed }}  {{ .Staging.String }}{{ end }}{{ if gt .StashCount 0 }}  {{ .StashCount }}{{ end }}' + foreground = '#585b70' + type = 'git' + style = 'plain' + + [blocks.segments.properties] + fetch_upstream_icon = true + fetch_status = true + +[[blocks]] + type = 'prompt' + alignment = 'left' + newline = true + + [[blocks.segments]] + template = '' + foreground = '#f9e2af' + type = 'text' + style = 'plain' + + [blocks.segments.properties] + cache_duration = 'none' diff --git a/home/stylix/cursor.nix b/home/stylix/cursor.nix new file mode 100644 index 0000000..d8b59ab --- /dev/null +++ b/home/stylix/cursor.nix @@ -0,0 +1,23 @@ +{ + pkgs, + inputs, + ... +}: let + mcmojavePkg = pkgs.stdenv.mkDerivation { + pname = "mcmojave-cursors"; + version = "24/2/2021"; + src = inputs.mcmojave-cursors; + dontBuild = true; + + installPhase = '' + mkdir -p $out/share/icons + cp -pr $src/dist $out/share/icons/McMojave-cursors + ''; + }; +in { + stylix.cursor = { + name = "McMojave-cursors"; + package = mcmojavePkg; + size = 22; + }; +} diff --git a/home/stylix/default.nix b/home/stylix/default.nix new file mode 100644 index 0000000..d1ce71d --- /dev/null +++ b/home/stylix/default.nix @@ -0,0 +1,32 @@ +{pkgs, ...}: { + imports = [ + ./cursor.nix + ./fonts.nix + ./targets.nix + ]; + + stylix = { + enable = true; + + base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-mocha.yaml"; + polarity = "dark"; + override = { + # swap base0E with base0D, so that mauve is the main accent + base0D = "cba6f7"; # base0E + base0E = "89b4fa"; # base0D + }; + + icons = { + enable = true; + dark = "Papirus"; + package = pkgs.papirus-icon-theme; + }; + + opacity = { + terminal = 0.9; + applications = 0.9; + desktop = 0.9; + popups = 0.9; + }; + }; +} diff --git a/home/stylix/fonts.nix b/home/stylix/fonts.nix new file mode 100644 index 0000000..b6ef530 --- /dev/null +++ b/home/stylix/fonts.nix @@ -0,0 +1,31 @@ +{pkgs, ...}: { + stylix.fonts = rec { + sansSerif = { + package = pkgs.nerd-fonts.ubuntu; + name = "Ubuntu Nerd Font"; + }; + + serif = sansSerif; + + monospace = { + package = pkgs.nerd-fonts.jetbrains-mono; + name = "JetBrainsMono Nerd Font"; + }; + + emoji = { + package = pkgs.twemoji-color-font; + name = "Twitter Color Emoji"; + }; + }; + + home.packages = with pkgs; [ + noto-fonts-cjk-sans + ]; + + fonts.fontconfig.defaultFonts = let + font = ["Ubuntu Nerd Font" "Noto Sans CJK"]; + in { + sansSerif = font; + serif = font; + }; +} diff --git a/home/stylix/targets.nix b/home/stylix/targets.nix new file mode 100644 index 0000000..21fa89d --- /dev/null +++ b/home/stylix/targets.nix @@ -0,0 +1,11 @@ +{ + stylix.targets = { + neovim.enable = false; + nixvim.enable = false; + + firefox = { + enable = false; + profileNames = ["Default"]; + }; + }; +} diff --git a/home/terminals/kitty/cwd.nix b/home/terminals/kitty/cwd.nix new file mode 100644 index 0000000..366262e --- /dev/null +++ b/home/terminals/kitty/cwd.nix @@ -0,0 +1,63 @@ +{pkgs, ...}: let + hyprctl = pkgs.lib.getExe' pkgs.hyprland "hyprctl"; + jq = pkgs.lib.getExe pkgs.jq; + pgrep = pkgs.lib.getExe' pkgs.procps "pgrep"; + kitty = pkgs.lib.getExe pkgs.kitty; + + # A kitty wrapper, to launch a new kitty window at the same path of the currently focused kitty window. + # Only works with zsh + kitty-cwd = + pkgs.writeShellScriptBin "kitty-cwd" + # sh + '' + active_window="$(${hyprctl} activewindow -j)" + class="$(echo "$active_window" | ${jq} -r .class)" + pid="$(echo "$active_window" | ${jq} -r .pid)" + + leaf_cwd="" + + if [[ "$class" == "kitty" ]]; then + current_pid="$pid" + + while true; do + child_pid=$(${pgrep} -P "$current_pid" -n) + if [[ -z "$child_pid" ]]; then break; fi + + cwd_file="''${XDG_RUNTIME_DIR:-/tmp}/kitty-cwd-$child_pid" + if [[ -f "$cwd_file" ]]; then + leaf_cwd=$(cat "$cwd_file") + fi + + current_pid="$child_pid" + done + fi + + target="''${leaf_cwd:-$HOME}" + ${kitty} --directory "$target" + ''; +in { + home.packages = [ + kitty-cwd + ]; + + programs = { + kitty.settings = { + allow_remote_control = "yes"; + listen_on = "unix:/tmp/kitty-{kitty_pid}"; + }; + + zsh.initContent = + # sh + '' + write_cwd() { + echo "$PWD" > "''${XDG_RUNTIME_DIR:-/tmp}/kitty-cwd-$$" + } + precmd_functions+=(write_cwd) + + cleanup_cwd() { + rm -f "''${XDG_RUNTIME_DIR:-/tmp}/kitty-cwd-$$" + } + zshexit_functions+=(cleanup_cwd) + ''; + }; +} diff --git a/home/terminals/kitty/default.nix b/home/terminals/kitty/default.nix new file mode 100644 index 0000000..419bc83 --- /dev/null +++ b/home/terminals/kitty/default.nix @@ -0,0 +1,19 @@ +{ + imports = [ + ./cwd.nix + ]; + + programs.kitty = { + enable = true; + settings = { + confirm_os_window_close = 0; + dynamic_background_opacity = true; + disable_ligatures = "always"; + }; + + shellIntegration.enableZshIntegration = true; + }; + + home.sessionVariables."TERMINAL" = "kitty"; + wayland.windowManager.hyprland.settings.env = ["TERMINAL,kitty"]; +} diff --git a/home/xdg-desktop.nix b/home/xdg-desktop.nix new file mode 100644 index 0000000..1ebff22 --- /dev/null +++ b/home/xdg-desktop.nix @@ -0,0 +1,19 @@ +{ + xdg = { + enable = true; + + desktopEntries = let + hide = { + exec = "echo"; + name = "Hidden"; + noDisplay = true; + }; + in { + kvantummanager = hide; + rofi = hide; + rofi-theme-selector = hide; + qt5ct = hide; + qt6ct = hide; + }; + }; +} diff --git a/hosts/thinkpad.nix b/hosts/thinkpad.nix new file mode 100644 index 0000000..2b6cc57 --- /dev/null +++ b/hosts/thinkpad.nix @@ -0,0 +1,38 @@ +{ + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "thunderbolt" "usb_storage" "usbhid" "sd_mod"]; + boot.kernelModules = ["kvm-amd"]; + + fileSystems."/" = { + device = "/dev/disk/by-label/NIXROOT"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-label/NIXBOOT"; + fsType = "vfat"; + options = ["fmask=0022" "dmask=0022"]; + }; + + swapDevices = []; + + # 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.enp1s0f0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp2s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/wsl.nix b/hosts/wsl.nix new file mode 100644 index 0000000..607a725 --- /dev/null +++ b/hosts/wsl.nix @@ -0,0 +1,4 @@ +{ + wsl.enable = true; + wsl.defaultUser = "demenik"; +} diff --git a/nixos/full.nix b/nixos/full.nix new file mode 100644 index 0000000..11cba33 --- /dev/null +++ b/nixos/full.nix @@ -0,0 +1,44 @@ +{ + pkgs, + stateVersion, + user, + ... +}: { + imports = [ + ./global + ./users/demenik.nix + + ./optional/backup.nix + ./optional/greetd.nix + ./optional/networkmanager.nix + ./optional/bluetooth.nix + ./optional/fprint.nix + ./optional/vm.nix + ./optional/gaming.nix + ./optional/adb.nix + ./optional/docker.nix + ./optional/direnv.nix + ./optional/wireshark.nix + ]; + + programs.zsh.enable = true; + users.users.${user}.shell = pkgs.zsh; + + boot = { + loader = { + efi.canTouchEfiVariables = true; + grub = { + enable = true; + device = "nodev"; + efiSupport = true; + }; + }; + + kernelPackages = pkgs.linuxPackages_latest; + }; + + programs.hyprland.enable = true; + services.displayManager.defaultSession = "hyprland"; + + system = {inherit stateVersion;}; +} diff --git a/nixos/global/default.nix b/nixos/global/default.nix new file mode 100644 index 0000000..f8c6ee7 --- /dev/null +++ b/nixos/global/default.nix @@ -0,0 +1,49 @@ +{ + pkgs, + lib, + ... +}: { + imports = [ + ./nix.nix + ]; + + programs.dconf.enable = true; + + environment.systemPackages = with pkgs; [ + home-manager + neovim + (lib.hiPrio uutils-coreutils-noprefix) + ]; + + services.xserver.xkb = { + layout = "de"; + variant = "nodeadkeys"; + }; + console.keyMap = "de"; + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_DE.UTF-8"; + LC_IDENTIFICATION = "de_DE.UTF-8"; + LC_MEASUREMENT = "de_DE.UTF-8"; + LC_MONETARY = "de_DE.UTF-8"; + LC_NAME = "de_DE.UTF-8"; + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TELEPHONE = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + time.timeZone = "Europe/Berlin"; + + services.pulseaudio.enable = false; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + security = { + rtkit.enable = true; + sudo-rs.enable = true; + }; +} diff --git a/nixos/global/nix.nix b/nixos/global/nix.nix new file mode 100644 index 0000000..58de27a --- /dev/null +++ b/nixos/global/nix.nix @@ -0,0 +1,19 @@ +{pkgs, ...}: { + nix = { + package = pkgs.nix; + + settings = { + auto-optimise-store = true; + trusted-users = ["root" "@wheel"]; + experimental-features = "nix-command flakes"; + warn-dirty = false; + }; + gc = { + automatic = true; + options = "--delete-older-than 2d"; + }; + optimise.automatic = true; + }; + + nixpkgs.config.allowUnfree = true; +} diff --git a/nixos/headless.nix b/nixos/headless.nix new file mode 100644 index 0000000..1fd9092 --- /dev/null +++ b/nixos/headless.nix @@ -0,0 +1,19 @@ +{ + pkgs, + stateVersion, + user, + ... +}: { + imports = [ + ./global + ./users/demenik.nix + + ./optional/docker.nix + ./optional/direnv.nix + ]; + + programs.zsh.enable = true; + users.users.${user}.shell = pkgs.zsh; + + system = {inherit stateVersion;}; +} diff --git a/nixos/optional/adb.nix b/nixos/optional/adb.nix new file mode 100644 index 0000000..3e1e0ce --- /dev/null +++ b/nixos/optional/adb.nix @@ -0,0 +1,4 @@ +{user, ...}: { + programs.adb.enable = true; + users.users."${user}".extraGroups = ["adbusers"]; +} diff --git a/nixos/optional/backup.nix b/nixos/optional/backup.nix new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/nixos/optional/backup.nix @@ -0,0 +1 @@ +{} diff --git a/nixos/optional/bluetooth.nix b/nixos/optional/bluetooth.nix new file mode 100644 index 0000000..3dac4a1 --- /dev/null +++ b/nixos/optional/bluetooth.nix @@ -0,0 +1,3 @@ +{ + hardware.bluetooth.enable = true; +} diff --git a/nixos/optional/direnv.nix b/nixos/optional/direnv.nix new file mode 100644 index 0000000..2b51c9d --- /dev/null +++ b/nixos/optional/direnv.nix @@ -0,0 +1,6 @@ +{ + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; +} diff --git a/nixos/optional/docker.nix b/nixos/optional/docker.nix new file mode 100644 index 0000000..9f3539b --- /dev/null +++ b/nixos/optional/docker.nix @@ -0,0 +1,8 @@ +{user, ...}: { + virtualisation.docker = { + enable = true; + rootless.enable = true; + }; + + users.users.${user}.extraGroups = ["docker"]; +} diff --git a/nixos/optional/eduroam.nix b/nixos/optional/eduroam.nix new file mode 100644 index 0000000..51ad8ba --- /dev/null +++ b/nixos/optional/eduroam.nix @@ -0,0 +1,19 @@ +{user, ...}: { + networking.wireless = { + enable = true; + networks = { + eduroam = { + auth = '' + proto=RSN + key_mgmt=WPA-EAP + eap=PEAP + identity="dominik.bernroider@uni-ulm.de" + password=hash:9446aa5c94d8f72165905212d0e62d36 + phase1="peaplabel=0" + phase2="auth=MSCHAPV2" + ca_cert="/home/${user}/.config/cat_installer/ca.pem" + ''; + }; + }; + }; +} diff --git a/nixos/optional/fprint.nix b/nixos/optional/fprint.nix new file mode 100644 index 0000000..4256f26 --- /dev/null +++ b/nixos/optional/fprint.nix @@ -0,0 +1,7 @@ +{pkgs, ...}: { + services.fprintd = { + enable = true; + tod.enable = true; + tod.driver = pkgs.libfprint-2-tod1-goodix-550a; + }; +} diff --git a/nixos/optional/gaming.nix b/nixos/optional/gaming.nix new file mode 100644 index 0000000..200644b --- /dev/null +++ b/nixos/optional/gaming.nix @@ -0,0 +1,15 @@ +{pkgs, ...}: { + programs.steam = { + enable = true; + + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + localNetworkGameTransfers.openFirewall = true; + + extest.enable = true; + }; + + environment.systemPackages = with pkgs; [ + lutris + ]; +} diff --git a/nixos/optional/greetd.nix b/nixos/optional/greetd.nix new file mode 100644 index 0000000..d66fa45 --- /dev/null +++ b/nixos/optional/greetd.nix @@ -0,0 +1,17 @@ +{pkgs, ...}: { + services.greetd = { + enable = true; + settings = { + default_session = { + command = '' + ${pkgs.tuigreet}/bin/tuigreet \ + --cmd "${pkgs.hyprland}/bin/hyprland" \ + --remember \ + --remember-session \ + --asterisks + ''; + user = "demenik"; + }; + }; + }; +} diff --git a/nixos/optional/networkmanager.nix b/nixos/optional/networkmanager.nix new file mode 100644 index 0000000..446c1b2 --- /dev/null +++ b/nixos/optional/networkmanager.nix @@ -0,0 +1,9 @@ +{user, ...}: { + networking.networkmanager.enable = true; + users.users."${user}".extraGroups = ["networkmanager"]; + + # networking.networkmanager.dns = "none"; + # networking.useDHCP = false; + # networking.dhcpcd.enable = false; + # networking.nameservers = [ homelabipv4 "8.8.8.8" ]; +} diff --git a/nixos/optional/vm.nix b/nixos/optional/vm.nix new file mode 100644 index 0000000..2fb735f --- /dev/null +++ b/nixos/optional/vm.nix @@ -0,0 +1,6 @@ +{user, ...}: { + virtualisation.libvirtd.enable = true; + programs.virt-manager.enable = true; + + users.users."${user}".extraGroups = ["libvirtd"]; +} diff --git a/nixos/optional/wireshark.nix b/nixos/optional/wireshark.nix new file mode 100644 index 0000000..d30eb2e --- /dev/null +++ b/nixos/optional/wireshark.nix @@ -0,0 +1,10 @@ +{ + pkgs, + user, + ... +}: { + programs.wireshark.enable = true; + environment.systemPackages = with pkgs; [wireshark-qt]; + + users.users."${user}".extraGroups = ["wireshark"]; +} diff --git a/nixos/users/demenik.nix b/nixos/users/demenik.nix new file mode 100644 index 0000000..a966666 --- /dev/null +++ b/nixos/users/demenik.nix @@ -0,0 +1,7 @@ +{ + users.users.demenik = { + isNormalUser = true; + description = "Dominik"; + extraGroups = ["wheel" "networkmanager" "audio" "video" "tlp" "power"]; + }; +} diff --git a/secrets/.gitignore b/secrets/.gitignore new file mode 100644 index 0000000..0837fca --- /dev/null +++ b/secrets/.gitignore @@ -0,0 +1,3 @@ +# * +!secrets.nix.example +!default.nix diff --git a/secrets/default.nix b/secrets/default.nix new file mode 100644 index 0000000..7c3c660 --- /dev/null +++ b/secrets/default.nix @@ -0,0 +1,29 @@ +{ + inputs, + pkgs, + user, + ... +}: let + ageFiles = builtins.attrNames (import ./secrets.nix); + ageNames = + map ( + name: + with builtins; + substring 0 (stringLength name - 4) name + ) + ageFiles; +in { + home.packages = with inputs; [ + agenix.packages."${pkgs.system}".default + ]; + + age = { + identityPaths = ["/home/${user}/.ssh/id_ed25519"]; + + secrets = builtins.listToAttrs (map (name: { + inherit name; + value.file = ./${name}.age; + }) + ageNames); + }; +} diff --git a/secrets/nextcloud.age b/secrets/nextcloud.age new file mode 100644 index 0000000..e9fdcc7 --- /dev/null +++ b/secrets/nextcloud.age @@ -0,0 +1,7 @@ +age-encryption.org/v1 +-> ssh-ed25519 YgeALA LRXSjEG25sS233s6YtC9d09pN+NxFZAMtcSFYWK/si8 +NBGgGKt/yCUd2NSsWhn5uuZ6d8BtyXXWDLTD/ZzCV3k +--- ZXR4S3GiD1yD6peBUjj8CuEb5AtXgpyFMqtGt6wA9Qg +J0KƛIfN'3hp“VUlUhWOgD9 +P~(GKrvVFNfFMUlԽn´ .$nS}zpצ~B/{1JsAqS;| (OomZBf Nfv(%t)L9Nr`BWF1ja +ۋ]dQ-/i243)dW#T|9" Á<-7[UI﵀D9vΡ \ No newline at end of file diff --git a/secrets/obsidian-personal.age b/secrets/obsidian-personal.age new file mode 100644 index 0000000000000000000000000000000000000000..2ec323db30158ab2754e78f842941769fc316ffd GIT binary patch literal 4900 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