diff --git a/flake.nix b/flake.nix index fa87496..92b02d1 100644 --- a/flake.nix +++ b/flake.nix @@ -30,6 +30,8 @@ }; FCS-Tristan-Nixbook = mkConf "work" { inherit pkgs nixpkgs system user home-manager hyprland; + laptop = true; + work = true; }; }; }; diff --git a/lib/mkconf.nix b/lib/mkconf.nix index 05d17ed..834c359 100644 --- a/lib/mkconf.nix +++ b/lib/mkconf.nix @@ -1,4 +1,14 @@ -name: { nixpkgs, home-manager, system, user, hyprland, ... }: +name: +{ nixpkgs +, home-manager +, system +, user +, hyprland +, laptop ? false +, work ? false +, displays ? [] +, ... +}: nixpkgs.lib.nixosSystem rec { inherit system; @@ -11,10 +21,29 @@ nixpkgs.lib.nixosSystem rec { trusted-public-keys = [ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ]; }; } + home-manager.nixosModules.home-manager + { + imports = [ + (import ./modules/scripts.nix { inherit user; }) + (import ./modules/editor.nix { inherit user; }) + (import ./modules/keyboard.nix { inherit user; }) + (import ./modules/display.nix { inherit user; }) + (import ./modules/work.nix { inherit user; }) + ]; + keyboard.dvorak.enable = laptop; + displays = if laptop then { + enable = true; + displays = [{ + name = "eDP-1"; + scaling = 1.2; + }]; + } + else displays; + roles.work.enable = work; + } ../system/global/system.nix ../system/${name}/system.nix ../system/${name}/hardware.nix - home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; diff --git a/lib/modules/display.nix b/lib/modules/display.nix new file mode 100644 index 0000000..ad6106b --- /dev/null +++ b/lib/modules/display.nix @@ -0,0 +1,82 @@ +{ user }: { lib, pkgs, config, ... }: +with lib; +let + cfg = config.displays; + + renderDisplaysForHyprland = displays: + "# === DISPLAY MODULE ===\n" + + concatStringsSep "\n" (map displayHyprlandSetting displays); + + displayHyprlandSetting = display: + "monitor = " + display.name + + ", " + resToString display.resolution + + ", " + display.position + + ", " + toString display.scaling; + + resolutionType = types.submodule ({ x, y, freq, ... }: + { + options = { + x = mkOption { + description = "x"; + type = types.int; + default = 0; + }; + y = mkOption { + description = "y"; + type = types.int; + default = 0; + }; + freq = mkOption { + description = "frequency"; + type = types.int; + default = 0; + }; + }; + }); + displayType = types.submodule + ({ ... }: { + options = { + name = mkOption { + description = "name of the display"; + }; + scaling = mkOption { + type = types.float; + default = 1.0; + }; + resolution = mkOption { + description = "res"; + type = resolutionType; + default = { }; + }; + position = mkOption { + description = "XxY"; + default = "auto"; + }; + }; + }); + + resToString = res: + if res.x == 0 || res.y == 0 || res.freq == 0 + then "preferred" + else "${toString res.x}x${toString res.y}@${toString res.freq}"; +in +{ + options.displays = + { + enable = mkEnableOption "manage displays"; + displays = mkOption { + type = types.listOf displayType; + default = [ ]; + }; + }; + + config = mkIf cfg.enable { + home-manager.users.${user}.imports = [ + { + wayland.windowManager.hyprland.extraConfig = mkIf (cfg.displays != [ ]) + (renderDisplaysForHyprland cfg.displays); + } + ]; + }; +} + diff --git a/lib/modules/editor.nix b/lib/modules/editor.nix new file mode 100644 index 0000000..5e6c3fd --- /dev/null +++ b/lib/modules/editor.nix @@ -0,0 +1,49 @@ +{ user }: { lib, pkgs, config, ... }: +with lib; +let + editor = config.programs.editor; + terminal = "foot"; + menu = "wofi --show dmenu"; +in +{ + options.programs = { + editor = { + enable = mkEnableOption "editor"; + package = mkPackageOption pkgs "vscodium" { + default = pkgs.vscodium; + example = "pkgs.vscode"; + }; + command = mkOption { + default = "/bin/codium"; + }; + neovim = mkEnableOption "neovim mode"; + }; + }; + + config = mkIf editor.enable { + home-manager.users.${user}.imports = [{ + programs.vscode = { + enable = true; + package = editor.package; + }; + }]; + + programs.scripts = [{ + name = "open-code"; + text = '' + code_dir=~/Documents/code + cd $code_dir + repo=$({ ls && echo clone-repo; } | ${menu}) + case $repo in + clone-repo) + url=$(wl-paste) + ${terminal} -e -- git clone "$url" ;; + *) [ -e "$repo" ] && ${editor.package}${editor.command} $repo ;; + esac + ''; + install = false; + hotkey = "C"; + }]; + }; + +} diff --git a/lib/modules/keyboard.nix b/lib/modules/keyboard.nix new file mode 100644 index 0000000..3338d2b --- /dev/null +++ b/lib/modules/keyboard.nix @@ -0,0 +1,24 @@ +{ user }: { lib, pkgs, config, ... }: +with lib; +{ + options.keyboard = { + dvorak = { + enable = mkEnableOption "use a good keyboard layout on a qwerty keyboard"; + }; + }; + + config = mkIf config.keyboard.dvorak.enable { + home-manager.users.${user}.imports = [ + { + wayland.windowManager.hyprland.extraConfig = '' + # === KEYBOARD MODULE === + input { + kb_variant = dvorak + } + ''; + } + ]; + services.xserver.xkbVariant = "dvorak"; + }; + +} diff --git a/lib/modules/scripts.nix b/lib/modules/scripts.nix new file mode 100644 index 0000000..2d12977 --- /dev/null +++ b/lib/modules/scripts.nix @@ -0,0 +1,52 @@ +{ user }: { lib, pkgs, config, ... }: +with lib; +let + scripts = config.programs.scripts; + + scriptType = types.submodule ({...}: { + options = { + name = mkOption { + description = "name of the executable"; + }; + text = mkOption { + description = "the text of the script"; + }; + hotkey = mkOption { + description = "the key that run this script"; + default = ""; + }; + install = mkOption { + type = types.bool; + default = true; + }; + }; + }); + + scriptToPackage = script: pkgs.writeShellScriptBin script.name script.text; + installScripts = scripts: (map scriptToPackage (filter ( s: s.install ) scripts)); + + bindScript = script: if script.hotkey != "" then '' + bind = SUPER, ${script.hotkey}, exec, ${scriptToPackage script}/bin/${script.name} + '' else ""; + + bindScripts = scripts: + "# === USER SCRIPTS MODULE ===\n" + + concatStringsSep "\n" (map bindScript scripts); + +in +{ + options.programs = { + scripts = mkOption { + type = types.listOf scriptType; + default = []; + }; + }; + + config = { + home-manager.users.${user}.imports = [{ + home.packages = installScripts scripts; + wayland.windowManager.hyprland.extraConfig = bindScripts scripts; + }]; + }; + +} diff --git a/lib/modules/work.nix b/lib/modules/work.nix new file mode 100644 index 0000000..c50bc3b --- /dev/null +++ b/lib/modules/work.nix @@ -0,0 +1,71 @@ +{ user }: { lib, pkgs, config, ... }: +with lib; +{ + options.roles.work = { + enable = mkEnableOption "work packages"; + }; + + config = mkIf config.roles.work.enable { + + home-manager.users.${user}.imports = [{ + + home.packages = with pkgs; [ + onedrive + kubectl + awscli2 + docker-compose + minikube + kubernetes-helm + ansible + thunderbird + (import ../mkapp.nix "slack" { + inherit pkgs; + desktopName = "Slack"; + app-id = "mpagibdhafmlkgpemeicgogjnhclenoc"; + browser = "${brave}/opt/brave.com/brave/brave-browser"; + }) + (import ../mkapp.nix "teams" { + inherit pkgs; + browser = "${brave}/opt/brave.com/brave/brave-browser"; + app-id = "cifhbcnohmdccbgoicgdjpfamggdegmo"; + desktopName = "Microsoft Teams"; + }) + (pkgs.writeShellScriptBin "my-editor" '' + ${pkgs.vscode}/bin/code --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations $@ + '') + ]; + + gtk.gtk3.bookmarks = [ + "file:///home/tristan/OneDrive/Documents/ OneDrive" + ]; + + programs.vscode = { + extensions = with pkgs; [ + vscode-extensions.ms-azuretools.vscode-docker + ]; + userSettings = { + "aws.telemetry" = false; + "gitlens.telemetry.enabled" = false; + }; + }; + + }]; + + programs.editor = { + enable = true; + package = pkgs.vscode; + command = "/bin/code"; + }; + + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + # nonfree vscode required for dev containers + "vscode" + ]; + + networking = { + networkmanager = { + plugins = [ pkgs.networkmanager-openvpn ]; + }; + }; + }; +} diff --git a/system/global/home.nix b/system/global/home.nix index a2fea6e..00e10e7 100644 --- a/system/global/home.nix +++ b/system/global/home.nix @@ -62,18 +62,6 @@ let ${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-up -t 1000 ''); - open-code = (pkgs.writeShellScriptBin "open-code" '' - code_dir=~/Documents/code - cd $code_dir - repo=$({ ls && echo clone-repo; } | ${my-deps.menu}) - case $repo in - clone-repo) - url=$(wl-paste) - ${my-deps.terminal} -e -- git clone "$url" ;; - *) [ -e "$repo" ] && my-editor $repo ;; - esac - ''); - switch-window = (pkgs.writeShellScriptBin "switch-window" '' ${my-deps.hyprctl} clients -j | \ ${my-deps.jq} '.[] | .title' -r | \ @@ -187,7 +175,6 @@ in bind = SUPER, Z, exec, ${pkgs.wlogout}/bin/wlogout bind = SUPER, M, exec, ${ my-deps.terminal } -e ncmpcpp bind = SUPER, O, exec, pcmanfm - bind = SUPER, C, exec, ${ my-scripts.open-code }/bin/open-code bind = SUPER, TAB, exec, ${ my-scripts.switch-window }/bin/switch-window bind = SUPER, G, exec, ${ pkgs.hyprpicker }/bin/hyprpicker | wl-copy && notify-send "Copied Colour" "$(wl-paste)" bind = SUPER, EQUAL, exec, hyprctl keyword misc:cursor_zoom_factor 2 @@ -441,8 +428,6 @@ in }; programs.vscode = { - enable = true; - package = pkgs.vscodium; extensions = with pkgs; [ vscode-extensions.asvetliakov.vscode-neovim vscode-extensions.jnoortheen.nix-ide @@ -915,7 +900,6 @@ color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a- "${modifier}+SHIFT+P" = "exec ${ my-scripts.bwotpmenu }/bin/bwotpmenu"; "${modifier}+SHIFT+S" = "exec ${ my-scripts.screenshot }/bin/screenshot"; "${modifier}+M" = "exec ${ my-deps.terminal } -e ncmpcpp"; - "${modifier}+C" = "exec ${ my-scripts.open-code }/bin/open-code"; "${modifier}+Z" = "exec ${pkgs.swaylock-effects}/bin/swaylock -f"; }; bars = [ ]; diff --git a/system/work/home.nix b/system/work/home.nix index a705277..3ad3d10 100644 --- a/system/work/home.nix +++ b/system/work/home.nix @@ -6,36 +6,13 @@ home.packages = with pkgs; [ sbctl - onedrive - kubectl - awscli2 - docker-compose - minikube - kubernetes-helm gimp libreoffice - ansible - thunderbird - (pkgs.writeShellScriptBin "my-editor" '' - ${pkgs.vscode}/bin/code --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations $@ - '') - (import ../../lib/mkapp.nix "slack" { - inherit pkgs; - desktopName = "Slack"; - app-id = "mpagibdhafmlkgpemeicgogjnhclenoc"; - browser = "${brave}/opt/brave.com/brave/brave-browser"; - }) (pkgs.makeDesktopItem { name = "logseq"; desktopName = "Logseq"; exec = "${logseq}/bin/logseq --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --disable-gpu"; }) - (import ../../lib/mkapp.nix "teams" { - inherit pkgs; - browser = "${brave}/opt/brave.com/brave/brave-browser"; - app-id = "cifhbcnohmdccbgoicgdjpfamggdegmo"; - desktopName = "Microsoft Teams"; - }) ]; programs.git = { @@ -48,13 +25,6 @@ ## work laptop configuration exec-once = ${pkgs.swaybg}/bin/swaybg -o eDP-1 -i ~/Pictures/backgrounds/nix-soft.png & - monitor = eDP-1, preferred, 0x0, 1.2 - monitor = HDMI-A-1, 1920x1080@144, auto, 1 - - input { - kb_variant = dvorak - } - general { gaps_out = 10 border_size = 3 @@ -64,25 +34,8 @@ ''; }; - gtk = { - gtk3.bookmarks = [ - "file:///home/tristan/OneDrive/Documents/ OneDrive" - ]; - }; - programs.firefox.enable = true; - programs.vscode = { - package = lib.mkForce pkgs.vscode; - extensions = with pkgs; [ - vscode-extensions.ms-azuretools.vscode-docker - ]; - userSettings = { - "aws.telemetry" = false; - "gitlens.telemetry.enabled" = false; - }; - }; - # wayland.windowManager.hyprland.enable = lib.mkForce false; # wayland.windowManager.sway.enable = true; # wayland.windowManager.sway.package = pkgs.swayfx; diff --git a/system/work/system.nix b/system/work/system.nix index 3cf576e..12077ec 100644 --- a/system/work/system.nix +++ b/system/work/system.nix @@ -5,28 +5,6 @@ networking.hostName = "FCS-Tristan-Nixbook"; - services.xserver = { - layout = "gb"; - xkbVariant = "dvorak"; - xkbOptions = "caps:escape"; - }; - - environment.systemPackages = with pkgs; [ - openvpn - openvpn3 - ]; - - nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ - # nonfree vscode required for dev containers - "vscode" - ]; - - networking = { - networkmanager = { - plugins = [ pkgs.networkmanager-openvpn ]; - }; - }; - boot.kernel.sysctl = { "net.ipv4.ip_unprivileged_port_start" = 53; }; @@ -79,11 +57,5 @@ }; }; - services.greetd = { - settings = rec { - # default_session = lib.mkForce sway_session; - }; - }; - }