begin to modularise

This commit is contained in:
Tristan 2023-05-06 18:38:35 +01:00
parent bbd26675f8
commit a1175ba492
10 changed files with 311 additions and 93 deletions

View file

@ -30,6 +30,8 @@
}; };
FCS-Tristan-Nixbook = mkConf "work" { FCS-Tristan-Nixbook = mkConf "work" {
inherit pkgs nixpkgs system user home-manager hyprland; inherit pkgs nixpkgs system user home-manager hyprland;
laptop = true;
work = true;
}; };
}; };
}; };

View file

@ -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 { nixpkgs.lib.nixosSystem rec {
inherit system; inherit system;
@ -11,10 +21,29 @@ nixpkgs.lib.nixosSystem rec {
trusted-public-keys = [ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ]; 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/global/system.nix
../system/${name}/system.nix ../system/${name}/system.nix
../system/${name}/hardware.nix ../system/${name}/hardware.nix
home-manager.nixosModules.home-manager
{ {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;

82
lib/modules/display.nix Normal file
View file

@ -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);
}
];
};
}

49
lib/modules/editor.nix Normal file
View file

@ -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";
}];
};
}

24
lib/modules/keyboard.nix Normal file
View file

@ -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";
};
}

52
lib/modules/scripts.nix Normal file
View file

@ -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;
}];
};
}

71
lib/modules/work.nix Normal file
View file

@ -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 ];
};
};
};
}

View file

@ -62,18 +62,6 @@ let
${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-up -t 1000 ${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" '' switch-window = (pkgs.writeShellScriptBin "switch-window" ''
${my-deps.hyprctl} clients -j | \ ${my-deps.hyprctl} clients -j | \
${my-deps.jq} '.[] | .title' -r | \ ${my-deps.jq} '.[] | .title' -r | \
@ -187,7 +175,6 @@ in
bind = SUPER, Z, exec, ${pkgs.wlogout}/bin/wlogout bind = SUPER, Z, exec, ${pkgs.wlogout}/bin/wlogout
bind = SUPER, M, exec, ${ my-deps.terminal } -e ncmpcpp bind = SUPER, M, exec, ${ my-deps.terminal } -e ncmpcpp
bind = SUPER, O, exec, pcmanfm 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, 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, 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 bind = SUPER, EQUAL, exec, hyprctl keyword misc:cursor_zoom_factor 2
@ -441,8 +428,6 @@ in
}; };
programs.vscode = { programs.vscode = {
enable = true;
package = pkgs.vscodium;
extensions = with pkgs; [ extensions = with pkgs; [
vscode-extensions.asvetliakov.vscode-neovim vscode-extensions.asvetliakov.vscode-neovim
vscode-extensions.jnoortheen.nix-ide 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+P" = "exec ${ my-scripts.bwotpmenu }/bin/bwotpmenu";
"${modifier}+SHIFT+S" = "exec ${ my-scripts.screenshot }/bin/screenshot"; "${modifier}+SHIFT+S" = "exec ${ my-scripts.screenshot }/bin/screenshot";
"${modifier}+M" = "exec ${ my-deps.terminal } -e ncmpcpp"; "${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"; "${modifier}+Z" = "exec ${pkgs.swaylock-effects}/bin/swaylock -f";
}; };
bars = [ ]; bars = [ ];

View file

@ -6,36 +6,13 @@
home.packages = with pkgs; [ home.packages = with pkgs; [
sbctl sbctl
onedrive
kubectl
awscli2
docker-compose
minikube
kubernetes-helm
gimp gimp
libreoffice 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 { (pkgs.makeDesktopItem {
name = "logseq"; name = "logseq";
desktopName = "Logseq"; desktopName = "Logseq";
exec = "${logseq}/bin/logseq --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --disable-gpu"; 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 = { programs.git = {
@ -48,13 +25,6 @@
## work laptop configuration ## work laptop configuration
exec-once = ${pkgs.swaybg}/bin/swaybg -o eDP-1 -i ~/Pictures/backgrounds/nix-soft.png & 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 { general {
gaps_out = 10 gaps_out = 10
border_size = 3 border_size = 3
@ -64,25 +34,8 @@
''; '';
}; };
gtk = {
gtk3.bookmarks = [
"file:///home/tristan/OneDrive/Documents/ OneDrive"
];
};
programs.firefox.enable = true; 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.hyprland.enable = lib.mkForce false;
# wayland.windowManager.sway.enable = true; # wayland.windowManager.sway.enable = true;
# wayland.windowManager.sway.package = pkgs.swayfx; # wayland.windowManager.sway.package = pkgs.swayfx;

View file

@ -5,28 +5,6 @@
networking.hostName = "FCS-Tristan-Nixbook"; 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 = { boot.kernel.sysctl = {
"net.ipv4.ip_unprivileged_port_start" = 53; "net.ipv4.ip_unprivileged_port_start" = 53;
}; };
@ -79,11 +57,5 @@
}; };
}; };
services.greetd = {
settings = rec {
# default_session = lib.mkForce sway_session;
};
};
} }