diff --git a/nixos/dotfiles-links.nix b/nixos/dotfiles-links.nix new file mode 100644 index 00000000..687c22ba --- /dev/null +++ b/nixos/dotfiles-links.nix @@ -0,0 +1,65 @@ +{ config, lib, ... }: +let + # Replicate the useful part of rcm/rcup: + # - dotfiles live in ~/dotfiles/dotfiles (no leading dots in the repo) + # - links in $HOME add a leading '.' to the first path component + # - link files individually so unmanaged state can coexist (e.g. ~/.cabal/store) + # + # Use out-of-store symlinks so editing the repo updates config immediately + # without a rebuild/switch (only link *placement* is managed by HM). + oos = config.lib.file.mkOutOfStoreSymlink; + + # Where the checked-out repo lives at runtime (activation time). + worktreeDotfiles = "${config.home.homeDirectory}/dotfiles/dotfiles"; + + # Use the flake source for enumeration (pure), but point links at the worktree. + srcDotfiles = ../dotfiles; + + excludedTop = [ + # Managed by Nix directly (PATH/fpath), not meant to appear as ~/.lib. + "lib" + # Avoid colliding with HM-generated xdg.configFile entries for now. + "config" + # Handled as a single directory symlink below. + "emacs.d" + ]; + + firstComponent = rel: + let parts = lib.splitString "/" rel; + in lib.elemAt parts 0; + + isExcluded = rel: lib.elem (firstComponent rel) excludedTop; + + listFilesRec = dir: + let + entries = builtins.readDir dir; + names = builtins.attrNames entries; + go = name: + let + ty = entries.${name}; + path = dir + "/${name}"; + in + if ty == "directory" then + map (p: "${name}/${p}") (listFilesRec path) + else + [ name ]; + in + lib.concatLists (map go names); + + managedRelFiles = + lib.filter (rel: !(isExcluded rel)) (listFilesRec srcDotfiles); + + mkManaged = rel: + lib.nameValuePair ".${rel}" { + source = oos "${worktreeDotfiles}/${rel}"; + }; +in +{ + home.file = + (builtins.listToAttrs (map mkManaged managedRelFiles)) + // { + # Keep ~/.emacs.d as a directory symlink (matches current setup). + ".emacs.d".source = oos "${worktreeDotfiles}/emacs.d"; + }; +} + diff --git a/nixos/essential.nix b/nixos/essential.nix index cec2e4e2..be45afb0 100644 --- a/nixos/essential.nix +++ b/nixos/essential.nix @@ -52,7 +52,6 @@ pulseaudio python-with-my-packages rclone - rcm ripgrep runc silver-searcher diff --git a/nixos/imalison.nix b/nixos/imalison.nix index 00d74e29..b414da86 100644 --- a/nixos/imalison.nix +++ b/nixos/imalison.nix @@ -2,6 +2,7 @@ home-manager.users.imalison = { imports = [ ./emacs.nix + ./dotfiles-links.nix ]; # Hyprland config starts this target on login (see `dotfiles/config/hypr/hyprland.conf`). diff --git a/rcm-link.sh b/rcm-link.sh deleted file mode 100755 index c8ac6747..00000000 --- a/rcm-link.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env sh - -export THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -export DOTFILES_DIR="$(readlink -f $THIS_DIR/dotfiles)" - -echo $DOTFILES_DIR -rcup -d $DOTFILES_DIR -S "emacs.d" -S "config/*" -S "lib"