about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2022-04-07 08:31:05 -0700
committerFranck Cuny <franck@fcuny.net>2022-04-07 08:31:05 -0700
commitdcc0315bba21b4efde7ffc0a6e50af24fdd0fbb4 (patch)
treed8b5aa68afc302a116dafa26f74fcdf73587a8f2
parentgitea: fix the module (diff)
downloadworld-dcc0315bba21b4efde7ffc0a6e50af24fdd0fbb4.tar.gz
initial attempt to reconfigure home-manager
All the modules that are needed for home-manager should be under
`home/`, and each host will have a `host.nix` where the modules are
enabled as needed. Later on we can create some profiles to make it
easier to consume the configuration.

I apply this only to tahoe for now, as the amount of packages needed for
my user are pretty limited.
-rw-r--r--home/beets/default.nix46
-rw-r--r--home/default.nix17
-rw-r--r--home/feh/default.nix8
-rw-r--r--home/fish/default.nix13
-rw-r--r--home/flac/default.nix16
-rw-r--r--home/git/default.nix51
-rw-r--r--home/go/default.nix16
-rw-r--r--home/packages/default.nix18
-rw-r--r--home/python/default.nix9
-rw-r--r--home/ssh/default.nix23
-rw-r--r--home/tmux/default.nix22
-rw-r--r--home/yt-dlp/config26
-rw-r--r--home/yt-dlp/default.nix12
-rw-r--r--hosts/tahoe/default.nix1
-rw-r--r--hosts/tahoe/home.nix17
-rw-r--r--modules/default.nix24
-rw-r--r--modules/home/default.nix27
17 files changed, 345 insertions, 1 deletions
diff --git a/home/beets/default.nix b/home/beets/default.nix
new file mode 100644
index 0000000..b93ddd1
--- /dev/null
+++ b/home/beets/default.nix
@@ -0,0 +1,46 @@
+{ config, lib, pkgs, ... }:
+let cfg = config.my.home.beets;
+in {
+  options.my.home.beets = with lib.my; {
+    enable = mkEnableOption "beets configuration";
+    musicDirectory = mkOption {
+      type = types.str;
+      example = "/home/fcuny/media/music";
+      description = "path to the music directory";
+    };
+  };
+
+  config.program.beets = lib.mkIf cfg.enable {
+    enable = true;
+    settings = {
+      directory = cfg.musicDirectory;
+      plugins =
+        "fromfilename discogs duplicates fetchart embedart badfiles lastgenre scrub";
+      paths = {
+        default = "$albumartist/$album%aunique{}/$track $title";
+        singleton = "Singles/$artist/$title";
+        comp = "Compilations/$album%aunique{}/$track - $title";
+        "albumtype:soundtrack" = "Soundtracks/$album ($year)/$track $title";
+      };
+      import = {
+        copy = true;
+        move = true;
+      };
+      va_name = "Various Artists";
+      embedart = { ifempty = true; };
+
+      lastgenre = {
+        auto = false;
+        canonical = true;
+        fallback = "unknown";
+        force = true;
+        prefer_specific = true;
+      };
+
+      fetchart = {
+        cautious = true;
+        sources = "filesystem coverart itunes amazon lastfm wikipedia";
+      };
+    };
+  };
+}
diff --git a/home/default.nix b/home/default.nix
new file mode 100644
index 0000000..be4c47d
--- /dev/null
+++ b/home/default.nix
@@ -0,0 +1,17 @@
+{ ... }:
+
+{
+  imports = [
+    ./beets
+    ./feh
+    ./fish
+    ./flac
+    ./git
+    ./go
+    ./packages
+    ./python
+    ./ssh
+    ./tmux
+    ./yt-dlp
+  ];
+}
diff --git a/home/feh/default.nix b/home/feh/default.nix
new file mode 100644
index 0000000..0032252
--- /dev/null
+++ b/home/feh/default.nix
@@ -0,0 +1,8 @@
+{ config, lib, ... }:
+let cfg = config.my.home.feh;
+in {
+  options.my.home.feh = with lib; {
+    enable = mkEnableOption "feh configuration";
+  };
+  config.programs.feh = lib.mkIf cfg.enable { enable = true; };
+}
diff --git a/home/fish/default.nix b/home/fish/default.nix
new file mode 100644
index 0000000..1ba3d6c
--- /dev/null
+++ b/home/fish/default.nix
@@ -0,0 +1,13 @@
+{ config, lib, pkgs, ... }:
+let cfg = config.my.home.fish;
+in {
+  options.my.home.fish = with lib.my; {
+    enable = mkEnableOption "fish configuration";
+  };
+  config.programs.ssh = lib.mkIf cfg.enable {
+    enable = true;
+    interactiveShellInit = ''
+      set fish_greeting
+    '';
+  };
+}
diff --git a/home/flac/default.nix b/home/flac/default.nix
new file mode 100644
index 0000000..a97149f
--- /dev/null
+++ b/home/flac/default.nix
@@ -0,0 +1,16 @@
+{ config, lib, pkgs, ... }:
+let cfg = config.my.home.flac;
+in {
+  options.my.home.flac = with lib.my; {
+    enable = mkEnableOption "flac configuration";
+  };
+
+  config.home.packages = with pkgs;
+    lib.mkIf cfg.enable ([
+      flac
+      abcde
+      (pkgs.writers.writeDashBin "rip-flac" ''
+        ${pkgs.abcde}/bin/abcde -Vx -G -a "cddb,read,encode,tag,move,clean" -o flac
+      '')
+    ]);
+}
diff --git a/home/git/default.nix b/home/git/default.nix
new file mode 100644
index 0000000..3b0bc86
--- /dev/null
+++ b/home/git/default.nix
@@ -0,0 +1,51 @@
+{ lib, config, ... }:
+
+let cfg = config.my.home.git;
+in {
+  options.my.home.git = with lib.my; {
+    enable = mkEnableOption "git configuration";
+  };
+
+  config.programs.git = lib.mkIf cfg.enable {
+    enable = true;
+    aliases = {
+      s = "status --short --branch";
+      amend = "commit --amend --no-edit";
+    };
+    extraConfig = {
+      core.whitespace = "trailing-space,space-before-tab";
+      color.ui = "true";
+      push.default = "simple";
+      init.defaultBranch = "main";
+      branch.autosetuprebase = "remote";
+      branch.sort = "authordate";
+    };
+    userName = "Franck Cuny";
+    userEmail = "franck@fcuny.net";
+    extraConfig = {
+      "credential \"https://github.com\"" = { username = "fcuny"; };
+      "credential \"https://git.fcuny.net\"" = { username = "fcuny"; };
+    };
+    ignores = [
+      "*.elc"
+      "*.iml"
+      "*.o"
+      "*.pyc"
+      "*.pyo"
+      "*pyc"
+      "*~"
+      ".DS_Store"
+      ".\\#"
+      ".dir-locals.el"
+      ".direnv/*"
+      ".idea"
+      ".projectile"
+      ".pytest_cache/"
+      "/env/*"
+      "Icon"
+      "TAGS"
+      "\\#*\\#"
+      "tags"
+    ];
+  };
+}
diff --git a/home/go/default.nix b/home/go/default.nix
new file mode 100644
index 0000000..c316189
--- /dev/null
+++ b/home/go/default.nix
@@ -0,0 +1,16 @@
+{ config, ... }:
+let cfg = config.my.home.go;
+in {
+  options.my.home.go = with lib.my; {
+    enable = mkEnableOption "go configuration";
+  };
+
+  config.programs.go = lib.mkIf cfg.enable {
+    enable = true;
+    goPath = ".local/share/pkg.go";
+    goBin = ".local/bin.go";
+    goPrivate = [ "git.fcuny.net" "golang.fcuny.net" ];
+  };
+
+  # home.sessionPath = [ config.home.sessionVariables.GOBIN ];
+}
diff --git a/home/packages/default.nix b/home/packages/default.nix
new file mode 100644
index 0000000..ee75c74
--- /dev/null
+++ b/home/packages/default.nix
@@ -0,0 +1,18 @@
+{ config, lib, pkgs, ... }:
+let cfg = config.my.home.packages;
+in {
+  options.my.home.packages = with lib; {
+    enable = my.mkDisableOption "user packages";
+    additionalPackages = mkOption {
+      type = with types; listOf package;
+      default = [ ];
+      example = literalExample ''
+        with pkgs; [
+          pavucontrol
+        ]
+      '';
+    };
+  };
+  config.home.packages = with pkgs;
+    lib.mkIf cfg.enable ([ util-linux jq ripgrep ] ++ cfg.additionalPackages);
+}
diff --git a/home/python/default.nix b/home/python/default.nix
new file mode 100644
index 0000000..c7069e3
--- /dev/null
+++ b/home/python/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, lib, ... }:
+let cfg = config.my.home.python;
+in {
+  options.my.home.python = with lib.my; {
+    enable = mkEnableOption "python configuration";
+  };
+
+  config.home.packages = with pkgs; lib.mkIf cfg.enable ([ python310 ]);
+}
diff --git a/home/ssh/default.nix b/home/ssh/default.nix
new file mode 100644
index 0000000..a4eabbf
--- /dev/null
+++ b/home/ssh/default.nix
@@ -0,0 +1,23 @@
+{ config, lib, ... }:
+let cfg = config.my.home.ssh;
+in {
+  options.my.home.ssh = with lib.my; {
+    enable = mkEnableOption "ssh configuration";
+  };
+
+  config.programs.ssh = lib.mkIf cfg.enable {
+    enable = true;
+    forwardAgent = true;
+    serverAliveInterval = 60;
+    controlMaster = "auto";
+    controlPersist = "30m";
+    matchBlocks = {
+      "github.com" = {
+        hostname = "github.com";
+        user = "git";
+        forwardAgent = false;
+        extraOptions = { preferredAuthentications = "publickey"; };
+      };
+    };
+  };
+}
diff --git a/home/tmux/default.nix b/home/tmux/default.nix
new file mode 100644
index 0000000..d1d9993
--- /dev/null
+++ b/home/tmux/default.nix
@@ -0,0 +1,22 @@
+{ config, lib, pkgs, ... }:
+let cfg = config.my.home.tmux;
+in {
+  options.my.home.tmux = with lib.my; {
+    enable = mkEnableOption "tmux terminal multiplexer";
+  };
+
+  config.programs.tmux = lib.mkIf cfg.enable {
+    enable = true;
+
+    terminal = "xterm-256color";
+    escapeTime = 0;
+    aggressiveResize = true;
+    shortcut = "z";
+    clock24 = true;
+    historyLimit = 50000; # Bigger buffer
+
+    extraConfig = ''
+      setw -g mouse on
+    '';
+  };
+}
diff --git a/home/yt-dlp/config b/home/yt-dlp/config
new file mode 100644
index 0000000..4710c9f
--- /dev/null
+++ b/home/yt-dlp/config
@@ -0,0 +1,26 @@
+# Preferred formats:
+# 1. 1080p, combined, mp4 (for some non-youtube sites).
+# 2. 1080p, combined, any format (in case mp4 is not available).
+# 3. 1080p, best video + best audio (only available with separate video and audio on youtube).
+# 4. >30fps (any resolution), best video + best audio (only available with separate video and audio on youtube).
+# 5. 720p, pre-joined, because it is available on youtube.
+# 6. <720p, best video + best audio (480p and some other lower resolutions are only available with separate video and audio on youtube).
+# 7. When all else fails, take whatever youtube-dl thinks is the best (mainly for non-YT websites).
+--format="best[height=1080][ext=mp4]/best[height=1080]/bestvideo[height=1080][ext=mp4]+bestaudio[ext=m4a]/bestvideo[fps>30][ext=mp4]+bestaudio[ext=m4a]/best[height=720][ext=mp4]/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best"
+
+--sub-langs all
+--write-subs
+
+--convert-subs=srt
+
+--restrict-filenames
+--output="$HOME/media/videos/%(title)s.%(ext)s"
+--merge-output-format mkv
+
+--embed-metadata
+--embed-chapters
+--embed-info-json
+# create chapter entries to mark sponsor segments
+--sponsorblock-mark all
+
+--yes-playlist
diff --git a/home/yt-dlp/default.nix b/home/yt-dlp/default.nix
new file mode 100644
index 0000000..ce42014
--- /dev/null
+++ b/home/yt-dlp/default.nix
@@ -0,0 +1,12 @@
+{ config, lib, pkgs, ... }:
+let cfg = config.my.home.yt-dlp;
+in {
+  options.my.home.yt-dlp = with lib.my; {
+    enable = mkEnableOption "yt-dlp configuration";
+  };
+
+  config.programs.yt-dlp = lib.mkIf cfg.enable {
+    config.home.packages = with pkgs; [ yt-dlp ];
+    xdg.configFile."yt-dlp/config".source = config;
+  };
+}
diff --git a/hosts/tahoe/default.nix b/hosts/tahoe/default.nix
index c72baa0..dfac37c 100644
--- a/hosts/tahoe/default.nix
+++ b/hosts/tahoe/default.nix
@@ -4,6 +4,7 @@
   imports = [ # Include the results of the hardware scan.
     ./hardware-configuration.nix
     ./networking.nix
+    ./home.nix
     ../profiles/nas.nix
   ];
 
diff --git a/hosts/tahoe/home.nix b/hosts/tahoe/home.nix
new file mode 100644
index 0000000..7ea3830
--- /dev/null
+++ b/hosts/tahoe/home.nix
@@ -0,0 +1,17 @@
+{ pkgs, ... }:
+
+{
+  my.home = {
+    packages = { enable = true; };
+    tmux.enable = true;
+    git.enable = true;
+    ssh.enable = true;
+    fish.enable = true;
+    beets = {
+      enable = true;
+      musicDirectory = "/data/fast/music";
+    };
+    flac.enable = true;
+    yt-dlp.enable = true;
+  };
+}
diff --git a/modules/default.nix b/modules/default.nix
index 67d8e83..e593055 100644
--- a/modules/default.nix
+++ b/modules/default.nix
@@ -1 +1,23 @@
-{ ... }: { imports = [ ./hardware ./system ./services ]; }
+{ lib, ... }:
+
+{
+  imports = [ ./hardware ./system ./services ./home ];
+
+  options.my = with lib; {
+    user = {
+      name = mkOption {
+        type = types.str;
+        default = "fcuny";
+        example = "franck";
+        description = "my username";
+      };
+
+      home = {
+        enable = mkEnableOption {
+          description = "home-manager configuration";
+          default = true;
+        };
+      };
+    };
+  };
+}
diff --git a/modules/home/default.nix b/modules/home/default.nix
new file mode 100644
index 0000000..0261128
--- /dev/null
+++ b/modules/home/default.nix
@@ -0,0 +1,27 @@
+{ config, inputs, lib, ... }:
+let
+  actualPath = [ "home-manager" "users" config.my.user.name "my" "home" ];
+  aliasPath = [ "my" "home" ];
+
+  cfg = config.my.user.home;
+in {
+  imports = [
+    inputs.home-manager.nixosModule # enable home-manager options
+    (lib.mkAliasOptionModule aliasPath
+      actualPath) # simplify setting home options
+  ];
+
+  config = {
+    home-manager = {
+      # Not a fan of out-of-directory imports, but this is a good exception
+      users.${config.my.user.name} = import ../../home;
+
+      # Nix Flakes compatibility
+      useGlobalPkgs = true;
+      useUserPackages = true;
+
+      # Forward inputs to home-manager configuration
+      extraSpecialArgs = { inherit inputs; };
+    };
+  };
+}