diff options
Diffstat (limited to 'modules')
92 files changed, 2244 insertions, 1275 deletions
diff --git a/modules/desktop/cinnamon/default.nix b/modules/desktop/cinnamon/default.nix deleted file mode 100644 index b6e2c6b..0000000 --- a/modules/desktop/cinnamon/default.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: - -{ - options.nx.desktop.cinnamon = { - enable = lib.mkEnableOption "Enable Cinnamon desktop environment"; - }; - - config = lib.mkIf config.nx.desktop.cinnamon.enable { - services.xserver.enable = true; - services.xserver.displayManager.lightdm.enable = true; - services.xserver.desktopManager.cinnamon.enable = true; - - services.speechd.enable = lib.mkForce false; - services.orca.enable = lib.mkForce true; - - environment.systemPackages = with pkgs; [ - nemo-preview - ]; - - environment.variables.QT_QPA_PLATFORMTHEME = "qt5ct"; - - services.xserver.xkb = { - layout = "de"; - variant = ""; - }; - - console.keyMap = "de"; - }; -} diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix deleted file mode 100644 index f3efbf5..0000000 --- a/modules/desktop/default.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ ... }: - -{ - imports = [ - ./sway - ./dunst.nix - ./waybar.nix - ./gnome - ./cinnamon - ./kde - ./labwc - ]; -} diff --git a/modules/hosts/audio/default.nix b/modules/hosts/audio/default.nix new file mode 100644 index 0000000..3cd06e4 --- /dev/null +++ b/modules/hosts/audio/default.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + ... +}: + +let + inherit (lib) mkOption types mkIf; + cfg = config.nx.services.audio; +in +{ + options.nx.services.audio = { + enable = mkOption { + description = "enable sound"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + wireplumber.enable = true; + }; + }; +} diff --git a/modules/hosts/default.nix b/modules/hosts/default.nix new file mode 100644 index 0000000..a1eaafc --- /dev/null +++ b/modules/hosts/default.nix @@ -0,0 +1,13 @@ +{ ... }: + +{ + imports = [ + ./audio + ./desktop + ./openssh + ./printer + ./server + ./system + ./wooting + ]; +} diff --git a/modules/hosts/desktop/cinnamon/default.nix b/modules/hosts/desktop/cinnamon/default.nix new file mode 100644 index 0000000..356bf42 --- /dev/null +++ b/modules/hosts/desktop/cinnamon/default.nix @@ -0,0 +1,38 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + inherit (lib) mkEnableOption mkIf mkForce; + cfg = config.nx.desktop.cinnamon; +in +{ + options.nx.desktop.cinnamon = { + enable = mkEnableOption "Enable Cinnamon desktop environment"; + }; + + config = mkIf cfg.enable { + services.xserver.enable = true; + services.xserver.displayManager.lightdm.enable = true; + services.xserver.desktopManager.cinnamon.enable = true; + + services.speechd.enable = mkForce false; + services.orca.enable = mkForce true; + + environment.systemPackages = with pkgs; [ + nemo-preview + ]; + + environment.variables.QT_QPA_PLATFORMTHEME = "qt5ct"; + + services.xserver.xkb = { + layout = "de"; + variant = ""; + }; + + console.keyMap = "de"; + }; +} diff --git a/modules/hosts/desktop/default.nix b/modules/hosts/desktop/default.nix new file mode 100644 index 0000000..137b68c --- /dev/null +++ b/modules/hosts/desktop/default.nix @@ -0,0 +1,14 @@ +{ ... }: + +{ + imports = [ + #./sway + #./dunst.nix + #./waybar.nix + #./gnome + ./cinnamon + ./kde + #./labwc + #./hyprland + ]; +} diff --git a/modules/desktop/dunst.nix b/modules/hosts/desktop/dunst.nix index 46e6445..4c5f74e 100644 --- a/modules/desktop/dunst.nix +++ b/modules/hosts/desktop/dunst.nix @@ -6,9 +6,13 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.dunst; +in { - options.nx.desktop.dunst.enable = lib.mkEnableOption "Enable dunst notification"; - config = lib.mkIf config.nx.desktop.dunst.enable { + options.nx.desktop.dunst.enable = mkEnableOption "Enable dunst notification"; + config = mkIf cfg.enable { home-manager.users.${username} = { home.packages = with pkgs; [ libnotify diff --git a/modules/desktop/gnome/dconf.nix b/modules/hosts/desktop/gnome/dconf.nix index 580433d..74b9b4a 100644 --- a/modules/desktop/gnome/dconf.nix +++ b/modules/hosts/desktop/gnome/dconf.nix @@ -5,8 +5,12 @@ ... }: +let + inherit (lib) mkIf; + cfg = config.nx.desktop.gnome; +in { - config = lib.mkIf config.nx.desktop.gnome.enable { + config = mkIf cfg.enable { home-manager.users."${username}".dconf.settings = { "org/gnome/desktop/interface" = { color-scheme = "prefer-dark"; diff --git a/modules/desktop/gnome/default.nix b/modules/hosts/desktop/gnome/default.nix index 40824a1..2aa62ed 100644 --- a/modules/desktop/gnome/default.nix +++ b/modules/hosts/desktop/gnome/default.nix @@ -5,16 +5,20 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.gnome; +in { imports = [ ./dconf.nix ]; options.nx.desktop.gnome = { - enable = lib.mkEnableOption "Enable GNOME desktop environment"; + enable = mkEnableOption "Enable GNOME desktop environment"; }; - config = lib.mkIf config.nx.desktop.gnome.enable { + config = mkIf cfg.enable { services.displayManager.gdm.enable = true; services.desktopManager.gnome.enable = true; services.gnome.core-developer-tools.enable = false; diff --git a/modules/hosts/desktop/hyprland/default.nix b/modules/hosts/desktop/hyprland/default.nix new file mode 100644 index 0000000..2bc2525 --- /dev/null +++ b/modules/hosts/desktop/hyprland/default.nix @@ -0,0 +1,183 @@ +{ + config, + username, + lib, + pkgs, + ... +}: + +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.hyprland; +in +{ + imports = [ + ./hyprlock.nix + ]; + + options.nx.desktop.hyprland.enable = mkEnableOption "Enable hyprland and setup"; + config = mkIf cfg.enable { + nx.desktop.hyprlock.enable = true; + home-manager.users.${username} = { + home.packages = with pkgs; [ + hyprshot + hyprpicker + ]; + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = true; + xwayland.enable = true; + settings = { + monitor = [ + "DP-1,highrr,0x0,auto" + ]; + + "$background" = "rgba(000000FF)"; + "$accent" = "rgba(FFFFFFFF)"; + + exec-once = [ + ]; + + env = [ + "XCURSOR_SIZE,24" + ]; + + input = { + kb_layout = "de"; + follow_mouse = 1; + touchpad = { + natural_scroll = "yes"; + }; + }; + + "device:logitech-g-pro--1" = { + sensitivity = -0.5; + }; + + general = { + gaps_in = 5; + gaps_out = 10; + border_size = 2; + "col.active_border" = "$accent"; + "col.inactive_border" = "$background"; + layout = "dwindle"; + }; + + decoration = { + rounding = 5; + active_opacity = 0.8; + inactive_opacity = 0.7; + + blur = { + enabled = true; + size = 4; + passes = 4; + ignore_opacity = true; + contrast = 1.1; + brightness = 1.0; + }; + + drop_shadow = false; + shadow_range = 30; + shadow_render_power = 4; + "col.shadow" = "$background"; + }; + + animations = { + enabled = "yes"; + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + misc = { + disable_hyprland_logo = true; + vrr = 1; + }; + + dwindle = { + pseudotile = "yes"; + preserve_split = "yes"; + }; + + master = { + new_is_master = true; + }; + + xwayland = { + force_zero_scaling = true; + }; + + windowrulev2 = [ + "noborder,class:(steam)" + ]; + + "$mod" = "SUPER"; + + bind = [ + "$mod, l, exec, hyprlock" + "$mod, s, exec, hyprshot --mode region" + "$mod, r, exec, wofi --show run" + "$mod, d, exec, wofi --show drun" + "$mod, c, exec, hyprpicker -r -a" + "$mod, return, exec, kitty" + "$mod, q, killactive," + "$mod, m, exit," + "$mod, f, fullscreen" + "$mod, v, togglefloating," + "$mod, P, pseudo," + + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + + ", XF86AudioPlay, exec, playerctl play-pause" + ", XF86AudioNext, exec, playerctl next" + ", XF86AudioPrev, exec, playerctl previous" + ", XF86Audiostop, exec, playerctl stop" + + "$mod, left, movefocus, l" + "$mod, right, movefocus, r" + "$mod, up, movefocus, u" + "$mod, down, movefocus, d" + + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + "$mod, 0, workspace, 10" + + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + "$mod SHIFT, 0, movetoworkspace, 10" + + "$mod, mouse_down, workspace, e+1" + "$mod, mouse_up, workspace, e-1" + ]; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + }; + }; + }; + }; +} diff --git a/modules/desktop/hyprland/hyprlock.nix b/modules/hosts/desktop/hyprland/hyprlock.nix index 425f83c..2d2ab03 100644 --- a/modules/desktop/hyprland/hyprlock.nix +++ b/modules/hosts/desktop/hyprland/hyprlock.nix @@ -5,11 +5,20 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.hyprlock; +in { - options.nx.desktop.hyprlock.enable = lib.mkEnableOption "Hyprlock is a screen locker for Hyprland."; - config = lib.mkIf config.nx.desktop.hyprlock.enable { + options.nx.desktop.hyprlock.enable = mkEnableOption "Hyprlock is a screen locker for Hyprland." // { + default = config.nx.desktop.hyprland.enable; + }; + config = mkIf cfg.enable { programs.hyprlock = { enable = true; + }; + home-manager.users.${username}.programs.hyprlock = { + enable = true; settings = { general = { immediate_render = true; diff --git a/modules/desktop/kde/default.nix b/modules/hosts/desktop/kde/default.nix index d2d37dd..d53e1c8 100644 --- a/modules/desktop/kde/default.nix +++ b/modules/hosts/desktop/kde/default.nix @@ -5,17 +5,22 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.kde; +in { - options.nx.desktop.kde.enable = lib.mkEnableOption "Enable kde"; - config = lib.mkIf config.nx.desktop.kde.enable { + options.nx.desktop.kde.enable = mkEnableOption "Enable kde"; + config = mkIf cfg.enable { services.displayManager.sddm.enable = true; services.displayManager.sddm.wayland.enable = true; services.desktopManager.plasma6.enable = true; + security.pam.services.sddm.enableKwallet = true; environment.plasma6.excludePackages = with pkgs.kdePackages; [ elisa - kate + kate ]; }; } diff --git a/modules/desktop/labwc/default.nix b/modules/hosts/desktop/labwc/default.nix index 9f15641..fd7c062 100644 --- a/modules/desktop/labwc/default.nix +++ b/modules/hosts/desktop/labwc/default.nix @@ -7,6 +7,9 @@ }: let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.labwc; + gruvbox-openbox = pkgs.stdenv.mkDerivation { pname = "gruvbox-openbox"; version = "0-unstable-2024-02-14"; @@ -31,8 +34,8 @@ in ./sfwbar.nix ]; - options.nx.desktop.labwc.enable = lib.mkEnableOption "Enable labwc"; - config = lib.mkIf config.nx.desktop.labwc.enable { + options.nx.desktop.labwc.enable = mkEnableOption "Enable labwc"; + config = mkIf cfg.enable { home-manager.users.${username} = { home.packages = with pkgs; [ labwc-tweaks diff --git a/modules/desktop/labwc/sfwbar.nix b/modules/hosts/desktop/labwc/sfwbar.nix index 62c4982..7021374 100644 --- a/modules/desktop/labwc/sfwbar.nix +++ b/modules/hosts/desktop/labwc/sfwbar.nix @@ -6,12 +6,16 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.sfwbar; +in { - options.nx.desktop.sfwbar.enable = lib.mkEnableOption "Enable sfwbar" // { + options.nx.desktop.sfwbar.enable = mkEnableOption "Enable sfwbar" // { default = config.nx.desktop.labwc.enable; }; - config = lib.mkIf config.nx.desktop.sfwbar.enable { + config = mkIf cfg.enable { home-manager.users.${username} = { home.packages = with pkgs; [ sfwbar diff --git a/modules/desktop/sway/default.nix b/modules/hosts/desktop/sway/default.nix index 7de94a6..c149c21 100644 --- a/modules/desktop/sway/default.nix +++ b/modules/hosts/desktop/sway/default.nix @@ -7,7 +7,9 @@ }: let + inherit (lib) mkEnableOption mkIf mkOptionDefault; mod = config.home-manager.users.${username}.wayland.windowManager.sway.config.modifier; + cfg = config.nx.desktop.sway; in { imports = [ @@ -15,8 +17,8 @@ in ./swaylock.nix ]; - options.nx.desktop.sway.enable = lib.mkEnableOption "Enable sway and setup"; - config = lib.mkIf config.nx.desktop.sway.enable { + options.nx.desktop.sway.enable = mkEnableOption "Enable sway and setup"; + config = mkIf cfg.enable { home-manager.users.${username} = { home.packages = with pkgs; [ wmenu @@ -57,7 +59,7 @@ in modifier = "Mod4"; - keybindings = lib.mkOptionDefault { + keybindings = mkOptionDefault { "${mod}+q" = "kill"; "${mod}+Shift+s" = "exec grimshot savecopy area"; "XF86AudioPlay" = "exec playerctl play-pause"; diff --git a/modules/desktop/sway/swayidle.nix b/modules/hosts/desktop/sway/swayidle.nix index 0708abc..df8dbdc 100644 --- a/modules/desktop/sway/swayidle.nix +++ b/modules/hosts/desktop/sway/swayidle.nix @@ -6,11 +6,15 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.swayidle; +in { - options.nx.desktop.swayidle.enable = lib.mkEnableOption "Enable swayidle configuration" // { + options.nx.desktop.swayidle.enable = mkEnableOption "Enable swayidle configuration" // { default = config.nx.desktop.sway.enable; }; - config = lib.mkIf config.nx.desktop.swayidle.enable { + config = mkIf cfg.enable { home-manager.users."${username}" = { services.swayidle = { enable = true; diff --git a/modules/desktop/sway/swaylock.nix b/modules/hosts/desktop/sway/swaylock.nix index 66e418b..9ba43a1 100644 --- a/modules/desktop/sway/swaylock.nix +++ b/modules/hosts/desktop/sway/swaylock.nix @@ -5,11 +5,15 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.swaylock; +in { - options.nx.desktop.swaylock.enable = lib.mkEnableOption "Enable and setup swaylock" // { + options.nx.desktop.swaylock.enable = mkEnableOption "Enable and setup swaylock" // { default = config.nx.desktop.sway.enable; }; - config = lib.mkIf config.nx.desktop.swaylock.enable { + config = mkIf cfg.enable { home-manager.users."${username}" = { programs.swaylock = { enable = true; diff --git a/modules/desktop/waybar.nix b/modules/hosts/desktop/waybar.nix index 874b50f..23b0f59 100644 --- a/modules/desktop/waybar.nix +++ b/modules/hosts/desktop/waybar.nix @@ -5,9 +5,13 @@ ... }: +let + inherit (lib) mkEnableOption mkIf; + cfg = config.nx.desktop.waybar; +in { - options.nx.desktop.waybar.enable = lib.mkEnableOption "Enable and configure Waybar"; - config = lib.mkIf config.nx.desktop.waybar.enable { + options.nx.desktop.waybar.enable = mkEnableOption "Enable and configure Waybar"; + config = mkIf cfg.enable { home-manager.users."${username}" = { programs.waybar = { enable = true; diff --git a/modules/hosts/openssh/default.nix b/modules/hosts/openssh/default.nix new file mode 100644 index 0000000..49c0527 --- /dev/null +++ b/modules/hosts/openssh/default.nix @@ -0,0 +1,25 @@ +{ + config, + username, + lib, + ... +}: +let + inherit (lib) mkOption types mkIf; + cfg = config.nx.services.openssh; +in +{ + options.nx.services.openssh.enable = mkOption { + description = "Setup openssh server"; + type = types.bool; + default = false; + }; + config = mkIf cfg.enable { + services.openssh = { + enable = true; + settings = { + AllowUsers = [ username ]; + }; + }; + }; +} diff --git a/modules/hosts/printer/default.nix b/modules/hosts/printer/default.nix new file mode 100644 index 0000000..d094c21 --- /dev/null +++ b/modules/hosts/printer/default.nix @@ -0,0 +1,32 @@ +{ + config, + pkgs, + lib, + ... +}: +let + inherit (lib) mkOption types mkIf; + cfg = config.nx.printer; +in +{ + + options.nx.printer = { + enable = mkOption { + description = "Setup printer service"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + services.printing = { + enable = true; + drivers = [ pkgs.brlaser ]; + }; + # printer autodiscovery + services.avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + }; + }; +} diff --git a/modules/hosts/server/default.nix b/modules/hosts/server/default.nix new file mode 100644 index 0000000..ca3ca4f --- /dev/null +++ b/modules/hosts/server/default.nix @@ -0,0 +1,29 @@ +{ + lib, + ... +}: +let + inherit (lib) mkOption types; +in +{ + options.nx.server = { + enable = mkOption { + description = "Set this host as server"; + type = types.bool; + default = false; + }; + timeZone = mkOption { + description = "Time Zone of the server"; + type = types.str; + default = "Europe/Berlin"; + }; + }; + + imports = [ + ./openssh + ./nginx + ./fail2ban + ./nextcloud + ./site + ]; +} diff --git a/modules/hosts/server/fail2ban/default.nix b/modules/hosts/server/fail2ban/default.nix new file mode 100644 index 0000000..09fcdf2 --- /dev/null +++ b/modules/hosts/server/fail2ban/default.nix @@ -0,0 +1,31 @@ +{ + config, + pkgs, + options, + lib, + ... +}: +let + cfg = config.nx.server.fail2ban; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.server.fail2ban = { + enable = mkOption { + description = "Setup fail2ban service"; + type = types.bool; + default = false; + }; + bantime = mkOption { + description = "default bantime"; + type = types.str; + default = "1h"; + }; + }; + config = mkIf cfg.enable { + services.fail2ban = { + enable = true; + bantime = cfg.bantime; + }; + }; +} diff --git a/modules/hosts/server/nextcloud/default.nix b/modules/hosts/server/nextcloud/default.nix new file mode 100644 index 0000000..a527de2 --- /dev/null +++ b/modules/hosts/server/nextcloud/default.nix @@ -0,0 +1,156 @@ +{ + pkgs, + config, + username, + options, + lib, + ... +}: +let + cfg = config.nx.server.nextcloud; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.server.nextcloud = { + enable = mkOption { + description = "Setup nextcloud server"; + type = types.bool; + default = false; + }; + adminUser = mkOption { + description = "Admin user"; + type = types.str; + default = "schererleander"; + }; + adminPassFile = mkOption { + description = "Admin user key file"; + type = types.str; + default = "/etc/nextcloud-admin-pass"; + }; + hostName = mkOption { + description = "Nextcloud hostname"; + type = types.str; + default = "cloud.schererleander.de"; + }; + backup = mkOption { + description = "enable borgbase backups"; + type = types.bool; + default = true; + }; + jail = mkOption { + description = "setup fail2ban jail"; + type = types.bool; + default = config.nx.server.fail2ban.enable; + }; + }; + + config = mkIf cfg.enable { + services.nextcloud = { + enable = true; + package = pkgs.nextcloud32; + hostName = cfg.hostName; + https = true; + database.createLocally = true; + maxUploadSize = "16G"; + config = { + dbtype = "mysql"; + adminuser = cfg.adminUser; + adminpassFile = cfg.adminPassFile; + }; + settings = { + maintenance_window_start = 2; # 02:00 + default_phone_region = "de"; + overwriteProtocol = "https"; + trusted_domains = [ cfg.hostName ]; + logtimezone = config.nx.server.timeZone; + log_type = "file"; + }; + phpOptions."opcache.interned_strings_buffer" = "64"; + }; + + services.nginx.virtualHosts = mkIf ((config.nx.server.nginx or { }).enable or false) { + "${cfg.hostName}" = { + forceSSL = true; + sslCertificate = config.nx.server.nginx.sslCertificate; + sslCertificateKey = config.nx.server.nginx.sslCertificateKey; + }; + }; + + services.borgbackup.jobs.nextcloud = mkIf cfg.backup { + paths = [ + "/var/lib/nextcloud" + "/var/lib/backup/nextcloud/db" + ]; + repo = "h8xn8qvo@h8xn8qvo.repo.borgbase.com:repo"; + encryption.mode = "none"; + environment = { + BORG_RSH = "ssh -i /home/${username}/.ssh/borgbase-nextcloud -o StrictHostKeyChecking=accept-new"; + TMPDIR = "/var/tmp"; + }; + compression = "auto,lzma"; + startAt = "daily"; + readWritePaths = [ + "/var/lib/backup" + "/var/lib/nextcloud" + ]; + preHook = '' + set -euo pipefail + INSTALL="${pkgs.coreutils}/bin/install" + FIND="${pkgs.findutils}/bin/find" + MYSQLDUMP="${pkgs.mariadb.client}/bin/mysql-dump" + GZIP="${pkgs.gzip}/bin/gzip" + OCC="${lib.getExe config.services.nextcloud.occ}" + + # This command requires write access to /var/lib/backup. + $INSTALL -d -m 0750 -o root -g root /var/lib/backup/nextcloud/db + + trap "$OCC maintenance:mode --off >/dev/null 2>&1 || true" EXIT + + $OCC maintenance:mode --on + + # Make a consistent database dump without locking the site. + $MYSQLDUMP --single-transaction --quick --lock-tables=false --databases nextcloud \ + | $GZIP -c > /var/lib/backup/nextcloud/db/nextcloud-$(date +%F-%H%M%S).sql.gz + + # Delete local dump files older than 14 days. + $FIND /var/lib/backup/nextcloud/db -type f -name "*.sql.gz" -mtime +14 -delete || true + ''; + postHook = '' + set -euo pipefail + ${lib.getExe config.services.nextcloud.occ} maintenance:mode --off || true + ''; + }; + + services.fail2ban = mkIf cfg.jail { + jails = { + nextcloud = { + enabled = true; + settings = { + backend = "systemd"; + journalmatch = "SYSLOG_IDENTIFIER=Nextcloud"; + # END modification to work with syslog instead of logile + port = 443; + protocol = "tcp"; + filter = "nextcloud"; + maxretry = 3; + bantime = 86400; + findtime = 43200; + }; + }; + }; + }; + + environment.etc = mkIf cfg.jail { + # Adapted failregex for syslogs + "fail2ban/filter.d/nextcloud.local".text = pkgs.lib.mkDefault ( + pkgs.lib.mkAfter '' + [Definition] + _groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*) + failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed: + ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error. + datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?" + '' + ); + }; + }; +} diff --git a/modules/hosts/server/nginx/default.nix b/modules/hosts/server/nginx/default.nix new file mode 100644 index 0000000..438ab49 --- /dev/null +++ b/modules/hosts/server/nginx/default.nix @@ -0,0 +1,56 @@ +{ + config, + lib, + ... +}: +let + cfg = config.nx.server.nginx; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.server.nginx = { + enable = mkOption { + description = "Setup nginx reverse proxy"; + type = types.bool; + default = true; + }; + hostName = mkOption { + description = "url of server"; + type = types.str; + default = "schererleander.de"; + }; + sslCertificate = mkOption { + description = "ssl certificate to use"; + type = types.nullOr types.str; + default = "/etc/ssl/${cfg.hostName}/fullchain.pem"; + }; + sslCertificateKey = mkOption { + description = "ssl certificate key to use"; + type = types.nullOr types.str; + default = "/etc/ssl/${cfg.hostName}/privkey.key"; + }; + }; + config = mkIf cfg.enable { + services.nginx = { + enable = true; + recommendedGzipSettings = true; + recommendedOptimisation = true; + recommendedProxySettings = true; + recommendedTlsSettings = true; + appendHttpConfig = '' + map $scheme $hsts_header { + https "max-age=31536000; includeSubdomains; preload"; + } + add_header Strict-Transport-Security $hsts_header; + #add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self';" always; + add_header 'Referrer-Policy' 'same-origin'; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + ''; + }; + networking.firewall.allowedTCPPorts = [ + 80 + 443 + ]; + }; +} diff --git a/modules/hosts/server/openssh/default.nix b/modules/hosts/server/openssh/default.nix new file mode 100644 index 0000000..fbb15db --- /dev/null +++ b/modules/hosts/server/openssh/default.nix @@ -0,0 +1,53 @@ +{ + config, + username, + lib, + ... +}: +let + cfg = config.nx.server.openssh; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.server.openssh = { + enable = mkOption { + description = "Setup openssh for server"; + type = types.bool; + default = false; + }; + port = mkOption { + description = "Port for openssh"; + type = types.port; + default = 8693; + }; + }; + + config = mkIf cfg.enable { + services.openssh = { + enable = true; + ports = [ cfg.port ]; + settings = { + PasswordAuthentication = false; + AllowUsers = [ username ]; + X11Forwarding = false; + PermitRootLogin = "yes"; + }; + }; + networking.firewall.allowedTCPPorts = [ cfg.port ]; + + services.fail2ban = { + jails = { + sshd = { + enabled = true; + settings = { + port = 8693; + backend = "systemd"; + maxretry = 4; + findtime = "10m"; + bantime = "1h"; + }; + }; + }; + }; + }; +} diff --git a/modules/hosts/server/site/default.nix b/modules/hosts/server/site/default.nix new file mode 100644 index 0000000..24807d3 --- /dev/null +++ b/modules/hosts/server/site/default.nix @@ -0,0 +1,32 @@ +{ + config, + lib, + inputs, + ... +}: +let + cfg = config.nx.server.site; + inherit (lib) mkOption types mkIf; +in +{ + imports = [ + inputs.site.nixosModules.default + ]; + + options.nx.server.site = { + enable = mkOption { + description = "Setup personal website"; + type = types.bool; + default = false; + }; + }; + + config = mkIf cfg.enable { + services.site = { + enable = true; + domain = "schererleander.de"; + sslCertificate = "/etc/ssl/schererleander.de/fullchain.pem"; + sslCertificateKey = "/etc/ssl/schererleander.de/privkey.key"; + }; + }; +} diff --git a/modules/hosts/system/default.nix b/modules/hosts/system/default.nix new file mode 100644 index 0000000..93452a6 --- /dev/null +++ b/modules/hosts/system/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./localisation.nix + ./network.nix + ./nix-options.nix + ./users.nix + ]; +} diff --git a/modules/system/localisation.nix b/modules/hosts/system/localisation.nix index 229c45f..229c45f 100644 --- a/modules/system/localisation.nix +++ b/modules/hosts/system/localisation.nix diff --git a/modules/system/network.nix b/modules/hosts/system/network.nix index 383480b..383480b 100644 --- a/modules/system/network.nix +++ b/modules/hosts/system/network.nix diff --git a/modules/hosts/system/nix-options.nix b/modules/hosts/system/nix-options.nix new file mode 100644 index 0000000..14d7fb7 --- /dev/null +++ b/modules/hosts/system/nix-options.nix @@ -0,0 +1,18 @@ +{ ... }: + +{ + nix = { + settings = { + experimental-features = [ + "nix-command" + "flakes" + ]; + auto-optimise-store = true; + }; + gc = { + automatic = true; + dates = "daily"; + options = "--delete-older-than 15d"; + }; + }; +} diff --git a/modules/system/users.nix b/modules/hosts/system/users.nix index d42dac3..5ecdfba 100644 --- a/modules/system/users.nix +++ b/modules/hosts/system/users.nix @@ -16,7 +16,7 @@ (lib.mkIf config.networking.networkmanager.enable "networkmanager") ]; shell = pkgs.zsh; - ignoreShellProgramCheck = true; + ignoreShellProgramCheck = true; }; security.sudo.wheelNeedsPassword = false; } diff --git a/modules/hosts/wooting/default.nix b/modules/hosts/wooting/default.nix new file mode 100644 index 0000000..b2b78c0 --- /dev/null +++ b/modules/hosts/wooting/default.nix @@ -0,0 +1,26 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + inherit (lib) mkOption types mkIf; + cfg = config.nx.wooting; +in +{ + options.nx.wooting = { + enable = mkOption { + description = "Setup wootility, udev rules to discover keyboards"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + services.udev.packages = [ pkgs.wooting-udev-rules ]; + environment.systemPackages = with pkgs; [ + wootility + ]; + }; +} diff --git a/modules/programs/anki.nix b/modules/programs/anki.nix deleted file mode 100644 index e63fe01..0000000 --- a/modules/programs/anki.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - config, - pkgs, - lib, - username, - ... -}: - -{ - options.nx.programs.anki.enable = lib.mkEnableOption "Enable anki"; - config = lib.mkIf config.nx.programs.anki.enable { - # Marked as broken - #home-manager.users.${username}.programs.anki = { - #enable = true; - #style = "native"; - #addons = with pkgs.ankiAddons; [ - # anki-connect - # review-heatmap - #]; - #}; - }; -} diff --git a/modules/programs/default.nix b/modules/programs/default.nix deleted file mode 100644 index 5a9c001..0000000 --- a/modules/programs/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ ... }: - -{ - imports = [ - ./anki.nix - ./foot.nix - ./git.nix - ./latex.nix - ./nixcord.nix - ./spicetify.nix - ./typst.nix - ./zathura.nix - ./firefox.nix - ./gh.nix - ./gpg.nix - ./neovim - ./tmux.nix - ./vscode.nix - ./zsh.nix - ./zed.nix - ./obsidian.nix - ./opencode.nix - ./gemini.nix - ./kitty.nix - ]; -} diff --git a/modules/programs/firefox.nix b/modules/programs/firefox.nix deleted file mode 100644 index 28bdfea..0000000 --- a/modules/programs/firefox.nix +++ /dev/null @@ -1,248 +0,0 @@ -{ - config, - username, - lib, - pkgs, - inputs, - ... -}: - -{ - options.nx.programs.firefox.enable = lib.mkEnableOption "Setup firefox"; - config = lib.mkIf config.nx.programs.firefox.enable { - home-manager.users.${username} = { - programs.firefox = { - enable = true; - profiles.default = { - extensions = { - packages = with inputs.firefox-addons.packages.${pkgs.system}; [ - ublock-origin - istilldontcareaboutcookies - sponsorblock - decentraleyes - vimium-c - ]; - - force = true; - - settings."uBlock0@raymondhill.net".settings = { - UserMessaging = { - uiTheme = "dark"; - uiAccentCustom = true; - uiAccentCustom0 = "#2C2C2C"; - cloudStorageEnabled = false; - contextMenuEnabled = false; - }; - # Block annoying login with google banner - userFilters = '' - ||accounts.google.com/gsi/* - ''; - }; - }; - - search.engines = { - nix-packages = { - name = "Nix Packages"; - urls = [ - { - template = "https://search.nixos.org/packages"; - params = [ - { - name = "type"; - value = "packages"; - } - { - name = "query"; - value = "{searchTerms}"; - } - ]; - } - ]; - - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = [ "@np" ]; - }; - - nixos-wiki = { - name = "NixOS Wiki"; - urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ]; - iconMapObj."16" = "https://wiki.nixos.org/favicon.ico"; - definedAliases = [ "@nw" ]; - }; - - startpage = { - name = "Startpage"; - urls = [ - { - template = "https://www.startpage.com/sp/search?query={searchTerms}"; - } - ]; - icon = "https://www.startpage.com/favicon.ico"; - definedAliases = [ "@s" ]; - }; - - bing.metaData.hidden = true; - google.metaData.alias = "@g"; - }; - - search.default = "startpage"; - - settings = { - }; - - userChrome = '' - /* Hide Back, Forward, Reload, Stop, All Tabs, Firefox View buttons */ - #back-button, - #forward-button, - #reload-button, - #stop-button, - #alltabs-button, - #firefox-view-button { - display: none !important; - } - - .titlebar-buttonbox-container { - display: none; - } - - #tabbrowser-tabs { - border-inline: none !important; - } - - /* Transparent background tabs (above url bar) */ - #navigator-toolbox { - -moz-appearance: -moz-vibrant-titlebar !important; - background: rgba(0, 0, 0, 0.8) !important; - } - - /* Transparent background (behind url bar) */ - #nav-bar { - background: none !important; - box-shadow: none !important; - border-top: 0px !important; - } - - .tab-background[selected="true"] { - background-color: #393e43 !important; - background-image: none !important; - } - - .tab-background { - background-color: var(--background) !important; - color: var(--foreground) !important; - box-shadow: none !important;; - } - - .tab-background[selected] { - background-color: rgba(0, 0, 0, 0.30) !important; - color: var(--foreground) !important; - box-shadow: none !important; - } - - /* Needed for transparency in general */ - :root { - --tabpanel-background-color: transparent !important; - --chrome-content-separator-color: transparent !important; - --toolbar-bgcolor: rgba(0, 0, 0, 0.9) !important; - --newtab-background-color: rgba(0, 0, 0, 0.9) !important; - --newtab-background-color-secondary: transparent !important; - --toolbar-field-background-color: rgba(120, 120, 120, 0.10) !important; - } - ''; - userContent = '' - @-moz-document url-prefix("about:"), url("about:home") { - /* Transparent about:settings about:config about:policies */ - :root { - background: rgba(0, 0, 0, 0.0) !important; - } - } - - /* Transparent about:home */ - * { - --newtab-background-color: transparent !important; - --newtab-background-color-secondary: transparent !important; - } - - /* Transparent elements in about:* */ - * { - --in-content-page-background: transparent !important; - --background-color-box: rgba(0, 0, 0, 0.5) !important; - } - ''; - }; - - policies = { - DisableTelemetry = true; - DisableFirefoxStudies = true; - #PasswordManagerEnabled = false; - OfferToSaveLogins = false; - DisablePocket = true; - DisplayBookmarksToolbar = "never"; - NoDefaultBookmarks = true; - - EnableTrackingProtection = { - Value = true; - Locked = true; - Cryptomining = true; - Fingerprinting = true; - }; - - EncryptedMediaExtensions = { - Enabled = true; - Locked = true; - }; - - FirefoxHome = { - Search = true; - TopSites = true; - SponsoredTopSites = false; - Highlights = true; - Pocket = false; - SponsoredPocket = false; - Snippets = false; - Locked = true; - }; - - UserMessaging = { - ExtensionRecommendations = false; - FeatureRecommendations = false; - Locked = true; - MoreFromMozilla = false; - SkipOnboarding = true; - UrlbarInterventions = false; - WhatsNew = false; - }; - - Preferences = { - "toolkit.legacyUserProfileCustomizations.stylesheets" = true; - "browser.toolbars.bookmarks.visibility" = "never"; - - # Disable fullscreen notification - "full-screen-api.warning.timeout" = "0"; - - # Disable annoying translation popup - "browser.translations.automaticallyPopup" = false; - - # Enable all extensions automatically - "extensions.autoDisableScopes" = 0; - - # Hide ctr-tab tab preview menu - "browser.ctrlTab.sortByRecentlyUsed" = false; - - # Hide pip controls - "media.videocontrols.picture-in-picture.video-toggle.enabled" = false; - - # Set homepage - "browser.startup.homepage" = "about:blank"; - "browser.newtab.url" = "about:blank"; - "browser.newtabpage.enabled" = false; - - # transparency - "browser.tabs.allow_transparent_browser" = true; - "gfx.webrender.all" = true; - }; - }; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/foot.nix b/modules/programs/foot.nix deleted file mode 100644 index 866757b..0000000 --- a/modules/programs/foot.nix +++ /dev/null @@ -1,60 +0,0 @@ -{ - config, - username, - lib, - pkgs, - ... -}: - -{ - options.nx.programs.foot.enable = lib.mkEnableOption "Enable foot terminal"; - config = lib.mkIf config.nx.programs.foot.enable { - home-manager.users.${username} = { - home.packages = with pkgs; [ - nerd-fonts.space-mono - ]; - - programs.foot = { - enable = true; - settings = { - main = { - pad = "10x10"; - font = "SpaceMono Nerd Font Mono:size=10"; - line-height = 12; - }; - - cursor = { - style = "underline"; - unfocused-style = "unchanged"; - blink = true; - }; - - colors = { - alpha = 0.9; - # Gruvbox Theme - background = "000000"; - foreground = "ebdbb2"; - - regular0 = "282828"; - regular1 = "cc241d"; - regular2 = "98971a"; - regular3 = "d79921"; - regular4 = "458588"; - regular5 = "b16286"; - regular6 = "689d6a"; - regular7 = "a89984"; - - bright0 = "928374"; - bright1 = "fb4934"; - bright2 = "b8bb26"; - bright3 = "fabd2f"; - bright4 = "83a598"; - bright5 = "d3869b"; - bright6 = "8ec07c"; - bright7 = "ebdbb2"; - }; - }; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/gemini.nix b/modules/programs/gemini.nix deleted file mode 100644 index 70c5260..0000000 --- a/modules/programs/gemini.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - config, - lib, - username, - ... -}: - -{ - options.nx.programs.gemini-cli.enable = lib.mkEnableOption "Install Gemini CLI tool"; - config = lib.mkIf config.nx.programs.gemini-cli.enable { - home-manager.users."${username}".programs.gemini-cli = { - enable = true; - # Cant store credentials due config read-only - #settings = { - # "ui.theme" = "Default"; - # "general.preferredEditor" = "nvim"; - # "general.disableAutoUpdate" = true; - # "privacy.usageStatisticsEnabled" = false; - #}; - }; - }; -} diff --git a/modules/programs/gh.nix b/modules/programs/gh.nix deleted file mode 100644 index 52a34e3..0000000 --- a/modules/programs/gh.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - config, - username, - lib, - ... -}: - -{ - options.nx.programs.gh.enable = lib.mkEnableOption "Setup gh"; - config = lib.mkIf config.nx.programs.gh.enable { - home-manager.users.${username} = { - programs.gh = { - enable = true; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/git.nix b/modules/programs/git.nix deleted file mode 100644 index 52ae045..0000000 --- a/modules/programs/git.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ - config, - username, - lib, - ... -}: - -{ - options.nx.programs.git.enable = lib.mkEnableOption "Enable git" // { - default = true; - }; - config = lib.mkIf config.nx.programs.git.enable { - home-manager.users.${username} = { - programs.git = { - enable = true; - signing = { - key = "A3502B180BC1D41A"; - signByDefault = true; - }; - ignores = [ - "*~" - ".DS_Store" - ]; - settings = { - user.name = "schererleander"; - user.email = "leander@schererleander.de"; - alias = { - st = "status"; - co = "checkout"; - br = "branch"; - }; - pull.rebase = true; - url."git@github.com:".insteadOf = "https://github.com"; - }; - }; - programs.diff-highlight = { - enable = true; - enableGitIntegration = true; - }; - }; - }; -} diff --git a/modules/programs/gpg.nix b/modules/programs/gpg.nix deleted file mode 100644 index 97eedf7..0000000 --- a/modules/programs/gpg.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ - config, - username, - pkgs, - lib, - ... -}: - -let - pinentryPackage = if pkgs.stdenv.isDarwin then pkgs.pinentry_mac else pkgs.pinentry-curses; - pinentryProgram = if pkgs.stdenv.isDarwin then "pinentry-mac" else "pinentry-curses"; -in -{ - options.nx.programs.gpg.enable = lib.mkEnableOption "Setup gpg and agent" // { - default = true; - }; - config = lib.mkIf config.nx.programs.gpg.enable { - home-manager.users.${username} = { - programs.gpg.enable = true; - services.gpg-agent = { - enable = true; - pinentry.package = pinentryPackage; - pinentry.program = pinentryProgram; - }; - }; - }; -} diff --git a/modules/programs/kitty.nix b/modules/programs/kitty.nix deleted file mode 100644 index 619d1db..0000000 --- a/modules/programs/kitty.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - config, - username, - lib, - ... -}: - -{ - options.nx.programs.kitty.enable = lib.mkEnableOption "Enable git"; - config = lib.mkIf config.nx.programs.kitty.enable { - home-manager.users.${username} = { - programs.kitty = { - enable = true; - enableGitIntegration = true; - font = { - name = "monospace"; - size = 11; - }; - settings = { - cursor_shape = "underline"; - cursor_blink_interval = "-1"; - cursor_stop_blinking_after = "15.0"; - - set_opacity = ".3"; - - enable_audio_bell = false; - bell_on_tab = false; - - window_border_width = "0"; - window_margin_width = "4"; - window_padding_width = "5"; - }; - }; - }; - }; -} - diff --git a/modules/programs/latex.nix b/modules/programs/latex.nix deleted file mode 100644 index 5a9f8b4..0000000 --- a/modules/programs/latex.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ - config, - username, - pkgs, - lib, - ... -}: - -{ - options.nx.programs.latex.enable = lib.mkEnableOption "Setup latex"; - config = lib.mkIf config.nx.programs.latex.enable { - home-manager.users.${username} = { - programs.texlive = { - enable = true; - # See https://mynixos.com/search?q=texlivepackages.collection for more collections - # and https://mynixos.com/search?q=texlivepackages for more individual packages. - extraPackages = tpkgs: { inherit (tpkgs) collection-basic collection-latex collection-latexrecommended biblatex; }; - }; - - home.packages = with pkgs; [ - biber - ]; - - programs.pandoc = { - enable = true; - defaults = { - pdf-engine = "pdfetex"; - }; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/neovim/default.nix b/modules/programs/neovim/default.nix deleted file mode 100644 index d850fa7..0000000 --- a/modules/programs/neovim/default.nix +++ /dev/null @@ -1,40 +0,0 @@ -{ - config, - username, - lib, - pkgs, - ... -}: - -{ - options.nx.programs.neovim.enable = lib.mkEnableOption "Setup neovim"; - config = lib.mkIf config.nx.programs.neovim.enable { - home-manager.users.${username} = { - programs.neovim = { - enable = true; - package = pkgs.neovim; - extraConfig = '' - luafile ${./init.lua} - ''; - }; - home.packages = with pkgs; [ - ripgrep - gcc - - # language servers - lua-language-server - nixd - pyright - gopls - java-language-server - typescript-language-server - rust-analyzer - tailwindcss-language-server - - # formatter - nixfmt-rfc-style - luaformatter - ]; - }; - }; -} diff --git a/modules/programs/nixcord.nix b/modules/programs/nixcord.nix deleted file mode 100644 index 191dcfb..0000000 --- a/modules/programs/nixcord.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ - config, - lib, - inputs, - username, - ... -}: - -{ - options.nx.programs.nixcord.enable = lib.mkEnableOption "Enable nixcord and setup"; - config = lib.mkIf config.nx.programs.nixcord.enable { - home-manager.users.${username} = { ... }: { - imports = [ inputs.nixcord.homeModules.nixcord ]; - - programs.nixcord = { - enable = true; - config = { - themeLinks = [ - "https://refact0r.github.io/system24/theme/system24.theme.css" - ]; - frameless = true; - plugins = { - alwaysAnimate.enable = false; - imageLink.enable = true; - imageZoom.enable = true; - translate.enable = true; - }; - }; - }; - }; - }; -} diff --git a/modules/programs/obsidian.nix b/modules/programs/obsidian.nix deleted file mode 100644 index 70aa47d..0000000 --- a/modules/programs/obsidian.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - config, - lib, - username, - ... -}: - -{ - options.nx.programs.obsidian.enable = lib.mkEnableOption "Obsidian note-taking application"; - config = lib.mkIf config.nx.programs.obsidian.enable { - home-manager.users."${username}" = { - programs.obsidian = { - enable = true; - }; - }; - }; -} diff --git a/modules/programs/opencode.nix b/modules/programs/opencode.nix deleted file mode 100644 index 3ceb6fb..0000000 --- a/modules/programs/opencode.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - username, - lib, - ... -}: - -{ - options.nx.programs.opencode.enable = lib.mkEnableOption "Setup opencode"; - config = lib.mkIf config.nx.programs.opencode.enable { - home-manager.users.${username}.programs.opencode = { - enable = true; - settings = { - theme = "system"; - share = "disabled"; - autoupdate = false; - }; - }; - }; -} diff --git a/modules/programs/spicetify.nix b/modules/programs/spicetify.nix deleted file mode 100644 index 0582f72..0000000 --- a/modules/programs/spicetify.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ - config, - lib, - pkgs, - inputs, - username, - ... -}: - -let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.system}; -in -{ - options.nx.programs.spicetify.enable = lib.mkEnableOption "Enable Spicetify integration"; - config = lib.mkIf config.nx.programs.spicetify.enable { - home-manager.users.${username} = { ... }: { - imports = [ inputs.spicetify-nix.homeManagerModules.spicetify ]; - nixpkgs.config.allowUnfree = true; - programs.spicetify = { - enable = true; - enabledSnippets = with spicePkgs.snippets; [ - pointer - sonicDancing - modernScrollbar - nyanCatProgressBar - declutterNowPlayingBar - ]; - - enabledExtensions = with spicePkgs.extensions; [ - keyboardShortcut - ]; - - theme = spicePkgs.themes.sleek; - colorScheme = "Coral"; - }; - }; - }; -} diff --git a/modules/programs/tmux.nix b/modules/programs/tmux.nix deleted file mode 100644 index 41d6e22..0000000 --- a/modules/programs/tmux.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ - config, - username, - lib, - ... -}: - -{ - options.nx.programs.tmux.enable = lib.mkEnableOption "Enable and configure Tmux"; - config = lib.mkIf config.nx.programs.tmux.enable { - home-manager.users.${username} = { - programs.tmux = { - enable = true; - extraConfig = '' - set -g default-terminal "xterm-256color" - - unbind C-b - set-option -g prefix C-a - bind-key C-a send-prefix - bind -n M-Left select-pane -L - bind -n M-Right select-pane -R - bind -n M-Up select-pane -U - bind -n M-Down select-pane -D - - # style - set -g status-position top - set -g status-justify absolute-centre - set -g status-style 'fg=color7 bg=default' - set -g status-right "" - # set -g status-right ' #(cd #{pane_current_path}; git rev-parse --abbrev-ref HEAD)' - # set -g status-right "" - set -g status-left '#S' - set -g status-left-style 'fg=color8' - set -g status-right-length 0 - set -g status-left-length 100 - setw -g window-status-current-style 'fg=colour6 bg=default bold' - setw -g window-status-current-format '#I:#W ' - setw -g window-status-style 'fg=color8' - - set -g mouse on - ''; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/typst.nix b/modules/programs/typst.nix deleted file mode 100644 index 8af406b..0000000 --- a/modules/programs/typst.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - config, - username, - pkgs, - lib, - ... -}: - -{ - options.nx.programs.typst.enable = lib.mkEnableOption "Setup typst"; - config = lib.mkIf config.nx.programs.typst.enable { - home-manager.users.${username} = { - home.packages = with pkgs; [ - typst - typst-fmt - ]; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/vscode.nix b/modules/programs/vscode.nix deleted file mode 100644 index beb347c..0000000 --- a/modules/programs/vscode.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ - config, - username, - lib, - pkgs, - ... -}: - -{ - options.nx.programs.vscode.enable = lib.mkEnableOption "Enable vscode and setup"; - config = lib.mkIf config.nx.programs.vscode.enable { - home-manager.users.${username} = { - programs.vscode = { - enable = true; - mutableExtensionsDir = false; - profiles.default = { - enableUpdateCheck = true; - enableExtensionUpdateCheck = true; - - userSettings = { - "update.mode" = "none"; - "workbench.colorTheme" = "Minimal"; - "editor.fontFamily" = "monospace"; - "editor.tabSize" = 2; - "editor.minimap.enabled" = false; - "terminal.integrated.cursorStyle" = "underline"; - "terminal.integrated.cursorStyleInactive" = "underline"; - "terminal.integrated.fontFamily" = "monospace"; - "terminal.integrated.fontSize" = 13; - "git.autofetch" = true; - "window.controlsStyle" = "custom"; - }; - - extensions = ( - with pkgs.vscode-extensions; - [ - ms-vscode.cmake-tools - ms-azuretools.vscode-docker - github.copilot - ms-python.python - golang.go - rust-lang.rust-analyzer - vscjava.vscode-maven - sumneko.lua - #fwcd.kotlin - bradlc.vscode-tailwindcss - adpyke.codesnap - esbenp.prettier-vscode - ] - ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [ - { - name = "minimalist-dark"; - publisher = "nichabosh"; - version = "1.0.0"; - sha256 = "sha256-lw+Scfada6DycLdRT2Cz+Fd12JucglIrw3uRd2ZhabQ="; - } - ] - ); - }; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/zathura.nix b/modules/programs/zathura.nix deleted file mode 100644 index 35304a4..0000000 --- a/modules/programs/zathura.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ - config, - username, - lib, - ... -}: - -{ - options.nx.programs.zathura.enable = lib.mkEnableOption "Enable zathura and setup"; - config = lib.mkIf config.nx.programs.zathura.enable { - home-manager.users.${username} = { - programs.zathura = { - enable = true; - options = { - recolor-lightcolor = "rgba(0, 0, 0, 0)"; - recolor-darkcolor = "rgba(255, 255, 255, 1)"; - recolor = true; - adjust-open = "width"; - guioptions = "none"; - zoom-center = true; - page-padding = 0; - pages-per-row = 1; - scroll-page-aware = true; - }; - - mappings = { - i = "recolor"; - j = "navigate previous"; - k = "navigate next"; - }; - }; - }; - }; -}
\ No newline at end of file diff --git a/modules/programs/zed.nix b/modules/programs/zed.nix deleted file mode 100644 index 305f5f3..0000000 --- a/modules/programs/zed.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - config, - lib, - username, - ... -}: - -{ - options.nx.programs.zed-editor.enable = lib.mkEnableOption "Enable and setup zed editor"; - config = lib.mkIf config.nx.programs.zed-editor.enable { - home-manager.users."${username}" = { - programs.zed-editor = { - enable = true; - extensions = [ - "nix" - ]; - userSettings = { - telemetry = { - metrics = false; - }; - }; - }; - }; - }; -} diff --git a/modules/programs/zsh.nix b/modules/programs/zsh.nix deleted file mode 100644 index d3fa72e..0000000 --- a/modules/programs/zsh.nix +++ /dev/null @@ -1,79 +0,0 @@ -{ - config, - pkgs, - lib, - username, - ... -}: -{ - options.nx.programs.zsh.enable = lib.mkEnableOption "Configure zsh"; - config = lib.mkIf config.nx.programs.zsh.enable { - home-manager.users.${username} = { - home.packages = with pkgs; [ - zoxide - imagemagick - ]; - programs.zsh = { - enable = true; - enableCompletion = true; - autosuggestion.enable = true; - syntaxHighlighting.enable = true; - initContent = '' - # view man pages with nvim - export MANPAGER="nvim +Man!" - - # Directory completion with trailing slash - zstyle ':completion:*' list-dirs-first true - zstyle ':completion:*' special-dirs true - zstyle ':completion:*' squeeze-slashes true - zstyle ':completion:*' add-space false - - # Case-insensitive completion - zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' - # vim keybindings - bindkey -v - - # imagemagick wrapper function to remove background - remove_bg() { - if [[ $# -lt 2 ]]; then - echo 'Usage: remove_bg <input_file> <fuzz_percentage> [transparent_color] [output_file]' - return 1 - fi - local input_file=$1 - local fuzz=$2 - local transparent_color=$3 - local output_file=$4 - - magick "$input_file" \ - -fuzz $fuzz -transparent "$transparent_color" \ - -alpha on -channel A -blur 0x2 -level 5%,100% +channel \ - "$output_file" - - echo "Saved transparent image to: $output_file" - } - - eval "$(zoxide init zsh)" - ''; - shellAliases = { - ls = "ls --color=auto"; - nixceck = "nix flake check --all-systems"; - }; - zplug = { - enable = true; - plugins = [ - { name = "mafredri/zsh-async"; } - { - name = "sindresorhus/pure"; - tags = [ - "as:theme" - "use:pure.zsh" - ]; - } - { name = "zdharma-continuum/fast-syntax-highlighting"; } - { name = "zsh-users/zsh-autosuggestions"; } - ]; - }; - }; - }; - }; -} diff --git a/modules/services/default.nix b/modules/services/default.nix deleted file mode 100644 index 85a5d80..0000000 --- a/modules/services/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ ... }: - -{ - imports = [ - ./printer.nix - ./polkit.nix - ./pipewire.nix - ./mullvad.nix - ./nextcloud-client.nix - ./wooting.nix - ./openssh.nix - ./keyring.nix - ]; -} diff --git a/modules/services/keyring.nix b/modules/services/keyring.nix deleted file mode 100644 index c08ca1e..0000000 --- a/modules/services/keyring.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - config, - lib, - ... -}: - -{ - options.nx.services.keyring.enable = lib.mkEnableOption "Enable keyring service"; - - config = lib.mkIf config.nx.services.keyring.enable { - security.pam.services.login.enableKwallet = lib.mkIf config.nx.desktop.kde.enable true; - - # default keyring to use - services.gnome.gnome-keyring.enable = lib.mkIf (!config.nx.desktop.kde.enable) true; - }; -} diff --git a/modules/services/mullvad.nix b/modules/services/mullvad.nix deleted file mode 100644 index 0d486be..0000000 --- a/modules/services/mullvad.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -{ - options.nx.services.mullvad.enable = lib.mkEnableOption "Enable and setup mullvad"; - config = lib.mkIf config.nx.services.mullvad.enable { - services.mullvad-vpn = { - enable = true; - package = pkgs.mullvad-vpn; - }; - }; -} diff --git a/modules/services/nextcloud-client.nix b/modules/services/nextcloud-client.nix deleted file mode 100644 index 8bf7b1e..0000000 --- a/modules/services/nextcloud-client.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ - config, - lib, - pkgs, - username, - ... -}: - -{ - options.nx.services.nextcloud-client.enable = - lib.mkEnableOption "Enable and setup nextcloud-client"; - config = lib.mkIf config.nx.services.nextcloud-client.enable { - nx.services.keyring.enable = true; - home-manager.users."${username}" = { - home.packages = with pkgs; [ nextcloud-client ]; - services.nextcloud-client = { - enable = true; - startInBackground = true; - }; - }; - }; -} diff --git a/modules/services/openssh.nix b/modules/services/openssh.nix deleted file mode 100644 index c6a73cb..0000000 --- a/modules/services/openssh.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ - config, - username, - lib, - ... -}: -{ - options.nx.services.openssh.enable = lib.mkEnableOption "Enable openssh service"; - config = lib.mkIf config.nx.services.openssh.enable { - services.openssh = { - enable = true; - settings = { - AllowUsers = [ username ]; - }; - }; - }; -} diff --git a/modules/services/pipewire.nix b/modules/services/pipewire.nix deleted file mode 100644 index 12b1ae2..0000000 --- a/modules/services/pipewire.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - config, - lib, - ... -}: - -{ - options.nx.services.pipewire.enable = lib.mkEnableOption "Enable pipewire for audio"; - config = lib.mkIf config.nx.services.pipewire.enable { - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - wireplumber.enable = true; - }; - }; -} diff --git a/modules/services/polkit.nix b/modules/services/polkit.nix deleted file mode 100644 index abd050f..0000000 --- a/modules/services/polkit.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: -{ - options.nx.services.polkit.enable = lib.mkEnableOption "Enable and setup polkit service"; - config = lib.mkIf config.nx.services.polkit.enable { - environment.systemPackages = with pkgs; [ - polkit - polkit_gnome - ]; - security.polkit.enable = true; - systemd.user.services.polkit-gnome-authentication-agent-1 = { - description = "polkit-gnome-authentication-agent-1"; - wantedBy = [ "graphical-session.target" ]; - wants = [ "graphical-session.target" ]; - after = [ "graphical-session.target" ]; - serviceConfig = { - Type = "simple"; - ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; - Restart = "on-failure"; - RestartSec = 1; - TimeoutStopSec = 10; - }; - }; - }; -} diff --git a/modules/services/printer.nix b/modules/services/printer.nix deleted file mode 100644 index 0f6d82b..0000000 --- a/modules/services/printer.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: -{ - options.nx.services.printer.enable = lib.mkEnableOption "Enable printer service"; - config = lib.mkIf config.nx.services.printer.enable { - services.printing = { - enable = true; - drivers = [ pkgs.brlaser ]; - }; - # printer autodiscovery - services.avahi = { - enable = true; - nssmdns4 = true; - openFirewall = true; - }; - }; -} diff --git a/modules/services/wooting.nix b/modules/services/wooting.nix deleted file mode 100644 index 6cab0b1..0000000 --- a/modules/services/wooting.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: - -{ - options.nx.services.wooting.enable = lib.mkEnableOption "Wootility service"; - config = lib.mkIf config.nx.services.wooting.enable { - services.udev.packages = [ pkgs.wooting-udev-rules ]; - environment.systemPackages = with pkgs; [ - wootility - ]; - }; -} diff --git a/modules/system/default.nix b/modules/system/default.nix deleted file mode 100644 index a3e0fcd..0000000 --- a/modules/system/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ ... }: - -{ - imports = [ - ./localisation.nix - ./network.nix - ./nix-options.nix - ./users.nix - ]; -} diff --git a/modules/system/nix-options.nix b/modules/system/nix-options.nix deleted file mode 100644 index fbbed29..0000000 --- a/modules/system/nix-options.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ ... }: - -{ - nix = { - settings = { - experimental-features = [ - "nix-command" - "flakes" - ]; - auto-optimise-store = true; - }; - gc = { - automatic = true; - dates = "daily"; - options = "--delete-older-than 15d"; - }; - }; -} diff --git a/modules/users/browsers/default.nix b/modules/users/browsers/default.nix new file mode 100644 index 0000000..70a8be5 --- /dev/null +++ b/modules/users/browsers/default.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + imports = [ + ./firefox + ]; +} diff --git a/modules/users/browsers/firefox/default.nix b/modules/users/browsers/firefox/default.nix new file mode 100644 index 0000000..b5212a2 --- /dev/null +++ b/modules/users/browsers/firefox/default.nix @@ -0,0 +1,276 @@ +{ + pkgs, + inputs, + config, + lib, + ... +}: +let + + cfg = config.nx.browsers.firefox; + inherit (lib) + mkOption + types + mkIf + optionalString + optionalAttrs + ; +in +{ + + options.nx.browsers.firefox = { + enable = mkOption { + description = "mozilla firefox"; + type = types.bool; + default = false; + }; + blockGoogle = mkOption { + description = "blocks google banner and other"; + type = types.bool; + default = true; + }; + transparent = mkOption { + description = "make firefox transparent"; + type = types.bool; + default = false; + }; + cleanHome = mkOption { + description = "clean up firefox home"; + type = types.bool; + default = true; + }; + hideRecommendations = mkOption { + description = "hide firefox recommendations"; + type = types.bool; + default = true; + }; + disablePasswordManager = mkOption { + description = "disable built-in browser password manager"; + type = types.bool; + default = true; + }; + }; + + config = mkIf cfg.enable { + programs.firefox = { + enable = true; + profiles.default = { + extensions = { + packages = with inputs.firefox-addons.packages.${pkgs.system}; [ + ublock-origin + istilldontcareaboutcookies + sponsorblock + decentraleyes + vimium-c + ]; + + force = true; + + settings."uBlock0@raymondhill.net".settings = { + UserMessaging = { + uiTheme = "dark"; + uiAccentCustom = true; + uiAccentCustom0 = "#2C2C2C"; + cloudStorageEnabled = false; + contextMenuEnabled = false; + }; + # Block annoying login with google banner + userFilters = optionalString cfg.blockGoogle '' + ||accounts.google.com/gsi/* + ''; + }; + }; + + search = { + default = "DuckDuckGo"; + engines = { + nix-packages = { + name = "Nix Packages"; + urls = [ + { + template = "https://search.nixos.org/packages"; + params = [ + { + name = "type"; + value = "packages"; + } + { + name = "query"; + value = "{searchTerms}"; + } + ]; + } + ]; + + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@np" ]; + }; + + nixos-wiki = { + name = "NixOS Wiki"; + urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ]; + iconMapObj."16" = "https://wiki.nixos.org/favicon.ico"; + definedAliases = [ "@nw" ]; + }; + + bing.metaData.hidden = true; + google.metaData.alias = "@g"; + }; + force = true; + }; + + userChrome = optionalString cfg.transparent '' + /* Hide Back, Forward, Reload, Stop, All Tabs, Firefox View buttons */ + #back-button, + #forward-button, + #reload-button, + #stop-button, + #alltabs-button, + #firefox-view-button { + display: none !important; + } + + .titlebar-buttonbox-container { + display: none; + } + + #tabbrowser-tabs { + border-inline: none !important; + } + + /* Transparent background tabs (above url bar) */ + #navigator-toolbox { + -moz-appearance: -moz-vibrant-titlebar !important; + background: rgba(0, 0, 0, 0.8) !important; + } + + /* Transparent background (behind url bar) */ + #nav-bar { + background: none !important; + box-shadow: none !important; + border-top: 0px !important; + } + + .tab-background[selected="true"] { + background-color: #393e43 !important; + background-image: none !important; + } + + .tab-background { + background-color: var(--background) !important; + color: var(--foreground) !important; + box-shadow: none !important;; + } + + .tab-background[selected] { + background-color: rgba(0, 0, 0, 0.30) !important; + color: var(--foreground) !important; + box-shadow: none !important; + } + + /* Needed for transparency in general */ + :root { + --tabpanel-background-color: transparent !important; + --chrome-content-separator-color: transparent !important; + --toolbar-bgcolor: rgba(0, 0, 0, 0.9) !important; + --newtab-background-color: rgba(0, 0, 0, 0.9) !important; + --newtab-background-color-secondary: transparent !important; + --toolbar-field-background-color: rgba(120, 120, 120, 0.10) !important; + } + ''; + userContent = optionalString cfg.transparent '' + @-moz-document url-prefix("about:"), url("about:home") { + /* Transparent about:settings about:config about:policies */ + :root { + background: rgba(0, 0, 0, 0.0) !important; + } + } + + /* Transparent about:home */ + * { + --newtab-background-color: transparent !important; + --newtab-background-color-secondary: transparent !important; + } + + /* Transparent elements in about:* */ + * { + --in-content-page-background: transparent !important; + --background-color-box: rgba(0, 0, 0, 0.5) !important; + } + ''; + }; + + policies = { + DisableTelemetry = true; + DisableFirefoxStudies = true; + PasswordManagerEnabled = !cfg.disablePasswordManager; + OfferToSaveLogins = !cfg.disablePasswordManager; + DisplayBookmarksToolbar = "never"; + NoDefaultBookmarks = true; + + Homepage = optionalAttrs cfg.cleanHome { + URL = "about:blank"; + Locked = true; + StartPage = "homepage"; + }; + + NewTabPage = !cfg.cleanHome; + + PictureInPicture = { + Enabled = false; + }; + + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + + EncryptedMediaExtensions = { + Enabled = true; + Locked = true; + }; + + FirefoxHome = { + Search = true; + TopSites = true; + SponsoredTopSites = !cfg.cleanHome; + Highlights = true; + Pocket = !cfg.cleanHome; + SponsoredPocket = !cfg.cleanHome; + Locked = true; + }; + + UserMessaging = { + ExtensionRecommendations = !cfg.hideRecommendations; + FeatureRecommendations = !cfg.hideRecommendations; + Locked = true; + MoreFromMozilla = !cfg.hideRecommendations; + SkipOnboarding = true; + UrlbarInterventions = !cfg.hideRecommendations; + }; + + Preferences = { + # Disable fullscreen notification + "full-screen-api.warning.timeout" = "0"; + + # Disable annoying translation popup + "browser.translations.automaticallyPopup" = false; + + # Enable all extensions automatically + "extensions.autoDisableScopes" = 0; + + # Hide ctr-tab tab preview menu + "browser.ctrlTab.sortByRecentlyUsed" = false; + } + // optionalAttrs cfg.transparent { + # transparency + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + "browser.tabs.allow_transparent_browser" = true; + "gfx.webrender.all" = true; + }; + }; + }; + }; +} diff --git a/modules/users/cli/default.nix b/modules/users/cli/default.nix new file mode 100644 index 0000000..98fe1fb --- /dev/null +++ b/modules/users/cli/default.nix @@ -0,0 +1,7 @@ +{ ... }: +{ + imports = [ + ./tmux + ./opencode + ]; +} diff --git a/modules/users/cli/opencode/default.nix b/modules/users/cli/opencode/default.nix new file mode 100644 index 0000000..8c1071d --- /dev/null +++ b/modules/users/cli/opencode/default.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + ... +}: +let + cfg = config.nx.cli.opencode; + inherit (lib) mkOption types mkIf; +in +{ + + options.nx.cli.opencode = { + enable = mkOption { + description = "opencode open source ai coding agent"; + type = types.bool; + default = false; + }; + }; + + config = mkIf cfg.enable { + programs.opencode = { + enable = true; + settings = { + theme = "system"; + share = "disabled"; + autoupdate = false; + }; + }; + }; +} diff --git a/modules/users/cli/tmux/default.nix b/modules/users/cli/tmux/default.nix new file mode 100644 index 0000000..9259c0b --- /dev/null +++ b/modules/users/cli/tmux/default.nix @@ -0,0 +1,55 @@ +{ + config, + pkgs, + lib, + ... +}: +let + inherit (lib) mkOption types mkIf; + cfg = config.nx.tmux; + +in +{ + options.nx.tmux = { + enable = mkOption { + description = "tmux"; + type = types.bool; + default = config.nx.terminal.multiplexer == "tmux"; + }; + }; + config = mkIf cfg.enable { + programs.tmux = { + enable = true; + keyMode = "vi"; + secureSocket = true; + shell = "${pkgs.${config.nx.terminal.defaultShell}}/bin/${config.nx.terminal.defaultShell}"; + terminal = "xterm-256color"; + extraConfig = '' + unbind C-b + set-option -g prefix C-a + bind-key C-a send-prefix + bind -n M-Left select-pane -L + bind -n M-Right select-pane -R + bind -n M-Up select-pane -U + bind -n M-Down select-pane -D + + # style + set -g status-position top + set -g status-justify absolute-centre + set -g status-style 'fg=color7 bg=default' + set -g status-right "" + # set -g status-right ' #(cd #{pane_current_path}; git rev-parse --abbrev-ref HEAD)' + # set -g status-right "" + set -g status-left '#S' + set -g status-left-style 'fg=color8' + set -g status-right-length 0 + set -g status-left-length 100 + setw -g window-status-current-style 'fg=colour6 bg=default bold' + setw -g window-status-current-format '#I:#W ' + setw -g window-status-style 'fg=color8' + + set -g mouse on + ''; + }; + }; +} diff --git a/modules/users/default.nix b/modules/users/default.nix new file mode 100644 index 0000000..06999d5 --- /dev/null +++ b/modules/users/default.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + imports = [ + ./browsers + ./cli + ./editors + ./git + ./gpg + ./media + ./productivity + ./shells + ./terminal + ./zathura + ]; +} diff --git a/modules/users/editors/default.nix b/modules/users/editors/default.nix new file mode 100644 index 0000000..76f3b96 --- /dev/null +++ b/modules/users/editors/default.nix @@ -0,0 +1,8 @@ +{ ... }: +{ + imports = [ + ./neovim + ./vscode + ./zed + ]; +} diff --git a/modules/users/editors/neovim/default.nix b/modules/users/editors/neovim/default.nix new file mode 100644 index 0000000..975fae8 --- /dev/null +++ b/modules/users/editors/neovim/default.nix @@ -0,0 +1,109 @@ +{ + config, + username, + lib, + pkgs, + ... +}: + +let + inherit (lib) + mkOption + types + mkIf + optionals + ; + cfg = config.nx.editors.neovim; +in +{ + options.nx.editors.neovim = { + enable = mkOption { + description = "Neovim editor"; + type = types.bool; + default = true; + }; + + langs = { + python = mkOption { + description = "enable the python integration"; + type = types.bool; + default = false; + }; + go = mkOption { + description = "enable go integration"; + type = types.bool; + default = false; + }; + ts = mkOption { + description = "enable the js/ts integration"; + type = types.bool; + default = false; + }; + java = mkOption { + description = "enable the java integration"; + type = types.bool; + default = false; + }; + nix = mkOption { + description = "enable the nix integration"; + type = types.bool; + default = true; + }; + latex = mkOption { + description = "enable latex integration"; + type = types.bool; + default = false; + }; + }; + }; + + config = mkIf cfg.enable { + programs.neovim = { + defaultEditor = true; + enable = true; + package = pkgs.neovim-unwrapped; + extraPackages = + with pkgs; + [ + tree-sitter + git + ripgrep + fd + gcc + ] + ++ (optionals cfg.langs.ts [ pkgs.nodePackages.typescript-language-server ]) + ++ (optionals cfg.langs.python [ ]) + ++ (optionals cfg.langs.go [ pkgs.gopls ]) + ++ (optionals cfg.langs.java [ pkgs.jdt-language-server ]) + ++ (optionals cfg.langs.nix [ + pkgs.nil + pkgs.nixfmt-rfc-style + ]) + ++ (optionals cfg.langs.latex [ pkgs.texlab ]); + + plugins = with pkgs.vimPlugins; [ + gruvbox-nvim + mini-starter + gitsigns-nvim + nvim-autopairs + telescope-nvim + fidget-nvim + plenary-nvim + nvim-treesitter.withAllGrammars + nvim-lspconfig + nvim-cmp + cmp-nvim-lsp + cmp-buffer + cmp-path + cmp-cmdline + luasnip + cmp_luasnip + lspkind-nvim + ]; + + extraConfig = '' + luafile ${./init.lua} + ''; + }; + }; +} diff --git a/modules/programs/neovim/init.lua b/modules/users/editors/neovim/init.lua index 79c49a5..1d2bdbb 100644 --- a/modules/programs/neovim/init.lua +++ b/modules/users/editors/neovim/init.lua @@ -20,32 +20,53 @@ map('n', '<leader>o', '<CMD>update<BAR>source %<CR>', { desc = 'Save & reload in map('n', '<leader>w', '<CMD>write<CR>') map('n', '<leader>q', '<CMD>quit<CR>') -vim.pack.add({ - { src = "https://github.com/ellisonleao/gruvbox.nvim" }, - { src = "https://github.com/echasnovski/mini.starter" }, - { src = "https://github.com/lewis6991/gitsigns.nvim" }, - { src = "https://github.com/windwp/nvim-autopairs" }, - { src = "https://github.com/nvim-telescope/telescope.nvim" }, - { src = "https://github.com/j-hui/fidget.nvim" }, - { src = "https://github.com/nvim-lua/plenary.nvim" }, - { src = "https://github.com/nvim-treesitter/nvim-treesitter" }, - { src = "https://github.com/neovim/nvim-lspconfig" }, - { src = "https://github.com/hrsh7th/nvim-cmp" }, - { src = "https://github.com/hrsh7th/cmp-nvim-lsp" }, - { src = "https://github.com/hrsh7th/cmp-buffer" }, - { src = "https://github.com/hrsh7th/cmp-path" }, - { src = "https://github.com/hrsh7th/cmp-cmdline" }, - { src = "https://github.com/L3MON4D3/LuaSnip" }, - { src = "https://github.com/saadparwaiz1/cmp_luasnip" }, - { src = "https://github.com/onsails/lspkind-nvim" } -}) -require("nvim-treesitter.configs").setup({ - ensure_installed = { "lua", "nix" }, - highlight = { enable = true }, +require("mini.starter").setup({ + header = table.concat({ + " /l、 ", + "(゚、 。 7 ", + " l ~ ヽ ", + " じしf_,)ノ ", + }, "\n"), + footer = "", + content_hooks = { + require("mini.starter").gen_hook.adding_bullet("» "), + require("mini.starter").gen_hook.aligning("center", "center"), + }, }) +require("gitsigns").setup() +require("nvim-autopairs").setup() +require("fidget").setup() + +vim.cmd("colorscheme gruvbox") + +local hl = vim.api.nvim_set_hl +hl(0, 'Normal', { bg = 'none' }) +hl(0, 'NormalFloat', { bg = 'none' }) +hl(0, 'NormalNC', { bg = 'none' }) +hl(0, 'StatusLine', { bg = 'none' }) +hl(0, 'SignColumn', { bg = 'none' }) +hl(0, "DiagnosticError", { bg = "none" }) +hl(0, "DiagnosticSignError", { bg = "none" }) +hl(0, "DiagnosticSignHint", { bg = "none" }) +hl(0, "DiagnosticSignInfo", { bg = "none" }) +hl(0, "DiagnosticSignWarn", { bg = "none" }) + +hl(0, "Pmenu", { bg = "none" }) +hl(0, "PmenuSel", { bg = "none" }) +hl(0, "FloatBorder", { bg = "none" }) + +local status_ok, configs = pcall(require, "nvim-treesitter.configs") +if status_ok then + configs.setup({ + highlight = { enable = true }, + indent = { enable = true }, + }) +end + local builtin = require('telescope.builtin') +local map = vim.keymap.set map('n', '<leader>ff', builtin.find_files, { desc = 'Telescope find files' }) map('n', '<leader>fg', builtin.live_grep, { desc = 'Telescope live grep' }) map('n', '<leader>fb', builtin.buffers, { desc = 'Telescope buffers' }) @@ -155,51 +176,15 @@ local servers = { ts_ls = {}, } -local server_names = {} + +local lspconfig = require('lspconfig') for server, config in pairs(servers) do config.capabilities = capabilities - vim.lsp.config(server, config) - table.insert(server_names, server) + lspconfig[server].setup(config) end -vim.lsp.enable(server_names) - vim.diagnostic.config({ virtual_text = { source = "if_many" }, underline = true, severity_sort = true, }) - - -require("mini.starter").setup({ - header = table.concat({ - " /l、 ", - "(゚、 。 7 ", - " l ~ ヽ ", - " じしf_,)ノ ", - }, "\n"), - footer = "", - content_hooks = { - require("mini.starter").gen_hook.adding_bullet("» "), - require("mini.starter").gen_hook.aligning("center", "center"), - }, -}) - - -require("gitsigns").setup() -require("nvim-autopairs").setup() -require("fidget").setup() - -vim.cmd("colorscheme gruvbox") - -local hl = vim.api.nvim_set_hl -hl(0, 'Normal', { bg = 'none' }) -hl(0, 'NormalFloat', { bg = 'none' }) -hl(0, 'NormalNC', { bg = 'none' }) -hl(0, 'StatusLine', { bg = 'none' }) -hl(0, 'SignColumn', { bg = 'none' }) -hl(0, "DiagnosticError", { bg = "none" }) -hl(0, "DiagnosticSignError", { bg = "none" }) -hl(0, "DiagnosticSignHint", { bg = "none" }) -hl(0, "DiagnosticSignInfo", { bg = "none" }) -hl(0, "DiagnosticSignWarn", { bg = "none" }) diff --git a/modules/users/editors/vscode/default.nix b/modules/users/editors/vscode/default.nix new file mode 100644 index 0000000..fe2c444 --- /dev/null +++ b/modules/users/editors/vscode/default.nix @@ -0,0 +1,142 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + inherit (lib) + mkOption + types + mkIf + optionals + ; + cfg = config.nx.editors.vscode; +in +{ + options.nx.editors.vscode = { + enable = mkOption { + description = "vscode editor"; + type = types.bool; + default = false; + }; + + useVSCodium = mkOption { + description = "Use vscodium instead of vscode"; + type = types.bool; + default = false; + }; + + theme = mkOption { + description = "Theme to use for vscode"; + type = types.enum [ + "minimal" + "dark" + "light" + ]; + default = "minimal"; + }; + + langs = { + cmake = mkOption { + description = "enable cmake integration"; + type = types.bool; + default = false; + }; + docker = mkOption { + description = "enable docker integration"; + type = types.bool; + default = false; + }; + python = mkOption { + description = "enable python integration"; + type = types.bool; + default = false; + }; + go = mkOption { + description = "enable go integration"; + type = types.bool; + default = false; + }; + rust = mkOption { + description = "enable rust integration"; + type = types.bool; + default = false; + }; + java = mkOption { + description = "enable java integration"; + type = types.bool; + default = false; + }; + lua = mkOption { + description = "enable lua integration"; + type = types.bool; + default = false; + }; + tailwindcss = mkOption { + description = "enable tailwindcss integration"; + type = types.bool; + default = false; + }; + }; + }; + + config = mkIf cfg.enable { + programs.vscode = { + enable = true; + package = if cfg.useVSCodium then pkgs.vscodium else pkgs.vscode; + mutableExtensionsDir = false; + profiles.default = { + enableUpdateCheck = true; + enableExtensionUpdateCheck = true; + + userSettings = { + "update.mode" = "none"; + "workbench.colorTheme" = + if cfg.theme == "minimal" then + "Minimal" + else if cfg.theme == "dark" then + "Default Dark Modern" + else + "Default Light Modern"; + "editor.fontFamily" = "monospace"; + "editor.tabSize" = 2; + "editor.minimap.enabled" = false; + "terminal.integrated.cursorStyle" = "underline"; + "terminal.integrated.cursorStyleInactive" = "underline"; + "terminal.integrated.fontFamily" = "monospace"; + "terminal.integrated.fontSize" = 13; + "git.autofetch" = true; + "window.controlsStyle" = "custom"; + }; + + extensions = + with pkgs.vscode-extensions; + [ + github.copilot + adpyke.codesnap + esbenp.prettier-vscode + ] + ++ (optionals cfg.langs.cmake [ ms-vscode.cmake-tools ]) + ++ (optionals cfg.langs.docker [ ms-azuretools.vscode-docker ]) + ++ (optionals cfg.langs.python [ ms-python.python ]) + ++ (optionals cfg.langs.go [ golang.go ]) + ++ (optionals cfg.langs.rust [ rust-lang.rust-analyzer ]) + ++ (optionals cfg.langs.java [ vscjava.vscode-maven ]) + ++ (optionals cfg.langs.lua [ sumneko.lua ]) + ++ (optionals cfg.langs.tailwindcss [ bradlc.vscode-tailwindcss ]) + ++ (optionals (cfg.theme == "minimal") ( + pkgs.vscode-utils.extensionsFromVscodeMarketplace [ + { + name = "minimalist-dark"; + publisher = "nichabosh"; + version = "1.0.0"; + sha256 = "sha256-lw+Scfada6DycLdRT2Cz+Fd12JucglIrw3uRd2ZhabQ="; + } + ] + )); + }; + }; + }; +} diff --git a/modules/users/editors/zed/default.nix b/modules/users/editors/zed/default.nix new file mode 100644 index 0000000..5ff0714 --- /dev/null +++ b/modules/users/editors/zed/default.nix @@ -0,0 +1,94 @@ +{ + config, + lib, + ... +}: + +let + inherit (lib) + mkOption + types + mkIf + optionals + ; + cfg = config.nx.editors.zed-editor; +in +{ + options.nx.editors.zed-editor = { + enable = mkOption { + description = "Enable and setup zed editor"; + type = types.bool; + default = false; + }; + + langs = { + nix = mkOption { + description = "enable nix integration"; + type = types.bool; + default = true; + }; + python = mkOption { + description = "enable python integration"; + type = types.bool; + default = false; + }; + rust = mkOption { + description = "enable rust integration"; + type = types.bool; + default = false; + }; + go = mkOption { + description = "enable go integration"; + type = types.bool; + default = false; + }; + lua = mkOption { + description = "enable lua integration"; + type = types.bool; + default = false; + }; + docker = mkOption { + description = "enable docker integration"; + type = types.bool; + default = false; + }; + java = mkOption { + description = "enable java integration"; + type = types.bool; + default = false; + }; + cmake = mkOption { + description = "enable cmake integration"; + type = types.bool; + default = false; + }; + toml = mkOption { + description = "enable toml integration"; + type = types.bool; + default = false; + }; + }; + }; + + config = mkIf cfg.enable { + programs.zed-editor = { + enable = true; + extensions = + [ ] + ++ (optionals cfg.langs.nix [ "nix" ]) + ++ (optionals cfg.langs.python [ "python" ]) + ++ (optionals cfg.langs.rust [ "rust" ]) + ++ (optionals cfg.langs.go [ "go" ]) + ++ (optionals cfg.langs.lua [ "lua" ]) + ++ (optionals cfg.langs.docker [ "dockerfile" ]) + ++ (optionals cfg.langs.java [ "java" ]) + ++ (optionals cfg.langs.cmake [ "cmake" ]) + ++ (optionals cfg.langs.toml [ "toml" ]); + userSettings = { + telemetry = { + metrics = false; + }; + }; + }; + }; +} diff --git a/modules/users/git/default.nix b/modules/users/git/default.nix new file mode 100644 index 0000000..f1f555e --- /dev/null +++ b/modules/users/git/default.nix @@ -0,0 +1,81 @@ +{ + config, + lib, + ... +}: +let + cfg = config.nx.git; + inherit (lib) mkOption mkIf types; +in +{ + options.nx.git = { + enable = mkOption { + description = "Enable git"; + type = types.bool; + default = false; + }; + + userName = mkOption { + description = "Git username"; + type = types.str; + default = "Leander Scherer"; + }; + + userEmail = mkOption { + description = "Git email"; + type = types.str; + default = "leander@schererleander.de"; + }; + + signKey = mkOption { + description = "Sign key"; + type = types.nullOr types.str; + default = "A3502B180BC1D41A"; + }; + + signFlavor = mkOption { + description = "Sign key flavor"; + type = types.enum [ + "ssh" + "openpgp" + ]; + default = "openpgp"; + }; + }; + + config = mkIf cfg.enable { + programs.git = { + enable = true; + + signing = mkIf (cfg.signKey != null) { + key = cfg.signKey; + signByDefault = true; + }; + + ignores = [ + "*~" + ".DS_Store" + ".direnv" + ".envrc" + ]; + + settings = { + user.name = cfg.userName; + user.email = cfg.userEmail; + help.autocorrect = 20; + alias = { + st = "status"; + co = "checkout"; + br = "branch"; + }; + pull.rebase = true; + gpg.format = cfg.signFlavor; + url."git@github.com:".insteadOf = "https://github.com"; + }; + }; + programs.diff-highlight = { + enable = true; + enableGitIntegration = true; + }; + }; +} diff --git a/modules/users/gpg/default.nix b/modules/users/gpg/default.nix new file mode 100644 index 0000000..d5714b0 --- /dev/null +++ b/modules/users/gpg/default.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + inherit (lib) + mkOption + types + mkIf + ; + cfg = config.nx.gpg; +in +{ + + options.nx.gpg = { + enable = mkOption { + description = "GNU Privacy Guard"; + type = types.bool; + default = config.nx.git.enable; + }; + + gpgKey = mkOption { + description = "default gpg key"; + type = types.nullOr types.str; + default = ""; + }; + + pinentry = mkOption { + description = "pinentry flavor"; + type = types.enum [ + "curses" + "gnome3" + "qt" + "mac" + ]; + default = if pkgs.stdenv.isDarwin then "mac" else "curses"; + }; + }; + + config = lib.mkIf cfg.enable { + programs.gpg = { + enable = true; + #settings.default-key = mkIf (cfg.gpgKey != null) cfg.gpgKey; + }; + + services.gpg-agent = { + enable = true; + pinentry.package = + if cfg.pinentry == "gnome3" then + pkgs.pinentry-gnome3 + else if cfg.pinentry == "qt" then + pkgs.pinentry-qt + else if cfg.pinentry == "mac" then + pkgs.pinentry_mac + else + pkgs.pinentry-curses; + }; + }; +} diff --git a/modules/users/media/default.nix b/modules/users/media/default.nix new file mode 100644 index 0000000..89daaba --- /dev/null +++ b/modules/users/media/default.nix @@ -0,0 +1,7 @@ +{ ... }: +{ + imports = [ + ./nixcord + ./spicetify + ]; +} diff --git a/modules/users/media/nixcord/default.nix b/modules/users/media/nixcord/default.nix new file mode 100644 index 0000000..329fa18 --- /dev/null +++ b/modules/users/media/nixcord/default.nix @@ -0,0 +1,42 @@ +{ + config, + lib, + inputs, + ... +}: +let + cfg = config.nx.media.nixcord; + inherit (lib) mkOption types mkIf; +in +{ + imports = [ inputs.nixcord.homeModules.nixcord ]; + options.nx.media.nixcord = { + enable = lib.mkOption { + description = "Enable nixcord and setup"; + type = types.bool; + default = false; + }; + frameless = mkOption { + description = "Make discord frameless"; + type = types.bool; + default = true; + }; + }; + config = mkIf cfg.enable { + programs.nixcord = { + enable = true; + config = { + themeLinks = [ + "https://refact0r.github.io/system24/theme/system24.theme.css" + ]; + frameless = cfg.frameless; + plugins = { + alwaysAnimate.enable = false; + imageLink.enable = true; + imageZoom.enable = true; + translate.enable = true; + }; + }; + }; + }; +} diff --git a/modules/users/media/spicetify/default.nix b/modules/users/media/spicetify/default.nix new file mode 100644 index 0000000..239f80f --- /dev/null +++ b/modules/users/media/spicetify/default.nix @@ -0,0 +1,45 @@ +{ + config, + lib, + pkgs, + inputs, + ... +}: + +let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.system}; + cfg = config.nx.media.spicetify; + inherit (lib) mkOption types mkIf; +in +{ + imports = [ inputs.spicetify-nix.homeManagerModules.spicetify ]; + + options.nx.media.spicetify = { + enable = mkOption { + description = "Command-line tool to customize the official Spotify client"; + type = types.bool; + default = false; + }; + }; + + config = mkIf cfg.enable { + nixpkgs.config.allowUnfree = true; + programs.spicetify = { + enable = true; + enabledSnippets = with spicePkgs.snippets; [ + pointer + sonicDancing + modernScrollbar + nyanCatProgressBar + declutterNowPlayingBar + ]; + + enabledExtensions = with spicePkgs.extensions; [ + keyboardShortcut + ]; + + theme = spicePkgs.themes.sleek; + colorScheme = "Coral"; + }; + }; +} diff --git a/modules/users/productivity/anki/default.nix b/modules/users/productivity/anki/default.nix new file mode 100644 index 0000000..efe4ab5 --- /dev/null +++ b/modules/users/productivity/anki/default.nix @@ -0,0 +1,30 @@ +{ + config, + options, + lib, + ... +}: +let + cfg = config.nx.productivity.anki; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.productivity.anki = { + enable = mkOption { + description = "Anki free and open-source flashcard program"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + # Marked as broken + #home-manager.users.${username}.programs.anki = { + #enable = true; + #style = "native"; + #addons = with pkgs.ankiAddons; [ + # anki-connect + # review-heatmap + #]; + #}; + }; +} diff --git a/modules/users/productivity/default.nix b/modules/users/productivity/default.nix new file mode 100644 index 0000000..9e05dde --- /dev/null +++ b/modules/users/productivity/default.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + imports = [ + ./anki + ./latex + ./obsidian + ./typst + ./nextcloud-client + ]; +} diff --git a/modules/users/productivity/latex/default.nix b/modules/users/productivity/latex/default.nix new file mode 100644 index 0000000..0720664 --- /dev/null +++ b/modules/users/productivity/latex/default.nix @@ -0,0 +1,47 @@ +{ + config, + options, + pkgs, + lib, + ... +}: +let + cfg = config.nx.productivity.latex; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.productivity.latex = { + enable = mkOption { + description = "LaTeX typesetting system"; + type = types.bool; + default = false; + }; + }; + + config = mkIf cfg.enable { + programs.texlive = { + enable = true; + # See https://mynixos.com/search?q=texlivepackages.collection for more collections + # and https://mynixos.com/search?q=texlivepackages for more individual packages. + extraPackages = tpkgs: { + inherit (tpkgs) + collection-basic + collection-latex + collection-latexrecommended + biblatex + ; + }; + }; + + home.packages = with pkgs; [ + biber + ]; + + programs.pandoc = { + enable = true; + defaults = { + pdf-engine = "pdfetex"; + }; + }; + }; +} diff --git a/modules/users/productivity/nextcloud-client/default.nix b/modules/users/productivity/nextcloud-client/default.nix new file mode 100644 index 0000000..1b92bb0 --- /dev/null +++ b/modules/users/productivity/nextcloud-client/default.nix @@ -0,0 +1,28 @@ +{ + config, + lib, + pkgs, + username, + ... +}: + +let + inherit (lib) mkOption types mkIf; + cfg = config.nx.productivity.nextcloud-client; +in +{ + options.nx.productivity.nextcloud-client = { + enable = mkOption { + description = "Client for nextcloud"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + #home.packages = with pkgs; [ nextcloud-client ]; + services.nextcloud-client = { + enable = true; + startInBackground = true; + }; + }; +} diff --git a/modules/users/productivity/obsidian/default.nix b/modules/users/productivity/obsidian/default.nix new file mode 100644 index 0000000..21b3f34 --- /dev/null +++ b/modules/users/productivity/obsidian/default.nix @@ -0,0 +1,23 @@ +{ + config, + lib, + ... +}: +let + cfg = config.nx.productivity.obsidian; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.productivity.obsidian = { + enable = mkOption { + description = "Obsidian note-taking application"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + programs.obsidian = { + enable = true; + }; + }; +} diff --git a/modules/users/productivity/typst/default.nix b/modules/users/productivity/typst/default.nix new file mode 100644 index 0000000..f3e1981 --- /dev/null +++ b/modules/users/productivity/typst/default.nix @@ -0,0 +1,25 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.nx.productivity.typst; + inherit (lib) mkOption types mkIf; +in +{ + options.nx.productivity.typst = { + enable = mkOption { + description = "Typst markup-based typesetting system"; + type = types.bool; + default = false; + }; + }; + config = mkIf cfg.enable { + home.packages = with pkgs; [ + typst + typst-fmt + ]; + }; +} diff --git a/modules/users/shells/default.nix b/modules/users/shells/default.nix new file mode 100644 index 0000000..c3f96c7 --- /dev/null +++ b/modules/users/shells/default.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + imports = [ + ./zsh + ]; +} diff --git a/modules/users/shells/zsh/default.nix b/modules/users/shells/zsh/default.nix new file mode 100644 index 0000000..5a48cf0 --- /dev/null +++ b/modules/users/shells/zsh/default.nix @@ -0,0 +1,66 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + inherit (lib) mkOption mkIf types; + cfg = config.nx.shells.zsh; +in +{ + options.nx.shells.zsh = { + enable = mkOption { + type = types.bool; + default = config.nx.terminal.defaultShell == "zsh"; + }; + }; + + config = mkIf cfg.enable { + home.packages = with pkgs; [ + zoxide + ]; + + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + initContent = '' + # view man pages with nvim + export MANPAGER="nvim +Man!" + + # Directory completion with trailing slash + zstyle ':completion:*' list-dirs-first true + zstyle ':completion:*' special-dirs true + zstyle ':completion:*' squeeze-slashes true + zstyle ':completion:*' add-space false + + # Case-insensitive completion + zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' + # vim keybindings + bindkey -v + ''; + shellAliases = { + ls = "ls --color=auto"; + }; + + zplug = { + enable = true; + plugins = [ + { name = "mafredri/zsh-async"; } + { + name = "sindresorhus/pure"; + tags = [ + "as:theme" + "use:pure.zsh" + ]; + } + { name = "zdharma-continuum/fast-syntax-highlighting"; } + { name = "zsh-users/zsh-autosuggestions"; } + ]; + }; + }; + }; +} diff --git a/modules/users/terminal/default.nix b/modules/users/terminal/default.nix new file mode 100644 index 0000000..4a9b254 --- /dev/null +++ b/modules/users/terminal/default.nix @@ -0,0 +1,36 @@ +{ + pkgs, + config, + lib, + ... +}: +let + inherit (lib) mkOption types; + cfg = config.nx.terminal; +in +{ + imports = [ + ./foot.nix + ./kitty.nix + ]; + options.nx.terminal = { + font = mkOption { + description = "default font"; + default = "Victor Mono"; + }; + + multiplexer = mkOption { + type = types.enum [ "tmux" ]; + default = "tmux"; + }; + + defaultShell = mkOption { + description = "default shell"; + type = types.enum [ + "bash" + "zsh" + ]; + default = "zsh"; + }; + }; +} diff --git a/modules/users/terminal/foot.nix b/modules/users/terminal/foot.nix new file mode 100644 index 0000000..fbaba8f --- /dev/null +++ b/modules/users/terminal/foot.nix @@ -0,0 +1,57 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + options.nx.terminal.foot.enable = lib.mkEnableOption "Enable foot terminal"; + config = lib.mkIf config.nx.terminal.foot.enable { + home.packages = with pkgs; [ + nerd-fonts.space-mono + ]; + + programs.foot = { + enable = true; + settings = { + main = { + pad = "10x10"; + font = "SpaceMono Nerd Font Mono:size=10"; + line-height = 12; + }; + + cursor = { + style = "underline"; + unfocused-style = "unchanged"; + blink = true; + }; + + colors = { + alpha = 0.9; + # Gruvbox Theme + background = "000000"; + foreground = "ebdbb2"; + + regular0 = "282828"; + regular1 = "cc241d"; + regular2 = "98971a"; + regular3 = "d79921"; + regular4 = "458588"; + regular5 = "b16286"; + regular6 = "689d6a"; + regular7 = "a89984"; + + bright0 = "928374"; + bright1 = "fb4934"; + bright2 = "b8bb26"; + bright3 = "fabd2f"; + bright4 = "83a598"; + bright5 = "d3869b"; + bright6 = "8ec07c"; + bright7 = "ebdbb2"; + }; + }; + }; + }; +} diff --git a/modules/users/terminal/kitty.nix b/modules/users/terminal/kitty.nix new file mode 100644 index 0000000..02789cd --- /dev/null +++ b/modules/users/terminal/kitty.nix @@ -0,0 +1,33 @@ +{ + config, + lib, + ... +}: + +{ + options.nx.programs.kitty.enable = lib.mkEnableOption "Enable kitty"; + config = lib.mkIf config.nx.programs.kitty.enable { + programs.kitty = { + enable = true; + shellIntegration.enableFishIntegration = true; + font = { + name = "monospace"; + size = 11; + }; + settings = { + cursor_shape = "underline"; + cursor_blink_interval = "-1"; + cursor_stop_blinking_after = "15.0"; + + background_opacity = "0.3"; + + enable_audio_bell = false; + bell_on_tab = false; + + window_border_width = "0"; + window_margin_width = "4"; + window_padding_width = "5"; + }; + }; + }; +} diff --git a/modules/users/zathura/default.nix b/modules/users/zathura/default.nix new file mode 100644 index 0000000..f07707c --- /dev/null +++ b/modules/users/zathura/default.nix @@ -0,0 +1,41 @@ +{ + config, + lib, + ... +}: +let + cfg = config.nx.programs.zathura; + inherit (lib) mkOption mkIf types; +in +{ + options.nx.programs.zathura = { + enable = mkOption { + default = false; + description = "zathura document viewer"; + type = types.bool; + }; + }; + + config = mkIf cfg.enable { + programs.zathura = { + enable = true; + options = { + recolor-lightcolor = "rgba(0, 0, 0, 0)"; + recolor-darkcolor = "rgba(255, 255, 255, 1)"; + recolor = true; + adjust-open = "width"; + guioptions = "none"; + zoom-center = true; + page-padding = 0; + pages-per-row = 1; + scroll-page-aware = true; + }; + + mappings = { + i = "recolor"; + j = "navigate previous"; + k = "navigate next"; + }; + }; + }; +} |
