From 0e00b8811a347017c7fb02093c170772ad17bd57 Mon Sep 17 00:00:00 2001 From: Martin Pander Date: Fri, 6 Feb 2026 15:23:14 +0100 Subject: [PATCH] Add nixos config --- nix/common.nix | 14 +- nix/flake.lock | 18 +- nix/nixos/MIGRATION.md | 206 +++++++++++++++++++++++ nix/nixos/QUICK_START.md | 107 ++++++++++++ nix/nixos/README.md | 282 ++++++++++++++++++++++++++++++++ nix/nixos/SUMMARY.md | 180 ++++++++++++++++++++ nix/nixos/TODO.md | 173 ++++++++++++++++++++ nix/nixos/configuration.nix | 60 +++++++ nix/nixos/configuration.nix.old | 64 ++++++++ nix/nixos/flake.lock | 86 ++++++++++ nix/nixos/flake.nix | 48 ++++++ nix/nixos/home.nix | 59 +++++++ nix/nixos/modules/dev.nix | 23 +++ nix/nixos/modules/git.nix | 88 ++++++++++ nix/nixos/modules/nvim.nix | 86 ++++++++++ nix/nixos/modules/sh.nix | 99 +++++++++++ nix/nixos/modules/task.nix | 75 +++++++++ nix/nixos/modules/tmux.nix | 73 +++++++++ nix/nixos/result | 1 + nix/user/dev.nix | 2 + nix/user/git.nix | 9 +- nix/user/nvim.nix | 2 +- nix/user/profiles/work.nix | 6 + nix/user/task.nix | 7 +- 24 files changed, 1754 insertions(+), 14 deletions(-) create mode 100644 nix/nixos/MIGRATION.md create mode 100644 nix/nixos/QUICK_START.md create mode 100644 nix/nixos/README.md create mode 100644 nix/nixos/SUMMARY.md create mode 100644 nix/nixos/TODO.md create mode 100644 nix/nixos/configuration.nix create mode 100644 nix/nixos/configuration.nix.old create mode 100644 nix/nixos/flake.lock create mode 100644 nix/nixos/flake.nix create mode 100644 nix/nixos/home.nix create mode 100644 nix/nixos/modules/dev.nix create mode 100644 nix/nixos/modules/git.nix create mode 100644 nix/nixos/modules/nvim.nix create mode 100644 nix/nixos/modules/sh.nix create mode 100644 nix/nixos/modules/task.nix create mode 100644 nix/nixos/modules/tmux.nix create mode 120000 nix/nixos/result diff --git a/nix/common.nix b/nix/common.nix index 2c349fd..4ddf994 100644 --- a/nix/common.nix +++ b/nix/common.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, pkgs, lib, ... }: { imports = [ @@ -16,6 +16,8 @@ # (pkgs.nerdfonts.override { fonts = [ "FiraCode" ]; }) pkgs.nerd-fonts.fira-code + pkgs.nix-ld + # (pkgs.writeShellScriptBin "my-hello" '' # echo "Hello, ${config.home.username}!" # '') @@ -30,6 +32,15 @@ # ''; }; + home.sessionVariables = { + NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ + stdenv.cc.cc + zlib + # Add other common libs here (glib, libx11, etc.) + ]; + NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker"; + }; + # Home Manager can also manage your environment variables through # 'home.sessionVariables'. If you don't want to manage your shell through Home # Manager then you have to manually source 'hm-session-vars.sh' located at @@ -48,7 +59,6 @@ #home.sessionVariables = { # EDITOR = "nvim"; #}; - #home.shellAliases = { # "ll" = "ls -la"; # "t" = "tmuxp"; diff --git a/nix/flake.lock b/nix/flake.lock index 2d22407..fc60680 100644 --- a/nix/flake.lock +++ b/nix/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1768798936, - "narHash": "sha256-eHld4id3TeD9Sxx5vgv58BnTl1fz+ewIKspz/kEoAE8=", + "lastModified": 1770164260, + "narHash": "sha256-mQgOAYWlVJyuyXjZN6yxqXWyODvQI5P/UZUCU7IOuYo=", "owner": "nix-community", "repo": "home-manager", - "rev": "2954aa29441a1a98901362e4d35515875761ad65", + "rev": "4fda26500b4539e0a1e3afba9f0e1616bdad4f85", "type": "github" }, "original": { @@ -27,11 +27,11 @@ ] }, "locked": { - "lastModified": 1768764703, - "narHash": "sha256-5ulSDyOG1U+1sJhkJHYsUOWEsmtLl97O0NTVMvgIVyc=", + "lastModified": 1770184146, + "narHash": "sha256-DsqnN6LvXmohTRaal7tVZO/AKBuZ02kPBiZKSU4qa/k=", "owner": "LnL7", "repo": "nix-darwin", - "rev": "0fc4e7ac670a0ed874abacf73c4b072a6a58064b", + "rev": "0d7874ef7e3ba02d58bebb871e6e29da36fa1b37", "type": "github" }, "original": { @@ -42,11 +42,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768564909, - "narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=", + "lastModified": 1770115704, + "narHash": "sha256-KHFT9UWOF2yRPlAnSXQJh6uVcgNcWlFqqiAZ7OVlHNc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f", + "rev": "e6eae2ee2110f3d31110d5c222cd395303343b08", "type": "github" }, "original": { diff --git a/nix/nixos/MIGRATION.md b/nix/nixos/MIGRATION.md new file mode 100644 index 0000000..119f13f --- /dev/null +++ b/nix/nixos/MIGRATION.md @@ -0,0 +1,206 @@ +# Migration Guide: Channels → Flakes + +## Why Migrate to Flakes? + +✅ **Reproducibility**: Lock files pin exact package versions +✅ **Latest unstable packages**: Easy access to nixos-unstable +✅ **Better for dotfiles**: Version control with exact dependencies +✅ **Modern approach**: Future of Nix configuration +✅ **You're ready**: You already have flakes enabled! + +## Current State (Channels) + +Your current setup: +```bash +/etc/nixos/configuration.nix # Channel-based, imports from +``` + +Commands: +```bash +sudo nix-channel --update +sudo nixos-rebuild switch +``` + +## Target State (Flakes) + +New setup: +```bash +/home/pan/dev/config/dot/nix/nixos/ +├── flake.nix # Declares inputs (nixpkgs, nixos-wsl, home-manager) +├── configuration.nix # System config (no imports needed) +├── home.nix # Your user config +└── modules/ # User modules +``` + +Commands: +```bash +nix flake update # Update dependencies +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix +``` + +## Migration Steps + +### Step 1: Test the Flake Configuration + +First, let's make sure it builds without applying: + +```bash +cd /home/pan/dev/config/dot/nix/nixos +nix flake check --impure # Validate syntax +sudo nixos-rebuild build --flake .#nix --impure # Test build +``` + +If successful, you'll see a `result` symlink. The `--impure` flag is needed for NIX_LD settings. + +### Step 2: Review What Will Change + +Compare your current and new configs: +```bash +diff /etc/nixos/configuration.nix /home/pan/dev/config/dot/nix/nixos/configuration.nix +``` + +Key differences: +- ❌ Removed: `imports = [ ]` +- ✅ Added: Flake manages these as inputs +- ✅ Uses: nixos-unstable (latest packages) +- ✅ Locks: Exact versions in flake.lock + +### Step 3: Apply the Flake Configuration + +**Option A: Direct (Recommended)** +```bash +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure +``` + +**Option B: Symlink to /etc/nixos (Optional)** +```bash +sudo mv /etc/nixos/configuration.nix /etc/nixos/configuration.nix.backup +sudo ln -s /home/pan/dev/config/dot/nix/nixos/flake.nix /etc/nixos/flake.nix +sudo ln -s /home/pan/dev/config/dot/nix/nixos/configuration.nix /etc/nixos/configuration.nix +sudo nixos-rebuild switch --flake /etc/nixos#nix --impure +``` + +### Step 4: Verify Everything Works + +After switching: +```bash +# Check system info +nixos-version + +# Check flake info +nix flake metadata /home/pan/dev/config/dot/nix/nixos + +# Test your tools +zsh --version +tmux -V +nvim --version +git --version +task --version +``` + +### Step 5: Set Up Convenient Alias (Optional) + +Add to your shell config: +```bash +alias nixos-update='cd /home/pan/dev/config/dot/nix/nixos && nix flake update && sudo nixos-rebuild switch --flake .#nix --impure' +alias nixos-rebuild-switch='sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure' +``` + +## Rollback Plan + +If anything goes wrong, you can always rollback: + +```bash +# List generations +sudo nix-env --list-generations --profile /nix/var/nix/profiles/system + +# Rollback to previous generation +sudo nixos-rebuild switch --rollback + +# Or select from boot menu +# Reboot and choose previous generation +``` + +Your old channel-based config is still at `/etc/nixos/configuration.nix.backup`. + +## Common Commands + +### With Flakes + +```bash +# Update all inputs (nixpkgs, home-manager, nixos-wsl) +nix flake update + +# Update just one input +nix flake lock --update-input nixpkgs + +# Apply configuration +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure + +# Test without applying +sudo nixos-rebuild build --flake /home/pan/dev/config/dot/nix/nixos#nix --impure + +# Check what changed +nix flake metadata /home/pan/dev/config/dot/nix/nixos +git diff flake.lock # See version changes +``` + +### Garbage Collection + +```bash +# Delete old generations (save disk space) +sudo nix-collect-garbage --delete-older-than 30d + +# Full cleanup +sudo nix-collect-garbage -d +sudo nix-store --optimise +``` + +## FAQ + +### Do I need to remove channels? + +No, but you can clean them up: +```bash +sudo nix-channel --list # See current channels +sudo nix-channel --remove nixos # Remove if desired +``` + +### Will my existing packages break? + +No! The flake uses the same package set (nixos-unstable). Your home-manager config stays the same. + +### What about `--impure` flag? + +You need it because `home.nix` uses `NIX_LD` which reads from the store at evaluation time. This is fine and expected for this use case. + +### Can I still use `nixos-rebuild switch` without flags? + +Not directly with flakes. But you can: +1. Create an alias (see Step 5) +2. Symlink to `/etc/nixos/flake.nix` and use `--flake /etc/nixos#nix` + +### How do I update packages now? + +```bash +# Update flake.lock to latest versions +nix flake update + +# Then rebuild +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure +``` + +## Benefits You'll Get + +1. **Exact versions**: `flake.lock` pins everything +2. **Faster updates**: Only download what changed +3. **Better caching**: Flakes have better binary cache hits +4. **Git-friendly**: Your whole system in version control +5. **Easy sharing**: Others can reproduce your exact system + +## Next Steps After Migration + +1. ✅ Commit your configuration to git +2. ✅ Remove old channels (optional) +3. ✅ Set up shell aliases +4. ✅ Enjoy reproducible configs! 🎉 diff --git a/nix/nixos/QUICK_START.md b/nix/nixos/QUICK_START.md new file mode 100644 index 0000000..455c06f --- /dev/null +++ b/nix/nixos/QUICK_START.md @@ -0,0 +1,107 @@ +# Quick Start Guide + +## TL;DR - Should I Use Flakes? + +**YES!** ✅ Use flakes because: + +1. You get **nixos-unstable** (latest packages) with reproducibility +2. Your config is in **git** with locked versions (flake.lock) +3. You **already have flakes enabled** in your system +4. It's the **modern, recommended approach** + +## Current vs Flake Setup + +### Current (Channels) ❌ +```bash +# Update +sudo nix-channel --update +sudo nixos-rebuild switch + +# Config location +/etc/nixos/configuration.nix + +# Package versions +Whatever the channel has (not locked) +``` + +### With Flakes (Recommended) ✅ +```bash +# Update +nix flake update +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure + +# Config location +/home/pan/dev/config/dot/nix/nixos/ + ├── flake.nix (inputs: nixpkgs unstable, home-manager, nixos-wsl) + ├── flake.lock (exact versions locked) + └── configuration.nix + +# Package versions +Locked in flake.lock, reproducible everywhere +``` + +## Apply the Flake Configuration Now + +### Step 1: Test it +```bash +cd /home/pan/dev/config/dot/nix/nixos +nix flake check --impure +sudo nixos-rebuild build --flake .#nix --impure +``` + +### Step 2: If successful, apply it +```bash +sudo nixos-rebuild switch --flake .#nix --impure +``` + +### Step 3: Verify +```bash +nixos-version +nix flake metadata /home/pan/dev/config/dot/nix/nixos +``` + +## What Changes? + +- ✅ Same packages, just from nixos-unstable (usually newer) +- ✅ Same home-manager config (all your dotfiles stay) +- ✅ Same NixOS-WSL functionality +- ✅ Exact versions locked in flake.lock +- ✅ Easy to rollback (NixOS generations) + +## Daily Usage + +```bash +# Make config changes +vim /home/pan/dev/config/dot/nix/nixos/home.nix + +# Apply +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure + +# Update packages (weekly/monthly) +cd /home/pan/dev/config/dot/nix/nixos +nix flake update +sudo nixos-rebuild switch --flake .#nix --impure + +# Rollback if needed +sudo nixos-rebuild switch --rollback +``` + +## Create Convenience Alias + +Add to your `~/.zshrc` or shell config: + +```bash +# Quick rebuild +alias nr='sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure' + +# Update and rebuild +alias nu='cd /home/pan/dev/config/dot/nix/nixos && nix flake update && sudo nixos-rebuild switch --flake .#nix --impure' +``` + +Then just run `nr` to rebuild! + +## Need Help? + +- Read [MIGRATION.md](MIGRATION.md) for detailed migration guide +- Read [README.md](README.md) for full documentation +- Check [TODO.md](TODO.md) for known issues diff --git a/nix/nixos/README.md b/nix/nixos/README.md new file mode 100644 index 0000000..c390e7d --- /dev/null +++ b/nix/nixos/README.md @@ -0,0 +1,282 @@ +# NixOS-WSL Configuration for pan + +This is a flake-based NixOS-WSL configuration ported from the standalone Home Manager setup. It provides a declarative, reproducible system configuration with integrated Home Manager and access to the latest unstable packages. + +## Structure + +``` +nixos/ +├── flake.nix # Flake with nixos-unstable, nixos-wsl, home-manager +├── flake.lock # Locked dependency versions (auto-generated) +├── configuration.nix # System-level NixOS-WSL configuration +├── home.nix # Home Manager user configuration +├── modules/ # User-level module configurations +│ ├── sh.nix # Shell (Zsh with Prezto, fzf, zoxide) +│ ├── tmux.nix # Tmux configuration +│ ├── git.nix # Git, Lazygit, Jujutsu +│ ├── nvim.nix # Neovim with 40+ plugins +│ ├── dev.nix # Development tools +│ └── task.nix # Taskwarrior, Timewarrior +├── README.md # This file +├── TODO.md # Known issues and future work +├── SUMMARY.md # Implementation overview +└── MIGRATION.md # Guide for migrating from channels to flakes +``` + +## Installation + +### 1. Test the Configuration (Recommended First Step) + +Before applying, validate and test build: + +```bash +cd /home/pan/dev/config/dot/nix/nixos + +# Validate flake syntax +nix flake check --impure + +# Test build without activating +sudo nixos-rebuild build --flake .#nix --impure +``` + +The `--impure` flag is needed for NIX_LD settings in the home configuration. + +### 2. Customize Configuration (Optional) + +Edit `configuration.nix` to adjust: +- **Hostname**: Change `networking.hostName` (current: "nix") +- **Timezone**: Change `time.timeZone` (current: "Europe/Berlin") +- **WSL user**: Change `wsl.defaultUser` (current: "pan") + +The current settings should work for your NixOS-WSL setup. + +### 3. Apply Configuration + +Apply the flake configuration: + +```bash +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure +``` + +Or from inside the directory: +```bash +cd /home/pan/dev/config/dot/nix/nixos +sudo nixos-rebuild switch --flake .#nix --impure +``` + +### 4. Verify Installation + +After applying, verify everything works: +```bash +# Check system +nixos-version + +# Check flake info +nix flake metadata /home/pan/dev/config/dot/nix/nixos + +# Test your tools +zsh --version +tmux -V +nvim --version +``` + +## Updating the Configuration + +After making changes to any configuration file: + +```bash +sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix --impure +``` + +## Updating System Packages + +To update all packages to the latest versions from nixos-unstable: + +```bash +cd /home/pan/dev/config/dot/nix/nixos + +# Update flake inputs (nixpkgs, home-manager, nixos-wsl) +nix flake update + +# Apply the updates +sudo nixos-rebuild switch --flake .#nix --impure +``` + +View what changed: +```bash +git diff flake.lock # See version bumps +``` + +## Rollback + +### Rollback to Previous Generation + +If something breaks after an update: +```bash +sudo nixos-rebuild switch --rollback +``` + +### List All Generations + +```bash +sudo nix-env --list-generations --profile /nix/var/nix/profiles/system +``` + +### Switch to Specific Generation + +```bash +sudo nixos-rebuild switch --switch-generation +``` + +### Rollback from Boot Menu + +At boot time, select "NixOS - All configurations" to see all previous generations and boot into any of them. + +## Differences from Original Ubuntu Configuration + +### Removed Features +- **macOS/Darwin support**: All nix-darwin references removed +- **WSL-specific paths**: Hard-coded Windows paths in tmux configuration removed +- **Platform conditionals**: Darwin and Windows checks cleaned up + +### System-Level Changes +- **User management**: User `pan` is now defined at the system level +- **Boot configuration**: Bootloader settings added +- **Networking**: NetworkManager enabled for network management +- **Zsh**: Enabled system-wide (configured via Home Manager) + +### Custom Packages Status + +The following custom packages from the original configuration are currently commented out in `modules/dev.nix`: +- `claude-code` +- `opencode` +- `gemini-cli` + +See [TODO.md](TODO.md) for information on integrating these packages. + +## Verification After Installation + +### Test Shell Environment +```bash +# Verify zsh is running +echo $SHELL + +# Test fzf (Ctrl+R for history search) +# Test zoxide +z /path/to/directory + +# Test lsd, bat +lsd +bat some-file +``` + +### Test Tmux +```bash +# Start tmux +tmux new -s test + +# Test custom keybindings: +# Alt+L/H - Next/previous window +# Alt+J/K - Next/previous session +# Ctrl+a + Ctrl+g - Lazygit popup +``` + +### Test Neovim +```bash +nvim test.nix + +# Inside nvim: +# :LspInfo - Check LSP status +# :checkhealth - Check overall health +``` + +### Test Git & VCS +```bash +git config --get user.name # Should be "Martin Pander" +git config --get user.email # Should be "martin.pander@knowtion.de" +lazygit --version +jj --version +``` + +### Test Taskwarrior +```bash +task --version # Should be 3.x +tt # taskwarrior-tui +timew --version +``` + +### Test Development Tools +```bash +direnv --version +visidata --version +``` + +## Common Tasks + +### Add a New Package + +Edit `home.nix` or the appropriate module file, then rebuild: +```bash +sudo nixos-rebuild switch --flake .#nixos +``` + +### Enable a System Service + +Edit `configuration.nix` to add the service, then rebuild: +```bash +sudo nixos-rebuild switch --flake .#nixos +``` + +### Cleanup Old Generations + +Remove old generations to free up disk space: +```bash +# Delete generations older than 30 days +sudo nix-collect-garbage --delete-older-than 30d + +# Or delete all old generations except current +sudo nix-collect-garbage -d +``` + +## Troubleshooting + +### Build Fails + +Check for syntax errors: +```bash +nix flake check +``` + +### Services Don't Start + +Check service status: +```bash +systemctl status +journalctl -u +``` + +### Home Manager Issues + +Rebuild Home Manager separately: +```bash +home-manager switch --flake .#pan +``` + +### NIX_LD Issues + +If you encounter issues running non-Nix binaries, check that NIX_LD variables are set: +```bash +echo $NIX_LD +echo $NIX_LD_LIBRARY_PATH +``` + +## Resources + +- [NixOS Manual](https://nixos.org/manual/nixos/stable/) +- [Home Manager Manual](https://nix-community.github.io/home-manager/) +- [Nixpkgs Search](https://search.nixos.org/packages) +- [NixOS Discourse](https://discourse.nixos.org/) + +## Support + +For issues specific to this configuration, see the TODO.md file for known limitations and planned improvements. diff --git a/nix/nixos/SUMMARY.md b/nix/nixos/SUMMARY.md new file mode 100644 index 0000000..3d3343b --- /dev/null +++ b/nix/nixos/SUMMARY.md @@ -0,0 +1,180 @@ +# NixOS Configuration - Implementation Summary + +This document summarizes the NixOS configuration that was created based on the migration plan. + +## What Was Created + +### Directory Structure + +``` +nixos/ +├── flake.nix # NixOS flake (no nix-darwin) +├── flake.lock # Flake lockfile (auto-generated) +├── configuration.nix # System-level configuration +├── hardware-configuration.nix # Hardware template (MUST be replaced) +├── home.nix # Home Manager integration +├── modules/ # User-level configurations +│ ├── sh.nix # Shell (Zsh, Prezto, fzf, zoxide) +│ ├── tmux.nix # Tmux (WSL paths removed) +│ ├── git.nix # Git, Lazygit, Jujutsu +│ ├── nvim.nix # Neovim with 40+ plugins +│ ├── dev.nix # Dev tools (direnv, visidata) +│ └── task.nix # Taskwarrior, Timewarrior +├── README.md # Installation and usage guide +├── TODO.md # Remaining tasks and issues +└── SUMMARY.md # This file +``` + +## Key Changes from Original Configuration + +### ✅ Removed +- **nix-darwin** input and outputs +- **macOS/Darwin** conditionals (lines 54-58 in sh.nix) +- **WSL** hard-coded paths (lines 31-32 in tmux.nix) +- **Windows** checks (lines 115-117 in sh.nix) + +### ✅ Added +- **System-level configuration** (configuration.nix) + - Boot loader setup (systemd-boot) + - Networking with NetworkManager + - User account definition + - System timezone and locale + - Nix flakes enabled + +- **Hardware configuration template** (hardware-configuration.nix) + - Placeholder for NixOS-generated config + - Must be replaced during installation + +### ✅ Modified +- **Home Manager integration** + - Now runs as NixOS module (not standalone) + - useGlobalPkgs enabled + - Removed allowUnfree (handled at system level) + +- **Shell configuration** (modules/sh.nix) + - Removed all platform-specific conditionals + - Clean Linux-only configuration + - Added `profileExtra` for .profile sourcing + +- **Tmux configuration** (modules/tmux.nix) + - Commented out note keybindings (C-n, C-p) + - Paths need to be updated for NixOS environment + +- **Development tools** (modules/dev.nix) + - Custom packages commented out: + - claude-code + - opencode + - gemini-cli + - TODO notes added for integration + +## Validation Status + +✅ Flake syntax is valid +✅ Configuration evaluates successfully +✅ All module imports resolve correctly +✅ No blocking errors found + +⚠️ Requires `--impure` flag due to NIX_LD settings + +## What Needs to Be Done Before Use + +### 🔴 Critical (Must Do) +1. **Replace hardware-configuration.nix** + ```bash + sudo nixos-generate-config --show-hardware-config > nixos/hardware-configuration.nix + ``` + +2. **Update hostname** in configuration.nix + - Currently set to: "nixos" + - Change to your actual hostname + +3. **Verify boot loader** choice in configuration.nix + - UEFI: systemd-boot (currently enabled) + - BIOS: GRUB (commented out) + +### 🟡 Important (Should Do) +1. **Verify timezone** in configuration.nix + - Currently: "Europe/Berlin" + +2. **Check locale settings** in configuration.nix + - Currently: en_US.UTF-8 / de_DE.UTF-8 + +3. **Verify nvim lua files** exist at: + - `/home/pan/dev/config/dot/nvim/base.lua` + - `/home/pan/dev/config/dot/nvim/keymaps.lua` + - `/home/pan/dev/config/dot/nvim/plugins.lua` + - `/home/pan/dev/config/dot/nvim/filetype.lua` + +### 🟢 Optional (Nice to Have) +1. **Update tmux note paths** in modules/tmux.nix (C-n, C-p keybindings) +2. **Add custom packages** (claude-code, opencode, gemini-cli) +3. **Review and customize** any other settings + +## How to Apply + +### Test Build (Recommended First) +```bash +cd /home/pan/dev/config/dot/nix/nixos +sudo nixos-rebuild build --flake .#nixos --impure +``` + +### Apply Configuration +```bash +cd /home/pan/dev/config/dot/nix/nixos +sudo nixos-rebuild switch --flake .#nixos --impure +``` + +### Update Packages +```bash +nix flake update +sudo nixos-rebuild switch --flake .#nixos --impure +``` + +## Verification Checklist + +After applying the configuration, verify: + +- [ ] System boots successfully +- [ ] User 'pan' can login +- [ ] Zsh loads with Prezto theme +- [ ] fzf keybindings work (Ctrl+R) +- [ ] zoxide works (`cd` command) +- [ ] Tmux starts without errors +- [ ] Neovim opens with all plugins +- [ ] Git config shows correct user +- [ ] Lazygit and Jujutsu work +- [ ] Taskwarrior shows version 3.x +- [ ] Direnv loads .envrc files + +## Files Preserved + +The original Home Manager configuration remains untouched: +- `/home/pan/dev/config/dot/nix/flake.nix` +- `/home/pan/dev/config/dot/nix/common.nix` +- `/home/pan/dev/config/dot/nix/user/*` + +You can continue using the Ubuntu setup alongside this NixOS configuration. + +## Documentation + +- **README.md**: Complete installation and usage guide +- **TODO.md**: Detailed list of remaining tasks and known issues +- **SUMMARY.md**: This file - quick overview and status + +## Support + +For issues or questions: +1. Check TODO.md for known issues +2. Review README.md for troubleshooting +3. Consult NixOS manual: https://nixos.org/manual/nixos/stable/ + +## Next Steps + +1. ✅ Configuration created successfully +2. ⏳ Replace hardware-configuration.nix +3. ⏳ Update hostname and timezone +4. ⏳ Test build configuration +5. ⏳ Apply configuration +6. ⏳ Verify all components work + +Good luck with your NixOS migration! 🚀 diff --git a/nix/nixos/TODO.md b/nix/nixos/TODO.md new file mode 100644 index 0000000..c56422e --- /dev/null +++ b/nix/nixos/TODO.md @@ -0,0 +1,173 @@ +# TODO - NixOS Configuration + +This file tracks remaining tasks and known issues for the NixOS configuration. + +## High Priority + +### Hardware Configuration +- [ ] Replace `hardware-configuration.nix` with actual generated configuration + - Run `sudo nixos-generate-config --show-hardware-config > hardware-configuration.nix` + - Verify file systems are correctly configured + - Verify boot partition is correct + - Adjust CPU microcode (Intel vs AMD) + +### System Settings +- [ ] Set correct hostname in `configuration.nix` +- [ ] Verify timezone setting (currently: Europe/Berlin) +- [ ] Verify locale settings (currently: en_US.UTF-8 / de_DE.UTF-8) +- [ ] Choose boot loader (systemd-boot vs GRUB) + +## Medium Priority + +### Custom Packages + +The following packages need to be integrated or replaced: + +- [ ] **claude-code** + - Check if available in nixpkgs + - If custom: create derivation in `packages/claude-code.nix` + - Or use alternative package manager (npm, pip, cargo) + +- [ ] **opencode** + - Check if available in nixpkgs + - If custom: create derivation in `packages/opencode.nix` + - Or use alternative package manager + +- [ ] **gemini-cli** + - Check if available in nixpkgs + - If custom: create derivation in `packages/gemini-cli.nix` + - Or use alternative package manager + +### Tmux Configuration + +- [ ] Update note popup keybindings (C-n, C-p) with correct NixOS paths + - Current: Commented out (had WSL hard-coded paths) + - Action: Decide on note location and update paths + - Example: `~/Documents/notes/Work/quick_notes.md` + +- [ ] Verify `~/bin/tmuxp_selector.sh` script exists + - Used by `C-s` keybinding + - May need to be created or path adjusted + +## Low Priority + +### Shell Configuration + +- [ ] Consider adding additional shell aliases +- [ ] Review if any macOS-specific tools need Linux alternatives +- [ ] Consider adding dircolors configuration + +### Documentation + +- [ ] Add screenshots of tmux setup +- [ ] Document custom Neovim configuration (lua files) +- [ ] Create troubleshooting guide for common issues + +### Optimizations + +- [ ] Consider using `programs.zsh.shellInit` vs `initContent` +- [ ] Review if `nix-ld` is actually needed (check use cases) +- [ ] Consider splitting large modules into smaller files + +## Features Not Yet Ported + +These were not in the original Home Manager config but might be useful on NixOS: + +- [ ] Desktop environment / Window manager +- [ ] Display manager (GDM, SDDM, LightDM) +- [ ] Sound configuration (PipeWire/PulseAudio) +- [ ] Printing support +- [ ] Bluetooth support +- [ ] Docker / Podman +- [ ] Virtualization (QEMU/KVM) + +## Known Issues + +### Nvim Configuration Files + +The nvim configuration references lua files from the parent directory: +```nix +initLua = builtins.concatStringsSep "\n" [ + (lib.strings.fileContents ../../../nvim/base.lua) + (lib.strings.fileContents ../../../nvim/keymaps.lua) + (lib.strings.fileContents ../../../nvim/plugins.lua) + (lib.strings.fileContents ../../../nvim/filetype.lua) +]; +``` + +**Status**: Should work if nvim/ directory exists at `/home/pan/dev/config/dot/nvim/` + +**Action**: Verify these files exist or adjust paths + +### Profile Loading + +The shell configuration includes: +```nix +profileExtra = '' + source $HOME/.profile +''; +``` + +**Status**: Will fail silently if `~/.profile` doesn't exist + +**Action**: Either create `~/.profile` or remove this line if not needed + +## Testing Checklist + +Before considering this configuration complete: + +- [ ] System boots successfully +- [ ] User can login as `pan` +- [ ] Zsh loads with Prezto +- [ ] Tmux starts without errors +- [ ] Neovim opens and plugins load +- [ ] LSP servers work in Neovim +- [ ] Git commands work with correct identity +- [ ] Lazygit opens and works +- [ ] Jujutsu commands work +- [ ] Taskwarrior shows tasks +- [ ] Direnv loads `.envrc` files +- [ ] fzf keybindings work (Ctrl+R) +- [ ] zoxide navigation works +- [ ] All shell aliases work + +## Future Enhancements + +- [ ] Add backup/restore scripts +- [ ] Create CI/CD for testing configuration +- [ ] Add secrets management (agenix or sops-nix) +- [ ] Consider using flake-parts for better organization +- [ ] Add system monitoring tools +- [ ] Configure automatic updates +- [ ] Add custom shell functions +- [ ] Integrate with cloud sync for dotfiles + +## Notes + +### Differences from Ubuntu Setup + +1. **No macOS support**: All Darwin-specific code removed +2. **No WSL support**: WSL-specific paths and checks removed +3. **System-level user**: User defined in NixOS config, not standalone +4. **Integrated Home Manager**: HM runs as NixOS module, not standalone + +### Migration Path + +If migrating from existing Ubuntu setup: + +1. Backup current configuration +2. Install NixOS (keep Ubuntu if dual-boot) +3. Apply this configuration +4. Test all workflows +5. Import personal data (tasks, notes, etc.) +6. Verify custom packages availability + +## Questions to Resolve + +- [ ] What are the custom packages used for? +- [ ] Are there any private/work-specific configurations to add? +- [ ] Should we add any of the "Features Not Yet Ported"? +- [ ] Is GPU acceleration needed (NVIDIA, AMD)? +- [ ] Are there any cron jobs or systemd timers to configure? +- [ ] Should we enable fish or keep only zsh? +- [ ] Do we need any container tools (Docker, Podman)? diff --git a/nix/nixos/configuration.nix b/nix/nixos/configuration.nix new file mode 100644 index 0000000..2669159 --- /dev/null +++ b/nix/nixos/configuration.nix @@ -0,0 +1,60 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +# NixOS-WSL specific options are documented on the NixOS-WSL repository: +# https://github.com/nix-community/NixOS-WSL + +{ config, lib, pkgs, ... }: + +{ + wsl.enable = true; + wsl.defaultUser = "pan"; + wsl.interop.register = true; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It's perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "25.05"; # Did you read the comment? + + networking.hostName = "nix"; + #networking.networkmanager.enable = true; + + time.timeZone = "Europe/Berlin"; # Adjust to your timezone + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_DE.UTF-8"; + LC_IDENTIFICATION = "de_DE.UTF-8"; + LC_MEASUREMENT = "de_DE.UTF-8"; + LC_MONETARY = "de_DE.UTF-8"; + LC_NAME = "de_DE.UTF-8"; + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TELEPHONE = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + + users.users.pan = { + isNormalUser = true; + extraGroups = [ "networkmanager" "wheel" ]; + shell = pkgs.zsh; + }; + + programs.zsh.enable = true; + + nix.settings = { + experimental-features = [ "nix-command" "flakes" ]; + }; + + nixpkgs.config.allowUnfree = true; + + environment.systemPackages = with pkgs; [ + git + wget + curl + ]; +} diff --git a/nix/nixos/configuration.nix.old b/nix/nixos/configuration.nix.old new file mode 100644 index 0000000..b419d6c --- /dev/null +++ b/nix/nixos/configuration.nix.old @@ -0,0 +1,64 @@ +# NixOS-WSL Configuration +# This works with the flake.nix in this directory +# +# Apply with: +# sudo nixos-rebuild switch --flake /home/pan/dev/config/dot/nix/nixos#nix + +{ config, lib, pkgs, ... }: + +{ + # WSL-specific settings + wsl.enable = true; + wsl.defaultUser = "pan"; + wsl.interop.register = true; + + # Networking + networking.hostName = "nix"; + networking.networkmanager.enable = true; + + # Time zone and locale + time.timeZone = "Europe/Berlin"; + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_DE.UTF-8"; + LC_IDENTIFICATION = "de_DE.UTF-8"; + LC_MEASUREMENT = "de_DE.UTF-8"; + LC_MONETARY = "de_DE.UTF-8"; + LC_NAME = "de_DE.UTF-8"; + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TELEPHONE = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + + # User account + users.users.pan = { + isNormalUser = true; + description = "Martin Pander"; + extraGroups = [ "networkmanager" "wheel" ]; + shell = pkgs.zsh; + }; + + # Enable Zsh system-wide + programs.zsh.enable = true; + + # Nix settings + nix.settings = { + experimental-features = [ "nix-command" "flakes" ]; + }; + + # Allow unfree packages + nixpkgs.config.allowUnfree = true; + + # Minimal system packages (most go in Home Manager) + environment.systemPackages = with pkgs; [ + vim + git + wget + curl + ]; + + # NixOS version (don't change unless you know what you're doing) + system.stateVersion = "25.05"; +} diff --git a/nix/nixos/flake.lock b/nix/nixos/flake.lock new file mode 100644 index 0000000..f0f3c02 --- /dev/null +++ b/nix/nixos/flake.lock @@ -0,0 +1,86 @@ +{ + "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770318660, + "narHash": "sha256-yFVde8QZK7Dc0Xa8eQDsmxLX4NJNfL1NKfctSyiQgMY=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "471e6a065f9efed51488d7c51a9abbd387df91b8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "nixos-wsl": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769217863, + "narHash": "sha256-RY9kJDXD6+2Td/59LkZ0PFSereCXHdBX9wIkbYjRKCY=", + "owner": "nix-community", + "repo": "NixOS-WSL", + "rev": "38a5250e57f583662eac3b944830e4b9e169e965", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NixOS-WSL", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1770197578, + "narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nixos-wsl": "nixos-wsl", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/nixos/flake.nix b/nix/nixos/flake.nix new file mode 100644 index 0000000..84cea8f --- /dev/null +++ b/nix/nixos/flake.nix @@ -0,0 +1,48 @@ +{ + description = "NixOS-WSL configuration for pan"; + + inputs = { + # Use nixos-unstable for latest packages + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + # NixOS-WSL for WSL-specific functionality + nixos-wsl = { + url = "github:nix-community/NixOS-WSL"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + # Home Manager for user configuration + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { self, nixpkgs, nixos-wsl, home-manager, ... }: + let + system = "x86_64-linux"; + in + { + nixosConfigurations = { + # Use your hostname: "nix" + nix = nixpkgs.lib.nixosSystem { + inherit system; + modules = [ + # NixOS-WSL module + nixos-wsl.nixosModules.wsl + + # System configuration + ./configuration.nix + + # Home Manager as NixOS module + home-manager.nixosModules.home-manager + { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.pan = import ./home.nix; + } + ]; + }; + }; + }; +} diff --git a/nix/nixos/home.nix b/nix/nixos/home.nix new file mode 100644 index 0000000..7cacfce --- /dev/null +++ b/nix/nixos/home.nix @@ -0,0 +1,59 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./modules/sh.nix + ./modules/tmux.nix + ./modules/git.nix + ./modules/dev.nix + ./modules/nvim.nix + ./modules/task.nix + ]; + + # User details + home.username = "pan"; + home.homeDirectory = "/home/pan"; + + # Git and Jujutsu user configuration + programs.git.settings.user = { + name = "Martin Pander"; + email = "martin.pander@knowtion.de"; + }; + + programs.jujutsu.settings.user = { + name = "Martin Pander"; + email = "martin.pander@knowtion.de"; + }; + + # Home packages + home.packages = with pkgs; [ + nil # Nix LSP + nerd-fonts.fira-code + nix-ld + + # Language servers + yaml-language-server + marksman + dockerfile-language-server + ]; + + # NIX_LD settings for running non-Nix binaries + home.sessionVariables = { + NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ + stdenv.cc.cc + zlib + ]; + NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker"; + }; + + # Silence news display + news.display = "silent"; + + # Enable Home Manager self-management + programs.home-manager.enable = true; + + # This value determines the Home Manager release which the configuration is + # compatible with. This helps avoid breakage when a new Home Manager release + # introduces backwards incompatible changes. + home.stateVersion = "25.05"; +} diff --git a/nix/nixos/modules/dev.nix b/nix/nixos/modules/dev.nix new file mode 100644 index 0000000..7b3c42e --- /dev/null +++ b/nix/nixos/modules/dev.nix @@ -0,0 +1,23 @@ +{ config, pkgs, ... }: + +{ + programs.direnv = { + enable = true; + enableZshIntegration = true; + nix-direnv.enable = true; + }; + + home.packages = with pkgs; [ + visidata + bubblewrap + + # TODO: Custom packages - need to verify availability or create derivations + # These packages were in the original configuration but may need custom setup: + # claude-code + # opencode + # gemini-cli + + # Uncomment the above packages if they are available in your nixpkgs, + # or create custom derivations for them in a separate packages/ directory. + ]; +} diff --git a/nix/nixos/modules/git.nix b/nix/nixos/modules/git.nix new file mode 100644 index 0000000..b0a7763 --- /dev/null +++ b/nix/nixos/modules/git.nix @@ -0,0 +1,88 @@ +{ config, pkgs, ... }: + +{ + programs.git = { + enable = true; + settings = { + alias = { + st = "status"; + ci = "commit"; + co = "checkout"; + br = "branch"; + pl = "pull"; + ps = "push"; + sw = "switch"; + mno =" merge --no-ff"; + lg = "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit"; + cleanup = "!git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D"; + }; + + column.ui = "auto"; + branch.sort = "-committerdate"; + tag.sort = "version:refname"; + diff = { + algorithm = "histogram"; + colorMoved = "plain"; + mnemonicPrefix = "true"; + renames = "true"; + }; + pull.rebase = "true"; + push = { + default = "simple"; + autoSetupRemote = "true"; + followTags = "true"; + }; + fetch = { + prune = "true"; + pruneTags = "true"; + all = "true"; + }; + help.autocorrect = "prompt"; + commit.verbose = "true"; + rerere = { + enabled = "true"; + autoupdate = "true"; + }; + rebase = { + autoSquas = "true"; + autoStash = "true"; + updateRefs = "true"; + }; + merge.conflictstyle = "zdiff3"; + core.editor = "nvim"; + init.defaultBranch = "main"; + }; + + ignores = [ + ".direnv/" + ".envrc" + ]; + }; + + programs.difftastic = { + enable = true; + git.enable = true; + }; + + programs.lazygit = { + enable = true; + settings = { + theme.lightTheme = "true"; + git = { + log = { + format = "%C(yellow)%h%Creset %C(bold blue)<%an>%Creset %s %Cgreen(%cr)%Creset"; + graph = "true"; + }; + }; + }; + }; + + programs.jujutsu = { + enable = true; + settings = { + aliases = { + tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"]; + }; + }; + }; +} diff --git a/nix/nixos/modules/nvim.nix b/nix/nixos/modules/nvim.nix new file mode 100644 index 0000000..e26ced5 --- /dev/null +++ b/nix/nixos/modules/nvim.nix @@ -0,0 +1,86 @@ +{ config, pkgs, lib, ... }: + +{ + programs.neovim = { + enable = true; + + defaultEditor = true; + vimAlias = true; + + plugins = with pkgs.vimPlugins; [ + vim-repeat + vim-surround + ts-comments-nvim + vim-fugitive + gitsigns-nvim + nvim-tree-lua + targets-vim + mini-pairs + mini-align + mini-bracketed + mini-splitjoin + mini-move + mini-ai + mini-icons + flash-nvim + trouble-nvim + conform-nvim + nvim-lint + promise-async + nvim-ufo + vim-windowswap + plenary-nvim + telescope-nvim + telescope-fzf-native-nvim + telescope-ui-select-nvim + yanky-nvim + lualine-nvim + undotree + luasnip + nvim-cmp + cmp_luasnip + cmp-buffer + cmp-path + cmp-cmdline + cmp-nvim-lsp + cmp-nvim-lsp-signature-help + cmp_yanky + cmp-git + nvim-lspconfig + lspkind-nvim + copilot-lua + copilot-cmp + CopilotChat-nvim + bullets-vim + nvim-dap + nvim-nio + nvim-dap-ui + nvim-dap-virtual-text + nvim-dap-go + nvim-dap-python + nvim-dap-lldb + todo-comments-nvim + vim-markdown + zen-mode-nvim + plantuml-syntax + obsidian-nvim + render-markdown-nvim + image-nvim + img-clip-nvim + vim-nix + (nvim-treesitter.withPlugins (p: [ p.awk p.bash p.c p.c_sharp p.cpp p.css p.diff p.dockerfile p.doxygen p.git_config p.gitcommit p.go p.gomod p.gosum p.gotmpl p.helm p.haskell p.html p.http p.java p.javascript p.json p.latex p.lua p.markdown p.markdown_inline p.matlab p.nix p.printf p.python p.regex p.rust p.sql p.strace p.supercollider p.svelte p.swift p.terraform p.tmux p.toml p.typescript p.vim p.xml p.yaml p.zig ])) + ]; + + initLua = builtins.concatStringsSep "\n" [ + (lib.strings.fileContents ../../../nvim/base.lua) + (lib.strings.fileContents ../../../nvim/keymaps.lua) + (lib.strings.fileContents ../../../nvim/plugins.lua) + (lib.strings.fileContents ../../../nvim/filetype.lua) + ]; + }; + + home.packages = with pkgs; [ + nodejs-slim + marksman + ]; +} diff --git a/nix/nixos/modules/sh.nix b/nix/nixos/modules/sh.nix new file mode 100644 index 0000000..b87597c --- /dev/null +++ b/nix/nixos/modules/sh.nix @@ -0,0 +1,99 @@ +{ config, pkgs, lib, ... }: + +{ + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + + history.size = 500000; + + prezto = { + enable = true; + caseSensitive = true; + color = true; + editor = { + dotExpansion = true; + keymap = "vi"; + }; + pmodules = [ + "environment" + "terminal" + "editor" + "history" + "directory" + "spectrum" + "utility" + "completion" + "syntax-highlighting" + "history-substring-search" + "prompt" + "git" + ]; + prompt.theme = "minimal"; + syntaxHighlighting.highlighters = [ + "main" + "brackets" + "pattern" + "line" + "cursor" + "root" + ]; + tmux = { + autoStartLocal = true; + itermIntegration = true; + }; + }; + + initContent = '' + HISTCONTROL='erasedups:ignoreboth' + HISTIGNORE='&:[ ]*:exit:ls:bg:fg:history:clear' + unsetopt beep + ''; + + profileExtra = '' + source $HOME/.profile + ''; + }; + + programs.fzf = { + enable = true; + enableZshIntegration = true; + }; + + programs.lsd = { + enable = true; + enableZshIntegration = true; + }; + + programs.zoxide = { + enable = true; + enableZshIntegration = true; + options = [ + "--cmd cd" + ]; + }; + + programs.bat.enable = true; + programs.ripgrep.enable = true; + programs.btop.enable = true; + programs.ranger.enable = true; + + home.packages = with pkgs; [ + fd + dust + glow + ripgrep-all + viddy + duf + ]; + + home.sessionVariables = { + BAT_THEME = "Coldark-Cold"; + }; + + home.shellAliases = { + lst = "lsd --tree"; + }; +} diff --git a/nix/nixos/modules/task.nix b/nix/nixos/modules/task.nix new file mode 100644 index 0000000..e0bcab0 --- /dev/null +++ b/nix/nixos/modules/task.nix @@ -0,0 +1,75 @@ +{config, pkgs, lib, ...}: + +{ + programs.taskwarrior = { + enable = true; + colorTheme = "light-256"; + package = pkgs.taskwarrior3; + config = { + weekstart = "monday"; + + uda.tasksquire.tags.default="code,comm,cust,del,doc,mngmnt,ops,rsrch,rvw,track"; + + uda.parenttask.type="string"; + uda.parenttask.label="Parent"; + + uda.energy.type="string"; + uda.energy.label="Energy"; + uda.energy.values="h,m,l"; + uda.energy.default="m"; + + uda.priority.values = "H,M,,L"; + urgency.uda.priority.L.coefficient = -0.5; + urgency.user.tag.deferred.coefficient = -15.0; + urgency.user.tag.cust.coefficient = 5.0; + urgency.user.tag.fixed.coefficient = -100.0; + + report.next.columns="id,start.age,entry.age,depends,priority,energy,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency"; + report.next.labels="ID,Active,Age,Deps,P,E,Project,Tag,Recur,S,Due,Until,Description,Urg"; + report.next.filter="status:pending -WAITING -deferred -track"; + + report.time.columns="id,start.age,entry.age,depends,priority,energy,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency"; + report.time.labels="ID,Active,Age,Deps,P,E,Project,Tag,Recur,S,Due,Until,Description,Urg"; + report.time.filter="status:pending -WAITING -deferred +fixed"; + + report.deferred.columns="id,start.age,entry.age,depends,priority,energy,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency"; + report.deferred.context="1"; + report.deferred.description="Deferred and waiting tasks"; + report.deferred.labels="ID,Active,Age,Deps,P,E,Project,Tag,Recur,S,Due,Until,Description,Urg"; + report.deferred.filter="status:pending +deferred"; + report.deferred.sort="urgency-"; + + report.low.columns="id,start.age,entry.age,depends,priority,energy,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency"; + report.low.context="1"; + report.low.description="Low energy tasks"; + report.low.filter="status:pending -WAITING -deferred"; + report.low.labels="ID,Active,Age,Deps,P,E,Project,Tag,Recur,S,Due,Until,Description,Urg"; + report.low.sort="energy+,urgency-"; + + context.today.read = "(prio:H or +next)"; + context.today.write = "prio:H +next"; + context.deferred.read = "+deferred"; + context.deferred.write = "+deferred"; + context.customer.read = "+cust"; + context.customer.write = "+cust"; + context.low_energy.read = "+low"; + context.low_energy.write = "+low"; + + uda.taskwarrior-tui.task-report.show-info = false; + uda.taskwarrior-tui.selection.reverse = "yes"; + }; + }; + + home.packages = with pkgs; [ + taskwarrior-tui + timewarrior + ]; + + home.shellAliases = lib.mkMerge [ { + t = "task"; + tt = "taskwarrior-tui"; + tw = "timew"; + tws = "timew summary :ids"; + } + ]; +} diff --git a/nix/nixos/modules/tmux.nix b/nix/nixos/modules/tmux.nix new file mode 100644 index 0000000..81774b0 --- /dev/null +++ b/nix/nixos/modules/tmux.nix @@ -0,0 +1,73 @@ +{ config, pkgs, lib, ... }: + +{ + programs.tmux = { + enable = true; + shortcut = "a"; + mouse = true; + keyMode = "vi"; + escapeTime = 0; + terminal = "screen-256color"; + tmuxp.enable = true; + extraConfig = '' + set -g display-time 1500 + + unbind S + bind S command-prompt "switch -t %1" + + bind-key -n M-K switch-client -p + bind-key -n M-J switch-client -n + + bind-key -n M-L next-window + bind-key -n M-H previous-window + + bind '"' split-window -c "#{pane_current_path}" + bind % split-window -h -c "#{pane_current_path}" + bind c new-window -a -c "#{pane_current_path}" + + bind C-s display-popup -E "zsh ~/bin/tmuxp_selector.sh" + bind C-g display-popup -E -d "#{pane_current_path}" -xC -yC -w 95% -h 95% "lazygit" + bind C-t display-popup -E -xC -yC -w 95% -h 95% "tasksquire" + # Note: The following keybindings had hard-coded WSL paths that were removed. + # Adjust the paths below to match your NixOS environment: + # bind C-n display-popup -E -xC -yC -w 95% -h 95% -d "~/Documents/notes/Work/" "vim quick_notes.md" + # bind C-p display-popup -E -xC -yC -w 95% -h 95% -d "~/Documents/notes/Work/development/" "vim mbpr.md" + + ####################################### + # status line + ####################################### + set -g status-justify centre + + set -g status-left "#[bg=#808080,fg=#ffffff,bold] #S #[default]#[bg=#BCBCBC] #{-30:pane_title} " + set -g status-left-length 40 + + set -g status-right "#[bg=#BCBCBC] %H:%M #[bg=#808080,fg=#ffffff] %d.%m.%y " + + # setw -g window-status-format " #W#F " + # setw -g window-status-current-format " #W#F " + setw -g window-status-format " #W " + setw -g window-status-current-format " #W " + setw -g window-status-separator "" + + ####################################### + # colors, taken from vim-lucius + ####################################### + set -g status-style "bg=#DADADA,fg=#000000" + + setw -g window-status-style "bg=#BCBCBC,fg=#000000" + setw -g window-status-current-style "bg=#808080,fg=#ffffff" + + setw -g window-status-activity-style "bg=#AFD7AF,fg=#000000" + setw -g window-status-bell-style "bg=#AFD7AF,fg=#000000" + #setw -g window-status-content-style "bg=#AFD7AF,fg=#000000" + + set -g pane-active-border-style "bg=#eeeeee,fg=#006699" + set -g pane-border-style "bg=#eeeeee,fg=#999999" + ''; + }; + + home.shellAliases = { + "o" = "tmuxp"; + "ol" = "tmuxp load"; + }; +} diff --git a/nix/nixos/result b/nix/nixos/result new file mode 120000 index 0000000..224a89b --- /dev/null +++ b/nix/nixos/result @@ -0,0 +1 @@ +/nix/store/sdjnb1hp96jbv904y92vnil7cjnc8x78-nixos-system-nix-26.05.20260204.00c21e4 \ No newline at end of file diff --git a/nix/user/dev.nix b/nix/user/dev.nix index 4261a02..1434c25 100644 --- a/nix/user/dev.nix +++ b/nix/user/dev.nix @@ -11,6 +11,8 @@ visidata claude-code opencode + gemini-cli + bubblewrap # crush ]; } diff --git a/nix/user/git.nix b/nix/user/git.nix index 067fe8e..b0a7763 100644 --- a/nix/user/git.nix +++ b/nix/user/git.nix @@ -77,5 +77,12 @@ }; }; - programs.jujutsu.enable = true; + programs.jujutsu = { + enable = true; + settings = { + aliases = { + tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"]; + }; + }; + }; } diff --git a/nix/user/nvim.nix b/nix/user/nvim.nix index c39fb57..8c34ac5 100644 --- a/nix/user/nvim.nix +++ b/nix/user/nvim.nix @@ -75,7 +75,7 @@ # set t_vb= # ''; - extraLuaConfig = builtins.concatStringsSep "\n" [ + initLua = builtins.concatStringsSep "\n" [ (lib.strings.fileContents ../../nvim/base.lua) (lib.strings.fileContents ../../nvim/keymaps.lua) (lib.strings.fileContents ../../nvim/plugins.lua) diff --git a/nix/user/profiles/work.nix b/nix/user/profiles/work.nix index 353d8ff..1e19b8e 100644 --- a/nix/user/profiles/work.nix +++ b/nix/user/profiles/work.nix @@ -10,6 +10,12 @@ name = "Martin Pander"; email = "martin.pander@knowtion.de"; }; + + programs.jujutsu.settings.user = { + name = "Martin Pander"; + email = "martin.pander@knowtion.de"; + }; + home.packages = with pkgs; [ yaml-language-server diff --git a/nix/user/task.nix b/nix/user/task.nix index 6ec7435..e0bcab0 100644 --- a/nix/user/task.nix +++ b/nix/user/task.nix @@ -8,6 +8,11 @@ config = { weekstart = "monday"; + uda.tasksquire.tags.default="code,comm,cust,del,doc,mngmnt,ops,rsrch,rvw,track"; + + uda.parenttask.type="string"; + uda.parenttask.label="Parent"; + uda.energy.type="string"; uda.energy.label="Energy"; uda.energy.values="h,m,l"; @@ -21,7 +26,7 @@ report.next.columns="id,start.age,entry.age,depends,priority,energy,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency"; report.next.labels="ID,Active,Age,Deps,P,E,Project,Tag,Recur,S,Due,Until,Description,Urg"; - report.next.filter="status:pending -WAITING -deferred"; + report.next.filter="status:pending -WAITING -deferred -track"; report.time.columns="id,start.age,entry.age,depends,priority,energy,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency"; report.time.labels="ID,Active,Age,Deps,P,E,Project,Tag,Recur,S,Due,Until,Description,Urg";