diff --git a/helpers.nix b/helpers.nix index 3e7d152..713695f 100644 --- a/helpers.nix +++ b/helpers.nix @@ -12,8 +12,11 @@ with inputs.nixpkgs.lib; { suite ? "", hostModules ? [], }: let - # Secrets directory. - secrets = builtins.toString inputs.secrets; + # specialArgs/extraSpecialArgs. + args = { + inherit inputs hostname; + secrets = builtins.toString inputs.secrets; + }; # Architecture. system = platform; @@ -57,14 +60,10 @@ with inputs.nixpkgs.lib; { nixosConfigurations.${hostname} = nixosSystem { inherit system pkgs; - specialArgs = { - # Pass variables to config. - inherit inputs secrets hostname; - }; + specialArgs = args; modules = [ - nixvim.nixosModules.nixvim # Neovim. lanzaboote.nixosModules.lanzaboote # Secure boot. sops-nix.nixosModules.sops # Secrets management. @@ -78,6 +77,7 @@ with inputs.nixpkgs.lib; { useGlobalPkgs = true; useUserPackages = true; backupFileExtension = "backup"; + extraSpecialArgs = args; users.fern = { # Me! home.username = "fern"; @@ -90,7 +90,9 @@ with inputs.nixpkgs.lib; { programs.home-manager.enable = true; # Import config. - imports = [./suites/${suite}/home.nix]; + imports = [ + nixvim.homeModules.nixvim + ./suites/${suite}/home.nix]; }; }; } diff --git a/suites/default.nix b/suites/default.nix index 994e59f..c37f3ee 100644 --- a/suites/default.nix +++ b/suites/default.nix @@ -1,11 +1,9 @@ { inputs, pkgs, - lib, hostname, ... -}: -with lib; { +}: { # NixOS version. system.stateVersion = "25.05"; @@ -29,6 +27,16 @@ with lib; { }; }; + # Install nh + enable autocleanup of store. + programs.nh = { + enable = true; + clean = { + enable = true; + extraArgs = "--keep 3"; + dates = "daily"; + }; + }; + # Enable redistributable firmware. hardware.enableRedistributableFirmware = true; @@ -74,237 +82,22 @@ with lib; { extraGroups = ["wheel"]; }; - # Use fish shell - programs.fish = { - enable = true; - - shellAbbrs = let - flake = "/home/fern/Repositories/flock"; - in { - ns = "nh os switch ${flake}"; - nt = "nh os test ${flake}"; - nb = "nh os boot ${flake}"; - }; - - interactiveShellInit = let - kanagawaTheme = builtins.readFile (pkgs.fetchurl { - url = "https://raw.githubusercontent.com/rebelot/kanagawa.nvim/refs/heads/master/extras/fish/kanagawa.fish"; - hash = "sha256-2sRTcX/ktf4aiALCn4w88PiGF8K3BtUeSSIQOdDxtWo="; - }); - in '' - # Kanagawa theme. - ${kanagawaTheme} - - # Disable greeting - set fish_greeting - - # Yazi cd on quit. - function y - set tmp (mktemp -t "yazi-cwd.XXXXXX") - yazi $argv --cwd-file="$tmp" - if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] - builtin cd -- "$cwd" - end - rm -f -- "$tmp" - end - ''; - }; - - # https://nixos.wiki/wiki/Fish#Setting_fish_as_your_shell + # Set fish as default shell (https://nixos.wiki/wiki/Fish#Setting_fish_as_your_shell). programs.bash = { interactiveShellInit = '' if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] then shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" - exec fish $LOGIN_OPTION + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION fi ''; }; - # https://discourse.nixos.org/t/slow-build-at-building-man-cache/52365/2 - documentation.man.generateCaches = false; + documentation.man.generateCaches = false; # https://discourse.nixos.org/t/slow-build-at-building-man-cache/52365/2 # Enable all terminfo (for ghostty). environment.enableAllTerminfo = true; - # Install some packages. - programs = { - git.enable = true; - lazygit.enable = true; - - nixvim = { - enable = true; - - # Set $EDITOR - defaultEditor = true; - - # For telescope grep. - dependencies.ripgrep.enable = true; - - # Space as leader. - globals.mapleader = " "; - - keymaps = [ - { - key = "t"; - action = " ToggleTerm direction=float "; - } - { - key = "x"; - action = " Trouble diagnostics toggle focus=false "; - } - { - key = "y"; - action = " Yazi "; - } - { - key = "fs"; - action = " SessionSearch "; - } - ]; - - colorschemes.kanagawa = { - enable = true; - settings = { - background.dark = "dragon"; - colors.theme.all.ui.bg_gutter = "none"; - }; - }; - - opts = rec { - background = "dark"; - shiftwidth = 2; - tabstop = shiftwidth; - softtabstop = shiftwidth; - expandtab = true; - number = true; - cursorline = true; - undofile = true; - }; - - plugins = { - auto-session.enable = true; - bufferline.enable = true; - colorizer.enable = true; - comment.enable = true; - gitsigns.enable = true; - lsp-format.enable = true; - notify.enable = true; - nvim-autopairs.enable = true; - nvim-surround.enable = true; - toggleterm.enable = true; - trouble.enable = true; - web-devicons.enable = true; - yazi.enable = true; - - lualine = { - enable = true; - settings.extensions = ["trouble" "toggleterm"]; - }; - - telescope = { - enable = true; - keymaps = { - "ff" = "find_files"; - "fg" = "live_grep"; - "fb" = "buffers"; - }; - }; - - blink-cmp = { - enable = true; - settings = { - keymap = { - preset = "enter"; - "" = [ - "select_next" - "fallback" - ]; - "" = [ - "select_prev" - "fallback" - ]; - }; - completion = { - menu.auto_show = true; - documentation.auto_show = true; - list.selection.preselect = false; - }; - cmdline = { - keymap.preset = "inherit"; - completion = { - menu.auto_show = true; - list.selection.preselect = false; - }; - }; - }; - }; - - lsp = { - enable = true; - inlayHints = true; - servers = { - nixd = { - enable = true; - settings = { - nixpkgs.expr = "import (builtins.getFlake (builtins.toString ${inputs.self})).inputs.nixpkgs { }"; - formatting.command = ["${pkgs.alejandra}/bin/alejandra"]; - options = { - nixos.expr = "(builtins.getFlake (builtins.toString ${inputs.self})).nixosConfigurations.${hostname}.options"; - home-manager.expr = "(builtins.getFlake (builtins.toString ${inputs.self})).nixosConfigurations.${hostname}.options.home-manager.users.type.getSubOptions []"; - }; - }; - }; - docker_compose_language_service.enable = true; - }; - }; - - treesitter = { - enable = true; - settings = { - highlight.enable = true; - incremental_selection.enable = true; - indent.enable = true; - }; - }; - }; - }; - }; - - programs.yazi = { - enable = true; - flavors."kanagawa-dragon.yazi" = pkgs.yazi-flavour-kanagawa-dragon; - settings.theme.flavor.dark = "kanagawa-dragon"; - }; - - programs.tmux = { - enable = true; - plugins = [pkgs.tmuxPlugins.kanagawa]; - extraConfigBeforePlugins = '' - set -g @kanagawa-plugins " " - set -g @kanagawa-theme "dragon" - set -g @kanagawa-ignore-window-colors true - ''; - }; - - programs.nh = { - enable = true; - clean = { - enable = true; - extraArgs = "--keep 3"; - dates = "daily"; - }; - }; - - environment.systemPackages = with pkgs; [ - aria2 - btop - lynx - ncdu - rsync - trash-cli - ]; - # Enable avahi hostname resolution. services.avahi = { enable = true; diff --git a/suites/desktop/default.nix b/suites/desktop/default.nix index 6a49fb9..17d1403 100755 --- a/suites/desktop/default.nix +++ b/suites/desktop/default.nix @@ -43,17 +43,10 @@ with lib; { desktopManager.gnome.enable = true; }; - # Theme QT applications - qt = { - enable = true; - platformTheme = "gnome"; - style = "adwaita-dark"; - }; - # Exclude some default gnome applications. environment.gnome.excludePackages = ( with pkgs; [ - epiphany # Browser (replaced by Firefox). + epiphany # Browser (replaced by Librewolf). evince # Document viewer (replaced by papers, which will become default on Gnome 49). gnome-connections # Remote desktop viewer. gnome-console # Terminal (replaced by ghostTTY). @@ -66,209 +59,9 @@ with lib; { ] ); - # Run electron apps under wayland. - environment.sessionVariables.NIXOS_OZONE_WL = "1"; - - # dconf settings. - programs.dconf.profiles.user.databases = [ - { - settings = { - # virt-manager autoconnect. - "org/virt-manager/virt-manager/connections" = { - autoconnect = ["qemu:///system"]; - uris = ["qemu:///system"]; - }; - - # Gnome settings. - "org/gnome/desktop/interface" = { - accent-color = "green"; - clock-show-seconds = true; - clock-show-weekday = true; - color-scheme = "prefer-dark"; - enable-hot-corners = false; - show-battery-percentage = true; - }; - - "org/gnome/desktop/background" = let - wallpaper = pkgs.copyPathToStore ./wallpaper.jpg; - in { - picture-uri = wallpaper; - picture-uri-dark = wallpaper; - }; - - "org/gnome/shell" = { - favorite-apps = gvariant.mkEmptyArray (gvariant.type.string); - enabled-extensions = with pkgs; [ - gnomeExtensions.adw-gtk3-colorizer.extensionUuid - gnomeExtensions.alphabetical-app-grid.extensionUuid - gnomeExtensions.auto-move-windows.extensionUuid - gnomeExtensions.caffeine.extensionUuid - gnomeExtensions.color-picker.extensionUuid - gnomeExtensions.rounded-window-corners-reborn.extensionUuid - gnomeExtensions.smile-complementary-extension.extensionUuid - ]; - }; - - "org/gnome/desktop/preferences" = { - num-workspaces = gvariant.mkInt32 4; - }; - - "org/gnome/mutter" = { - dynamic-workspaces = false; - experimental-features = [ - "scale-monitor-framebuffer" # Enables fractional scaling (125% 150% 175%) - "xwayland-native-scaling" # Scales Xwayland applications to look crisp on HiDPI screens - ]; - }; - - "org/gnome/settings-daemon/plugins/color" = { - night-light-enabled = true; - night-light-schedule-automatic = false; - }; - - "org/gnome/desktop/peripherals/touchpad" = { - natural-scroll = false; - two-finger-scrolling-enabled = true; - }; - - "org/gnome/desktop/wm/keybindings" = { - close = ["q"]; - move-to-workspace-1 = ["1"]; - move-to-workspace-2 = ["2"]; - move-to-workspace-3 = ["3"]; - move-to-workspace-4 = ["4"]; - switch-to-workspace-1 = ["1"]; - switch-to-workspace-2 = ["2"]; - switch-to-workspace-3 = ["3"]; - switch-to-workspace-4 = ["4"]; - toggle-maximized = ["f"]; - }; - - "org/gnome/settings-daemon/plugins/media-keys" = { - custom-keybindings = [ - "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/" - "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/" - "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/" - ]; - }; - - "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = { - name = "Open Emoji Picker"; - command = "smile"; - binding = "period"; - }; - - "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = { - name = "Open Terminal"; - command = "ghostty"; - binding = "Return"; - }; - - "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2" = { - name = "Open Files"; - command = "nautilus"; - binding = "e"; - }; - - # Applications. - "io/github/Foldex/AdwSteamGtk" = { - color-theme-options = "Adwaita"; - hide-whats-new-switch = false; - library-sidebar-options = "Show"; - login-qr-options = "Show"; - no-rounded-corners-switch = false; - prefs-beta-support = false; - window-controls-layout-options = "Auto"; - window-controls-options = "Adwaita"; - }; - - # Extensions. - "org/gnome/shell/extensions/auto-move-windows" = { - application-list = ["Fluffychat.desktop:2" "signal.desktop:2" "proton-mail.desktop:2" "feishin.desktop:3" "org.prismlauncher.PrismLauncher.desktop:4" "steam.desktop:4" "discord.desktop:2"]; - }; - - "org/gnome/shell/extensions/alphabetical-app-grid" = { - folder-order-position = "start"; - }; - - "org/gnome/shell/extensions/caffeine" = { - enable-fullscreen = false; - enable-mpris = false; - indicator-position = gvariant.mkInt32 0; - indicator-position-index = gvariant.mkInt32 0; - indicator-position-max = gvariant.mkInt32 4; - restore-state = false; - show-indicator = "only-active"; - }; - - "org/gnome/shell/extensions/color-picker" = { - enable-notify = false; - enable-preview = true; - enable-shortcut = true; - enable-sound = false; - enable-systray = false; - persistent-mode = false; - }; - }; - } - ]; - - # Install some packages. - programs = { - steam.enable = true; - firefox = { - enable = true; - package = pkgs.librewolf; - }; - }; - - environment.systemPackages = with pkgs; [ - adw-gtk3 - adwsteamgtk - blender - caligula - celluloid - feishin - fluffychat - fusee-nano - ghostty - gimp3 - glabels-qt - gnome-tweaks - gnomeExtensions.adw-gtk3-colorizer - gnomeExtensions.alphabetical-app-grid - gnomeExtensions.auto-move-windows - gnomeExtensions.caffeine - gnomeExtensions.color-picker - gnomeExtensions.rounded-window-corners-reborn - gnomeExtensions.smile-complementary-extension - hunspell - hunspellDicts.en_AU - inkscape - jellyfin-media-player - libreoffice - minipro - naps2 - nextcloud-client - ns-usbloader - obsidian - orca-slicer - papers - prismlauncher - protonmail-desktop - rockbox-utility - rpi-imager - signal-desktop - smile - via - webcord - yubioath-flutter - ]; - - fonts.packages = with pkgs; [ - merriweather - iosevka - ]; + # Gaming. + programs.steam.enable = true; + programs.gamemode.enable = true; # Allow opening terminal applications from gnome app launcher. xdg.terminal-exec = { @@ -286,9 +79,6 @@ with lib; { SUBSYSTEM=="usb", ATTRS{idVendor}=="0955", ATTRS{idProduct}=="7321", MODE="0666" ''; - # Enable gamemode service. - programs.gamemode.enable = true; - # Enable CUPS to print documents. services.printing = { enable = true; diff --git a/suites/desktop/home.nix b/suites/desktop/home.nix index 57e3c9f..9417a59 100644 --- a/suites/desktop/home.nix +++ b/suites/desktop/home.nix @@ -1,6 +1,161 @@ -{pkgs, ...}: { +{ + lib, + pkgs, + ... +}: +with lib; { imports = [../home.nix]; + # Run electron apps under wayland. + home.sessionVariables.NIXOS_OZONE_WL = "1"; + + # Theme QT applications + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + # Allow fontconfig to discover fonts. + fonts.fontconfig.enable = true; + + # dconf settings + dconf = { + enable = true; + settings = { + # Gnome settings. + "org/gnome/desktop/interface" = { + accent-color = "green"; + clock-show-seconds = true; + clock-show-weekday = true; + color-scheme = "prefer-dark"; + enable-hot-corners = false; + show-battery-percentage = true; + }; + + "org/gnome/desktop/background" = let + wallpaper = pkgs.copyPathToStore ./wallpaper.jpg; + in { + picture-uri = wallpaper; + picture-uri-dark = wallpaper; + }; + + "org/gnome/shell" = { + favorite-apps = gvariant.mkEmptyArray (gvariant.type.string); + enabled-extensions = with pkgs; [ + gnomeExtensions.adw-gtk3-colorizer.extensionUuid + gnomeExtensions.alphabetical-app-grid.extensionUuid + gnomeExtensions.auto-move-windows.extensionUuid + gnomeExtensions.caffeine.extensionUuid + gnomeExtensions.color-picker.extensionUuid + gnomeExtensions.rounded-window-corners-reborn.extensionUuid + gnomeExtensions.smile-complementary-extension.extensionUuid + ]; + }; + + "org/gnome/desktop/preferences" = { + num-workspaces = gvariant.mkInt32 4; + }; + + "org/gnome/mutter" = { + dynamic-workspaces = false; + experimental-features = [ + "scale-monitor-framebuffer" # Enables fractional scaling (125% 150% 175%) + "xwayland-native-scaling" # Scales Xwayland applications to look crisp on HiDPI screens + ]; + }; + + "org/gnome/settings-daemon/plugins/color" = { + night-light-enabled = true; + night-light-schedule-automatic = false; + }; + + "org/gnome/desktop/peripherals/touchpad" = { + natural-scroll = false; + two-finger-scrolling-enabled = true; + }; + + "org/gnome/desktop/wm/keybindings" = { + close = ["q"]; + move-to-workspace-1 = ["1"]; + move-to-workspace-2 = ["2"]; + move-to-workspace-3 = ["3"]; + move-to-workspace-4 = ["4"]; + switch-to-workspace-1 = ["1"]; + switch-to-workspace-2 = ["2"]; + switch-to-workspace-3 = ["3"]; + switch-to-workspace-4 = ["4"]; + toggle-maximized = ["f"]; + }; + + "org/gnome/settings-daemon/plugins/media-keys" = { + custom-keybindings = [ + "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/" + "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/" + "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/" + ]; + }; + + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = { + name = "Open Emoji Picker"; + command = "smile"; + binding = "period"; + }; + + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = { + name = "Open Terminal"; + command = "ghostty"; + binding = "Return"; + }; + + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2" = { + name = "Open Files"; + command = "nautilus"; + binding = "e"; + }; + + # Applications. + "io/github/Foldex/AdwSteamGtk" = { + color-theme-options = "Adwaita"; + hide-whats-new-switch = false; + library-sidebar-options = "Show"; + login-qr-options = "Show"; + no-rounded-corners-switch = false; + prefs-beta-support = false; + window-controls-layout-options = "Auto"; + window-controls-options = "Adwaita"; + }; + + # Extensions. + "org/gnome/shell/extensions/auto-move-windows" = { + application-list = ["Fluffychat.desktop:2" "signal.desktop:2" "proton-mail.desktop:2" "feishin.desktop:3" "org.prismlauncher.PrismLauncher.desktop:4" "steam.desktop:4" "discord.desktop:2"]; + }; + + "org/gnome/shell/extensions/alphabetical-app-grid" = { + folder-order-position = "start"; + }; + + "org/gnome/shell/extensions/caffeine" = { + enable-fullscreen = false; + enable-mpris = false; + indicator-position = gvariant.mkInt32 0; + indicator-position-index = gvariant.mkInt32 0; + indicator-position-max = gvariant.mkInt32 4; + restore-state = false; + show-indicator = "only-active"; + }; + + "org/gnome/shell/extensions/color-picker" = { + enable-notify = false; + enable-preview = true; + enable-shortcut = true; + enable-sound = false; + enable-systray = false; + persistent-mode = false; + }; + }; + }; + # Autostart. xdg.autostart = { enable = true; @@ -22,20 +177,77 @@ ]; }; - # Ghostty settings. - programs.ghostty = { + # Install some packages. + home.packages = with pkgs; [ + # Gnome. + adw-gtk3 + adwsteamgtk + gnome-tweaks + gnomeExtensions.adw-gtk3-colorizer + gnomeExtensions.alphabetical-app-grid + gnomeExtensions.auto-move-windows + gnomeExtensions.caffeine + gnomeExtensions.color-picker + gnomeExtensions.rounded-window-corners-reborn + gnomeExtensions.smile-complementary-extension + + # Fonts. + merriweather + iosevka + + # Dictionary & spellcheck. + hunspell + hunspellDicts.en_AU + + # Software. + blender + caligula + celluloid + feishin + fluffychat + fusee-nano + gimp3 + glabels-qt + inkscape + jellyfin-media-player + libreoffice + minipro + naps2 + ns-usbloader + obsidian + orca-slicer + papers + prismlauncher + protonmail-desktop + rockbox-utility + rpi-imager + signal-desktop + smile + via + webcord + yubioath-flutter + ]; + + # Install and configure software. + services.nextcloud-client = { enable = true; - settings = { - font-family = "IosevkaCustom"; - theme = "Kanagawa Dragon"; - }; + startInBackground = true; }; - # Librewolf settings - programs.firefox = { - enable = true; - package = pkgs.librewolf; - profiles.default = {}; - profiles.default.settings."identity.sync.tokenserver.uri" = "https://fxsync.fern.garden/1.0/sync/1.5"; + programs = { + ghostty = { + enable = true; + settings = { + font-family = "IosevkaCustom"; + theme = "Kanagawa Dragon"; + }; + }; + + firefox = { + enable = true; + package = pkgs.librewolf; + profiles.default = {}; + profiles.default.settings."identity.sync.tokenserver.uri" = "https://fxsync.fern.garden/1.0/sync/1.5"; + }; }; } diff --git a/suites/home.nix b/suites/home.nix index 0823837..0525982 100644 --- a/suites/home.nix +++ b/suites/home.nix @@ -1,19 +1,225 @@ { - programs.git = { - enable = true; - userEmail = "mail@fern.garden"; - userName = "Fern Garden"; - }; + inputs, + hostname, + pkgs, + ... +}: { + # Install packages. + home.packages = with pkgs; [ncdu rsync trash-cli]; - programs.aria2 = { - enable = true; - settings = { - max-concurrent-downloads = 5; - max-connection-per-server = 16; - min-split-size = "8M"; - split = 32; - disk-cache = "64M"; - file-allocation = "falloc"; + # Install & configure software. + programs = { + lazygit.enable = true; + btop.enable = true; + + fish = { + enable = true; + shellAbbrs = let + flake = "/home/fern/Repositories/flock"; + in { + ns = "nh os switch ${flake}"; + nt = "nh os test ${flake}"; + nb = "nh os boot ${flake}"; + }; + interactiveShellInit = let + kanagawaTheme = builtins.readFile (pkgs.fetchurl { + url = "https://raw.githubusercontent.com/rebelot/kanagawa.nvim/refs/heads/master/extras/fish/kanagawa.fish"; + hash = "sha256-2sRTcX/ktf4aiALCn4w88PiGF8K3BtUeSSIQOdDxtWo="; + }); + in '' + # Kanagawa theme. + ${kanagawaTheme} + + # Disable greeting + set fish_greeting + + # Yazi cd on quit. + function y + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + builtin cd -- "$cwd" + end + rm -f -- "$tmp" + end + ''; + }; + + yazi = { + enable = true; + enableFishIntegration = true; + flavors."kanagawa-dragon" = pkgs.yazi-flavour-kanagawa-dragon; + theme.flavor.dark = "kanagawa-dragon"; + }; + + nixvim = { + enable = true; + + # Set $EDITOR + defaultEditor = true; + + # For telescope grep. + dependencies.ripgrep.enable = true; + + # Space as leader. + globals.mapleader = " "; + + keymaps = [ + { + key = "t"; + action = " ToggleTerm direction=float "; + } + { + key = "x"; + action = " Trouble diagnostics toggle focus=false "; + } + { + key = "y"; + action = " Yazi "; + } + { + key = "fs"; + action = " SessionSearch "; + } + ]; + + colorschemes.kanagawa = { + enable = true; + settings = { + background.dark = "dragon"; + colors.theme.all.ui.bg_gutter = "none"; + }; + }; + + opts = rec { + background = "dark"; + shiftwidth = 2; + tabstop = shiftwidth; + softtabstop = shiftwidth; + expandtab = true; + number = true; + cursorline = true; + undofile = true; + }; + + plugins = { + auto-session.enable = true; + bufferline.enable = true; + colorizer.enable = true; + comment.enable = true; + gitsigns.enable = true; + lsp-format.enable = true; + notify.enable = true; + nvim-autopairs.enable = true; + nvim-surround.enable = true; + toggleterm.enable = true; + trouble.enable = true; + web-devicons.enable = true; + yazi.enable = true; + + lualine = { + enable = true; + settings.extensions = ["trouble" "toggleterm"]; + }; + + telescope = { + enable = true; + keymaps = { + "ff" = "find_files"; + "fg" = "live_grep"; + "fb" = "buffers"; + }; + }; + + blink-cmp = { + enable = true; + settings = { + keymap = { + preset = "enter"; + "" = [ + "select_next" + "fallback" + ]; + "" = [ + "select_prev" + "fallback" + ]; + }; + completion = { + menu.auto_show = true; + documentation.auto_show = true; + list.selection.preselect = false; + }; + cmdline = { + keymap.preset = "inherit"; + completion = { + menu.auto_show = true; + list.selection.preselect = false; + }; + }; + }; + }; + + lsp = { + enable = true; + inlayHints = true; + servers = { + nixd = { + enable = true; + settings = { + nixpkgs.expr = "import (builtins.getFlake (builtins.toString ${inputs.self})).inputs.nixpkgs { }"; + formatting.command = ["${pkgs.alejandra}/bin/alejandra"]; + options = { + nixos.expr = "(builtins.getFlake (builtins.toString ${inputs.self})).nixosConfigurations.${hostname}.options"; + home-manager.expr = "(builtins.getFlake (builtins.toString ${inputs.self})).nixosConfigurations.${hostname}.options.home-manager.users.type.getSubOptions []"; + }; + }; + }; + docker_compose_language_service.enable = true; + }; + }; + + treesitter = { + enable = true; + settings = { + highlight.enable = true; + incremental_selection.enable = true; + indent.enable = true; + }; + }; + }; + }; + + tmux = { + enable = true; + plugins = [ + { + plugin = pkgs.tmuxPlugins.kanagawa; + extraConfig = '' + set -g @kanagawa-plugins " " + set -g @kanagawa-theme "dragon" + set -g @kanagawa-ignore-window-colors true + ''; + } + ]; + }; + + git = { + enable = true; + userEmail = "mail@fern.garden"; + userName = "Fern Garden"; + }; + + aria2 = { + enable = true; + settings = { + max-concurrent-downloads = 5; + max-connection-per-server = 16; + min-split-size = "8M"; + split = 32; + disk-cache = "64M"; + file-allocation = "falloc"; + }; }; }; }