Compare commits

..

2 commits

Author SHA1 Message Date
c2d751c40e Got it working! 2025-09-16 19:13:56 -07:00
6b9ac2e00e Scaffolding 2025-09-16 18:45:24 -07:00
38 changed files with 1610 additions and 1106 deletions

1
.gitignore vendored
View file

@ -1 +0,0 @@
result

848
flake.lock generated

File diff suppressed because it is too large Load diff

186
flake.nix
View file

@ -1,114 +1,94 @@
{
outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } {
imports = with inputs; [
easy-hosts.flakeModule
home-manager.flakeModules.home-manager
];
inputs = {
nixpkgs.url = "nixpkgs/nixos-unstable";
systems = [ "x86_64-linux" ];
easy-hosts = {
autoConstruct = true;
path = ./hosts;
onlySystem = "x86_64-nixos";
home-manager.url = "github:nix-community/home-manager";
shared = {
lix-module.url = "https://git.lix.systems/lix-project/nixos-module/archive/2.91.1-2.tar.gz";
hyprland.url = "git+https://github.com/hyprwm/Hyprland";
hyprland-contrib.url = "github:hyprwm/contrib";
niri.url = "github:sodiboo/niri-flake";
sops-nix.url = "github:Mic92/sops-nix";
ags.url = "github:Aylur/ags";
aagl.url = "github:ezKEa/aagl-gtk-on-nix";
};
outputs = { self, home-manager, nixpkgs, lix-module, ... }@inputs: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
fs = pkgs.lib.fileset;
st = pkgs.lib.strings;
as = pkgs.lib.attrsets;
hosts = let
hostFilter = { name, ...}: name == "host.nix";
hostPaths = fs.toList (fs.fileFilter hostFilter ./hosts);
# Assumes dir structure is start_of_path/hosts/hostname/host.nix
extractHostName = path: builtins.unsafeDiscardStringContext (
st.removeSuffix "/host.nix" (
builtins.elemAt (st.splitString "/hosts/" path) 1
)
);
in builtins.listToAttrs (map (path: {
value = path;
name = extractHostName path;
}) hostPaths);
users = let
userFilter = { name, ...}: name == "user.nix";
userPaths = fs.toList (fs.fileFilter userFilter ./hosts);
in builtins.listToAttrs (map (path: let
dirsAndFiles = st.splitString "/" path;
dAFLength = builtins.length dirsAndFiles;
# Assumes dir structure is start_of_path/hosts/hostname/users/username/user.nix
hostname = builtins.unsafeDiscardStringContext (
builtins.elemAt dirsAndFiles (dAFLength - 4));
username = builtins.unsafeDiscardStringContext (
builtins.elemAt dirsAndFiles (dAFLength - 2));
in {
name = username + "@" + hostname;
value = path;
}
) userPaths);
userConfig = usernameAtHostname: userpath: home-manager.lib.homeManagerConfiguration {
inherit pkgs;
extraSpecialArgs = {
inherit inputs;
inherit usernameAtHostname;
};
modules = [
# inputs.lix-module.nixosModules.default
./nixosModules
./hmModules
userpath
];
};
};
flake = {
homeConfigurations = let
userConfig = system: extraModules:
inputs.home-manager.lib.homeManagerConfiguration {
extraSpecialArgs = { inherit inputs; };
pkgs = inputs.nixpkgs.legacyPackages.${system};
modules = with inputs;[
./hmModules
nixvim.homeModules.nixvim
caelestia-shell.homeManagerModules.default
] ++ extraModules;
hostConfig = hostname: hostpath: nixpkgs.lib.nixosSystem {
specialArgs = let
hostFilteredUsers = as.filterAttrs (
name: value: let
userHostname = builtins.elemAt (st.splitString "@" name) 1;
in userHostname == hostname
) users;
hostUsers = as.mapAttrsToList (
name: value: builtins.elemAt (st.splitString "@" name) 0
) hostFilteredUsers;
in {
inherit inputs;
inherit hostname;
"usernameList" = hostUsers;
};
modules = [
./nixosModules
hostpath
];
};
in {
"pan@juri" = userConfig "x86_64-linux" [ ./users/juri ];
"pan@jibril" = userConfig "x86_64-linux" [ ./users/jibril ];
"pan@onizuka" = userConfig "x86_64-linux" [ ./users/onizuka ];
};
};
};
inputs = {
# Save data with this url. Source:
# at://did:plc:mojgntlezho4qt7uvcfkdndg/app.bsky.feed.post/3loogwsoqok2w
# cid: bafyreidhuuxs3cuabneygtxir65hnd7hvy4hwj5rwrylpwmp7jhxciasve
nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz";
home-manager = {
type = "github";
owner = "nix-community";
repo = "home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-parts = {
type = "github";
owner = "hercules-ci";
repo = "flake-parts";
inputs.nixpkgs-lib.follows = "nixpkgs";
};
caelestia-shell = {
type = "github";
owner = "caelestia-dots";
repo = "shell";
inputs.nixpkgs.follows = "nixpkgs";
};
easy-hosts = {
type = "github";
owner = "tgirlcloud";
repo = "easy-hosts";
};
# lix = {
# url = "https://git.lix.systems/lix-project/lix/archive/main.tar.gz";
# flake = false;
# };
#
# lix-module = {
# url = "https://git.lix.systems/lix-project/nixos-module/archive/main.tar.gz";
# inputs.nixpkgs.follows = "nixpkgs";
# inputs.lix.follows = "lix";
# };
niri = {
type = "github";
owner = "sodiboo";
repo = "niri-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
nixvim = {
type = "github";
owner = "nix-community";
repo = "nixvim";
inputs.nixpkgs.follows = "nixpkgs";
};
sops-nix = {
type = "github";
owner = "Mic92";
repo = "sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
silentSDDM = {
type = "github";
owner = "uiriansan";
repo = "SilentSDDM";
inputs.nixpkgs.follows = "nixpkgs";
};
nixosConfigurations = builtins.mapAttrs (name: path: hostConfig name path) hosts;
homeConfigurations = builtins.mapAttrs (name: path: userConfig name path) users;
};
}

View file

@ -1,52 +0,0 @@
{ config, pkgs, lib, ... }:
{
options.beets = {
enable = lib.mkEnableOption "Enables beets music";
plugins = {
the.enable = lib.mkOption { default = true; };
ftintitle.enable = lib.mkOption { default = true; };
lyrics.enable = lib.mkOption { default = true; };
fetchart = {
enable = lib.mkOption { default = true; };
embed = lib.mkOption { default = true; };
};
};
};
config = lib.mkIf config.beets.enable {
programs.beets.enable = true;
programs.beets.settings = {
directory = "${config.xdg.userDirs.music}";
library = "${config.xdg.userDirs.music}.db";
paths.default = with config.beets.plugins; let
# raw_artist = if ftintitle.enable
# then "$album_artist_no_feat"
# else "$albumartist";
raw_artist = "$albumartist";
artist = if the.enable
then "%the{${raw_artist}}/"
else raw_artist;
the_rest = "$album%aunique{}/$track $title";
in artist + the_rest;
embedart = with config.beets.plugins.fetchart;
lib.mkIf (enable && embed) {
maxwidth = 500;
};
plugins = with lib; with config.beets.plugins;
optional (the.enable) "the" ++
optional (ftintitle.enable) "ftintitle" ++
optional (lyrics.enable) "lyrics" ++
optional (fetchart.enable) "fetchart" ++
optional (fetchart.embed) "embedart" ++ [
"musicbrainz"
"info"
];
};
};
}

View file

@ -1,61 +0,0 @@
{ inputs, config, lib, pkgs, ... }:
{
options.caelestia-shell = {
enable = lib.mkEnableOption "Enables caelestia-shell";
};
config = lib.mkIf config.caelestia-shell.enable {
programs.caelestia = {
enable = true;
cli.enable = true;
systemd.enable = true;
settings = {
general.idle.timeouts = [ { timeout = 180; idleAction = "lock"; } ];
appearance = {
anim.durations.scale = 0.8;
transparency = { base = 0.75; enabled = true; layers = 0.4; };
};
background.desktopClock = {
enabled = true;
scale = 2.0;
};
bar = {
clock = {
background = true;
showDate = true;
showIcon = false;
};
entries = [
{ id = "logo"; enabled = true; }
{ id = "spacer"; enabled = true; }
{ id = "tray"; enabled = true; }
{ id = "clock"; enabled = true; }
{ id = "power"; enabled = true; }
];
persistent = false;
popouts = { activeWindow = false; statusIcons = false; };
scrollActions = { workspaces = false; brightness = false; };
showOnHover = true;
};
border = {
rounding = 6;
thickness = 4;
};
dashboard.showMedia = false;
launcher.enabled = false;
osd.enableBrightness = false;
paths.wallpaperDir = "${config.xdg.userDirs.pictures}/wallpapers";
services = {
weatherLocation = "47.61600, -122.31903";
useFahrenheit = false;
useTwelveHourClock = false;
};
utilities = {
enabled = false;
toasts.configLoaded = false;
};
};
};
};
}

View file

@ -1,93 +0,0 @@
{ config, lib, ... }:
{
options.foot = {
enable = lib.mkEnableOption "Enables foot";
make_default = lib.mkEnableOption "Makes foot default terminal emulator";
font = lib.mkOption { default = ""; };
font_size = lib.mkOption { default = 24; };
theme = {
catppuccin.enable = lib.mkEnableOption "Enables catppuccin theme for foot";
};
};
config = lib.mkIf config.foot.enable {
programs.foot = {
enable = true;
settings = {
main.font = "${config.foot.font}:size=${builtins.toString config.foot.font_size}";
colors-dark = lib.mkIf config.foot.theme.catppuccin.enable {
cursor = "11111b f5e0dc";
foreground = "cdd6f4";
background = "1e1e2e";
regular0 = "45475a";
regular1 = "f38ba8";
regular2 = "a6e3a1";
regular3 = "f9e2af";
regular4 = "89b4fa";
regular5 = "f5c2e7";
regular6 = "94e2d5";
regular7 = "bac2de";
bright0 = "585b70";
bright1 = "f38ba8";
bright2 = "a6e3a1";
bright3 = "f9e2af";
bright4 = "89b4fa";
bright5 = "f5c2e7";
bright6 = "94e2d5";
bright7 = "a6adc8";
"16" = "fab387";
"17" = "f5e0dc";
selection-foreground = "cdd6f4";
selection-background = "414356";
search-box-no-match = "11111b f38ba8";
search-box-match = "cdd6f4 313244";
jump-labels = "11111b fab387";
urls = "89b4fa";
};
colors-light = lib.mkIf config.foot.theme.catppuccin.enable {
cursor = "eff1f5 dc8a78";
foreground = "4c4f69";
background = "eff1f5";
regular0 = "5c5f77";
regular1 = "d20f39";
regular2 = "40a02b";
regular3 = "df8e1d";
regular4 = "1e66f5";
regular5 = "ea76cb";
regular6 = "179299";
regular7 = "acb0be";
bright0 = "6c6f85";
bright1 = "d20f39";
bright2 = "40a02b";
bright3 = "df8e1d";
bright4 = "1e66f5";
bright5 = "ea76cb";
bright6 = "179299";
bright7 = "bcc0cc";
"16" = "fe640b";
"17" = "dc8a78";
selection-foreground = "4c4f69";
selection-background = "ccced7";
search-box-no-match = "dce0e8 d20f39";
search-box-match = "4c4f69 ccd0da";
jump-labels = "dce0e8 fe640b";
urls = "1e66f5";
};
};
};
defaultApps.terminal = lib.mkIf config.foot.make_default "foot";
};
}

View file

@ -12,12 +12,10 @@
config = lib.mkIf config.git.enable {
programs.git = {
enable = true;
settings = {
user = {
name = config.git.username;
email = config.git.email;
signingkey = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
};
userName = config.git.username;
userEmail = config.git.email;
extraConfig = {
user.signingkey = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
gpg.format = "ssh";
commit.gpgSign = "true";
tag.gpgSign = "true";

View file

@ -1,5 +1,5 @@
{ config, lib, ... }:
# let rootPath = ./.; in
{ config, inputs, pkgs, lib, ... }:
let rootPath = ./.; in
{
options.hypr = {
enable = lib.mkEnableOption "Enables hyprland";
@ -35,223 +35,219 @@
screenshot.enable = lib.mkEnableOption "Enables Screenshotting";
};
config.warnings = lib.mkIf config.hypr.enable [''
hypr.* has been deprecated to allow the removal of hyprland from flake inputs.
''];
imports = [ inputs.hyprland.homeManagerModules.default ];
# imports = [ inputs.hyprland.homeManagerModules.default ];
config = let
lopts = lib.lists.optionals;
in {
nix.settings = {
substituters = ["https://hyprland.cachix.org"];
trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
};
} // lib.mkIf config.hypr.enable {
wayland.windowManager.hyprland = let
mod = config.hypr.mod_key;
# p-s = let
# chw = config.hypr.workspace;
# findDefaultWs = id: if (builtins.hasAttr id chw.workspaces)
# then (builtins.head (builtins.getAttr id chw.workspaces))
# else "";
# in with config.hypr.workspace; lib.mkIf primary-secondary.enable {
# primaryWs = findDefaultWs primary-secondary.primary;
# secondaryWs = findDefaultWs primary-secondary.secondary;
# };
in {
enable = true;
settings = {
monitor = config.hypr.monitor.details;
workspace = let
wsMonitor = monitor: wrksps: map (ws:
if ws == (builtins.head wrksps)
then "name:"+ws+", monitor:"+monitor+", persistent:true, default:true"
else "name:"+ws+", monitor:"+monitor+", persistent:true"
) wrksps;
makeRules = wsAttr: builtins.concatLists (builtins.attrValues (
builtins.mapAttrs wsMonitor wsAttr
));
in makeRules config.hypr.workspace.workspaces
++ [
"w[t1], gapsout:0, gapsin:0"
"w[tg1], gapsout:0, gapsin:0"
"f[1], gapsout:0, gapsin:0"
]
++ lopts config.hypr.workspace.scratchpad.enable [
"special:scratch, on-created-empty: [float; size 50% 50%; center] ${config.defaultApps.terminal}"
];
input = {
accel_profile = "flat";
sensitivity = config.hypr.mouse.sensitivity;
};
general = {
gaps_in = 3;
gaps_out = 3;
border_size = 2;
"col.active_border" = "rgb(F5C2E7)";
"col.inactive_border" = "rgb(1E1D2F)";
layout = "master";
};
decoration = {
rounding = 2;
blur = {
enabled = true;
size = 12;
passes = 2;
special = true;
};
};
animation = [
"windows, 1, 4, default, popin 50%"
"windowsOut, 1, 4, default, popin 50%"
"windowsMove, 1, 3, default"
"border, 1, 3, default"
"fade, 1, 3, default"
"workspaces, 1, 3, default"
];
master = {
mfact = config.hypr.master.mfact;
};
misc = {
focus_on_activate = true;
};
# config = let
# lopts = lib.lists.optionals;
# in {
# nix.settings = {
# substituters = ["https://hyprland.cachix.org"];
# trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
# };
# } // lib.mkIf config.hypr.enable {
# wayland.windowManager.hyprland = let
# mod = config.hypr.mod_key;
# # p-s = let
# # chw = config.hypr.workspace;
# # findDefaultWs = id: if (builtins.hasAttr id chw.workspaces)
# # then (builtins.head (builtins.getAttr id chw.workspaces))
# # else "";
# # in with config.hypr.workspace; lib.mkIf primary-secondary.enable {
# # primaryWs = findDefaultWs primary-secondary.primary;
# # secondaryWs = findDefaultWs primary-secondary.secondary;
# # };
# in {
# enable = true;
# settings = {
# monitor = config.hypr.monitor.details;
# workspace = let
# wsMonitor = monitor: wrksps: map (ws:
# if ws == (builtins.head wrksps)
# then "name:"+ws+", monitor:"+monitor+", persistent:true, default:true"
# else "name:"+ws+", monitor:"+monitor+", persistent:true"
# ) wrksps;
# makeRules = wsAttr: builtins.concatLists (builtins.attrValues (
# builtins.mapAttrs wsMonitor wsAttr
# ));
# in makeRules config.hypr.workspace.workspaces
# ++ [
# "w[t1], gapsout:0, gapsin:0"
# "w[tg1], gapsout:0, gapsin:0"
# "f[1], gapsout:0, gapsin:0"
# ]
# ++ lopts config.hypr.workspace.scratchpad.enable [
# "special:scratch, on-created-empty: [float; size 50% 50%; center] ${config.defaultApps.terminal}"
# ];
# input = {
# accel_profile = "flat";
# sensitivity = config.hypr.mouse.sensitivity;
# };
# general = {
# gaps_in = 3;
# gaps_out = 3;
# border_size = 2;
# "col.active_border" = "rgb(F5C2E7)";
# "col.inactive_border" = "rgb(1E1D2F)";
# layout = "master";
# };
# decoration = {
# rounding = 2;
# blur = {
# enabled = true;
# size = 12;
# passes = 2;
# special = true;
# };
# };
# animation = [
# "windows, 1, 4, default, popin 50%"
# "windowsOut, 1, 4, default, popin 50%"
# "windowsMove, 1, 3, default"
# "border, 1, 3, default"
# "fade, 1, 3, default"
# "workspaces, 1, 3, default"
# ];
# master = {
# mfact = config.hypr.master.mfact;
# };
# misc = {
# focus_on_activate = true;
# };
exec-once = lopts config.hypr.polkit.enable [
"${pkgs.kdePackages.polkit-kde-agent-1}/bin/libexec/polkit-kde-authentication-agent-1"
] ++ lopts config.hypr.background.enable [
"${pkgs.swww}/bin/swww-daemon"
"${pkgs.swww}/bin/swww img ${config.hypr.background.path}"
] ++ lopts config.ags.enable [
"ags"
] ++ lopts config.beeper.enable [
"[workspace name:chat silent] Beeper"
];
env = with config.hypr; [
# "HYPR_MON_PRIMARY, ${workspace.primary-secondary.primary}"
# "HYPR_MON_SECONDARY, ${workspace.primary-secondary.secondary}"
"HYPR_WORK_DB, ${config.xdg.cacheHome}/hypr/workspace.db"
] ++ lopts cursor.enable [
"HYPRCURSOR_THEME,${cursor.theme}"
"HYPRCURSOR_SIZE,${cursor.size}"
] ++ lopts config.nvidia.enable [
"LIBVA_DRIVER_NAME,nvidia"
"XDG_SESSION_TYPE,wayland"
"GBM_BACKEND,nvidia-drm"
"__GLX_VENDOR_LIBRARY_NAME,nvidia"
"WLR_RENDERER_ALLOW_SOFTWARE,1"
"WLR_DRM_DEVICES,/dev/dri/card1"
];
windowrulev2 = let
workspaceDefaults = wsname: applist: map (
app: "workspace " + wsname + ", " + app
) applist;
allDefault = wsAttr: builtins.concatLists (builtins.attrValues (
builtins.mapAttrs workspaceDefaults wsAttr
));
in allDefault config.hypr.workspace.defaults
++ [
"bordersize 0, floating:0, onworkspace:w[t1]"
"rounding 0, floating:0, onworkspace:w[t1]"
"bordersize 0, floating:0, onworkspace:w[tg1]"
"rounding 0, floating:0, onworkspace:w[tg1]"
"bordersize 0, floating:0, onworkspace:f[1]"
"rounding 0, floating:0, onworkspace:f[1]"
]
++ lopts config.hypr.xwayland.videobridge.enable [
"opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$"
"noanim,class:^(xwaylandvideobridge)$"
"noinitialfocus,class:^(xwaylandvideobridge)$"
"maxsize 1 1,class:^(xwaylandvideobridge)$"
"noblur,class:^(xwaylandvideobridge)$"
] ++ map (id: "opacity 1 override, " + id) config.hypr.windows.opaque
++ [
"opacity 0.94 fullscreen:0"
"opacity 0.79 override, class:^(${config.defaultApps.terminal})$"
];
# 1, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh home
# 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web
# 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med
# 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game
# 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc
# _, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh hell
# TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh
#
# exec-once = lopts config.hypr.polkit.enable [
# "${pkgs.kdePackages.polkit-kde-agent-1}/bin/libexec/polkit-kde-authentication-agent-1"
# ] ++ lopts config.hypr.background.enable [
# "${pkgs.swww}/bin/swww-daemon"
# "${pkgs.swww}/bin/swww img ${config.hypr.background.path}"
# ] ++ lopts config.ags.enable [
# "ags"
# ] ++ lopts config.beeper.enable [
# "[workspace name:chat silent] Beeper"
# ];
#
# env = with config.hypr; [
# # "HYPR_MON_PRIMARY, ${workspace.primary-secondary.primary}"
# # "HYPR_MON_SECONDARY, ${workspace.primary-secondary.secondary}"
# "HYPR_WORK_DB, ${config.xdg.cacheHome}/hypr/workspace.db"
# ] ++ lopts cursor.enable [
# "HYPRCURSOR_THEME,${cursor.theme}"
# "HYPRCURSOR_SIZE,${cursor.size}"
# ] ++ lopts config.nvidia.enable [
# "LIBVA_DRIVER_NAME,nvidia"
# "XDG_SESSION_TYPE,wayland"
# "GBM_BACKEND,nvidia-drm"
# "__GLX_VENDOR_LIBRARY_NAME,nvidia"
# "WLR_RENDERER_ALLOW_SOFTWARE,1"
# "WLR_DRM_DEVICES,/dev/dri/card1"
# ];
#
# windowrulev2 = let
# workspaceDefaults = wsname: applist: map (
# app: "workspace " + wsname + ", " + app
# ) applist;
# allDefault = wsAttr: builtins.concatLists (builtins.attrValues (
# builtins.mapAttrs workspaceDefaults wsAttr
# ));
# in allDefault config.hypr.workspace.defaults
# ++ [
# "bordersize 0, floating:0, onworkspace:w[t1]"
# "rounding 0, floating:0, onworkspace:w[t1]"
# "bordersize 0, floating:0, onworkspace:w[tg1]"
# "rounding 0, floating:0, onworkspace:w[tg1]"
# "bordersize 0, floating:0, onworkspace:f[1]"
# "rounding 0, floating:0, onworkspace:f[1]"
# ]
# ++ lopts config.hypr.xwayland.videobridge.enable [
# "opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$"
# "noanim,class:^(xwaylandvideobridge)$"
# "noinitialfocus,class:^(xwaylandvideobridge)$"
# "maxsize 1 1,class:^(xwaylandvideobridge)$"
# "noblur,class:^(xwaylandvideobridge)$"
# ] ++ map (id: "opacity 1 override, " + id) config.hypr.windows.opaque
# ++ [
# "opacity 0.94 fullscreen:0"
# "opacity 0.79 override, class:^(${config.defaultApps.terminal})$"
# ];
#
# # 1, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh home
# # 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web
# # 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med
# # 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game
# # 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc
# # _, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh hell
# # TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh
# #
# # SHIFT, 1, movetoworkspacesilent, name:home
# # SHIFT, 2, movetoworkspacesilent, name:web
# # SHIFT, 3, movetoworkspacesilent, name:med
# # SHIFT, 4, movetoworkspacesilent, name:game
# # SHIFT, TAB, movetoworkspacesilent, r-1
#
# bind = let
# modPrefix = kb: if (lib.strings.hasPrefix "&" kb)
# then ("${mod}" + kb)
# else ("${mod}, " + kb);
# in map modPrefix ([
# "Return, exec, ${config.defaultApps.terminal}"
# "&SHIFT, Q, exit"
# "h, focusmonitor, l"
# "l, focusmonitor, r"
# "j, cyclenext,"
# "k, cyclenext, prev"
# "&SHIFT, h, movecurrentworkspacetomonitor, -1"
# "&SHIFT, l, movecurrentworkspacetomonitor, +1"
# "&SHIFT, j, swapnext,"
# "&SHIFT, k, swapnext, prev"
# "c, killactive"
# "f, togglefloating"
# "&SHIFT, f, fullscreen"
# ] ++ (let
# workspaces = builtins.concatLists (
# builtins.attrValues config.hypr.workspace.workspaces);
# wsBinds = with builtins; wrksps: depth: if depth > (length wrksps)
# then []
# else let ws = builtins.elemAt wrksps (depth -1); in [
# "${toString depth}, workspace, name:${ws}"
# "&SHIFT, ${toString depth}, movetoworkspacesilent, name:${ws}"
# ] ++ wsBinds wrksps (depth + 1);
# in wsBinds workspaces 1) ++ lopts config.rofi.enable [
# "&SHIFT, return, exec, ${pkgs.rofi}/bin/rofi -show run"
# ] ++ lopts config.hypr.screenshot.enable [
# "P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copy area"
# "&SHIFT, P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copysave area"
# ] ++ lopts config.hypr.workspace.scratchpad.enable [
# "i, togglespecialworkspace, scratch"
# ]);
#
# bindm = map (kb: "${mod}, " + kb) [
# "mouse:272, movewindow"
# "mouse:273, movewindow"
# ];
# };
# };
#
# home.packages = with pkgs; [
# wlr-randr # Xrandr for wayland
# wl-clipboard # Clipboard manager for wayland
# ] ++ lopts config.hypr.xwayland.videobridge.enable [
# kdePackages.xwaylandvideobridge
# ] ++ lopts config.hypr.cursor.enable [
# hyprcursor
# ] ++ lopts config.hypr.screenshot.enable [
# hyprpicker # Colorpicker, needed for screenshot tool
# inputs.hyprland-contrib.packages.${pkgs.system}.grimblast
# ];
#
# xdg.configFile."hypr-scripts" = {
# source = rootPath + "/scripts";
# target = "hypr/scripts";
# executable = true;
# };
#
# xdg.dataFile."hypr-icons" = lib.mkIf config.hypr.cursor.enable {
# source = rootPath + "/icons";
# target = "icons/";
# recursive = true;
# };
# };
# SHIFT, 1, movetoworkspacesilent, name:home
# SHIFT, 2, movetoworkspacesilent, name:web
# SHIFT, 3, movetoworkspacesilent, name:med
# SHIFT, 4, movetoworkspacesilent, name:game
# SHIFT, TAB, movetoworkspacesilent, r-1
bind = let
modPrefix = kb: if (lib.strings.hasPrefix "&" kb)
then ("${mod}" + kb)
else ("${mod}, " + kb);
in map modPrefix ([
"Return, exec, ${config.defaultApps.terminal}"
"&SHIFT, Q, exit"
"h, focusmonitor, l"
"l, focusmonitor, r"
"j, cyclenext,"
"k, cyclenext, prev"
"&SHIFT, h, movecurrentworkspacetomonitor, -1"
"&SHIFT, l, movecurrentworkspacetomonitor, +1"
"&SHIFT, j, swapnext,"
"&SHIFT, k, swapnext, prev"
"c, killactive"
"f, togglefloating"
"&SHIFT, f, fullscreen"
] ++ (let
workspaces = builtins.concatLists (
builtins.attrValues config.hypr.workspace.workspaces);
wsBinds = with builtins; wrksps: depth: if depth > (length wrksps)
then []
else let ws = builtins.elemAt wrksps (depth -1); in [
"${toString depth}, workspace, name:${ws}"
"&SHIFT, ${toString depth}, movetoworkspacesilent, name:${ws}"
] ++ wsBinds wrksps (depth + 1);
in wsBinds workspaces 1) ++ lopts config.rofi.enable [
"&SHIFT, return, exec, ${pkgs.rofi}/bin/rofi -show run"
] ++ lopts config.hypr.screenshot.enable [
"P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copy area"
"&SHIFT, P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copysave area"
] ++ lopts config.hypr.workspace.scratchpad.enable [
"i, togglespecialworkspace, scratch"
]);
bindm = map (kb: "${mod}, " + kb) [
"mouse:272, movewindow"
"mouse:273, movewindow"
];
};
};
home.packages = with pkgs; [
wlr-randr # Xrandr for wayland
wl-clipboard # Clipboard manager for wayland
] ++ lopts config.hypr.xwayland.videobridge.enable [
kdePackages.xwaylandvideobridge
] ++ lopts config.hypr.cursor.enable [
hyprcursor
] ++ lopts config.hypr.screenshot.enable [
hyprpicker # Colorpicker, needed for screenshot tool
inputs.hyprland-contrib.packages.${pkgs.system}.grimblast
];
xdg.configFile."hypr-scripts" = {
source = rootPath + "/scripts";
target = "hypr/scripts";
executable = true;
};
xdg.dataFile."hypr-icons" = lib.mkIf config.hypr.cursor.enable {
source = rootPath + "/icons";
target = "icons/";
recursive = true;
};
};
}

View file

@ -33,7 +33,7 @@
relativenumber = true;
};
commands = {
dragon-out = ''%${pkgs.dragon-drop}/bin/dragon-drop -a -x "$fx"'';
dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"'';
trash = lib.mkIf config.trash.enable ''
%${pkgs.trash-cli}/bin/trash "$fx"
'';

View file

@ -8,7 +8,7 @@
config = lib.mkIf config.lutris.enable {
home.packages = with pkgs; [
lutris
wineWow64Packages.stable
wineWowPackages.stable
# (lutris.override {
# extraLibraries = pkgs: [
# # List library dependencies here

View file

@ -14,242 +14,156 @@
catppuccin.enable = lib.mkEnableOption "Enables catppuccin theme";
};
plugins = {
comments.enable = lib.mkOption { default = true; };
fugitive.enable = lib.mkOption { default = true; };
lualine.enable = lib.mkOption { default = true; };
luasnip.enable = lib.mkOption { default = false; };
nvimcmp.enable = lib.mkOption { default = true; };
opencode.enable = lib.mkOption { default = true; };
comments.enable = lib.mkEnableOption "Enables nvim-comment";
fugitive.enable = lib.mkEnableOption "Enables git-fugitive";
lualine.enable = lib.mkEnableOption "Enables lualine";
luasnip.enable = lib.mkEnableOption "Enables luasnip snippets";
nvimcmp.enable = lib.mkEnableOption "Enables nvim completion";
telescope = {
enable = lib.mkOption { default = true; };
fzf.enable = lib.mkOption { default = true; };
enable = lib.mkEnableOption "Enables telescope";
fzf.enable = lib.mkEnableOption "Enables telescope-fzf";
};
treesitter.enable = lib.mkOption { default = true; };
wiki.enable = lib.mkOption { default = false; };
treesitter.enable = lib.mkEnableOption "Enables treesitter";
wiki.enable = lib.mkEnableOption "Enables a wiki";
};
};
imports = [
./plugin/lsp.nix
./plugin/nvimcmp.nix
./plugin/telescope.nix
./plugin/treesitter.nix
];
config = lib.mkIf config.neovim.enable {
home.sessionVariables = {
EDITOR = "nvim";
VISUAL = "nvim";
};
programs.nixvim = {
programs.neovim = {
enable = true;
viAlias = true;
vimAlias = true;
vimdiffAlias = true;
globals = {
mapleader = " ";
maplocalleader = " ";
rust_recommended_style = 0;
};
extraLuaConfig = ''
${builtins.readFile ./options.lua}
'';
opts = {
list = true;
updatetime = 750;
extraPackages = with pkgs; [
(lib.mkIf config.neovim.languages.c.enable libclang)
(lib.mkIf config.neovim.languages.go.enable gopls)
(lib.mkIf config.neovim.languages.nix.enable nil)
(lib.mkIf config.neovim.languages.rust.enable rust-analyzer)
];
tabstop = 2;
softtabstop = 0;
shiftwidth = 2;
smarttab = true;
expandtab = true;
# Additional packages are added through imports
plugins = let
lopts = lib.lists.optionals;
cfgp = config.neovim.plugins;
cfgl = config.neovim.languages;
cfgt = config.neovim.themes;
colorcolumn = "81";
showmatch = true;
number = true;
relativenumber = true;
swapfile = false;
backup = false;
undofile = true;
undodir = "${config.xdg.configHome}/nvim/undodir";
smartcase = true;
};
keymaps = with config.lib.nixvim; [
comments = lopts cfgp.comments.enable (with pkgs.vimPlugins; [
{
key = "<leader>d";
mode = "n";
action = mkRaw "vim.diagnostic.open_float";
}
{
key = "<C-J>";
mode = "n";
action = "<C-W><C-J>";
}
{
key = "<C-K>";
mode = "n";
action = "<C-W><C-K>";
}
{
key = "<C-L>";
mode = "n";
action = "<C-W><C-L>";
}
{
key = "<C-H>";
mode = "n";
action = "<C-W><C-H>";
}
{
key = "<C-y>";
mode = "x";
action = "\"+y";
options.remap = true;
}
{
key = "<C-y>";
mode = "n";
action = "\"+yy";
options.remap = true;
}
{
key = "<C-p>";
mode = "n";
action = "\"+P";
options.remap = true;
}
] ++ lib.lists.optionals config.neovim.plugins.opencode.enable (let
ocFunc = cmd: let raw = "function() require('opencode').${cmd} end";
in (config.lib.nixvim.mkRaw raw);
in [
{
key = "<leader>ot";
action = ocFunc "toggle()";
mode = [ "n" "x" ];
options.desc = "Toggle opencode";
}
{
key = "<leader>oa";
action = ocFunc "ask('', { submit = true })";
mode = [ "n" "x" ];
options.desc = "Ask opencode...";
}
{
key = "<leader>or";
action = ocFunc "operator('@this ')";
mode = [ "n" "x" ];
options.desc = "Add range to opencode";
plugin = comment-nvim;
type = "lua";
config = "require(\"Comment\").setup()";
}
]);
};
programs.nixvim.colorschemes = with config.neovim.themes; {
catppuccin = lib.mkIf catppuccin.enable {
enable = true;
flavour = "mocha";
integrations.vimwiki = lib.mkIf wiki.enable true;
};
};
fugitive = lopts cfgp.fugitive.enable (with pkgs.vimPlugins; [
vim-fugitive
]);
programs.nixvim.plugins = with config.neovim.plugins; {
comment.enable = comments.enable;
luasnip-pkg = lopts cfgp.luasnip.enable (with pkgs.vimPlugins; [
luasnip
friendly-snippets
(lib.mkIf cfgp.nvimcmp.enable cmp_luasnip)
]);
fugitive.enable = fugitive.enable;
lualine = lib.mkIf lualine.enable {
enable = true;
icons_enabled = true;
};
web-devicons.enable = lualine.enable;
luasnip.enable = luasnip.enable;
friendly-snippets.enable = luasnip.enable;
cmp = {
enable = nvimcmp.enable;
autoEnableSources = true;
settings = {
sources = [
{ name = "nvim_lsp"; }
{ name = "path"; }
{ name = "buffer"; }
] ++ lib.optional luasnip.enable { name = "cmp-luasnip"; };
mapping = with config.lib.nixvim; {
"<Tab>" = mkRaw
"cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
"<S-Tab>" = mkRaw
"cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
};
};
};
opencode = {
enable = opencode.enable;
settings = {
input.enabled = true;
lsp.enabled = true;
events.permissions.enabled = false;
};
};
snacks.enable = opencode.enable;
telescope = {
enable = telescope.enable;
keymaps = {
"<leader>ff" = "find_files";
"<leader>fg" = "git_files";
};
extensions = {
fzf = lib.mkIf telescope.fzf.enable {
enable = true;
fuzzy = true;
override_generic_sorter = true;
override_file_sorter = true;
case_mode = "smart_case";
};
};
};
treesitter = {
enable = treesitter.enable;
highlight.enable = true;
indent.enable = true;
folding.enable = false;
};
vimwiki = {
enable = wiki.enable;
list = [
lualine = lopts cfgp.lualine.enable (with pkgs.vimPlugins; [
{
path = "${config.xdg.userDirs.documents}/wiki";
links_space_char = "_";
ext = ".md";
syntax = "markdown";
plugin = lualine-nvim;
type = "lua";
config = ''
require("lualine").setup {
options = {
icons_enabled = true,
'' + lib.strings.optionalString cfgt.catppuccin.enable ''
theme = "catppuccin"
'' + ''
}
];
};
}
'';
}
nvim-web-devicons
]);
nvim-lspconfig.enable = true;
nix.enable = config.neovim.languages.nix.enable;
rustaceanvim.enable = config.neovim.languages.rust.enable;
typsecript-tools.enable = config.neovim.languages.typescript.enable;
};
nix-pkg = lopts cfgl.nix.enable (with pkgs.vimPlugins; [
vim-nix
]);
programs.nixvim.lsp = {
enable = true;
servers = with config.neovim.languages; {
clangd.enable = c.enable;
gopls.enable = go.enable;
nil_ls.enable = nix.enable;
rust_analyzer.enable = rust.enable;
tsserver.enable = typescript.enable;
};
keymaps = [
{ key = "gd"; lspBufAction = "definition"; }
{ key = "gD"; lspBufAction = "declaration"; }
{ key = "gi"; lspBufAction = "implementation"; }
{ key = "gt"; lspBufAction = "type_definition"; }
{ key = "K"; lspBufAction = "hover"; }
] ++ lib.optional config.neovim.plugins.telescope.enable {
key = "gr";
action = config.lib.nixvim.mkRaw
"require('telescope.builtin').lsp_references";
};
rust-pkg = lopts cfgl.rust.enable (with pkgs.vimPlugins; [
{
plugin = rustaceanvim;
type = "lua";
config = ''
vim.g.rust_recommended_style = 0
'';
}
]);
go-pkg = lopts cfgl.go.enable (with pkgs.vimPlugins; [
go-nvim
]);
typescript-pkg = lopts cfgl.typescript.enable (with pkgs.vimPlugins; [
{
plugin = typescript-tools-nvim;
type = "lua";
config = ''
require("typescript-tools").setup {}
'';
}
]);
catppuccin-pkg = lopts cfgt.catppuccin.enable (with pkgs.vimPlugins; [
{
plugin = catppuccin-nvim;
type = "lua";
config = ''
vim.cmd.colorscheme "catppuccin-mocha"
require('catppuccin').setup({
integrations = {
'' + lib.strings.optionalString cfgp.wiki.enable ''
vimwiki = true
'' + ''
}
})
'';
}
]);
wiki = lopts cfgp.wiki.enable (with pkgs.vimPlugins; [
{
plugin = vimwiki;
type = "lua";
config = ''
vim.g.vimwiki_list = {
{
path = '${config.xdg.userDirs.documents}/wiki',
links_space_char = '_',
ext = '.md',
syntax = 'markdown',
}
}
'';
}
]);
in comments ++ fugitive ++ luasnip-pkg ++ lualine ++ nix-pkg ++ rust-pkg
++ go-pkg ++ wiki ++ catppuccin-pkg ++ typescript-pkg;
};
};
}

View file

@ -0,0 +1,60 @@
-- Globals
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
vim.opt.list = true
vim.bo.filetype = "on"
vim.opt.updatetime = 300
-- Indentations
vim.opt.tabstop = 2
vim.opt.softtabstop = 0
vim.opt.shiftwidth = 2
vim.opt.smarttab = true
vim.opt.expandtab = true
-- Style
vim.opt.colorcolumn = "80"
vim.opt.showmatch = true
vim.opt.number = true
vim.opt.relativenumber = true
-- Easy Split Navigation
-- nnoremap <C-J> <C-W><C-J>
-- nnoremap <C-K> <C-W><C-K>
-- nnoremap <C-L> <C-W><C-L>
-- nnoremap <C-H> <C-W><C-H>
-- Searching
vim.opt.smartcase = true
-- Backups
vim.opt.swapfile = false
vim.opt.backup = false
vim.opt.undofile = true
vim.opt.undodir = '/home/pan/.config/nvim/undodir'
-- Error viewing
vim.keymap.set('n', '<Leader>d', function() vim.diagnostic.open_float() end)
-- Easy copy and pasting to external programs
-- map <C-y> "+yy
-- map <C-p> "+P
-- autocmd BufRead,BufNewFile *.md call WritingMode()
-- autocmd BufRead,BufNewFile *.tex call WritingMode()
-- autocmd BufRead,BufNewFile *.svx call WritingMode()
-- autocmd BufRead,BufNewFile *.py call PythonMode()
-- function! WritingMode()
-- setlocal textwidth=80
-- setlocal wrap linebreak nolist
-- setlocal whichwrap+=<,>,h,l
-- nnoremap j gj
-- nnoremap k gk
-- setlocal spell spelllang=en_us
-- endfunction
-- function! PythonMode()
-- setlocal foldmethod=indent
-- setlocal foldlevel=99
-- endfunction

View file

@ -0,0 +1,53 @@
{ config, pkgs, lib, ... }:
{
config = lib.mkIf config.neovim.enable {
programs.neovim.plugins = let
cfgp = config.neovim.plugins;
cfgl = config.neovim.languages;
configText = ''
local on_attach = function(_, bufnr)
local bufmap = function(keys, func)
vim.keymap.set('n', keys, func, { buffer = bufnr })
end
bufmap('<leader>r', vim.lsp.buf.rename)
bufmap('<leader>a', vim.lsp.buf.code_action)
bufmap('gd', vim.lsp.buf.definition)
bufmap('gD', vim.lsp.buf.declaration)
bufmap('gI', vim.lsp.buf.implementation)
bufmap('<leader>D', vim.lsp.buf.type_definition)
'' + lib.strings.optionalString cfgp.telescope.enable ''
bufmap('gr', require('telescope.builtin').lsp_references)
bufmap('<leader>s', require('telescope.builtin').lsp_document_symbols)
bufmap('<leader>S', require('telescope.builtin').lsp_dynamic_workspace_symbols)
'' + ''
bufmap('K', vim.lsp.buf.hover)
vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
vim.lsp.buf.format()
end, {})
end
local capabilities = vim.lsp.protocol.make_client_capabilities()
'' + lib.strings.optionalString cfgl.c.enable ''
require('lspconfig').clangd.setup {}
'' + lib.strings.optionalString cfgl.go.enable ''
require('lspconfig').gopls.setup {}
'' + lib.strings.optionalString cfgl.nix.enable ''
require('lspconfig').nil_ls.setup {}
'';
in with pkgs.vimPlugins; [
{
plugin = nvim-lspconfig;
type = "lua";
config = configText;
}
];
};
}

View file

@ -0,0 +1,72 @@
{ config, pkgs, lib, ... }:
let
cfgp = config.neovim.plugins;
in {
config = lib.mkIf (config.neovim.enable && cfgp.nvimcmp.enable) {
programs.neovim.plugins = let
configText = ''
local cmp = require('cmp')
'' + lib.strings.optionalString cfgp.luasnip.enable ''
local luasnip = require('luasnip')
require('luasnip.loaders.from_vscode').lazy_load()
luasnip.config.setup {}
'' + ''
cmp.setup {
mapping = cmp.mapping.preset.insert {
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-d>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete {},
['<CR>'] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Replace,
select = true,
},
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
'' + lib.strings.optionalString cfgp.luasnip.enable ''
elseif luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
'' + ''
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
'' + lib.strings.optionalString cfgp.luasnip.enable ''
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
'' + ''
else
fallback()
end
end, { 'i', 's' }),
},
'' + lib.strings.optionalString cfgp.luasnip.enable ''
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
sources = {
{ name = 'luasnip' },
},
'' + ''
}
'';
in with pkgs.vimPlugins; [
{
plugin = nvim-cmp;
type = "lua";
config = configText;
}
];
};
}

View file

@ -0,0 +1,43 @@
{ config, pkgs, lib, ... }:
let
cfgp = config.neovim.plugins;
in {
config = lib.mkIf (config.neovim.enable && cfgp.telescope.enable) {
programs.neovim.plugins = let
configText = ''
require('telescope').setup({
extensions = {
'' + lib.strings.optionalString cfgp.telescope.fzf.enable ''
fzf = {
fuzzy = true, -- false will only do exact matching
override_generic_sorter = true, -- override the generic sorter
override_file_sorter = true, -- override the file sorter
case_mode = "smart_case", -- or "ignore_case" or "respect_case"
-- the default case_mode is "smart_case"
}
'' + ''
}
})
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
vim.keymap.set('n', '<leader>fg', builtin.git_files, {})
'' + lib.strings.optionalString cfgp.telescope.fzf.enable ''
require('telescope').load_extension('fzf')
'';
in with pkgs.vimPlugins; [
{
plugin = telescope-nvim;
type = "lua";
config = configText;
}
(lib.mkIf cfgp.nvimcmp.enable telescope-fzf-native-nvim)
];
home.packages = with pkgs; [
(lib.mkIf cfgp.telescope.fzf.enable fzf)
];
};
}

View file

@ -0,0 +1,38 @@
{ config, pkgs, lib, ... }:
let
cfgp = config.neovim.plugins;
cfgl = config.neovim.languages;
in {
config = lib.mkIf (config.neovim.enable && cfgp.treesitter.enable) {
programs.neovim.plugins = let
configText = ''
require('nvim-treesitter.configs').setup {
ensure_installed = {},
auto_install = false,
highlight = { enable = true },
indent = { enable = true },
}
'';
# I've tried many things, and can't get treesitter plugins changing
# dynamically. For not just have them always loaded regardless of config
treeplugs = p: [
p.tree-sitter-c
p.tree-sitter-go
p.tree-sitter-nix
p.tree-sitter-rust
p.tree-sitter-typescript
];
in with pkgs.vimPlugins; [
{
plugin = (nvim-treesitter.withPlugins treeplugs);
type = "lua";
config = configText;
}
];
};
}

View file

@ -53,8 +53,8 @@
binds = with config.lib.niri.actions; {
"Mod+Return".action= spawn "${config.defaultApps.terminal}";
"Mod+Shift+Return".action = spawn "${pkgs.fuzzel}/bin/fuzzel";
"Mod+P".action.screenshot = [];
"Mod+Shift+P".action.screenshot-window = [];
"Mod+P".action = screenshot;
"Mod+Shift+P".action = screenshot-window;
"Mod+Tab".action = switch-preset-column-width;
"Mod+Shift+Q".action = quit;

View file

@ -1,4 +1,4 @@
{ config, lib, ... }:
{ config, lib, usernameAtHostname, ... }:
{
options = {
@ -9,22 +9,22 @@
browser = lib.mkOption { default = ""; };
};
};
config = {
config = let
st = lib.strings;
in {
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
nixpkgs.config.allowUnfree = true;
home.stateVersion = "23.05";
home = {
username = "pan";
homeDirectory = "/home/pan";
username = builtins.elemAt (st.splitString "@" usernameAtHostname) 0;
homeDirectory = "/home/" + config.home.username;
packages = config.extraPkgs;
};
home.sessionVariables = {
GRADLE_USER_HOME = "${config.xdg.dataHome}/gradle";
CARGO_HOME = "${config.xdg.dataHome}/cargo";
JULIA_DEPOT_PATH = "${config.xdg.dataHome}/julia:$JULIA_DEPOT_PATH";
CUDA_CACHE_PATH = "${config.xdg.cacheHome}/nv";
};

View file

@ -6,10 +6,7 @@
};
config = lib.mkIf config.ssh.enable {
programs.ssh = {
enable = true;
enableDefaultConfig = false;
};
programs.ssh.enable = true;
home.packages = with pkgs; [
sshfs # SSH File system
];

View file

@ -1,30 +1,25 @@
{ config, lib, ... }:
{ config, inputs, pkgs, lib, ... }:
{
options.ags = {
enable = lib.mkEnableOption "Enable ags";
};
config.warnings = lib.mkIf config.ags.enable [''
ags.enable has been deprecated to allow the removal of ags from flake
inputs.
''];
imports = [ inputs.ags.homeManagerModules.default ];
# imports = [ inputs.ags.homeManagerModules.default ];
config = lib.mkIf config.ags.enable {
home.packages = with pkgs; [
libnotify # Notifications through ags
];
programs.ags = {
enable = true;
configDir = ./config;
# config = lib.mkIf config.ags.enable {
# home.packages = with pkgs; [
# libnotify # Notifications through ags
# ];
# programs.ags = {
# enable = true;
# configDir = ./config;
#
# extraPackages = with pkgs; [
# gtksourceview
# webkitgtk
# accountsservice
# ];
# };
# };
extraPackages = with pkgs; [
gtksourceview
webkitgtk
accountsservice
];
};
};
}

View file

@ -27,7 +27,6 @@
tuigreet.enable = true;
niri.enable = true;
tailscale.enable = true;
postgres.enable = true;

View file

@ -1,4 +1,4 @@
[Kabal]
["TheKabal2.4"]
["DropboxGuest3.0"]

View file

@ -1,5 +1,9 @@
wireless: ENC[AES256_GCM,data:VU8tpeCgEFSUC490q1hGgBrdFFscL2QybywlpiFG3suofj2Q2VVXKLK4EpF2ebpf/nBf/ggHv/uoSFxuQYYvIsMIo1bYOKvM5QNMi9HO2KmfFbmQYYzmt5CNNh9tno9wmiekeDOnKjQDGK5CoGLD4+y+VW1IVrN9XL+xRxAszgYM4qdSim7CJ1hgU89OgzVL9poVsmqxbiuWY88+ZErIspSHO0QwGOJ5Pc4OixEK2N3EtcYDhV5fBvlFv7t4b8P6BJZIn2NVXCVaW4UcEsefcxHqohd5AuYXJH7wt9aPwJRJehxd9GhVJeQ6QtPXuqZaEspd+dSvlYrvdO8pFTrIklrty30CJg3WberWmI111T8ZNFlNBghSu6nXzO9YkKfDuAYUEPVERL9jG9xF8tGb1JxhOmg33Kg6fg==,iv:07Reckni7LSfDL3qVUv4v80IOVQSbFpz49UsyiIDGWk=,tag:iMgCspLUWNCjjYT0pkMwDw==,type:str]
wireless: ENC[AES256_GCM,data:pQv+gdAW8W9nSEJkbXWex47iuuqgJMEELldFsmgk2Y08MDZ1ytXqlphTK/jbewD3tpz4v29fSuWamv1uZpxM2+c2zCuMVTdrhAf0i/Sjqd9CWP8NQvTDI3v8ps9REFzR7n7hywnkfOkDNwRkmavSfCxK5k9SQLNC7De6P811/Fundb9r6oeIH2OEDBkZEHw8gYndjy6cLDUE2SY/cmxRsKWhATsCLcWKOpQa86zlT9dr9nMtYVF1AN5T4JR/7QKqJ8UT4mvhAA0OEfKv0Cf3euH24vtBrv5YxwDT6tQpOABOyOy9mWLc+bXDID/HX4akeU1O6+eBSpNeRgpAcMfD6b/eqKAvDvnixHubu9GemVspmeoA/91i5B70u3kjm0EKup7KLXCp5RutLnLRczDPdfbCB7bEipeRyF8P+UCuhQ==,iv:WN7mGyHpaMDdLRpFGyDUQ2D9a0t/rucfyKroJYqaHPs=,tag:7KTzBEt30nqCJclDgiWuKg==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age1ey3wr2wnkgny3dfgvnyrf0cptwzr7s5x464p2y9ya58lpay8lfrsds3y68
enc: |
@ -19,7 +23,8 @@ sops:
Ky83VFhiVE9wK01UMDlSbnIrd2d2SHcKp6mF8PaR0ItrvLHpEgMe6fwuboyrrs9y
7Ct6qZ1SN/4f/xJpDP2qiaQ4KTZzY1BlC3isT3CWeajOQhL/y5JCOw==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-08-27T05:30:04Z"
mac: ENC[AES256_GCM,data:hoSykxuHPAofdbXNJCyozeQYYhg3yXLOVx+K9PsSctUMrIc9ii76SDGY2h+6gFNy1rGkPxmYHueqHEJHvvoxLHcwkwoN8AddOVrnXNoIpOvwcn0GfpPIPf5rCvxSxvcsZwPW+affMMVRyRR8aJ3llj7ojuuuyTnm+HL9H9vY1PQ=,iv:pUXl49AqRerTlGoOzoWt0NrEo8rqPmBF7yiB4ZufC3M=,tag:1mP3jsP2O6yKlJVmaA7EMQ==,type:str]
lastmodified: "2024-11-07T21:12:36Z"
mac: ENC[AES256_GCM,data:z0ePEvsEKvcMca2x2qjTsSBwk+qI3jd8h2uAnSsGtJL5UI1OdBL8oVIGKty0pGaCvtrF01UN1ncKBGe5y12Vij2yuyv7LK4ANArxQ4+O583NdYHYeD+T75yGu4SAYjcoM23RD1h+W0SLQpCen2J3WYmJaOjtqMBv/gaFYl/DV7I=,iv:VJjZTd1g4oJCDLEp8+jH15Y2svTNtQUE1vc3WQoJJZU=,tag:4U7uh6U5PwHJ2r6/WFUbnw==,type:str]
pgp: []
unencrypted_suffix: _unencrypted
version: 3.10.2
version: 3.9.1

View file

@ -0,0 +1,10 @@
{ config, pkgs, ... }:
{
fish.enable = true;
git = {
enable = true;
username = "Badtz";
email = "may@badtz.dev";
};
}

View file

@ -4,10 +4,7 @@
imports = [
./hardware.nix
];
nvidia = {
enable = true;
stable = true;
};
nvidia.enable = true;
pipewire.enable = true;
polkit.enable = true;
tablet.enable = true;
@ -18,11 +15,13 @@
sshd.enable = true;
tailscale.enable = true;
sddm.enable = true;
tuigreet.enable = true;
niri.enable = true;
steam.enable = true;
steam.gamemode = true;
aagl.enable = true;
aagl.honkai-rail = true;
input-remapper.enable = true;
postgres.enable = true;

View file

@ -0,0 +1,117 @@
{ config, pkgs, ... }:
{
# "DP-2" = [
# "home"
# "web"
# "med"
# "game"
# ];
# "DP-1" = [
# "chat"
# ];
# RULES
# "name:web" = [ "class:(librewolf)" ];
# "name:med" = [ "class:(librewolf),title:Picture-in-Picture" ];
# "name:chat" = [ "class:(Beeper)" ];
# "name:game" = [ "class:(lutris)" "class:(explorer.exe)" ];
# OPAQUE:
# "initialTitle:^(Discord Popout)$"
# "class:^(firefox)$"
# "class:^(Gimp)$"
# "class:^(feh)$"
# "class:^(mpv)$"
# path = "${config.home.homeDirectory}/med/pix/bg.png";
# theme = "miku";
niri = {
enable = true;
mouse.accel = -0.53;
outputs = {
"DP-1" = {
position = { x = 2560; y = -100; };
mode = { width = 2560; height = 1440; refresh = 144.000; };
transform.rotation = 270;
};
"DP-2" = {
position = { x = 0; y = 0; };
mode = { width = 2560; height = 1440; refresh = 144.000; };
};
};
};
timer.enableHourly = true;
timer.enableQuarterly = true;
colors.enable = true;
manpages.enable = true;
trash.enable = true;
fish.enable = true;
kitty.enable = true;
kitty.make_default = true;
kitty.font = "Cascadia Code";
git.enable = true;
git.username = "Julia Lange";
git.email = "public@julialange.org";
ssh.enable = true;
librewolf.enable = true;
librewolf.make_default = true;
syncthing = {
enable = true;
devices."juri".id = "HAUUSTK-W2YD6MV-DL2T2MV-XSHSFSC-IA6P6GY-B62IC27-YKHVQLX-374FRAO";
folders."wiki" = {
path = "${config.xdg.userDirs.documents}/neowiki";
devices = [ "juri" ];
};
};
mpv.enable = true;
zathura.enable = true;
feh.enable = true;
neovim.enable = true;
neovim.languages = {
c.enable = true;
nix.enable = true;
rust.enable = true;
typescript.enable = true;
};
neovim.plugins = {
comments.enable = true;
fugitive.enable = true;
lualine.enable = true;
luasnip.enable = true;
nvimcmp.enable = true;
telescope = {
enable = true;
fzf.enable = true;
};
treesitter.enable = true;
wiki.enable = true;
};
neovim.themes.catppuccin.enable = true;
lf.enable = true;
lf.hiddenfiles = [
"${config.home.homeDirectory}/.librewolf"
"${config.home.homeDirectory}/.nix-defexpr"
"${config.home.homeDirectory}/.nix-profile"
"${config.home.homeDirectory}/.nv"
"${config.home.homeDirectory}/.pki"
"${config.home.homeDirectory}/.steam*"
"${config.home.homeDirectory}/.zshenv"
];
zoxide.enable = true;
gimp.enable = true;
beeper.enable = true;
discord.enable = true;
lutris.enable = true;
extraPkgs = with pkgs; [
# Applications
logseq
claude-code
];
}

View file

@ -1,4 +1,4 @@
{ config, lib, ... }:
{ config, inputs, lib, ... }:
{
options.aagl = {
@ -12,21 +12,16 @@
"Enables honkai 3rd impact";
};
# imports = [ inputs.aagl.nixosModules.default ];
imports = [ inputs.aagl.nixosModules.default ];
config.warnings = lib.mkIf (config.aagl.enable || config.aagl.honkai-rail ||
config.aagl.genshin || config.aagl.honkai-3rd) [''
aagl.* has been deprecated to allow the removal of aagl from flake inputs.
''];
config = lib.mkIf config.aagl.enable {
nix.settings = inputs.aagl.nixConfig;
# config = lib.mkIf config.aagl.enable {
# nix.settings = inputs.aagl.nixConfig;
#
# programs.honkers-railway-launcher.enable =
# lib.mkIf config.aagl.honkai-rail true;
# programs.anime-game-launcher.enable =
# lib.mkIf config.aagl.genshin true;
# programs.honkers-launcher.enable =
# lib.mkIf config.aagl.honkai-3rd true;
# };
programs.honkers-railway-launcher.enable =
lib.mkIf config.aagl.honkai-rail true;
programs.anime-game-launcher.enable =
lib.mkIf config.aagl.genshin true;
programs.honkers-launcher.enable =
lib.mkIf config.aagl.honkai-3rd true;
};
}

View file

@ -1,4 +1,4 @@
{ config, pkgs, lib, ... }:
{ config, lib, ... }:
{
options.steam = {
@ -11,15 +11,6 @@
enable = true;
remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true;
package = pkgs.steam.override {
extraBwrapArgs = [
"--bind $XDG_STATE_HOME/FakeSteamHome $HOME"
"--unsetenv XDG_CACHE_HOME"
"--unsetenv XDG_CONFIG_HOME"
"--unsetenv XDG_DATA_HOME"
"--unsetenv XDG_STATE_HOME"
];
};
};
programs.gamemode.enable = lib.mkIf config.steam.gamemode true;
};

View file

@ -1,4 +1,4 @@
{ config, pkgs, lib, inputs, ... }:
{ config, pkgs, lib, hostname, usernameList, ... }:
{
options.system = {
@ -22,6 +22,7 @@
boot.loader.efi.canTouchEfiVariables = true;
})
{
networking.hostName = hostname;
system.stateVersion = lib.mkDefault "23.05";
time.timeZone = config.system.timezone;
@ -29,26 +30,15 @@
# Packages & Default Packages
nixpkgs.config.allowUnfree = true;
nix = {
registry.nixpkgs.flake = inputs.nixpkgs;
gc = { automatic = true; options = "--delete-older-than 5d"; };
channel.enable = false;
settings = {
auto-optimise-store = true;
keep-going = true;
use-xdg-base-directories = true;
experimental-features = [
"flakes"
"nix-command"
];
};
};
environment.systemPackages = with pkgs; [
git
neovim
xdg-user-dirs
] ++ config.system.extraPkgs;
# XDG Compliance
nix.settings.use-xdg-base-directories = true;
users = {
users = builtins.listToAttrs (map (
user: {
@ -59,7 +49,7 @@
extraGroups = [ "network" ];
};
}
) [ "pan" ]);
) usernameList);
groups = {
wheel = {
members = config.system.users.bigWheels;

View file

@ -20,7 +20,7 @@
'';
package = pkgs.caddy.withPlugins {
plugins = [ "github.com/caddy-dns/porkbun@v0.3.1" ];
hash = "sha256-cM9ez2i9ZADbXSI7KNZlBCe1F1vpX5fH++qKILaHguA=";
hash = "sha256-g/Nmi4X/qlqqjY/zoG90iyP5Y5fse6Akr8exG5Spf08=";
};
virtualHosts = config.caddy.vhosts;
email = config.caddy.adminEmail;

View file

@ -1,4 +1,4 @@
{ config, lib, ... }:
{ inputs, config, lib, ... }:
{
@ -6,14 +6,18 @@
enable = lib.mkEnableOption "Enables hyprland";
};
# imports = [
# inputs.hyprland.nixosModules.default
# ];
imports = [
inputs.hyprland.nixosModules.default
];
config.warnings = lib.mkIf config.hyprland.enable [''
hyprland.enable has been deprecated to allow the removal of hyprland from
flake inputs.
''];
# config.programs.hyprland.enable = lib.mkIf config.hyprland.enable true;
config = {
nix.settings = {
substituters = [ "https://hyprland.cachix.org" ];
trusted-public-keys = [
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
];
experimental-features = [ "nix-command" "flakes" ];
};
programs.hyprland.enable = lib.mkIf config.hyprland.enable true;
};
}

View file

@ -2,22 +2,22 @@
{
options.nvidia = {
enable = lib.mkEnableOption "Enables nvidia with proprietary drivers";
enable = lib.mkEnableOption
"Enables nvidia with proprietary drivers";
open = lib.mkEnableOption "Use open nvidia option for newer cards";
stable = lib.mkEnableOption "Use stable instead of beta";
};
config = lib.mkIf config.nvidia.enable {
hardware.graphics.enable = true;
hardware.graphics = {
enable = true;
};
services.xserver.videoDrivers = ["nvidia"];
hardware.nvidia = {
open = if config.nvidia.open then true else false;
modesetting.enable = true;
package = if config.nvidia.stable
then config.boot.kernelPackages.nvidiaPackages.stable
else config.boot.kernelPackages.nvidiaPackages.beta;
package = config.boot.kernelPackages.nvidiaPackages.beta;
};
boot.kernelParams = [ "nvidia_drm.fbdev=1" ];

View file

@ -1,27 +0,0 @@
{ config, pkgs, lib, inputs', ... }:
{
options.sddm = {
enable = lib.mkEnableOption "enables sddm";
};
config = lib.mkIf config.sddm.enable (let
sddm-theme = inputs'.silentSDDM.packages.default.override {
theme = "catppuccin-macchiato";
};
in {
qt.enable = true;
environment.systemPackages = [ sddm-theme sddm-theme.test ];
services.displayManager.sddm = {
wayland.enable = true;
package = pkgs.kdePackages.sddm;
enable = true;
theme = sddm-theme.pname;
extraPackages = sddm-theme.propagatedBuildInputs;
settings.General = {
GreeterEnvironment = "QML2_IMPORT_PATH=${sddm-theme}/share/sddm/themes/${sddm-theme.pname}/components/,QT_IM_MODULE=qtvirtualkeyboard";
InputMethod = "qtvirtualkeyboard";
};
};
});
}

View file

@ -1,80 +0,0 @@
{ config, pkgs, ... }:
{
niri = {
enable = true;
mouse.accel = -0.53;
outputs = {
"DP-1" = {
position = { x = 2560; y = 0; };
mode = { width = 2560; height = 1440; refresh = 144.000; };
};
"DP-2" = {
position = { x = 0; y = 0; };
mode = { width = 2560; height = 1440; refresh = 144.000; };
};
};
};
caelestia-shell.enable = true;
colors.enable = true;
manpages.enable = true;
trash.enable = true;
fish.enable = true;
foot = {
enable = true;
make_default = true;
font = "Cascadia Code";
theme.catppuccin.enable = true;
};
git.enable = true;
git.username = "Julia Lange";
git.email = "public@julialange.org";
ssh.enable = true;
librewolf.enable = true;
librewolf.make_default = true;
syncthing = {
enable = true;
devices."juri".id = "HAUUSTK-W2YD6MV-DL2T2MV-XSHSFSC-IA6P6GY-B62IC27-YKHVQLX-374FRAO";
folders."wiki" = {
path = "${config.xdg.userDirs.documents}/neowiki";
devices = [ "juri" ];
};
};
mpv.enable = true;
zathura.enable = true;
feh.enable = true;
beets.enable = true;
neovim = {
enable = true;
languages = {
c.enable = true;
nix.enable = true;
rust.enable = true;
typescript.enable = true;
};
themes.catppuccin.enable = true;
};
lf.enable = true;
lf.hiddenfiles = [
"${config.home.homeDirectory}/.mozilla" # Unsupported
"${config.home.homeDirectory}/.librewolf" # Unsupported
"${config.home.homeDirectory}/.ssh" # openssh assumes
"${config.home.homeDirectory}/.manpath" # man-db has it hardcoded
"${config.home.homeDirectory}/.face" # caelestia-shell requires
];
zoxide.enable = true;
gimp.enable = true;
discord.enable = true;
extraPkgs = with pkgs; [
signal-desktop
ente-desktop
];
}