165 lines
4.5 KiB
Nix
165 lines
4.5 KiB
Nix
# Shared Home Manager base config for all desktop users.
|
|
# Provides common programs, services, session variables, shell setup,
|
|
# fonts, and dotfile management. Host home.nix files import this and
|
|
# override/extend as needed.
|
|
{ config, lib, pkgs, osConfig, ... }:
|
|
let
|
|
cfg = config.baseHome;
|
|
in
|
|
{
|
|
options.baseHome = {
|
|
enable = lib.mkEnableOption "shared home-manager base config";
|
|
userName = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Username for home directory and services";
|
|
};
|
|
fullName = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Full display name for git etc";
|
|
};
|
|
email = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Email for git etc";
|
|
};
|
|
stateVersion = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = "23.11";
|
|
description = "Home Manager state version";
|
|
};
|
|
hostDir = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Host directory name for dotfile symlinks (e.g. 'frame12')";
|
|
};
|
|
};
|
|
|
|
imports = [
|
|
./programs.nix
|
|
./git-autosync.nix
|
|
./noctalia.nix
|
|
../wm/niri-home.nix
|
|
];
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
home.username = cfg.userName;
|
|
home.homeDirectory = "/home/${cfg.userName}";
|
|
programs.home-manager.enable = true;
|
|
home.stateVersion = cfg.stateVersion;
|
|
|
|
sharedPrograms.enable = true;
|
|
fonts.fontconfig.enable = true;
|
|
|
|
# Stylix auto-theming
|
|
stylix = {
|
|
autoEnable = lib.mkDefault true;
|
|
targets.firefox = {
|
|
profileNames = lib.mkDefault [ "default" ];
|
|
colorTheme.enable = lib.mkDefault true;
|
|
firefoxGnomeTheme.enable = lib.mkDefault true;
|
|
};
|
|
};
|
|
|
|
# Enable niri home config
|
|
nirihome.enable = lib.mkDefault true;
|
|
|
|
# Common session variables
|
|
home.sessionVariables = {
|
|
EDITOR = lib.mkDefault "hx";
|
|
NIXOS_OZONE_WL = "1";
|
|
};
|
|
|
|
# Gnome keyring for SSH and secrets
|
|
services.gnome-keyring.enable = true;
|
|
services.gnome-keyring.components = [ "ssh" "secrets" ];
|
|
|
|
# Bluetooth headphone controls
|
|
services.mpris-proxy.enable = true;
|
|
|
|
# Common packages (Qt theming, fonts, unix tools)
|
|
home.packages = with pkgs; [
|
|
# Qt theming for Stylix
|
|
libsForQt5.qtstyleplugin-kvantum
|
|
libsForQt5.qt5ct
|
|
# Common unix tools
|
|
lsd
|
|
htop
|
|
unzip
|
|
];
|
|
|
|
# Git base config — hosts extend with user-specific settings
|
|
programs.git = {
|
|
enable = true;
|
|
settings = {
|
|
user.name = cfg.fullName;
|
|
user.email = cfg.email;
|
|
init.defaultBranch = "main";
|
|
pull.ff = "only";
|
|
merge.conflictStyle = "zdiff3";
|
|
push.autoSetupRemote = "true";
|
|
};
|
|
};
|
|
|
|
programs.bash.enable = true;
|
|
|
|
# Zsh base setup
|
|
programs.zsh = {
|
|
enable = true;
|
|
oh-my-zsh = {
|
|
enable = true;
|
|
plugins = [ "git" ];
|
|
theme = lib.mkDefault "half-life";
|
|
};
|
|
initContent = lib.mkDefault ''
|
|
# History
|
|
HISTSIZE=10000
|
|
SAVEHIST=10000
|
|
setopt SHARE_HISTORY
|
|
setopt APPEND_HISTORY
|
|
|
|
# integrate ssh-agent from gnome keyring
|
|
export SSH_AUTH_SOCK=/run/user/$UID/gcr/ssh
|
|
'';
|
|
shellAliases = {
|
|
ls = "lsd";
|
|
l = "lsd --almost-all --long";
|
|
llm = "lsd --timesort --long";
|
|
lS = "lsd --oneline --classic";
|
|
lt = "lsd --tree --depth=2";
|
|
cat = "bat --paging=never";
|
|
rm = "rm -i";
|
|
};
|
|
syntaxHighlighting.enable = true;
|
|
};
|
|
|
|
# Shared dotfiles — all hosts use the same pattern
|
|
home.file = lib.mkMerge [
|
|
(
|
|
let
|
|
# Relative to the host's home.nix (hosts/<host>/modules/home-manager/)
|
|
# After migration, shared dotfiles at ../../../../shared/dotfiles
|
|
# But since this module lives in shared/, use a relative path from here
|
|
sharedDotfilesPath = ../../dotfiles;
|
|
in
|
|
if builtins.pathExists sharedDotfilesPath then
|
|
builtins.listToAttrs (
|
|
map (name: {
|
|
name = "${config.xdg.configHome}/${name}";
|
|
value = {
|
|
source = lib.mkDefault (sharedDotfilesPath + "/${name}");
|
|
};
|
|
}) (builtins.attrNames (builtins.readDir sharedDotfilesPath))
|
|
)
|
|
else
|
|
{ }
|
|
)
|
|
];
|
|
|
|
# Niri config symlink — each host has its own niri dotfiles
|
|
xdg.configFile = {
|
|
"niri".source = lib.mkDefault (
|
|
config.lib.file.mkOutOfStoreSymlink
|
|
"${osConfig.deskCfg.flakePath}/hosts/${cfg.hostDir}/linked-dotfiles/niri"
|
|
);
|
|
};
|
|
};
|
|
}
|