initial commit
132
README.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# SaugOS
|
||||
|
||||
A dev-focused NixOS configuration for older laptops, distilled from [ZaneyOS](https://gitlab.com/Zaney/zaneyos). Uses the **Niri** scrolling tiling Wayland compositor with Catppuccin Mocha theming, Waybar, and a curated set of development tools.
|
||||
|
||||
## What's Included
|
||||
|
||||
- **Niri** window manager with full keybindings, window rules, and waybar integration
|
||||
- **Neovim** (via nvf) with LSP, Treesitter, Telescope — full IDE setup
|
||||
- **VS Code**, **Ghostty**, **Kitty**, **Tmux**
|
||||
- **Zsh** with Powerlevel10k, Oh-My-Zsh, syntax highlighting
|
||||
- **Yazi** file manager, **lazygit**, **bat**, **eza**, **fzf**, **zoxide**
|
||||
- **Stylix** system-wide theming (Catppuccin Mocha, JetBrains Mono)
|
||||
- **TLP** + **thermald** for laptop power management
|
||||
- **Docker** for containerized development
|
||||
- **Rofi** launcher, **swaync** notifications, **wlogout**
|
||||
- No gaming packages, no NVIDIA drivers, lightweight kernel
|
||||
|
||||
## Requirements
|
||||
|
||||
- A NixOS installation (25.11+) with flakes enabled
|
||||
- x86_64 system with Intel or AMD integrated graphics (or a VM)
|
||||
- The repo must live at `~/zaneyos/SaugOS` (or update `modules/core/nh.nix`)
|
||||
|
||||
## Installation
|
||||
|
||||
### 1. Clone into position
|
||||
|
||||
```bash
|
||||
cd ~/zaneyos # parent repo
|
||||
cd SaugOS
|
||||
```
|
||||
|
||||
### 2. Configure your host
|
||||
|
||||
Copy the default host template for your machine:
|
||||
|
||||
```bash
|
||||
cp -r hosts/default hosts/<your-hostname>
|
||||
```
|
||||
|
||||
Edit `hosts/<your-hostname>/variables.nix` to set your preferences:
|
||||
|
||||
- `gitUsername` / `gitEmail` — your identity
|
||||
- `terminal` — default terminal (`ghostty`, `kitty`, `alacritty`, `wezterm`)
|
||||
- `browser` — default browser
|
||||
- `keyboardLayout` — keyboard layout (`us`, `de`, etc.)
|
||||
- `clock24h` — 24-hour clock format
|
||||
- `stylixImage` — wallpaper/theme source image
|
||||
- Toggle `tmuxEnable`, `vscodeEnable`, `ghosttyEnable`, etc.
|
||||
|
||||
### 3. Generate hardware config
|
||||
|
||||
```bash
|
||||
sudo nixos-generate-config --show-hardware-config > hosts/<your-hostname>/hardware.nix
|
||||
```
|
||||
|
||||
### 4. Update flake.nix
|
||||
|
||||
Edit `flake.nix` and set the `host` and `profile` variables:
|
||||
|
||||
```nix
|
||||
host = "<your-hostname>";
|
||||
profile = "intel"; # or "amd" or "vm"
|
||||
```
|
||||
|
||||
### 5. Build and switch
|
||||
|
||||
```bash
|
||||
# Stage files so the flake can see them
|
||||
git add -A
|
||||
|
||||
# Build the system
|
||||
sudo nixos-rebuild switch --flake .#<profile>
|
||||
```
|
||||
|
||||
Where `<profile>` is `intel`, `amd`, or `vm`.
|
||||
|
||||
### After first boot
|
||||
|
||||
The included CLI tool `saugcli` handles ongoing management:
|
||||
|
||||
```bash
|
||||
saugcli rebuild # Rebuild and switch
|
||||
saugcli rebuild-boot # Rebuild for next boot
|
||||
saugcli update # Update flake inputs + rebuild
|
||||
saugcli cleanup # Remove old generations
|
||||
saugcli diag # Generate hardware report
|
||||
saugcli trim # SSD TRIM
|
||||
saugcli update-host # Auto-detect and set host/profile in flake.nix
|
||||
saugcli add-host <name> # Add a new host from the default template
|
||||
```
|
||||
|
||||
Options for `rebuild`/`update`:
|
||||
- `--dry` / `-n` — preview without applying
|
||||
- `--ask` / `-a` — confirmation prompts
|
||||
- `--cores N` — limit CPU cores (useful on low-resource machines)
|
||||
- `--verbose` / `-v` — detailed output
|
||||
|
||||
## Profiles
|
||||
|
||||
| Profile | GPU | Use Case |
|
||||
|---------|-----|----------|
|
||||
| `intel` | Intel integrated | Most older laptops |
|
||||
| `amd` | AMD integrated | AMD-based laptops |
|
||||
| `vm` | VirtIO/VMware | Virtual machines |
|
||||
|
||||
## Key Files
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `flake.nix` | Inputs, outputs, host/profile selection |
|
||||
| `hosts/<host>/variables.nix` | Per-machine settings (control panel) |
|
||||
| `hosts/<host>/hardware.nix` | Hardware scan output |
|
||||
| `hosts/<host>/host-packages.nix` | Machine-specific packages |
|
||||
| `modules/core/packages.nix` | System-wide packages |
|
||||
| `modules/home/niri/binds.nix` | Keybindings |
|
||||
| `modules/home/scripts/saugcli.nix` | CLI management tool |
|
||||
|
||||
## Default Keybindings (Niri)
|
||||
|
||||
| Key | Action |
|
||||
|-----|--------|
|
||||
| `Super + Return` | Open terminal |
|
||||
| `Super + D` | Rofi app launcher |
|
||||
| `Super + Q` | Close window |
|
||||
| `Super + 1-9` | Switch workspace |
|
||||
| `Super + Shift + 1-9` | Move window to workspace |
|
||||
| `Super + H/J/K/L` | Focus left/down/up/right |
|
||||
| `Super + Shift + H/L` | Move column left/right |
|
||||
| `Super + F` | Maximize column |
|
||||
| `Super + Shift + F` | Fullscreen |
|
||||
| `Super + Print` | Screenshot (region) |
|
||||
652
flake.lock
generated
Normal file
@@ -0,0 +1,652 @@
|
||||
{
|
||||
"nodes": {
|
||||
"base16": {
|
||||
"inputs": {
|
||||
"fromYaml": "fromYaml"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1755819240,
|
||||
"narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=",
|
||||
"owner": "SenchoPens",
|
||||
"repo": "base16.nix",
|
||||
"rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "SenchoPens",
|
||||
"repo": "base16.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"base16-fish": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1765809053,
|
||||
"narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=",
|
||||
"owner": "tomyun",
|
||||
"repo": "base16-fish",
|
||||
"rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tomyun",
|
||||
"repo": "base16-fish",
|
||||
"rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"base16-helix": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1760703920,
|
||||
"narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-helix",
|
||||
"rev": "d646af9b7d14bff08824538164af99d0c521b185",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-helix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"base16-vim": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1732806396,
|
||||
"narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-vim",
|
||||
"rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-vim",
|
||||
"rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"firefox-gnome-theme": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1764873433,
|
||||
"narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
|
||||
"owner": "rafaelmardojai",
|
||||
"repo": "firefox-gnome-theme",
|
||||
"rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rafaelmardojai",
|
||||
"repo": "firefox-gnome-theme",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1751685974,
|
||||
"narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1",
|
||||
"revCount": 92,
|
||||
"type": "git",
|
||||
"url": "https://git.lix.systems/lix-project/flake-compat.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://git.lix.systems/lix-project/flake-compat.git"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
"nvf",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769996383,
|
||||
"narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts_2": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
"stylix",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1767609335,
|
||||
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"fromYaml": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1731966426,
|
||||
"narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=",
|
||||
"owner": "SenchoPens",
|
||||
"repo": "fromYaml",
|
||||
"rev": "106af9e2f715e2d828df706c386a685698f3223b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "SenchoPens",
|
||||
"repo": "fromYaml",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gnome-shell": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"host": "gitlab.gnome.org",
|
||||
"lastModified": 1767737596,
|
||||
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
|
||||
"owner": "GNOME",
|
||||
"repo": "gnome-shell",
|
||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"host": "gitlab.gnome.org",
|
||||
"owner": "GNOME",
|
||||
"ref": "gnome-49",
|
||||
"repo": "gnome-shell",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774274588,
|
||||
"narHash": "sha256-dnHvv5EMUgTzGZmA+3diYjQU2O6BEpGLEOgJ1Qe9LaY=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "cf9686ba26f5ef788226843bc31fda4cf72e373b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "release-25.11",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"mnw": {
|
||||
"locked": {
|
||||
"lastModified": 1770419553,
|
||||
"narHash": "sha256-b1XqsH7AtVf2dXmq2iyRr2NC1yG7skY7Z6N2MpWHlK4=",
|
||||
"owner": "Gerg-L",
|
||||
"repo": "mnw",
|
||||
"rev": "2aaffa8030d0b262176146adbb6b0e6374ce2957",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Gerg-L",
|
||||
"repo": "mnw",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"ndg": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nvf",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1768214250,
|
||||
"narHash": "sha256-hnBZDQWUxJV3KbtvyGW5BKLO/fAwydrxm5WHCWMQTbw=",
|
||||
"owner": "feel-co",
|
||||
"repo": "ndg",
|
||||
"rev": "a6bd3c1ce2668d096e4fdaaa03ad7f03ba1fbca8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "feel-co",
|
||||
"ref": "refs/tags/v2.6.0",
|
||||
"repo": "ndg",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"niri": {
|
||||
"inputs": {
|
||||
"niri-stable": "niri-stable",
|
||||
"niri-unstable": "niri-unstable",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable",
|
||||
"xwayland-satellite-stable": "xwayland-satellite-stable",
|
||||
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774283383,
|
||||
"narHash": "sha256-3aCfmL8hOcdIl783LTnK+lHcjMGCnc+2zQ98xUyefCU=",
|
||||
"owner": "sodiboo",
|
||||
"repo": "niri-flake",
|
||||
"rev": "8a583029606cf072cc01c7e2f4298cc75a7ada28",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "sodiboo",
|
||||
"repo": "niri-flake",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"niri-stable": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1756556321,
|
||||
"narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=",
|
||||
"owner": "YaLTeR",
|
||||
"repo": "niri",
|
||||
"rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "YaLTeR",
|
||||
"ref": "v25.08",
|
||||
"repo": "niri",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"niri-unstable": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1773130184,
|
||||
"narHash": "sha256-3bwx4WqCB06yfQIGB+OgIckOkEDyKxiTD5pOo4Xz2rI=",
|
||||
"owner": "YaLTeR",
|
||||
"repo": "niri",
|
||||
"rev": "b07bde3ee82dd73115e6b949e4f3f63695da35ea",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "YaLTeR",
|
||||
"repo": "niri",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-flatpak": {
|
||||
"locked": {
|
||||
"lastModified": 1767983141,
|
||||
"narHash": "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs=",
|
||||
"owner": "gmodena",
|
||||
"repo": "nix-flatpak",
|
||||
"rev": "440818969ac2cbd77bfe025e884d0aa528991374",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "gmodena",
|
||||
"ref": "latest",
|
||||
"repo": "nix-flatpak",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1774244481,
|
||||
"narHash": "sha256-4XfMXU0DjN83o6HWZoKG9PegCvKvIhNUnRUI19vzTcQ=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "4590696c8693fea477850fe379a01544293ca4e2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1774244481,
|
||||
"narHash": "sha256-4XfMXU0DjN83o6HWZoKG9PegCvKvIhNUnRUI19vzTcQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "4590696c8693fea477850fe379a01544293ca4e2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1774106199,
|
||||
"narHash": "sha256-US5Tda2sKmjrg2lNHQL3jRQ6p96cgfWh3J1QBliQ8Ws=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "6c9a78c09ff4d6c21d0319114873508a6ec01655",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1771008912,
|
||||
"narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "a82ccc39b39b621151d6732718e3e250109076fa",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1767799921,
|
||||
"narHash": "sha256-r4GVX+FToWVE2My8VVZH4V0pTIpnu2ZE8/Z4uxGEMBE=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d351d0653aeb7877273920cd3e823994e7579b0b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nur": {
|
||||
"inputs": {
|
||||
"flake-parts": [
|
||||
"stylix",
|
||||
"flake-parts"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"stylix",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1767886815,
|
||||
"narHash": "sha256-pB2BBv6X9cVGydEV/9Y8+uGCvuYJAlsprs1v1QHjccA=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NUR",
|
||||
"rev": "4ff84374d77ff62e2e13a46c33bfeb73590f9fef",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "NUR",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nvf": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"flake-parts": "flake-parts",
|
||||
"mnw": "mnw",
|
||||
"ndg": "ndg",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774370747,
|
||||
"narHash": "sha256-yjVgtiGCf0/nH8bp8tPhZrkGAQ575QImTLyndA7GYTA=",
|
||||
"owner": "notashelf",
|
||||
"repo": "nvf",
|
||||
"rev": "795711598394281a0a7a912765c18d8a8611a85f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "notashelf",
|
||||
"repo": "nvf",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"home-manager": "home-manager",
|
||||
"niri": "niri",
|
||||
"nix-flatpak": "nix-flatpak",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||
"nvf": "nvf",
|
||||
"stylix": "stylix",
|
||||
"zen-browser": "zen-browser"
|
||||
}
|
||||
},
|
||||
"stylix": {
|
||||
"inputs": {
|
||||
"base16": "base16",
|
||||
"base16-fish": "base16-fish",
|
||||
"base16-helix": "base16-helix",
|
||||
"base16-vim": "base16-vim",
|
||||
"firefox-gnome-theme": "firefox-gnome-theme",
|
||||
"flake-parts": "flake-parts_2",
|
||||
"gnome-shell": "gnome-shell",
|
||||
"nixpkgs": "nixpkgs_3",
|
||||
"nur": "nur",
|
||||
"systems": "systems_2",
|
||||
"tinted-foot": "tinted-foot",
|
||||
"tinted-kitty": "tinted-kitty",
|
||||
"tinted-schemes": "tinted-schemes",
|
||||
"tinted-tmux": "tinted-tmux",
|
||||
"tinted-zed": "tinted-zed"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774194089,
|
||||
"narHash": "sha256-SCczWhr8y8aaXVHG+gOGcRahNb0BU1Z5zYZuv9W/nA8=",
|
||||
"owner": "danth",
|
||||
"repo": "stylix",
|
||||
"rev": "7c34241d80ea64dd2039bb3a786fb66b4c6261d9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "danth",
|
||||
"ref": "release-25.11",
|
||||
"repo": "stylix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-foot": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1726913040,
|
||||
"narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-foot",
|
||||
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-foot",
|
||||
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-kitty": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1735730497,
|
||||
"narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-kitty",
|
||||
"rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-kitty",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-schemes": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767817087,
|
||||
"narHash": "sha256-eGE8OYoK6HzhJt/7bOiNV2cx01IdIrHL7gXgjkHRdNo=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "schemes",
|
||||
"rev": "bd99656235aab343e3d597bf196df9bc67429507",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "schemes",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-tmux": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767489635,
|
||||
"narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-tmux",
|
||||
"rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-tmux",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-zed": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767488740,
|
||||
"narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-zed",
|
||||
"rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-zed",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"xwayland-satellite-stable": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1755491097,
|
||||
"narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=",
|
||||
"owner": "Supreeeme",
|
||||
"repo": "xwayland-satellite",
|
||||
"rev": "388d291e82ffbc73be18169d39470f340707edaa",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Supreeeme",
|
||||
"ref": "v0.7",
|
||||
"repo": "xwayland-satellite",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"xwayland-satellite-unstable": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1773622265,
|
||||
"narHash": "sha256-wToKwH7IgWdGLMSIWksEDs4eumR6UbbsuPQ42r0oTXQ=",
|
||||
"owner": "Supreeeme",
|
||||
"repo": "xwayland-satellite",
|
||||
"rev": "a879e5e0896a326adc79c474bf457b8b99011027",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Supreeeme",
|
||||
"repo": "xwayland-satellite",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"zen-browser": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773722260,
|
||||
"narHash": "sha256-U8MsSiqqYZHR3oKE+cCZ2AJt3b4LcXs+oQuNLipaO78=",
|
||||
"owner": "youwen5",
|
||||
"repo": "zen-browser-flake",
|
||||
"rev": "0e6e43342fb3e9a3439fafa777d8cdf98e4ffc49",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "youwen5",
|
||||
"repo": "zen-browser-flake",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
63
flake.nix
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
description = "SaugOS - Dev-focused NixOS for older laptops";
|
||||
|
||||
inputs = {
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
nvf.url = "github:notashelf/nvf";
|
||||
stylix.url = "github:danth/stylix/release-25.11";
|
||||
nix-flatpak.url = "github:gmodena/nix-flatpak?ref=latest";
|
||||
|
||||
niri = {
|
||||
url = "github:sodiboo/niri-flake";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
zen-browser = {
|
||||
url = "github:youwen5/zen-browser-flake";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
{
|
||||
nixpkgs,
|
||||
home-manager,
|
||||
nix-flatpak,
|
||||
niri,
|
||||
...
|
||||
}@inputs:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
host = "default";
|
||||
profile = "intel";
|
||||
username = "benno";
|
||||
|
||||
mkNixosConfig = gpuProfile: nixpkgs.lib.nixosSystem {
|
||||
specialArgs = {
|
||||
inherit inputs username host profile;
|
||||
pkgs-unstable = import inputs.nixpkgs-unstable {
|
||||
inherit system;
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
};
|
||||
modules = [
|
||||
{ nixpkgs.hostPlatform = system; }
|
||||
./profiles/${gpuProfile}
|
||||
nix-flatpak.nixosModules.nix-flatpak
|
||||
niri.nixosModules.niri
|
||||
];
|
||||
};
|
||||
in
|
||||
{
|
||||
nixosConfigurations = {
|
||||
amd = mkNixosConfig "amd";
|
||||
intel = mkNixosConfig "intel";
|
||||
vm = mkNixosConfig "vm";
|
||||
};
|
||||
};
|
||||
}
|
||||
6
hosts/default/default.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ ... }: {
|
||||
imports = [
|
||||
./hardware.nix
|
||||
./host-packages.nix
|
||||
];
|
||||
}
|
||||
35
hosts/default/hardware.nix
Normal file
@@ -0,0 +1,35 @@
|
||||
# Do not modify this file! It was generated by 'nixos-generate-config'
|
||||
# Replace with actual hardware scan output for the target laptop.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usb_storage" "sd_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/CHANGEME";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/CHANGEME";
|
||||
fsType = "vfat";
|
||||
options = [ "fmask=0077" "dmask=0077" ];
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
||||
29
hosts/default/host-packages.nix
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
# Communication
|
||||
pkgs-unstable.signal-desktop
|
||||
element-desktop
|
||||
|
||||
# Browser
|
||||
inputs.zen-browser.packages."x86_64-linux".default
|
||||
|
||||
# Screen locking (niri)
|
||||
swaylock
|
||||
swayidle
|
||||
|
||||
# Dev tools
|
||||
nodejs
|
||||
python3
|
||||
gnumake
|
||||
gcc
|
||||
|
||||
# Security
|
||||
gnupg
|
||||
kdePackages.kleopatra
|
||||
];
|
||||
}
|
||||
57
hosts/default/variables.nix
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
# Git Configuration
|
||||
gitUsername = "Benno Lorenz";
|
||||
gitEmail = "benno@benno-lorenz.com";
|
||||
|
||||
# Desktop Environment — Niri (scrolling tiling WM)
|
||||
desktopEnvironment = "niri";
|
||||
|
||||
# Display Manager
|
||||
# `tui` for text login, `sddm` for graphical GUI
|
||||
displayManager = "sddm";
|
||||
|
||||
# Bundled application toggles
|
||||
tmuxEnable = true;
|
||||
alacrittyEnable = false;
|
||||
weztermEnable = false;
|
||||
ghosttyEnable = true;
|
||||
vscodeEnable = true;
|
||||
helixEnable = false;
|
||||
doomEmacsEnable = false;
|
||||
|
||||
# Monitor settings (adjust per-machine)
|
||||
extraMonitorSettings = "
|
||||
";
|
||||
|
||||
# Waybar settings
|
||||
clock24h = true;
|
||||
|
||||
# Default browser (must be installed separately in host-packages.nix)
|
||||
browser = "zen";
|
||||
|
||||
# Default terminal emulator
|
||||
terminal = "ghostty";
|
||||
|
||||
# Keyboard layout
|
||||
keyboardLayout = "de";
|
||||
keyboardVariant = "";
|
||||
consoleKeyMap = "de";
|
||||
|
||||
# NFS support
|
||||
enableNFS = false;
|
||||
|
||||
# Printing support
|
||||
printEnable = false;
|
||||
|
||||
# Thunar GUI file manager (Yazi is default)
|
||||
thunarEnable = true;
|
||||
|
||||
# Stylix theme image — sets the system color palette
|
||||
stylixImage = ../../wallpapers/Amagi.jpeg;
|
||||
|
||||
# Waybar style
|
||||
waybarChoice = ../../modules/home/waybar/waybar-curved.nix;
|
||||
|
||||
# Network host ID (needed for zfs, otherwise leave as-is)
|
||||
hostId = "5ab03f50";
|
||||
}
|
||||
20
modules/core/boot.nix
Normal file
@@ -0,0 +1,20 @@
|
||||
{ pkgs, pkgs-unstable, config, ... }:
|
||||
|
||||
{
|
||||
boot = {
|
||||
# Use standard LTS kernel — lighter for older laptops than zen
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
loader.systemd-boot.enable = true;
|
||||
loader.efi.canTouchEfiVariables = true;
|
||||
# Appimage Support
|
||||
binfmt.registrations.appimage = {
|
||||
wrapInterpreterInShell = false;
|
||||
interpreter = "${pkgs.appimage-run}/bin/appimage-run";
|
||||
recognitionType = "magic";
|
||||
offset = 0;
|
||||
mask = ''\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff'';
|
||||
magicOrExtension = ''\x7fELF....AI\x02'';
|
||||
};
|
||||
plymouth.enable = true;
|
||||
};
|
||||
}
|
||||
34
modules/core/default.nix
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
inputs,
|
||||
host,
|
||||
...
|
||||
}:
|
||||
let
|
||||
vars = import ../../hosts/${host}/variables.nix;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./boot.nix
|
||||
./flatpak.nix
|
||||
./fonts.nix
|
||||
./hardware.nix
|
||||
./network.nix
|
||||
./nfs.nix
|
||||
./nh.nix
|
||||
./packages.nix
|
||||
./printing.nix
|
||||
(if vars.displayManager == "tui" then ./greetd.nix else ./sddm.nix)
|
||||
./security.nix
|
||||
./services.nix
|
||||
./stylix.nix
|
||||
./syncthing.nix
|
||||
./system.nix
|
||||
./thunar.nix
|
||||
./user.nix
|
||||
./virtualisation.nix
|
||||
./wayland.nix
|
||||
./xserver.nix
|
||||
(if vars.desktopEnvironment == "niri" then ./swaylock.nix else null)
|
||||
inputs.stylix.nixosModules.stylix
|
||||
];
|
||||
}
|
||||
13
modules/core/flatpak.nix
Normal file
@@ -0,0 +1,13 @@
|
||||
{ pkgs, ... }: {
|
||||
xdg.portal = {
|
||||
enable = true;
|
||||
extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
|
||||
};
|
||||
services = {
|
||||
flatpak = {
|
||||
enable = true;
|
||||
packages = [ ];
|
||||
update.onActivation = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
26
modules/core/fonts.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
fonts = {
|
||||
packages = with pkgs; [
|
||||
dejavu_fonts
|
||||
fira-code
|
||||
fira-code-symbols
|
||||
font-awesome
|
||||
ibm-plex
|
||||
inter
|
||||
jetbrains-mono
|
||||
material-icons
|
||||
maple-mono.NF
|
||||
nerd-fonts.im-writing
|
||||
nerd-fonts.blex-mono
|
||||
noto-fonts
|
||||
noto-fonts-color-emoji
|
||||
noto-fonts-cjk-sans
|
||||
powerline-fonts
|
||||
roboto
|
||||
roboto-mono
|
||||
symbola
|
||||
terminus_font
|
||||
];
|
||||
};
|
||||
}
|
||||
12
modules/core/greetd.nix
Normal file
@@ -0,0 +1,12 @@
|
||||
{ pkgs, username, ... }: {
|
||||
services.greetd = {
|
||||
enable = true;
|
||||
vt = 3;
|
||||
settings = {
|
||||
default_session = {
|
||||
user = username;
|
||||
command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd niri-session";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
10
modules/core/hardware.nix
Normal file
@@ -0,0 +1,10 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
hardware = {
|
||||
graphics.enable = true;
|
||||
enableRedistributableFirmware = true;
|
||||
bluetooth.enable = true;
|
||||
bluetooth.powerOnBoot = true;
|
||||
};
|
||||
local.hardware-clock.enable = false;
|
||||
}
|
||||
37
modules/core/network.nix
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
pkgs,
|
||||
host,
|
||||
options,
|
||||
...
|
||||
}: let
|
||||
inherit (import ../../hosts/${host}/variables.nix) hostId;
|
||||
in {
|
||||
assertions = [
|
||||
{
|
||||
assertion = builtins.match "^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$" host != null;
|
||||
message = "Invalid hostname '${host}'.";
|
||||
}
|
||||
];
|
||||
|
||||
networking = {
|
||||
hostName = "${host}";
|
||||
hostId = hostId;
|
||||
networkmanager.enable = true;
|
||||
timeServers = options.networking.timeServers.default ++ ["pool.ntp.org"];
|
||||
nameservers = ["1.1.1.1#one.one.one.one" "1.0.0.1#one.one.one.one"];
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 22 80 443 8080 ];
|
||||
};
|
||||
};
|
||||
|
||||
services.resolved = {
|
||||
enable = true;
|
||||
dnssec = "true";
|
||||
domains = ["~."];
|
||||
fallbackDns = ["1.1.1.1#one.one.one.one" "1.0.0.1#one.one.one.one"];
|
||||
dnsovertls = "true";
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [networkmanagerapplet];
|
||||
}
|
||||
10
modules/core/nfs.nix
Normal file
@@ -0,0 +1,10 @@
|
||||
{ host, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) enableNFS;
|
||||
in
|
||||
{
|
||||
services = {
|
||||
rpcbind.enable = enableNFS;
|
||||
nfs.server.enable = enableNFS;
|
||||
};
|
||||
}
|
||||
15
modules/core/nh.nix
Normal file
@@ -0,0 +1,15 @@
|
||||
{ pkgs, username, ... }: {
|
||||
programs.nh = {
|
||||
enable = true;
|
||||
clean = {
|
||||
enable = true;
|
||||
extraArgs = "--keep-since 7d --keep 5";
|
||||
};
|
||||
flake = "/home/${username}/zaneyos/SaugOS";
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
nix-output-monitor
|
||||
nvd
|
||||
];
|
||||
}
|
||||
60
modules/core/packages.nix
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
programs = {
|
||||
neovim = {
|
||||
enable = true;
|
||||
defaultEditor = true;
|
||||
};
|
||||
firefox.enable = false;
|
||||
dconf.enable = true;
|
||||
seahorse.enable = true;
|
||||
fuse.userAllowOther = true;
|
||||
mtr.enable = true;
|
||||
gnupg.agent = {
|
||||
enable = true;
|
||||
enableSSHSupport = true;
|
||||
};
|
||||
};
|
||||
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
appimage-run
|
||||
brightnessctl
|
||||
cliphist
|
||||
docker-compose
|
||||
duf
|
||||
dysk
|
||||
eza
|
||||
ffmpeg
|
||||
file-roller
|
||||
gedit
|
||||
greetd.tuigreet
|
||||
htop
|
||||
eog
|
||||
inxi
|
||||
killall
|
||||
libnotify
|
||||
lm_sensors
|
||||
lshw
|
||||
mesa-demos
|
||||
ncdu
|
||||
nixfmt-rfc-style
|
||||
pavucontrol
|
||||
pciutils
|
||||
pkg-config
|
||||
playerctl
|
||||
ripgrep
|
||||
socat
|
||||
unrar
|
||||
unzip
|
||||
usbutils
|
||||
uwsm
|
||||
waypaper
|
||||
wget
|
||||
];
|
||||
}
|
||||
18
modules/core/printing.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
{ host, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) printEnable;
|
||||
in
|
||||
{
|
||||
services = {
|
||||
printing = {
|
||||
enable = printEnable;
|
||||
drivers = [ ];
|
||||
};
|
||||
avahi = {
|
||||
enable = printEnable;
|
||||
nssmdns4 = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
ipp-usb.enable = printEnable;
|
||||
};
|
||||
}
|
||||
44
modules/core/sddm.nix
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
foreground = config.stylix.base16Scheme.base00;
|
||||
textColor = config.stylix.base16Scheme.base05;
|
||||
sddm-astronaut = pkgs.sddm-astronaut.override {
|
||||
embeddedTheme = "pixel_sakura";
|
||||
themeConfig = {
|
||||
FormPosition = "left";
|
||||
Blur = "4.0";
|
||||
Background = "${toString config.stylix.image}";
|
||||
HeaderTextColor = "#${textColor}";
|
||||
DateTextColor = "#${textColor}";
|
||||
TimeTextColor = "#${textColor}";
|
||||
LoginFieldTextColor = "#${textColor}";
|
||||
PasswordFieldTextColor = "#${textColor}";
|
||||
UserIconColor = "#${textColor}";
|
||||
PasswordIconColor = "#${textColor}";
|
||||
WarningColor = "#${textColor}";
|
||||
LoginButtonBackgroundColor = "#${config.stylix.base16Scheme.base01}";
|
||||
SystemButtonsIconsColor = "#${textColor}";
|
||||
SessionButtonTextColor = "#${textColor}";
|
||||
VirtualKeyboardButtonTextColor = "#${textColor}";
|
||||
DropdownBackgroundColor = "#${config.stylix.base16Scheme.base01}";
|
||||
HighlightBackgroundColor = "#${textColor}";
|
||||
FormBackgroundColor = "#${config.stylix.base16Scheme.base01}";
|
||||
};
|
||||
};
|
||||
in {
|
||||
services.displayManager = {
|
||||
sddm = {
|
||||
package = pkgs.kdePackages.sddm;
|
||||
extraPackages = [sddm-astronaut];
|
||||
enable = true;
|
||||
wayland.enable = false;
|
||||
theme = "sddm-astronaut-theme";
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [sddm-astronaut];
|
||||
}
|
||||
50
modules/core/security.nix
Normal file
@@ -0,0 +1,50 @@
|
||||
{ pkgs, username, ... }: {
|
||||
security = {
|
||||
rtkit.enable = true;
|
||||
polkit = {
|
||||
enable = true;
|
||||
extraConfig = ''
|
||||
polkit.addRule(function(action, subject) {
|
||||
if ( subject.isInGroup("users") && (
|
||||
action.id == "org.freedesktop.login1.reboot" ||
|
||||
action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
|
||||
action.id == "org.freedesktop.login1.power-off" ||
|
||||
action.id == "org.freedesktop.login1.power-off-multiple-sessions"
|
||||
))
|
||||
{ return polkit.Result.YES; }
|
||||
})
|
||||
'';
|
||||
};
|
||||
|
||||
pam.services = {
|
||||
login.enableGnomeKeyring = true;
|
||||
login.enableKwallet = true;
|
||||
};
|
||||
|
||||
pam.services.hyprlock = {
|
||||
text = ''
|
||||
auth sufficient pam_unix.so try_first_pass nullok
|
||||
auth required pam_deny.so
|
||||
'';
|
||||
};
|
||||
|
||||
pam.services.swaylock = {
|
||||
text = ''
|
||||
auth sufficient pam_unix.so try_first_pass nullok
|
||||
auth required pam_deny.so
|
||||
'';
|
||||
};
|
||||
|
||||
sudo.extraRules = [
|
||||
{
|
||||
users = [ "${username}" ];
|
||||
commands = [
|
||||
{
|
||||
command = "ALL";
|
||||
options = [ "NOPASSWD" ];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
49
modules/core/services.nix
Normal file
@@ -0,0 +1,49 @@
|
||||
{ profile, ... }: {
|
||||
services = {
|
||||
libinput.enable = true;
|
||||
fstrim.enable = true;
|
||||
gvfs.enable = true;
|
||||
openssh = {
|
||||
enable = true;
|
||||
settings = {
|
||||
PermitRootLogin = "no";
|
||||
PasswordAuthentication = true;
|
||||
KbdInteractiveAuthentication = true;
|
||||
};
|
||||
ports = [ 22 ];
|
||||
};
|
||||
blueman.enable = true;
|
||||
tumbler.enable = true;
|
||||
gnome.gnome-keyring.enable = true;
|
||||
tailscale.enable = true;
|
||||
|
||||
smartd = {
|
||||
enable =
|
||||
if profile == "vm"
|
||||
then false
|
||||
else true;
|
||||
autodetect = true;
|
||||
};
|
||||
pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
jack.enable = true;
|
||||
};
|
||||
|
||||
# TLP for laptop power management
|
||||
tlp = {
|
||||
enable = true;
|
||||
settings = {
|
||||
CPU_SCALING_GOVERNOR_ON_AC = "performance";
|
||||
CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
|
||||
CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
|
||||
CPU_ENERGY_PERF_POLICY_ON_BAT = "power";
|
||||
START_CHARGE_THRESH_BAT0 = 40;
|
||||
STOP_CHARGE_THRESH_BAT0 = 80;
|
||||
};
|
||||
};
|
||||
thermald.enable = true;
|
||||
};
|
||||
}
|
||||
55
modules/core/stylix.nix
Normal file
@@ -0,0 +1,55 @@
|
||||
{ pkgs, host, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) stylixImage;
|
||||
in
|
||||
{
|
||||
stylix = {
|
||||
enable = true;
|
||||
image = stylixImage;
|
||||
base16Scheme = {
|
||||
base00 = "24273a"; # base
|
||||
base01 = "1e2030"; # mantle
|
||||
base02 = "363a4f"; # surface0
|
||||
base03 = "494d64"; # surface1
|
||||
base04 = "5b6078"; # surface2
|
||||
base05 = "cad3f5"; # text
|
||||
base06 = "f4dbd6"; # rosewater
|
||||
base07 = "b7bdf8"; # lavender
|
||||
base08 = "ed8796"; # red
|
||||
base09 = "f5a97f"; # peach
|
||||
base0A = "eed49f"; # yellow
|
||||
base0B = "a6da95"; # green
|
||||
base0C = "8bd5ca"; # teal
|
||||
base0D = "8aadf4"; # blue
|
||||
base0E = "c6a0f6"; # mauve
|
||||
base0F = "f0c6c6"; # flamingo
|
||||
};
|
||||
polarity = "dark";
|
||||
opacity.terminal = 1.0;
|
||||
cursor = {
|
||||
package = pkgs.bibata-cursors;
|
||||
name = "Bibata-Modern-Ice";
|
||||
size = 24;
|
||||
};
|
||||
fonts = {
|
||||
monospace = {
|
||||
package = pkgs.nerd-fonts.jetbrains-mono;
|
||||
name = "JetBrains Mono";
|
||||
};
|
||||
sansSerif = {
|
||||
package = pkgs.montserrat;
|
||||
name = "Montserrat";
|
||||
};
|
||||
serif = {
|
||||
package = pkgs.montserrat;
|
||||
name = "Montserrat";
|
||||
};
|
||||
sizes = {
|
||||
applications = 12;
|
||||
terminal = 15;
|
||||
desktop = 11;
|
||||
popups = 12;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
13
modules/core/swaylock.nix
Normal file
@@ -0,0 +1,13 @@
|
||||
{ config, pkgs, host, ... }:
|
||||
let
|
||||
vars = import ../../../hosts/${host}/variables.nix;
|
||||
in
|
||||
{
|
||||
services.udev.extraRules = "";
|
||||
|
||||
environment.etc."swaylock/config".text = ''
|
||||
color=${config.lib.stylix.colors.base00}
|
||||
'';
|
||||
|
||||
environment.systemPackages = [ pkgs.swaylock ];
|
||||
}
|
||||
8
modules/core/syncthing.nix
Normal file
@@ -0,0 +1,8 @@
|
||||
{ username, ... }: {
|
||||
services.syncthing = {
|
||||
enable = false;
|
||||
user = "${username}";
|
||||
dataDir = "/home/${username}";
|
||||
configDir = "/home/${username}/.config/syncthing";
|
||||
};
|
||||
}
|
||||
40
modules/core/system.nix
Normal file
@@ -0,0 +1,40 @@
|
||||
{ host, profile, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) consoleKeyMap;
|
||||
in
|
||||
{
|
||||
nix = {
|
||||
settings = {
|
||||
download-buffer-size = 200000000;
|
||||
auto-optimise-store = true;
|
||||
experimental-features = [
|
||||
"nix-command"
|
||||
"flakes"
|
||||
];
|
||||
substituters = [ "https://niri.cachix.org" ];
|
||||
trusted-public-keys = [ "niri.cachix.org-1:Wv0OmO7PsuocRKzfDoJ3mulSl7Z+BN0JISU3WYj9E84=" ];
|
||||
};
|
||||
};
|
||||
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";
|
||||
};
|
||||
environment.variables = {
|
||||
NIXOS_OZONE_WL = "1";
|
||||
SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS = "0";
|
||||
SAUGOS_VERSION = "1.0";
|
||||
SAUGOS = "true";
|
||||
};
|
||||
console.keyMap = "${consoleKeyMap}";
|
||||
|
||||
system.stateVersion = "23.11";
|
||||
}
|
||||
18
modules/core/thunar.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
{ host, pkgs, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) thunarEnable;
|
||||
in
|
||||
{
|
||||
programs = {
|
||||
thunar = {
|
||||
enable = thunarEnable;
|
||||
plugins = with pkgs.xfce; [
|
||||
thunar-archive-plugin
|
||||
thunar-volman
|
||||
];
|
||||
};
|
||||
};
|
||||
environment.systemPackages = with pkgs; [
|
||||
ffmpegthumbnailer
|
||||
];
|
||||
}
|
||||
45
modules/core/user.nix
Normal file
@@ -0,0 +1,45 @@
|
||||
{ pkgs
|
||||
, inputs
|
||||
, username
|
||||
, host
|
||||
, profile
|
||||
, pkgs-unstable
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) gitUsername;
|
||||
in
|
||||
{
|
||||
imports = [ inputs.home-manager.nixosModules.home-manager ];
|
||||
home-manager = {
|
||||
useUserPackages = true;
|
||||
useGlobalPkgs = false;
|
||||
backupFileExtension = "backup";
|
||||
extraSpecialArgs = { inherit inputs username host profile pkgs-unstable; };
|
||||
users.${username} = {
|
||||
imports = [
|
||||
./../home
|
||||
];
|
||||
home = {
|
||||
username = "${username}";
|
||||
homeDirectory = "/home/${username}";
|
||||
stateVersion = "23.11";
|
||||
};
|
||||
};
|
||||
};
|
||||
users.mutableUsers = true;
|
||||
users.users.${username} = {
|
||||
isNormalUser = true;
|
||||
description = "${gitUsername}";
|
||||
extraGroups = [
|
||||
"docker"
|
||||
"libvirtd"
|
||||
"lp"
|
||||
"networkmanager"
|
||||
"wheel"
|
||||
];
|
||||
shell = pkgs.zsh;
|
||||
ignoreShellProgramCheck = true;
|
||||
};
|
||||
nix.settings.allowed-users = [ "${username}" ];
|
||||
}
|
||||
13
modules/core/virtualisation.nix
Normal file
@@ -0,0 +1,13 @@
|
||||
{ pkgs, ... }: {
|
||||
# Docker for container-based dev workflows
|
||||
virtualisation = {
|
||||
docker.enable = true;
|
||||
podman.enable = false;
|
||||
libvirtd.enable = false;
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
lazydocker
|
||||
docker-client
|
||||
];
|
||||
}
|
||||
32
modules/core/wayland.nix
Normal file
@@ -0,0 +1,32 @@
|
||||
{ host, pkgs, inputs, ... }:
|
||||
let
|
||||
vars = import ../../hosts/${host}/variables.nix;
|
||||
desktopEnvironment = vars.desktopEnvironment or "niri";
|
||||
in
|
||||
{
|
||||
programs.niri = {
|
||||
enable = desktopEnvironment == "niri";
|
||||
package = inputs.niri.packages.${pkgs.system}.niri-stable;
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
xwayland
|
||||
xdg-utils
|
||||
];
|
||||
|
||||
xdg.portal = {
|
||||
enable = true;
|
||||
extraPortals = with pkgs; [
|
||||
xdg-desktop-portal-gtk
|
||||
] ++ (if desktopEnvironment == "niri" then [
|
||||
xdg-desktop-portal-gnome
|
||||
] else []);
|
||||
|
||||
config = if desktopEnvironment == "niri" then {
|
||||
common.default = "*";
|
||||
niri.default = [ "gnome" "gtk" ];
|
||||
} else {};
|
||||
};
|
||||
|
||||
security.polkit.enable = true;
|
||||
}
|
||||
16
modules/core/xserver.nix
Normal file
@@ -0,0 +1,16 @@
|
||||
{ host, ... }:
|
||||
let
|
||||
vars = import ../../hosts/${host}/variables.nix;
|
||||
keyboardLayout = vars.keyboardLayout or "us";
|
||||
keyboardVariant = vars.keyboardVariant or "";
|
||||
enableXServer = vars.displayManager == "sddm";
|
||||
in
|
||||
{
|
||||
services.xserver = {
|
||||
enable = enableXServer;
|
||||
xkb = {
|
||||
layout = "${keyboardLayout}";
|
||||
variant = "${keyboardVariant}";
|
||||
};
|
||||
};
|
||||
}
|
||||
15
modules/drivers/amd-drivers.nix
Normal file
@@ -0,0 +1,15 @@
|
||||
{ lib, pkgs, config, ... }:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.drivers.amdgpu;
|
||||
in
|
||||
{
|
||||
options.drivers.amdgpu = {
|
||||
enable = mkEnableOption "Enable AMD Drivers";
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.tmpfiles.rules = [ "L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}" ];
|
||||
services.xserver.videoDrivers = [ "amdgpu" ];
|
||||
};
|
||||
}
|
||||
9
modules/drivers/default.nix
Normal file
@@ -0,0 +1,9 @@
|
||||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./amd-drivers.nix
|
||||
./intel-drivers.nix
|
||||
./local-hardware-clock.nix
|
||||
./vm-guest-services.nix
|
||||
];
|
||||
}
|
||||
20
modules/drivers/intel-drivers.nix
Normal file
@@ -0,0 +1,20 @@
|
||||
{ lib, pkgs, config, ... }:
|
||||
with lib; let
|
||||
cfg = config.drivers.intel;
|
||||
in
|
||||
{
|
||||
options.drivers.intel = {
|
||||
enable = mkEnableOption "Enable Intel Graphics Drivers";
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
hardware.graphics = {
|
||||
extraPackages = with pkgs; [
|
||||
intel-media-driver
|
||||
intel-vaapi-driver
|
||||
libva-vdpau-driver
|
||||
libvdpau-va-gl
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
12
modules/drivers/local-hardware-clock.nix
Normal file
@@ -0,0 +1,12 @@
|
||||
{ lib, pkgs, config, ... }:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.local.hardware-clock;
|
||||
in
|
||||
{
|
||||
options.local.hardware-clock = {
|
||||
enable = mkEnableOption "Change Hardware Clock To Local Time";
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable { time.hardwareClockInLocalTime = true; };
|
||||
}
|
||||
16
modules/drivers/vm-guest-services.nix
Normal file
@@ -0,0 +1,16 @@
|
||||
{ lib, pkgs, config, ... }:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.vm.guest-services;
|
||||
in
|
||||
{
|
||||
options.vm.guest-services = {
|
||||
enable = mkEnableOption "Enable Virtual Machine Guest Services";
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
services.qemuGuest.enable = true;
|
||||
services.spice-vdagentd.enable = true;
|
||||
services.spice-webdavd.enable = false;
|
||||
};
|
||||
}
|
||||
30
modules/home/alacritty.nix
Normal file
@@ -0,0 +1,30 @@
|
||||
{ lib, ... }: {
|
||||
programs.alacritty =
|
||||
let
|
||||
font_family = lib.mkForce "Maple Mono NF";
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
settings = {
|
||||
font = {
|
||||
normal = {
|
||||
family = font_family;
|
||||
style = "Regular";
|
||||
};
|
||||
bold = {
|
||||
family = font_family;
|
||||
style = "Bold";
|
||||
};
|
||||
italic = {
|
||||
family = font_family;
|
||||
style = "Italic";
|
||||
};
|
||||
bold_italic = {
|
||||
family = font_family;
|
||||
style = "Bold Italic";
|
||||
};
|
||||
size = 15;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
22
modules/home/bash.nix
Normal file
@@ -0,0 +1,22 @@
|
||||
{ profile, ... }: {
|
||||
programs.bash = {
|
||||
enable = false;
|
||||
enableCompletion = true;
|
||||
initExtra = ''
|
||||
fastfetch
|
||||
if [ -f $HOME/.bashrc-personal ]; then
|
||||
source $HOME/.bashrc-personal
|
||||
fi
|
||||
'';
|
||||
shellAliases = {
|
||||
sv = "sudo nvim";
|
||||
fr = "nh os switch --hostname ${profile}";
|
||||
fu = "nh os switch --hostname ${profile} --update";
|
||||
|
||||
ncg = "nix-collect-garbage --delete-old && sudo nix-collect-garbage -d && sudo /run/current-system/bin/switch-to-configuration boot";
|
||||
v = "nvim";
|
||||
cat = "bat";
|
||||
".." = "cd ..";
|
||||
};
|
||||
};
|
||||
}
|
||||
20
modules/home/bashrc-personal.nix
Normal file
@@ -0,0 +1,20 @@
|
||||
{ pkgs, ... }: {
|
||||
home.packages = with pkgs; [ bash ];
|
||||
|
||||
home.file."./.bashrc-personal".text = ''
|
||||
|
||||
# This file allows you to define your own aliases, functions, etc
|
||||
# below are just some examples of what you can use this file for
|
||||
|
||||
#!/usr/bin/env bash
|
||||
# Set defaults
|
||||
#
|
||||
#export EDITOR="nvim"
|
||||
#export VISUAL="nvim"
|
||||
|
||||
#alias c="clear"
|
||||
#eval "$(zoxide init bash)"
|
||||
#eval "$(oh-my-posh init bash --config $HOME/.config/powerlevel10k_rainbow.omp.json)"
|
||||
|
||||
'';
|
||||
}
|
||||
26
modules/home/bat.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ pkgs
|
||||
, lib
|
||||
, ...
|
||||
}: {
|
||||
programs.bat = {
|
||||
enable = true;
|
||||
config = {
|
||||
pager = "less -FR";
|
||||
# other styles available and cane be combined
|
||||
# style = "numbers,changes,headers,rule,grid";
|
||||
style = "full";
|
||||
# Bat has other thems as well
|
||||
# ansi,Catppuccin,base16,base16-256,GitHub,Nord,etc
|
||||
theme = lib.mkForce "Dracula";
|
||||
};
|
||||
extraPackages = with pkgs.bat-extras; [
|
||||
batman
|
||||
batpipe
|
||||
batgrep
|
||||
];
|
||||
};
|
||||
home.sessionVariables = {
|
||||
MANPAGER = "sh -c 'col -bx | bat -l man -p'";
|
||||
MANROFFOPT = "-c";
|
||||
};
|
||||
}
|
||||
35
modules/home/bottom.nix
Normal file
@@ -0,0 +1,35 @@
|
||||
{ ... }: {
|
||||
programs.bottom = {
|
||||
enable = true;
|
||||
settings = {
|
||||
enable_gpu = true;
|
||||
theme = "nord";
|
||||
flags.group_processes = true;
|
||||
row = [
|
||||
{
|
||||
ratio = 2;
|
||||
child = [
|
||||
{ type = "cpu"; }
|
||||
{ type = "temp"; }
|
||||
];
|
||||
}
|
||||
{
|
||||
ratio = 2;
|
||||
child = [
|
||||
{ type = "network"; }
|
||||
];
|
||||
}
|
||||
{
|
||||
ratio = 3;
|
||||
child = [
|
||||
{
|
||||
type = "proc";
|
||||
ratio = 1;
|
||||
default = true;
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
18
modules/home/btop.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
{ pkgs, ... }: {
|
||||
programs.btop = {
|
||||
enable = true;
|
||||
settings = {
|
||||
vim_keys = true;
|
||||
rounded_corners = true;
|
||||
proc_tree = true;
|
||||
show_gpu_info = "on";
|
||||
show_uptime = true;
|
||||
show_coretemp = true;
|
||||
cpu_sensor = "auto";
|
||||
show_disks = true;
|
||||
only_physical = true;
|
||||
io_mode = true;
|
||||
io_graph_combined = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
62
modules/home/default.nix
Normal file
@@ -0,0 +1,62 @@
|
||||
{ host, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix)
|
||||
alacrittyEnable
|
||||
desktopEnvironment
|
||||
ghosttyEnable
|
||||
tmuxEnable
|
||||
waybarChoice
|
||||
weztermEnable
|
||||
vscodeEnable
|
||||
helixEnable
|
||||
doomEmacsEnable
|
||||
;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./bash.nix
|
||||
./bashrc-personal.nix
|
||||
./bat.nix
|
||||
./btop.nix
|
||||
./bottom.nix
|
||||
./eza.nix
|
||||
./fastfetch
|
||||
./fzf.nix
|
||||
./gh.nix
|
||||
./git.nix
|
||||
./gtk.nix
|
||||
./htop.nix
|
||||
./kitty.nix
|
||||
./lazygit.nix
|
||||
./nvf.nix
|
||||
./rofi
|
||||
./qt.nix
|
||||
./scripts
|
||||
./stylix.nix
|
||||
./swappy.nix
|
||||
./swaync.nix
|
||||
./tealdeer.nix
|
||||
waybarChoice
|
||||
./wlogout
|
||||
./xdg.nix
|
||||
./yazi
|
||||
./zoxide.nix
|
||||
./zsh
|
||||
]
|
||||
++ (if desktopEnvironment == "niri" then [ ./niri ] else [ ])
|
||||
++ (if helixEnable then [ ./evil-helix.nix ] else [ ])
|
||||
++ (if vscodeEnable then [ ./vscode.nix ] else [ ])
|
||||
++ (
|
||||
if doomEmacsEnable then
|
||||
[
|
||||
./editors/doom-emacs-install.nix
|
||||
./editors/doom-emacs.nix
|
||||
]
|
||||
else
|
||||
[ ]
|
||||
)
|
||||
++ (if weztermEnable then [ ./wezterm.nix ] else [ ])
|
||||
++ (if ghosttyEnable then [ ./ghostty.nix ] else [ ])
|
||||
++ (if tmuxEnable then [ ./tmux.nix ] else [ ])
|
||||
++ (if alacrittyEnable then [ ./alacritty.nix ] else [ ]);
|
||||
}
|
||||
78
modules/home/editors/doom-emacs-install.nix
Normal file
@@ -0,0 +1,78 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
let
|
||||
doom-icon = pkgs.fetchurl {
|
||||
url = "https://raw.githubusercontent.com/jeetelongname/doom-banners/master/splashes/doom/doom-emacs-color2.svg";
|
||||
sha256 = "1xxi5ra1z8njsqaqiaq96wyn1sc967l42kvjzbji1zrjj8za6bgq";
|
||||
};
|
||||
in
|
||||
{
|
||||
# 1. Create a script to install Doom Emacs
|
||||
home.packages = [
|
||||
(pkgs.writeShellScriptBin "get-doom" ''
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# --- Icons ---
|
||||
ICON_CHECK="✔"
|
||||
ICON_INFO="ℹ"
|
||||
ICON_ROCKET="🚀"
|
||||
|
||||
# --- Helper Functions ---
|
||||
print_status() {
|
||||
echo
|
||||
echo "--- $ICON_INFO $1 ---"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo "--- $ICON_CHECK $1 ---"
|
||||
}
|
||||
|
||||
print_banner() {
|
||||
echo "==============================="
|
||||
echo " Doom Emacs Installer $ICON_ROCKET"
|
||||
echo "==============================="
|
||||
}
|
||||
|
||||
# --- Main Script ---
|
||||
print_banner
|
||||
EMACSDIR="$HOME/.emacs.d"
|
||||
|
||||
if [ -d "$EMACSDIR" ]; then
|
||||
print_success "Doom Emacs is already installed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
print_status "Cloning Doom Emacs..."
|
||||
git clone --depth 1 https://github.com/doomemacs/doomemacs "$EMACSDIR"
|
||||
print_success "Doom Emacs cloned."
|
||||
|
||||
print_status "Running Doom install..."
|
||||
"$EMACSDIR/bin/doom" install
|
||||
print_success "Doom install complete."
|
||||
|
||||
print_status "Running doom sync..."
|
||||
"$EMACSDIR/bin/doom" sync
|
||||
print_success "Doom sync complete."
|
||||
|
||||
echo
|
||||
print_success "All done! Doom Emacs is ready to use."
|
||||
'')
|
||||
];
|
||||
|
||||
# 2. Add the bin directory to the PATH
|
||||
home.sessionPath = [
|
||||
"$HOME/.emacs.d/bin"
|
||||
];
|
||||
|
||||
# 3. Create a desktop file
|
||||
xdg.desktopEntries.doom-emacs = {
|
||||
name = "Doom Emacs";
|
||||
comment = "A configuration framework for GNU Emacs";
|
||||
exec = "emacs";
|
||||
icon = doom-icon;
|
||||
terminal = false;
|
||||
type = "Application";
|
||||
categories = [ "Development" "TextEditor" ];
|
||||
};
|
||||
}
|
||||
162
modules/home/editors/doom-emacs.nix
Normal file
@@ -0,0 +1,162 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
emacs-pgtk
|
||||
git
|
||||
lazygit
|
||||
ripgrep
|
||||
libtool
|
||||
cmake
|
||||
pkg-config
|
||||
# Spell checking
|
||||
hunspell
|
||||
hunspellDicts.en_US
|
||||
hunspellDicts.en_AU
|
||||
hunspellDicts.es_ES
|
||||
# LSP servers
|
||||
clang-tools # C/C++ LSP
|
||||
nil # Nix LSP
|
||||
];
|
||||
|
||||
home.file.".doom.d/init.el".text = ''
|
||||
;;; init.el -*- lexical-binding: t; -*-
|
||||
|
||||
(doom!
|
||||
:completion
|
||||
(company +auto)
|
||||
(vertico +icons)
|
||||
|
||||
:ui
|
||||
doom
|
||||
doom-dashboard
|
||||
doom-quit
|
||||
hl-todo
|
||||
modeline
|
||||
nav-flash
|
||||
ophints
|
||||
(popup +defaults)
|
||||
(ligatures +extra)
|
||||
tabs
|
||||
treemacs
|
||||
vi-tilde-fringe
|
||||
window-select
|
||||
|
||||
:editor
|
||||
(evil +everywhere)
|
||||
file-templates
|
||||
fold
|
||||
multiple-cursors
|
||||
snippets
|
||||
word-wrap
|
||||
|
||||
:emacs
|
||||
(dired +icons)
|
||||
electric
|
||||
(ibuffer +icons)
|
||||
(undo +tree)
|
||||
vc
|
||||
|
||||
:term
|
||||
vterm
|
||||
|
||||
:checkers
|
||||
(syntax +flymake)
|
||||
(spell +flyspell)
|
||||
grammar
|
||||
|
||||
:tools
|
||||
(eval +overlay)
|
||||
(lookup +docsets)
|
||||
lsp
|
||||
(magit +forge)
|
||||
pdf
|
||||
tree-sitter
|
||||
|
||||
:lang
|
||||
bash
|
||||
(c +lsp)
|
||||
css
|
||||
docker
|
||||
html
|
||||
(json +lsp)
|
||||
markdown
|
||||
(nix +tree-sitter +lsp)
|
||||
toml
|
||||
yaml
|
||||
|
||||
:config
|
||||
(default +bindings +smartparens))
|
||||
'';
|
||||
|
||||
home.file.".doom.d/config.el".text = ''
|
||||
;;; config.el -*- lexical-binding: t; -*-
|
||||
|
||||
(setq doom-theme 'doom-one)
|
||||
(setq display-line-numbers-type 'relative)
|
||||
(setq nerd-icons-font-family "JetBrainsMono Nerd Font")
|
||||
|
||||
;; Git configuration
|
||||
(after! magit
|
||||
;; Set default git editor to emacsclient
|
||||
(setq with-editor-emacsclient-executable "emacsclient")
|
||||
;; Show word-granularity differences within diff hunks
|
||||
(setq magit-diff-refine-hunk t)
|
||||
;; Auto-refresh magit buffers
|
||||
(setq magit-refresh-status-buffer t))
|
||||
|
||||
;; Lazygit integration
|
||||
(defun my/lazygit ()
|
||||
"Open lazygit in a terminal."
|
||||
(interactive)
|
||||
(if (fboundp 'vterm)
|
||||
(let ((default-directory (magit-toplevel)))
|
||||
(vterm "*lazygit*")
|
||||
(vterm-send-string "lazygit")
|
||||
(vterm-send-return))
|
||||
(async-shell-command "lazygit" "*lazygit*")))
|
||||
|
||||
;; LSP configuration
|
||||
(after! lsp-mode
|
||||
(setq lsp-signature-auto-activate t
|
||||
lsp-signature-render-documentation t
|
||||
lsp-completion-provider :company-capf
|
||||
lsp-idle-delay 0.1))
|
||||
|
||||
;; Nix LSP (nil) configuration
|
||||
(with-eval-after-load 'lsp-nix-nil
|
||||
(setq lsp-nix-nil-auto-eval-inputs t))
|
||||
|
||||
;; Company completion settings
|
||||
(after! company
|
||||
(setq company-idle-delay 0.2
|
||||
company-minimum-prefix-length 1
|
||||
company-tooltip-align-annotations t
|
||||
company-require-match 'never))
|
||||
|
||||
;; Spell checking configuration
|
||||
(after! ispell
|
||||
(setq ispell-program-name "hunspell")
|
||||
(setq ispell-local-dictionary "en_US")
|
||||
(setq ispell-local-dictionary-alist
|
||||
'(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_US") nil utf-8))))
|
||||
|
||||
;; Git keybindings
|
||||
(map! :leader
|
||||
(:prefix-map ("g" . "git")
|
||||
:desc "Magit status" "g" #'magit-status
|
||||
:desc "Magit dispatch" "d" #'magit-dispatch
|
||||
:desc "Magit file dispatch" "f" #'magit-file-dispatch
|
||||
:desc "Magit blame" "b" #'magit-blame-addition
|
||||
:desc "Git time machine" "t" #'git-timemachine-toggle
|
||||
:desc "Lazygit" "l" #'my/lazygit
|
||||
:desc "Git stage file" "s" #'magit-stage-file
|
||||
:desc "Git unstage file" "u" #'magit-unstage-file))
|
||||
'';
|
||||
|
||||
home.file.".doom.d/packages.el".text = ''
|
||||
;;; packages.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; Git-related packages
|
||||
(package! git-timemachine)
|
||||
'';
|
||||
}
|
||||
89
modules/home/evil-helix.nix
Normal file
@@ -0,0 +1,89 @@
|
||||
{ pkgs, ... }:
|
||||
let
|
||||
enableEvilHelix = true; # Set to true to enable the configuration
|
||||
in
|
||||
{
|
||||
home.packages = with pkgs; (
|
||||
if enableEvilHelix
|
||||
then [
|
||||
evil-helix
|
||||
cmake-language-server
|
||||
jsonnet-language-server
|
||||
luaformatter
|
||||
lua-language-server
|
||||
marksman
|
||||
taplo
|
||||
nil
|
||||
jq-lsp
|
||||
vscode-langservers-extracted
|
||||
bash-language-server
|
||||
awk-language-server
|
||||
vscode-extensions.llvm-vs-code-extensions.vscode-clangd
|
||||
clang-tools
|
||||
docker-compose-language-service
|
||||
docker-compose
|
||||
docker-language-server
|
||||
typescript-language-server
|
||||
]
|
||||
else [ ]
|
||||
);
|
||||
|
||||
home.file.".config/helix/languages.toml".text =
|
||||
if enableEvilHelix
|
||||
then ''
|
||||
[language-server.nil]
|
||||
command = "nil"
|
||||
|
||||
[language-server.lua]
|
||||
command = "lua-language-server"
|
||||
|
||||
[language-server.json]
|
||||
command = "vscode-json-languageserver"
|
||||
|
||||
[language-server.markdown]
|
||||
command = "marksman"
|
||||
''
|
||||
else "";
|
||||
|
||||
home.file.".config/helix/config.toml".text =
|
||||
if enableEvilHelix
|
||||
then ''
|
||||
theme = "catppuccin_mocha"
|
||||
#theme = "ao"
|
||||
|
||||
[editor]
|
||||
evil = true
|
||||
end-of-line-diagnostics = "hint"
|
||||
auto-pairs = true
|
||||
mouse = true
|
||||
middle-click-paste = true
|
||||
shell = ["zsh", "-c"]
|
||||
line-number = "absolute"
|
||||
auto-completion = true
|
||||
path-completion = true
|
||||
auto-info = true
|
||||
color-modes = true
|
||||
popup-border = "all"
|
||||
clipboard-provider = "wayland"
|
||||
indent-heuristic = "hybrid"
|
||||
|
||||
[editor.statusline]
|
||||
left = ["mode", "spinner"]
|
||||
center = ["file-absolute-path", "total-line-numbers", "read-only-indicator", "file-modification-indicator"]
|
||||
right = ["diagnostics", "selections", "position", "file-encoding", "file-line-ending", "file-type"]
|
||||
separator = "│"
|
||||
mode.normal = "NORMAL"
|
||||
mode.insert = "INSERT"
|
||||
mode.select = "SELECT"
|
||||
|
||||
[editor.lsp]
|
||||
enable = true
|
||||
display-messages = true
|
||||
display-progress-messages = true
|
||||
|
||||
[editor.inline-diagnostics]
|
||||
cursor-line = "hint"
|
||||
other-lines = "hint"
|
||||
''
|
||||
else "";
|
||||
}
|
||||
30
modules/home/eza.nix
Normal file
@@ -0,0 +1,30 @@
|
||||
# Eza is a ls replacement
|
||||
{
|
||||
programs.eza = {
|
||||
enable = true;
|
||||
icons = "auto";
|
||||
enableBashIntegration = true;
|
||||
enableZshIntegration = true;
|
||||
enableFishIntegration = true;
|
||||
git = true;
|
||||
|
||||
extraOptions = [
|
||||
"--group-directories-first"
|
||||
"--no-quotes"
|
||||
"--header" # Show header row
|
||||
"--git-ignore"
|
||||
"--icons=always"
|
||||
# "--time-style=long-iso" # ISO 8601 extended format for time
|
||||
"--classify" # append indicator (/, *, =, @, |)
|
||||
"--hyperlink" # make paths clickable in some terminals
|
||||
];
|
||||
};
|
||||
# Aliases to make `ls`, `ll`, `la` use eza
|
||||
home.shellAliases = {
|
||||
ls = "eza";
|
||||
lt = "eza --tree --level=2";
|
||||
ll = "eza -lh --no-user --long";
|
||||
la = "eza -lah ";
|
||||
tree = "eza --tree ";
|
||||
};
|
||||
}
|
||||
BIN
modules/home/face.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
136
modules/home/fastfetch/default.nix
Normal file
@@ -0,0 +1,136 @@
|
||||
{
|
||||
programs.fastfetch = {
|
||||
enable = true;
|
||||
|
||||
settings = {
|
||||
display = {
|
||||
color = {
|
||||
keys = "35";
|
||||
output = "95";
|
||||
};
|
||||
separator = " ➜ ";
|
||||
};
|
||||
|
||||
logo = {
|
||||
source = ./nixos.png;
|
||||
type = "kitty-direct";
|
||||
height = 10;
|
||||
width = 20;
|
||||
padding = {
|
||||
top = 2;
|
||||
left = 2;
|
||||
};
|
||||
};
|
||||
|
||||
modules = [
|
||||
"break"
|
||||
{
|
||||
type = "os";
|
||||
key = "OS";
|
||||
keyColor = "31";
|
||||
}
|
||||
{
|
||||
type = "command";
|
||||
key = " ├ SaugOS ";
|
||||
keyColor = "31";
|
||||
text = "echo v$" + "{SAUGOS_VERSION}";
|
||||
}
|
||||
{
|
||||
type = "kernel";
|
||||
key = " ├ ";
|
||||
keyColor = "31";
|
||||
}
|
||||
{
|
||||
type = "packages";
|
||||
key = " ├ ";
|
||||
keyColor = "31";
|
||||
}
|
||||
{
|
||||
type = "shell";
|
||||
key = " └ ";
|
||||
keyColor = "31";
|
||||
}
|
||||
"break"
|
||||
{
|
||||
type = "wm";
|
||||
key = "WM ";
|
||||
keyColor = "32";
|
||||
}
|
||||
{
|
||||
type = "wmtheme";
|
||||
key = " ├ ";
|
||||
keyColor = "32";
|
||||
}
|
||||
{
|
||||
type = "icons";
|
||||
key = " ├ ";
|
||||
keyColor = "32";
|
||||
}
|
||||
{
|
||||
type = "cursor";
|
||||
key = " ├ ";
|
||||
keyColor = "32";
|
||||
}
|
||||
{
|
||||
type = "terminal";
|
||||
key = " ├ ";
|
||||
keyColor = "32";
|
||||
}
|
||||
{
|
||||
type = "terminalfont";
|
||||
key = " └ ";
|
||||
keyColor = "32";
|
||||
}
|
||||
"break"
|
||||
{
|
||||
type = "host";
|
||||
format = "{5} {1} Type {2}";
|
||||
key = "PC ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "cpu";
|
||||
format = "{1} ({3}) @ {7} GHz";
|
||||
key = " ├ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "gpu";
|
||||
format = "{1} {2} @ {12} GHz";
|
||||
key = " ├ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "memory";
|
||||
key = " ├ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "disk";
|
||||
key = " ├ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "monitor";
|
||||
key = " ├ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "player";
|
||||
key = " ├ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
{
|
||||
type = "media";
|
||||
key = " └ ";
|
||||
keyColor = "33";
|
||||
}
|
||||
"break"
|
||||
{
|
||||
type = "uptime";
|
||||
key = " Uptime ";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
BIN
modules/home/fastfetch/nixos.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
37
modules/home/fzf.nix
Normal file
@@ -0,0 +1,37 @@
|
||||
# Fzf is a general-purpose command-line fuzzy finder.
|
||||
{ config
|
||||
, lib
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
accent = "#" + config.lib.stylix.colors.base0D;
|
||||
foreground = "#" + config.lib.stylix.colors.base05;
|
||||
muted = "#" + config.lib.stylix.colors.base03;
|
||||
in
|
||||
{
|
||||
programs.fzf = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
colors = lib.mkForce {
|
||||
"fg+" = accent;
|
||||
"bg+" = "-1";
|
||||
"fg" = foreground;
|
||||
"bg" = "-1";
|
||||
"prompt" = muted;
|
||||
"pointer" = accent;
|
||||
};
|
||||
defaultOptions = [
|
||||
"--margin=1"
|
||||
"--layout=reverse"
|
||||
"--border=none"
|
||||
"--info='hidden'"
|
||||
"--header=''"
|
||||
"--prompt='/ '"
|
||||
"-i"
|
||||
"--no-bold"
|
||||
"--bind='enter:execute(nvim {})'"
|
||||
"--preview='bat --style=numbers --color=always --line-range :500 {}'"
|
||||
"--preview-window=right:60%:wrap"
|
||||
];
|
||||
};
|
||||
}
|
||||
6
modules/home/gh.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ ... }:
|
||||
{
|
||||
programs = {
|
||||
gh.enable = true;
|
||||
};
|
||||
}
|
||||
100
modules/home/ghostty.nix
Normal file
@@ -0,0 +1,100 @@
|
||||
{ pkgs, ... }:
|
||||
let
|
||||
# A recent issue 7/7/2025 w/ghostty causes it to hang or respond slowly
|
||||
# This is a workaround until a fix is released
|
||||
myGhostty = pkgs.ghostty.overrideAttrs (_: {
|
||||
preBuild = ''
|
||||
shopt -s globstar
|
||||
sed -i 's/^const xev = @import("xev");$/const xev = @import("xev").Epoll;/' **/*.zig
|
||||
shopt -u globstar
|
||||
'';
|
||||
});
|
||||
in
|
||||
{
|
||||
programs.ghostty = {
|
||||
enable = true;
|
||||
package = myGhostty; # to fix a but in current builds of ghostty
|
||||
#package = pkgs.ghostty;
|
||||
};
|
||||
home.file."./.config/ghostty/config".text = ''
|
||||
|
||||
#theme = Aura
|
||||
theme = Dracula
|
||||
#theme = Aardvark Blue
|
||||
#theme = GruvboxDarkHard
|
||||
adjust-cell-height = 10%
|
||||
window-theme = dark
|
||||
window-height = 32
|
||||
window-width = 110
|
||||
background-opacity = 0.95
|
||||
background-blur-radius = 60
|
||||
selection-background = #2d3f76
|
||||
selection-foreground = #c8d3f5
|
||||
cursor-style = bar
|
||||
mouse-hide-while-typing = true
|
||||
|
||||
# keybindings
|
||||
# Copy/Paste
|
||||
keybind = ctrl+shift+c=copy_to_clipboard
|
||||
keybind = ctrl+shift+v=paste_from_clipboard
|
||||
|
||||
keybind = alt+s>r=reload_config
|
||||
keybind = alt+s>x=close_surface
|
||||
|
||||
keybind = alt+s>n=new_window
|
||||
|
||||
# tabs
|
||||
keybind = alt+s>c=new_tab
|
||||
keybind = alt+s>shift+l=next_tab
|
||||
keybind = alt+s>shift+h=previous_tab
|
||||
keybind = alt+s>comma=move_tab:-1
|
||||
keybind = alt+s>period=move_tab:1
|
||||
|
||||
# quick tab switch
|
||||
keybind = alt+s>1=goto_tab:1
|
||||
keybind = alt+s>2=goto_tab:2
|
||||
keybind = alt+s>3=goto_tab:3
|
||||
keybind = alt+s>4=goto_tab:4
|
||||
keybind = alt+s>5=goto_tab:5
|
||||
keybind = alt+s>6=goto_tab:6
|
||||
keybind = alt+s>7=goto_tab:7
|
||||
keybind = alt+s>8=goto_tab:8
|
||||
keybind = alt+s>9=goto_tab:9
|
||||
|
||||
# split
|
||||
keybind = alt+s>\=new_split:right
|
||||
keybind = alt+s>-=new_split:down
|
||||
|
||||
keybind = alt+s>j=goto_split:bottom
|
||||
keybind = alt+s>k=goto_split:top
|
||||
keybind = alt+s>h=goto_split:left
|
||||
keybind = alt+s>l=goto_split:right
|
||||
|
||||
keybind = alt+s>z=toggle_split_zoom
|
||||
|
||||
keybind = alt+s>e=equalize_splits
|
||||
|
||||
# other
|
||||
#copy-on-select = clipboard
|
||||
|
||||
font-size = 12
|
||||
#font-family = JetBrainsMono Nerd Font Mono
|
||||
#font-family-bold = JetBrainsMono NFM Bold
|
||||
#font-family-bold-italic = JetBrainsMono NFM Bold Italic
|
||||
#font-family-italic = JetBrainsMono NFM Italic
|
||||
|
||||
font-family = BerkeleyMono Nerd Font
|
||||
#font-family = Iosevka Nerd Font
|
||||
# font-family = SFMono Nerd Font
|
||||
|
||||
title = "GhosTTY"
|
||||
|
||||
wait-after-command = false
|
||||
shell-integration = detect
|
||||
window-save-state = always
|
||||
gtk-single-instance = true
|
||||
unfocused-split-opacity = 0.5
|
||||
quick-terminal-position = center
|
||||
shell-integration-features = cursor,sudo
|
||||
'';
|
||||
}
|
||||
31
modules/home/git.nix
Normal file
@@ -0,0 +1,31 @@
|
||||
{ host, ... }:
|
||||
let
|
||||
inherit (import ../../hosts/${host}/variables.nix) gitUsername gitEmail;
|
||||
in
|
||||
{
|
||||
programs.git = {
|
||||
enable = true;
|
||||
settings = {
|
||||
user = {
|
||||
name = gitUsername;
|
||||
email = gitEmail;
|
||||
};
|
||||
push.default = "simple";
|
||||
credential.helper = "cache --timeout=7200";
|
||||
init.defaultBranch = "main";
|
||||
log.decorate = "full";
|
||||
log.date = "iso";
|
||||
merge.conflictStyle = "diff3";
|
||||
alias = {
|
||||
br = "branch --sort=-committerdate";
|
||||
co = "checkout";
|
||||
df = "diff";
|
||||
com = "commit -a";
|
||||
gs = "stash";
|
||||
gp = "pull";
|
||||
lg = "log --graph --pretty=format:'%Cred%h%Creset - %C(yellow)%d%Creset %s %C(green)(%cr)%C(bold blue) <%an>%Creset' --abbrev-commit";
|
||||
st = "status";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
16
modules/home/gtk.nix
Normal file
@@ -0,0 +1,16 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
gtk = {
|
||||
iconTheme = {
|
||||
name = "Papirus-Dark";
|
||||
package = pkgs.papirus-icon-theme;
|
||||
};
|
||||
gtk3.extraConfig = {
|
||||
gtk-application-prefer-dark-theme = 1;
|
||||
};
|
||||
gtk4.extraConfig = {
|
||||
gtk-application-prefer-dark-theme = 1;
|
||||
};
|
||||
};
|
||||
}
|
||||
42
modules/home/htop.nix
Normal file
@@ -0,0 +1,42 @@
|
||||
{ config, ... }: {
|
||||
programs.htop = {
|
||||
enable = true;
|
||||
settings =
|
||||
{
|
||||
color_scheme = 6;
|
||||
cpu_count_from_one = 0;
|
||||
delay = 15;
|
||||
fields = with config.lib.htop.fields; [
|
||||
PID
|
||||
USER
|
||||
PRIORITY
|
||||
NICE
|
||||
M_SIZE
|
||||
M_RESIDENT
|
||||
M_SHARE
|
||||
STATE
|
||||
PERCENT_CPU
|
||||
PERCENT_MEM
|
||||
TIME
|
||||
COMM
|
||||
];
|
||||
highlight_base_name = 1;
|
||||
highlight_megabytes = 1;
|
||||
highlight_threads = 1;
|
||||
}
|
||||
// (with config.lib.htop;
|
||||
leftMeters [
|
||||
(bar "AllCPUs2")
|
||||
(bar "Memory")
|
||||
(bar "Swap")
|
||||
(text "Zram")
|
||||
])
|
||||
// (with config.lib.htop;
|
||||
rightMeters [
|
||||
(text "Tasks")
|
||||
(text "LoadAverage")
|
||||
(text "Uptime")
|
||||
(text "Systemd")
|
||||
]);
|
||||
};
|
||||
}
|
||||
75
modules/home/kitty.nix
Normal file
@@ -0,0 +1,75 @@
|
||||
{ pkgs, ... }: {
|
||||
programs.kitty = {
|
||||
enable = true;
|
||||
package = pkgs.kitty;
|
||||
settings = {
|
||||
font_size = 12;
|
||||
wheel_scroll_min_lines = 1;
|
||||
window_padding_width = 4;
|
||||
confirm_os_window_close = 0;
|
||||
scrollback_lines = 10000;
|
||||
enable_audio_bell = false;
|
||||
mouse_hide_wait = 60;
|
||||
cursor_trail = 1;
|
||||
tab_fade = 1;
|
||||
active_tab_font_style = "bold";
|
||||
inactive_tab_font_style = "bold";
|
||||
tab_bar_edge = "top";
|
||||
tab_bar_margin_width = 0;
|
||||
tab_bar_style = "powerline";
|
||||
#tab_bar_style = "fade";
|
||||
enabled_layouts = "splits";
|
||||
};
|
||||
extraConfig = ''
|
||||
|
||||
# Clipboard
|
||||
map ctrl+shift+v paste_from_selection
|
||||
map shift+insert paste_from_selection
|
||||
|
||||
# Scrolling
|
||||
map ctrl+shift+up scroll_line_up
|
||||
map ctrl+shift+down scroll_line_down
|
||||
map ctrl+shift+k scroll_line_up
|
||||
map ctrl+shift+j scroll_line_down
|
||||
map ctrl+shift+page_up scroll_page_up
|
||||
map ctrl+shift+page_down scroll_page_down
|
||||
map ctrl+shift+home scroll_home
|
||||
map ctrl+shift+end scroll_end
|
||||
map ctrl+shift+h show_scrollback
|
||||
|
||||
# Window management
|
||||
map alt+n new_window_with_cwd #open in current dir
|
||||
#map alt+n new_os_window #opens term in $HOME
|
||||
map alt+w close_window
|
||||
map ctrl+shift+enter launch --location=hsplit
|
||||
map ctrl+shift+s launch --location=vsplit
|
||||
map ctrl+shift+] next_window
|
||||
map ctrl+shift+[ previous_window
|
||||
map ctrl+shift+f move_window_forward
|
||||
map ctrl+shift+b move_window_backward
|
||||
map ctrl+shift+` move_window_to_top
|
||||
map ctrl+shift+1 first_window
|
||||
map ctrl+shift+2 second_window
|
||||
map ctrl+shift+3 third_window
|
||||
map ctrl+shift+4 fourth_window
|
||||
map ctrl+shift+5 fifth_window
|
||||
map ctrl+shift+6 sixth_window
|
||||
map ctrl+shift+7 seventh_window
|
||||
map ctrl+shift+8 eighth_window
|
||||
map ctrl+shift+9 ninth_window # Tab management
|
||||
map ctrl+shift+0 tenth_window
|
||||
map ctrl+shift+right next_tab
|
||||
map ctrl+shift+left previous_tab
|
||||
map ctrl+shift+t new_tab
|
||||
map ctrl+shift+q close_tab
|
||||
map ctrl+shift+l next_layout
|
||||
map ctrl+shift+. move_tab_forward
|
||||
map ctrl+shift+, move_tab_backward
|
||||
|
||||
# Miscellaneous
|
||||
map ctrl+shift+up increase_font_size
|
||||
map ctrl+shift+down decrease_font_size
|
||||
map ctrl+shift+backspace restore_font_size
|
||||
'';
|
||||
};
|
||||
}
|
||||
32
modules/home/lazygit.nix
Normal file
@@ -0,0 +1,32 @@
|
||||
# Lazygit is a simple terminal UI for git commands.
|
||||
{ config, lib, ... }:
|
||||
let
|
||||
accent = "#${config.lib.stylix.colors.base0D}";
|
||||
muted = "#${config.lib.stylix.colors.base03}";
|
||||
in
|
||||
{
|
||||
programs.lazygit = {
|
||||
enable = true;
|
||||
settings = lib.mkForce {
|
||||
disableStartupPopups = true;
|
||||
notARepository = "skip";
|
||||
promptToReturnFromSubprocess = false;
|
||||
update.method = "never";
|
||||
git = {
|
||||
commit.signOff = true;
|
||||
parseEmoji = true;
|
||||
};
|
||||
gui = {
|
||||
theme = {
|
||||
activeBorderColor = [ accent "bold" ];
|
||||
inactiveBorderColor = [ muted ];
|
||||
};
|
||||
showListFooter = false;
|
||||
showRandomTip = false;
|
||||
showCommandLog = false;
|
||||
showBottomLine = false;
|
||||
nerdFontsVersion = "3";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
193
modules/home/niri/binds.nix
Normal file
@@ -0,0 +1,193 @@
|
||||
{
|
||||
host,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
inherit (import ../../../hosts/${host}/variables.nix) browser terminal;
|
||||
in {
|
||||
programs.niri.settings = {
|
||||
binds = with config.lib.niri.actions; {
|
||||
# Terminal & application launcher
|
||||
"Mod+Return".action.spawn = "${terminal}";
|
||||
"Mod+D".action.spawn = "fuzzel";
|
||||
"Mod+R".action.spawn = "rofi-launcher";
|
||||
|
||||
# Window management
|
||||
"Mod+Q".action = close-window;
|
||||
"Mod+F".action = fullscreen-window;
|
||||
"Mod+Shift+F".action = maximize-column;
|
||||
"Mod+Shift+Space".action = toggle-window-floating;
|
||||
"Mod+Space".action = switch-focus-between-floating-and-tiling;
|
||||
|
||||
# Session control
|
||||
"Mod+Shift+E".action.quit = {skip-confirmation = false;};
|
||||
"Mod+Shift+Q".action.quit = {skip-confirmation = true;};
|
||||
"Mod+L" = {
|
||||
action.spawn = ["swaylock"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
|
||||
# Focus windows
|
||||
"Mod+Left".action = focus-column-left;
|
||||
"Mod+Right".action = focus-column-right;
|
||||
"Mod+Up".action = focus-window-up;
|
||||
"Mod+Down".action = focus-window-down;
|
||||
"Mod+Home".action = focus-column-first;
|
||||
"Mod+End".action = focus-column-last;
|
||||
|
||||
# Focus monitors
|
||||
"Mod+Shift+Left".action = focus-monitor-left;
|
||||
"Mod+Shift+Right".action = focus-monitor-right;
|
||||
"Mod+Shift+Up".action = focus-monitor-up;
|
||||
"Mod+Shift+Down".action = focus-monitor-down;
|
||||
|
||||
# Move windows within workspace
|
||||
"Mod+Ctrl+Left".action = move-column-left;
|
||||
"Mod+Ctrl+Right".action = move-column-right;
|
||||
"Mod+Ctrl+Up".action = move-window-up;
|
||||
"Mod+Ctrl+Down".action = move-window-down;
|
||||
"Mod+Ctrl+W".action = toggle-column-tabbed-display;
|
||||
"Mod+Ctrl+Home".action = move-column-to-first;
|
||||
"Mod+Ctrl+End".action = move-column-to-last;
|
||||
|
||||
# Move windows to monitors
|
||||
"Mod+Shift+Ctrl+Left".action = move-column-to-monitor-left;
|
||||
"Mod+Shift+Ctrl+Right".action = move-column-to-monitor-right;
|
||||
"Mod+Shift+Ctrl+Up".action = move-column-to-monitor-up;
|
||||
"Mod+Shift+Ctrl+Down".action = move-column-to-monitor-down;
|
||||
|
||||
# Workspaces
|
||||
"Mod+1".action = {focus-workspace = 1;};
|
||||
"Mod+2".action = {focus-workspace = 2;};
|
||||
"Mod+3".action = {focus-workspace = 3;};
|
||||
"Mod+4".action = {focus-workspace = 4;};
|
||||
"Mod+5".action = {focus-workspace = 5;};
|
||||
"Mod+6".action = {focus-workspace = 6;};
|
||||
"Mod+7".action = {focus-workspace = 7;};
|
||||
"Mod+8".action = {focus-workspace = 8;};
|
||||
"Mod+9".action = {focus-workspace = 9;};
|
||||
|
||||
"Mod+Page_Down".action = focus-workspace-down;
|
||||
"Mod+Page_Up".action = focus-workspace-up;
|
||||
|
||||
"Mod+Shift+1".action = {move-window-to-workspace = 1;};
|
||||
"Mod+Shift+2".action = {move-window-to-workspace = 2;};
|
||||
"Mod+Shift+3".action = {move-window-to-workspace = 3;};
|
||||
"Mod+Shift+4".action = {move-window-to-workspace = 4;};
|
||||
"Mod+Shift+5".action = {move-window-to-workspace = 5;};
|
||||
"Mod+Shift+6".action = {move-window-to-workspace = 6;};
|
||||
"Mod+Shift+7".action = {move-window-to-workspace = 7;};
|
||||
"Mod+Shift+8".action = {move-window-to-workspace = 8;};
|
||||
"Mod+Shift+9".action = {move-window-to-workspace = 9;};
|
||||
|
||||
"Mod+Shift+Page_Down".action = move-window-to-workspace-down;
|
||||
"Mod+Shift+Page_Up".action = move-window-to-workspace-up;
|
||||
|
||||
"Mod+Ctrl+1".action = {move-column-to-workspace = 1;};
|
||||
"Mod+Ctrl+2".action = {move-column-to-workspace = 2;};
|
||||
"Mod+Ctrl+3".action = {move-column-to-workspace = 3;};
|
||||
"Mod+Ctrl+4".action = {move-column-to-workspace = 4;};
|
||||
"Mod+Ctrl+5".action = {move-column-to-workspace = 5;};
|
||||
"Mod+Ctrl+6".action = {move-column-to-workspace = 6;};
|
||||
"Mod+Ctrl+7".action = {move-column-to-workspace = 7;};
|
||||
"Mod+Ctrl+8".action = {move-column-to-workspace = 8;};
|
||||
"Mod+Ctrl+9".action = {move-column-to-workspace = 9;};
|
||||
|
||||
"Mod+Ctrl+Page_Down".action = move-column-to-workspace-down;
|
||||
"Mod+Ctrl+Page_Up".action = move-column-to-workspace-up;
|
||||
|
||||
# Layout & Sizing
|
||||
"Mod+Plus".action = {set-column-width = "+10%";};
|
||||
"Mod+Shift+Plus".action = {set-column-width = "+10";};
|
||||
"Mod+odiaeresis".action = {set-column-width = "-10%";};
|
||||
"Mod+Shift+odiaeresis".action = {set-column-width = "-10";};
|
||||
|
||||
"Mod+Ctrl+Plus".action = {set-window-height = "+10%";};
|
||||
"Mod+Ctrl+Shift+Plus".action = {set-window-height = "+10";};
|
||||
"Mod+Ctrl+odiaeresis".action = {set-window-height = "-10%";};
|
||||
"Mod+Ctrl+Shift+odiaeresis".action = {set-window-height = "-10";};
|
||||
|
||||
"Mod+Shift+R".action = reset-window-height;
|
||||
"Mod+comma".action = switch-preset-column-width;
|
||||
"Mod+period".action = switch-preset-window-height;
|
||||
"Mod+M".action = maximize-column;
|
||||
"Mod+C".action = center-column;
|
||||
|
||||
# Overview mode
|
||||
"Mod+Tab".action = toggle-overview;
|
||||
"Mod+numbersign".action = show-hotkey-overlay;
|
||||
|
||||
# Screenshots
|
||||
"Print".action.screenshot = {};
|
||||
"Ctrl+Print".action.screenshot-screen = {};
|
||||
"Alt+Print".action.screenshot-window = {};
|
||||
|
||||
# Media keys
|
||||
"XF86AudioRaiseVolume" = {
|
||||
action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
"XF86AudioLowerVolume" = {
|
||||
action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
"XF86AudioMute" = {
|
||||
action.spawn = ["wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
"XF86AudioMicMute" = {
|
||||
action.spawn = ["wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
|
||||
# Brightness
|
||||
"XF86MonBrightnessUp" = {
|
||||
action.spawn = ["brightnessctl" "set" "10%+"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
"XF86MonBrightnessDown" = {
|
||||
action.spawn = ["brightnessctl" "set" "10%-"];
|
||||
allow-when-locked = true;
|
||||
};
|
||||
|
||||
# Scroll bindings
|
||||
"Mod+WheelScrollDown" = {
|
||||
action = focus-workspace-down;
|
||||
cooldown-ms = 150;
|
||||
};
|
||||
"Mod+WheelScrollUp" = {
|
||||
action = focus-workspace-up;
|
||||
cooldown-ms = 150;
|
||||
};
|
||||
"Mod+WheelScrollRight".action = focus-column-right;
|
||||
"Mod+WheelScrollLeft".action = focus-column-left;
|
||||
"Mod+TouchpadScrollDown" = {
|
||||
action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"];
|
||||
cooldown-ms = 150;
|
||||
};
|
||||
"Mod+TouchpadScrollUp" = {
|
||||
action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"];
|
||||
cooldown-ms = 150;
|
||||
};
|
||||
|
||||
# Custom applications
|
||||
"Mod+W".action.spawn = "${browser}";
|
||||
"Mod+E".action.spawn = "thunar";
|
||||
"Mod+Ctrl+Escape".action.spawn = "btop";
|
||||
|
||||
# Advanced
|
||||
"Mod+H".action = consume-window-into-column;
|
||||
"Mod+K".action = expel-window-from-column;
|
||||
"Mod+Ctrl+H".action = consume-or-expel-window-left;
|
||||
"Mod+Ctrl+L".action = consume-or-expel-window-right;
|
||||
"Mod+Shift+T".action = do-screen-transition;
|
||||
"Mod+O".action = toggle-window-rule-opacity;
|
||||
"Mod+Shift+Ctrl+T".action = toggle-debug-tint;
|
||||
"Mod+Escape" = {
|
||||
action = toggle-keyboard-shortcuts-inhibit;
|
||||
allow-inhibiting = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
8
modules/home/niri/default.nix
Normal file
@@ -0,0 +1,8 @@
|
||||
{ host, ... }:
|
||||
{
|
||||
imports = [
|
||||
./niri.nix
|
||||
./binds.nix
|
||||
./windowrules.nix
|
||||
];
|
||||
}
|
||||
117
modules/home/niri/niri.nix
Normal file
@@ -0,0 +1,117 @@
|
||||
{ host, config, pkgs, inputs, ... }:
|
||||
let
|
||||
vars = import ../../../hosts/${host}/variables.nix;
|
||||
extraMonitorSettings = vars.extraMonitorSettings;
|
||||
keyboardLayout = vars.keyboardLayout or "us";
|
||||
keyboardVariant = vars.keyboardVariant or "";
|
||||
stylixImage = vars.stylixImage;
|
||||
in
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
swww
|
||||
grim
|
||||
slurp
|
||||
wl-clipboard
|
||||
swappy
|
||||
xwayland-satellite
|
||||
];
|
||||
|
||||
home.file = {
|
||||
"Pictures/Wallpapers" = {
|
||||
source = ../../../wallpapers;
|
||||
recursive = true;
|
||||
};
|
||||
".face.icon".source = ../face.jpg;
|
||||
".config/face.jpg".source = ../face.jpg;
|
||||
};
|
||||
|
||||
programs.niri = {
|
||||
settings = {
|
||||
input = {
|
||||
keyboard = {
|
||||
xkb = {
|
||||
layout = "${keyboardLayout}";
|
||||
variant = "${keyboardVariant}";
|
||||
options = "grp:alt_caps_toggle,caps:super";
|
||||
};
|
||||
repeat-delay = 300;
|
||||
repeat-rate = 50;
|
||||
};
|
||||
|
||||
touchpad = {
|
||||
tap = true;
|
||||
natural-scroll = true;
|
||||
dwt = true;
|
||||
scroll-factor = 0.8;
|
||||
};
|
||||
|
||||
mouse = {
|
||||
accel-speed = 0.0;
|
||||
};
|
||||
};
|
||||
|
||||
layout = {
|
||||
gaps = 8;
|
||||
center-focused-column = "never";
|
||||
|
||||
border = {
|
||||
enable = true;
|
||||
width = 2;
|
||||
active = {
|
||||
color = "#${config.lib.stylix.colors.base08}";
|
||||
};
|
||||
inactive = {
|
||||
color = "#${config.lib.stylix.colors.base01}";
|
||||
};
|
||||
};
|
||||
|
||||
focus-ring = {
|
||||
enable = false;
|
||||
};
|
||||
};
|
||||
|
||||
spawn-at-startup = [
|
||||
{ command = [ "xwayland-satellite" ":1" ]; }
|
||||
{ command = [ "swww-daemon" ]; }
|
||||
{ command = [ "waybar" ]; }
|
||||
{ command = [ "swaync" ]; }
|
||||
{ command = [ "swww" "img" "${stylixImage}" ]; }
|
||||
{ command = [ "swayidle" "-w" "before-sleep" "swaylock" ]; }
|
||||
];
|
||||
|
||||
prefer-no-csd = true;
|
||||
|
||||
screenshot-path = "~/Pictures/Screenshots/Screenshot-%Y-%m-%d-%H-%M-%S.png";
|
||||
|
||||
environment = {
|
||||
DISPLAY = ":1";
|
||||
NIXOS_OZONE_WL = "1";
|
||||
MOZ_ENABLE_WAYLAND = "1";
|
||||
MOZ_WEBRENDER = "1";
|
||||
XDG_SESSION_TYPE = "wayland";
|
||||
WLR_NO_HARDWARE_CURSORS = "1";
|
||||
QT_QPA_PLATFORM = "wayland";
|
||||
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||
GDK_BACKEND = "wayland,x11";
|
||||
CLUTTER_BACKEND = "wayland";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
systemd.user.targets.niri-shutdown = {
|
||||
Unit = {
|
||||
Description = "Shutdown running niri user services";
|
||||
DefaultDependencies = "no";
|
||||
StopWhenUnneeded = true;
|
||||
|
||||
Conflicts = [
|
||||
"graphical-session.target"
|
||||
"graphical-session-pre.target"
|
||||
];
|
||||
After = [
|
||||
"graphical-session.target"
|
||||
"graphical-session-pre.target"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
55
modules/home/niri/windowrules.nix
Normal file
@@ -0,0 +1,55 @@
|
||||
{ ... }:
|
||||
{
|
||||
programs.niri.settings = {
|
||||
window-rules = [
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^org.kde.polkit-kde-authentication-agent-1$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^pavucontrol$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^blueman-manager$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^nm-connection-editor$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ title = "^Picture-in-Picture$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^thunar$"; title = "^File Operation Progress$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^firefox$"; title = "^Picture-in-Picture$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
{
|
||||
matches = [
|
||||
{ app-id = "^rofi$"; }
|
||||
];
|
||||
open-floating = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
268
modules/home/nvf.nix
Normal file
@@ -0,0 +1,268 @@
|
||||
{ inputs
|
||||
, config
|
||||
, ...
|
||||
}: {
|
||||
imports = [ inputs.nvf.homeManagerModules.default ];
|
||||
|
||||
programs.nvf = {
|
||||
enable = true;
|
||||
|
||||
settings.vim = {
|
||||
lsp.enable = true;
|
||||
vimAlias = true;
|
||||
viAlias = true;
|
||||
withNodeJs = true;
|
||||
lineNumberMode = "relNumber";
|
||||
enableLuaLoader = true;
|
||||
preventJunkFiles = true;
|
||||
options = {
|
||||
tabstop = 4;
|
||||
shiftwidth = 2;
|
||||
wrap = false;
|
||||
};
|
||||
|
||||
clipboard = {
|
||||
enable = true;
|
||||
registers = "unnamedplus";
|
||||
providers = {
|
||||
wl-copy.enable = true;
|
||||
xsel.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
maps = {
|
||||
normal = {
|
||||
"<leader>e" = {
|
||||
action = "<CMD>Neotree toggle<CR>";
|
||||
silent = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
diagnostics = {
|
||||
enable = true;
|
||||
config = {
|
||||
virtual_lines.enable = true;
|
||||
underline = true;
|
||||
};
|
||||
};
|
||||
|
||||
keymaps = [
|
||||
{
|
||||
key = "jk";
|
||||
mode = [ "i" ];
|
||||
action = "<ESC>";
|
||||
desc = "Exit insert mode";
|
||||
}
|
||||
{
|
||||
key = "<leader>nh";
|
||||
mode = [ "n" ];
|
||||
action = ":nohl<CR>";
|
||||
desc = "Clear search highlights";
|
||||
}
|
||||
{
|
||||
key = "<leader>ff";
|
||||
mode = [ "n" ];
|
||||
action = "<cmd>Telescope find_files<cr>";
|
||||
desc = "Search files by name";
|
||||
}
|
||||
{
|
||||
key = "<leader>lg";
|
||||
mode = [ "n" ];
|
||||
action = "<cmd>Telescope live_grep<cr>";
|
||||
desc = "Search files by contents";
|
||||
}
|
||||
{
|
||||
key = "<leader>fe";
|
||||
mode = [ "n" ];
|
||||
action = "<cmd>Neotree toggle<cr>";
|
||||
desc = "File browser toggle";
|
||||
}
|
||||
{
|
||||
key = "<C-h>";
|
||||
mode = [ "i" ];
|
||||
action = "<Left>";
|
||||
desc = "Move left in insert mode";
|
||||
}
|
||||
{
|
||||
key = "<C-j>";
|
||||
mode = [ "i" ];
|
||||
action = "<Down>";
|
||||
desc = "Move down in insert mode";
|
||||
}
|
||||
{
|
||||
key = "<C-k>";
|
||||
mode = [ "i" ];
|
||||
action = "<Up>";
|
||||
desc = "Move up in insert mode";
|
||||
}
|
||||
{
|
||||
key = "<C-l>";
|
||||
mode = [ "i" ];
|
||||
action = "<Right>";
|
||||
desc = "Move right in insert mode";
|
||||
}
|
||||
];
|
||||
|
||||
telescope.enable = true;
|
||||
|
||||
spellcheck = {
|
||||
enable = true;
|
||||
languages = [ "en" ];
|
||||
programmingWordlist.enable = true;
|
||||
};
|
||||
|
||||
lsp = {
|
||||
formatOnSave = true;
|
||||
lspkind.enable = false;
|
||||
lightbulb.enable = false;
|
||||
lspsaga.enable = false;
|
||||
trouble.enable = true;
|
||||
lspSignature.enable = true;
|
||||
otter-nvim.enable = false;
|
||||
nvim-docs-view.enable = false;
|
||||
};
|
||||
|
||||
languages = {
|
||||
enableFormat = true;
|
||||
enableTreesitter = true;
|
||||
enableExtraDiagnostics = true;
|
||||
nix.enable = true;
|
||||
clang.enable = true;
|
||||
zig.enable = true;
|
||||
python.enable = true;
|
||||
markdown.enable = true;
|
||||
ts = {
|
||||
enable = true;
|
||||
lsp.enable = true;
|
||||
format.type = ["prettierd"];
|
||||
extensions.ts-error-translator.enable = true;
|
||||
};
|
||||
html.enable = true;
|
||||
lua.enable = true;
|
||||
css = {
|
||||
enable = true;
|
||||
format.type = ["prettierd"];
|
||||
};
|
||||
typst.enable = true;
|
||||
rust = {
|
||||
enable = true;
|
||||
extensions.crates-nvim.enable = true;
|
||||
};
|
||||
};
|
||||
visuals = {
|
||||
nvim-web-devicons.enable = true;
|
||||
nvim-cursorline.enable = true;
|
||||
cinnamon-nvim.enable = true;
|
||||
fidget-nvim.enable = true;
|
||||
highlight-undo.enable = true;
|
||||
indent-blankline.enable = true;
|
||||
rainbow-delimiters.enable = true;
|
||||
};
|
||||
|
||||
statusline.lualine = {
|
||||
enable = true;
|
||||
theme = "base16";
|
||||
};
|
||||
|
||||
autopairs.nvim-autopairs.enable = true;
|
||||
autocomplete.nvim-cmp.enable = true;
|
||||
snippets.luasnip.enable = true;
|
||||
tabline.nvimBufferline.enable = true;
|
||||
treesitter.context.enable = false;
|
||||
binds = {
|
||||
whichKey.enable = true;
|
||||
cheatsheet.enable = true;
|
||||
};
|
||||
git = {
|
||||
enable = true;
|
||||
gitsigns.enable = true;
|
||||
gitsigns.codeActions.enable = false;
|
||||
};
|
||||
projects.project-nvim.enable = true;
|
||||
dashboard.dashboard-nvim.enable = true;
|
||||
filetree.neo-tree.enable = true;
|
||||
notify = {
|
||||
nvim-notify.enable = true;
|
||||
nvim-notify.setupOpts.background_colour = "#${config.lib.stylix.colors.base01}";
|
||||
};
|
||||
utility = {
|
||||
preview.markdownPreview.enable = true;
|
||||
ccc.enable = false;
|
||||
vim-wakatime.enable = false;
|
||||
icon-picker.enable = true;
|
||||
surround.enable = true;
|
||||
diffview-nvim.enable = true;
|
||||
motion = {
|
||||
hop.enable = true;
|
||||
leap.enable = true;
|
||||
precognition.enable = false;
|
||||
};
|
||||
images = {
|
||||
image-nvim.enable = false;
|
||||
};
|
||||
};
|
||||
ui = {
|
||||
borders.enable = true;
|
||||
noice.enable = true;
|
||||
colorizer.enable = true;
|
||||
illuminate.enable = true;
|
||||
breadcrumbs = {
|
||||
enable = false;
|
||||
navbuddy.enable = false;
|
||||
};
|
||||
smartcolumn = {
|
||||
enable = true;
|
||||
};
|
||||
fastaction.enable = true;
|
||||
};
|
||||
|
||||
session = {
|
||||
nvim-session-manager.enable = false;
|
||||
};
|
||||
comments = {
|
||||
comment-nvim.enable = true;
|
||||
};
|
||||
|
||||
luaConfigPost = ''
|
||||
-- Nix LSP (nil) configuration for auto-eval-inputs
|
||||
local lspconfig = require('lspconfig')
|
||||
lspconfig.nil_ls.setup({
|
||||
settings = {
|
||||
['nil'] = {
|
||||
nix = {
|
||||
auto_eval_inputs = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
-- Auto-update programming wordlist on first startup
|
||||
vim.api.nvim_create_autocmd("VimEnter", {
|
||||
callback = function()
|
||||
-- Check if dirtytalk dict file exists
|
||||
local dict_path = vim.fn.stdpath('data') .. '/site/spell/programming.utf-8.add'
|
||||
if vim.fn.filereadable(dict_path) == 0 then
|
||||
-- Only run if file doesn't exist to avoid repeated downloads
|
||||
vim.schedule(function()
|
||||
vim.cmd('DirtytalkUpdate')
|
||||
end)
|
||||
end
|
||||
end,
|
||||
})
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
home.activation = {
|
||||
dirtytalkUpdate = ''
|
||||
# Create the spell directory if it doesn't exist
|
||||
mkdir -p "$HOME/.local/share/nvim/site/spell"
|
||||
|
||||
# Try to run DirtytalkUpdate in headless mode with better error handling
|
||||
if ! ${config.programs.nvf.finalPackage}/bin/nvim --headless -c "DirtytalkUpdate" -c "qa!" 2>/dev/null; then
|
||||
echo "Note: DirtytalkUpdate will run automatically on first Neovim startup"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
}
|
||||
6
modules/home/qt.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ lib, ... }: {
|
||||
qt = {
|
||||
enable = true;
|
||||
platformTheme.name = lib.mkForce "qtct";
|
||||
};
|
||||
}
|
||||
49
modules/home/rofi/config-long.nix
Normal file
@@ -0,0 +1,49 @@
|
||||
{ ... }: {
|
||||
home.file.".config/rofi/config-long.rasi".text = ''
|
||||
@import "~/.config/rofi/config.rasi"
|
||||
window {
|
||||
width: 750px;
|
||||
border-radius: 20px;
|
||||
}
|
||||
mainbox {
|
||||
orientation: vertical;
|
||||
children: [ "inputbar", "listbox" ];
|
||||
}
|
||||
inputbar {
|
||||
padding: 75px 40px;
|
||||
background-color: transparent;
|
||||
background-image: url("~/Pictures/Wallpapers/Rainnight.jpg", width);
|
||||
text-color: @foreground;
|
||||
children: [ "textbox-prompt-colon", "entry" ];
|
||||
}
|
||||
textbox-prompt-colon {
|
||||
padding: 12px 20px;
|
||||
border-radius: 100%;
|
||||
background-color: @bg-alt;
|
||||
text-color: @foreground;
|
||||
}
|
||||
entry {
|
||||
expand: true;
|
||||
padding: 12px 16px;
|
||||
border-radius: 100%;
|
||||
background-color: @bg-alt;
|
||||
text-color: @foreground;
|
||||
}
|
||||
button {
|
||||
padding: 12px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
element {
|
||||
spacing: 10px;
|
||||
padding: 12px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
textbox {
|
||||
padding: 12px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
error-message {
|
||||
border-radius: 0px;
|
||||
}
|
||||
'';
|
||||
}
|
||||
6
modules/home/rofi/default.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ ... }: {
|
||||
imports = [
|
||||
./config-long.nix
|
||||
./rofi.nix
|
||||
];
|
||||
}
|
||||
208
modules/home/rofi/rofi.nix
Normal file
@@ -0,0 +1,208 @@
|
||||
{ pkgs
|
||||
, config
|
||||
, ...
|
||||
}: {
|
||||
programs = {
|
||||
rofi = {
|
||||
enable = true;
|
||||
package = pkgs.rofi;
|
||||
extraConfig = {
|
||||
modi = "drun,filebrowser,run";
|
||||
show-icons = true;
|
||||
icon-theme = "Papirus";
|
||||
font = "JetBrainsMono Nerd Font Mono 12";
|
||||
drun-display-format = "{icon} {name}";
|
||||
display-drun = " Apps";
|
||||
display-run = " Run";
|
||||
display-filebrowser = " File";
|
||||
};
|
||||
theme =
|
||||
let
|
||||
inherit (config.lib.formats.rasi) mkLiteral;
|
||||
in
|
||||
{
|
||||
"*" = {
|
||||
bg = mkLiteral "#${config.stylix.base16Scheme.base00}";
|
||||
bg-alt = mkLiteral "#${config.stylix.base16Scheme.base09}";
|
||||
foreground = mkLiteral "#${config.stylix.base16Scheme.base01}";
|
||||
selected = mkLiteral "#${config.stylix.base16Scheme.base08}";
|
||||
active = mkLiteral "#${config.stylix.base16Scheme.base0B}";
|
||||
text-selected = mkLiteral "#${config.stylix.base16Scheme.base00}";
|
||||
text-color = mkLiteral "#${config.stylix.base16Scheme.base05}";
|
||||
border-color = mkLiteral "#${config.stylix.base16Scheme.base0F}";
|
||||
urgent = mkLiteral "#${config.stylix.base16Scheme.base0E}";
|
||||
};
|
||||
"window" = {
|
||||
transparency = "real";
|
||||
width = mkLiteral "1000px";
|
||||
location = mkLiteral "center";
|
||||
anchor = mkLiteral "center";
|
||||
fullscreen = false;
|
||||
x-offset = mkLiteral "0px";
|
||||
y-offset = mkLiteral "0px";
|
||||
cursor = "default";
|
||||
enabled = true;
|
||||
border-radius = mkLiteral "15px";
|
||||
background-color = mkLiteral "@bg";
|
||||
};
|
||||
"mainbox" = {
|
||||
enabled = true;
|
||||
spacing = mkLiteral "0px";
|
||||
orientation = mkLiteral "horizontal";
|
||||
children = map mkLiteral [
|
||||
"imagebox"
|
||||
"listbox"
|
||||
];
|
||||
background-color = mkLiteral "transparent";
|
||||
};
|
||||
"imagebox" = {
|
||||
padding = mkLiteral "20px";
|
||||
background-color = mkLiteral "transparent";
|
||||
background-image = mkLiteral ''url("~/Pictures/Wallpapers/Rainnight.jpg", height)'';
|
||||
orientation = mkLiteral "vertical";
|
||||
children = map mkLiteral [
|
||||
"inputbar"
|
||||
"dummy"
|
||||
"mode-switcher"
|
||||
];
|
||||
};
|
||||
"listbox" = {
|
||||
spacing = mkLiteral "20px";
|
||||
padding = mkLiteral "20px";
|
||||
background-color = mkLiteral "transparent";
|
||||
orientation = mkLiteral "vertical";
|
||||
children = map mkLiteral [
|
||||
"message"
|
||||
"listview"
|
||||
];
|
||||
};
|
||||
"dummy" = {
|
||||
background-color = mkLiteral "transparent";
|
||||
};
|
||||
"inputbar" = {
|
||||
enabled = true;
|
||||
spacing = mkLiteral "10px";
|
||||
padding = mkLiteral "10px";
|
||||
border-radius = mkLiteral "10px";
|
||||
background-color = mkLiteral "@bg-alt";
|
||||
text-color = mkLiteral "@foreground";
|
||||
children = map mkLiteral [
|
||||
"textbox-prompt-colon"
|
||||
"entry"
|
||||
];
|
||||
};
|
||||
"textbox-prompt-colon" = {
|
||||
enabled = true;
|
||||
expand = false;
|
||||
str = "";
|
||||
background-color = mkLiteral "inherit";
|
||||
text-color = mkLiteral "inherit";
|
||||
};
|
||||
"entry" = {
|
||||
enabled = true;
|
||||
background-color = mkLiteral "inherit";
|
||||
text-color = mkLiteral "inherit";
|
||||
cursor = mkLiteral "text";
|
||||
placeholder = "Search";
|
||||
placeholder-color = mkLiteral "inherit";
|
||||
};
|
||||
"mode-switcher" = {
|
||||
enabled = true;
|
||||
spacing = mkLiteral "20px";
|
||||
background-color = mkLiteral "transparent";
|
||||
text-color = mkLiteral "@foreground";
|
||||
};
|
||||
"button" = {
|
||||
padding = mkLiteral "15px";
|
||||
border-radius = mkLiteral "10px";
|
||||
background-color = mkLiteral "@bg-alt";
|
||||
text-color = mkLiteral "inherit";
|
||||
cursor = mkLiteral "pointer";
|
||||
};
|
||||
"button selected" = {
|
||||
background-color = mkLiteral "@selected";
|
||||
text-color = mkLiteral "@foreground";
|
||||
};
|
||||
"listview" = {
|
||||
enabled = true;
|
||||
columns = 1;
|
||||
lines = 8;
|
||||
cycle = true;
|
||||
dynamic = true;
|
||||
scrollbar = false;
|
||||
layout = mkLiteral "vertical";
|
||||
reverse = false;
|
||||
fixed-height = true;
|
||||
fixed-columns = true;
|
||||
spacing = mkLiteral "10px";
|
||||
background-color = mkLiteral "transparent";
|
||||
text-color = mkLiteral "@foreground";
|
||||
cursor = "default";
|
||||
};
|
||||
"element" = {
|
||||
enabled = true;
|
||||
spacing = mkLiteral "15px";
|
||||
padding = mkLiteral "8px";
|
||||
border-radius = mkLiteral "10px";
|
||||
background-color = mkLiteral "transparent";
|
||||
text-color = mkLiteral "@text-color";
|
||||
cursor = mkLiteral "pointer";
|
||||
};
|
||||
"element normal.normal" = {
|
||||
background-color = mkLiteral "inherit";
|
||||
text-color = mkLiteral "@text-color";
|
||||
};
|
||||
"element normal.urgent" = {
|
||||
background-color = mkLiteral "@urgent";
|
||||
text-color = mkLiteral "@text-color";
|
||||
};
|
||||
"element normal.active" = {
|
||||
background-color = mkLiteral "inherit";
|
||||
text-color = mkLiteral "@text-color";
|
||||
};
|
||||
"element selected.normal" = {
|
||||
background-color = mkLiteral "@selected";
|
||||
text-color = mkLiteral "@foreground";
|
||||
};
|
||||
"element selected.urgent" = {
|
||||
background-color = mkLiteral "@urgent";
|
||||
text-color = mkLiteral "@text-selected";
|
||||
};
|
||||
"element selected.active" = {
|
||||
background-color = mkLiteral "@urgent";
|
||||
text-color = mkLiteral "@text-selected";
|
||||
};
|
||||
"element-icon" = {
|
||||
background-color = mkLiteral "transparent";
|
||||
text-color = mkLiteral "inherit";
|
||||
size = mkLiteral "36px";
|
||||
cursor = mkLiteral "inherit";
|
||||
};
|
||||
"element-text" = {
|
||||
background-color = mkLiteral "transparent";
|
||||
text-color = mkLiteral "inherit";
|
||||
cursor = mkLiteral "inherit";
|
||||
vertical-align = mkLiteral "0.5";
|
||||
horizontal-align = mkLiteral "0.0";
|
||||
};
|
||||
"message" = {
|
||||
background-color = mkLiteral "transparent";
|
||||
};
|
||||
"textbox" = {
|
||||
padding = mkLiteral "15px";
|
||||
border-radius = mkLiteral "10px";
|
||||
background-color = mkLiteral "@bg-alt";
|
||||
text-color = mkLiteral "@foreground";
|
||||
vertical-align = mkLiteral "0.5";
|
||||
horizontal-align = mkLiteral "0.0";
|
||||
};
|
||||
"error-message" = {
|
||||
padding = mkLiteral "15px";
|
||||
border-radius = mkLiteral "20px";
|
||||
background-color = mkLiteral "@bg";
|
||||
text-color = mkLiteral "@foreground";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
26
modules/home/scripts/default.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ pkgs
|
||||
, username
|
||||
, profile
|
||||
, ...
|
||||
}: {
|
||||
home.packages = [
|
||||
(import ./hm-find.nix { inherit pkgs; })
|
||||
(import ./note.nix { inherit pkgs; })
|
||||
(import ./note-from-clipboard.nix { inherit pkgs; })
|
||||
(import ./rofi-launcher.nix { inherit pkgs; })
|
||||
(import ./screenshootin.nix { inherit pkgs; })
|
||||
(import ./squirtle.nix { inherit pkgs; })
|
||||
(import ./task-waybar.nix { inherit pkgs; })
|
||||
(import ./wallsetter.nix {
|
||||
inherit pkgs;
|
||||
inherit username;
|
||||
})
|
||||
(import ./web-search.nix { inherit pkgs; })
|
||||
(import ./saugcli.nix {
|
||||
inherit pkgs profile;
|
||||
backupFiles = [
|
||||
".config/mimeapps.list.backup"
|
||||
];
|
||||
})
|
||||
];
|
||||
}
|
||||
60
modules/home/scripts/hm-find.nix
Normal file
@@ -0,0 +1,60 @@
|
||||
{ pkgs }:
|
||||
pkgs.writeShellScriptBin "hm-find" ''
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Script Metadata
|
||||
#===============================================
|
||||
# This script searches recent journalctl entries for Home Manager errors
|
||||
# It identifies backup files that prevent rebuilds and allows removal.
|
||||
# Author: Don Williams
|
||||
# Creation Date: May 6th, 2025
|
||||
# Revision History:
|
||||
#-----------------------------------------------
|
||||
# 0.1 - 5/6/25 - Initial version
|
||||
# 0.2 - 5/7/25 - Improved messaging, added log directory check
|
||||
|
||||
# Display WARNING message
|
||||
echo "==============================================="
|
||||
echo " ⚠️ WARNING ⚠️ "
|
||||
echo "==============================================="
|
||||
echo "*** This script is experimental! ***"
|
||||
echo "It will attempt to find old backup files that are preventing Home Manager from rebuilding."
|
||||
echo "If conflicting files are found, you will be prompted to remove them."
|
||||
echo "A log of any deletions will be stored in \$HOME/hm-logs."
|
||||
echo "==============================================="
|
||||
|
||||
# Define the time range (default: last 30 minutes)
|
||||
TIME_RANGE="30m"
|
||||
LOG_DIR="$HOME/hm-logs"
|
||||
LOG_FILE="$LOG_DIR/hm-cleanup-$(date +'%Y-%m-%d_%H-%M-%S').log"
|
||||
|
||||
# Ensure the log directory exists
|
||||
if [ ! -d "$LOG_DIR" ]; then
|
||||
echo "Creating log directory: $LOG_DIR"
|
||||
mkdir -p "$LOG_DIR"
|
||||
fi
|
||||
|
||||
# Search journal logs for backup conflicts and extract file paths
|
||||
FILES=$(journalctl --since "-$TIME_RANGE" -xe | grep hm-activate | awk -F "'|'" '/would be clobbered by backing up/ {print $2}')
|
||||
|
||||
# Check if any files were found
|
||||
if [ -z "$FILES" ]; then
|
||||
echo "No conflicting backup files found in the last $TIME_RANGE."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Display found backup files
|
||||
echo "🚨 The following backup files are preventing Home Manager from rebuilding:"
|
||||
echo "$FILES" | tr ' ' '\n'
|
||||
|
||||
# Ask for user confirmation before deletion
|
||||
read -p "❓ Do you want to remove these files? (y/N): " confirm
|
||||
|
||||
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||||
echo "🗑️ Deleting files..." | tee -a "$LOG_FILE"
|
||||
echo "$FILES" | xargs rm -v | tee -a "$LOG_FILE"
|
||||
echo "✅ Cleanup completed at $(date)" | tee -a "$LOG_FILE"
|
||||
else
|
||||
echo "⛔ No files were removed." | tee -a "$LOG_FILE"
|
||||
fi
|
||||
''
|
||||
20
modules/home/scripts/note-from-clipboard.nix
Normal file
@@ -0,0 +1,20 @@
|
||||
{ pkgs, ... }:
|
||||
pkgs.writeShellScriptBin "note-from-clipboard" ''
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Check clipboard content type
|
||||
clipboard_type=$(${pkgs.wl-clipboard}/bin/wl-paste --list-types | head -n 1)
|
||||
|
||||
if [[ "$clipboard_type" == "text/plain"* ]]; then
|
||||
# It's text, let's create a note
|
||||
${pkgs.wl-clipboard}/bin/wl-paste | note
|
||||
if [ $? -eq 0 ]; then
|
||||
${pkgs.libnotify}/bin/notify-send -t 3000 "📝 Note Created" "Clipboard content added as a new note."
|
||||
else
|
||||
${pkgs.libnotify}/bin/notify-send -t 5000 -u critical "❌ Note Creation Failed" "There was an error creating the note."
|
||||
fi
|
||||
else
|
||||
# It's not text, so we do nothing and notify the user
|
||||
${pkgs.libnotify}/bin/notify-send -t 4000 -u low "📋 Note Skipped" "Clipboard does not contain text."
|
||||
fi
|
||||
''
|
||||
244
modules/home/scripts/note.nix
Normal file
@@ -0,0 +1,244 @@
|
||||
{ pkgs, ... }:
|
||||
pkgs.writeShellScriptBin "note" ''
|
||||
|
||||
# Colors for nice output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
MAGENTA='\033[0;35m'
|
||||
CYAN='\033[0;36m'
|
||||
WHITE='\033[1;37m'
|
||||
GRAY='\033[0;37m'
|
||||
BOLD='\033[1m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# XDG-compliant notes directory and file
|
||||
NOTES_DIR="$HOME/.local/share/notes"
|
||||
NOTES_FILE="$NOTES_DIR/notes.txt"
|
||||
|
||||
# Create notes directory if it doesn't exist
|
||||
mkdir -p "$NOTES_DIR"
|
||||
|
||||
# Function to display usage
|
||||
show_usage() {
|
||||
echo -e "''${BOLD}''${BLUE}📝 Note Manager''${NC}"
|
||||
echo -e "''${GRAY}Usage:''${NC}"
|
||||
echo -e " ''${CYAN}note''${NC} ''${YELLOW}<text>''${NC} - Add a new note"
|
||||
echo -e " ''${CYAN}note''${NC} - Display all notes"
|
||||
echo -e " ''${CYAN}note del''${NC} ''${YELLOW}<number>''${NC} - Delete note by number"
|
||||
echo -e " ''${CYAN}note clear''${NC} - Clear all notes"
|
||||
echo -e " ''${CYAN}echo 'text' | note''${NC} - Add note from stdin"
|
||||
echo -e " ''${CYAN}cat file | note''${NC} - Add file contents as note"
|
||||
echo ""
|
||||
echo -e "''${GRAY}Examples:''${NC}"
|
||||
echo -e " ''${GREEN}note call plumber tomorrow''${NC}"
|
||||
echo -e " ''${GREEN}cat todo.txt | note''${NC}"
|
||||
echo -e " ''${GREEN}note del 3''${NC}"
|
||||
}
|
||||
|
||||
# Function to add a note
|
||||
add_note() {
|
||||
local note_text="$1"
|
||||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
local date_only=$(date '+%Y-%m-%d')
|
||||
|
||||
# Create notes file if it doesn't exist
|
||||
touch "$NOTES_FILE"
|
||||
|
||||
# Get next note number
|
||||
local note_num=1
|
||||
if [ -f "$NOTES_FILE" ] && [ -s "$NOTES_FILE" ]; then
|
||||
note_num=$(grep -E "^#[0-9]+" "$NOTES_FILE" | sed 's/^#\([0-9]*\).*/\1/' | sort -n | tail -1)
|
||||
note_num=$((note_num + 1))
|
||||
fi
|
||||
|
||||
# Add the note with proper formatting
|
||||
{
|
||||
echo "#$note_num [$timestamp]"
|
||||
echo "$note_text"
|
||||
echo ""
|
||||
} >> "$NOTES_FILE"
|
||||
|
||||
echo -e "''${GREEN}✓''${NC} Note #$note_num added ''${GRAY}($date_only)''${NC}"
|
||||
}
|
||||
|
||||
# Function to display all notes
|
||||
display_notes() {
|
||||
if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then
|
||||
echo -e "''${YELLOW}📝 No notes found''${NC}"
|
||||
echo -e "''${GRAY}Use ''${CYAN}note <text>''${GRAY} to add your first note''${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "''${BOLD}''${BLUE}📝 Your Notes''${NC}"
|
||||
echo -e "''${GRAY}📁 $NOTES_FILE''${NC}"
|
||||
echo -e "''${GRAY}$(printf '%.0s─' {1..50})''${NC}"
|
||||
|
||||
local in_note=false
|
||||
local note_content=""
|
||||
|
||||
while IFS= read -r line; do
|
||||
# Check if line starts with # followed by numbers and space and [
|
||||
if echo "$line" | grep -q "^#[0-9][0-9]* \["; then
|
||||
# Print previous note content if exists
|
||||
if [ "$in_note" = true ] && [ -n "$note_content" ]; then
|
||||
echo -e "$note_content"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Extract note number and timestamp
|
||||
local num=$(echo "$line" | sed 's/^#\([0-9]*\) \[.*/\1/')
|
||||
local timestamp=$(echo "$line" | sed 's/^#[0-9]* \[\(.*\)\]/\1/')
|
||||
local date_part=$(echo "$timestamp" | cut -d' ' -f1)
|
||||
local time_part=$(echo "$timestamp" | cut -d' ' -f2)
|
||||
|
||||
echo -e "''${BOLD}''${CYAN}#$num''${NC} ''${GRAY}[$date_part ''${YELLOW}$time_part''${GRAY}]''${NC}"
|
||||
in_note=true
|
||||
note_content=""
|
||||
elif [ -n "$line" ] && [ "$in_note" = true ]; then
|
||||
# Accumulate note content
|
||||
if [ -z "$note_content" ]; then
|
||||
note_content="''${WHITE}$line''${NC}"
|
||||
else
|
||||
note_content="$note_content\n''${WHITE}$line''${NC}"
|
||||
fi
|
||||
elif [ -z "$line" ] && [ "$in_note" = true ]; then
|
||||
# End of current note
|
||||
if [ -n "$note_content" ]; then
|
||||
echo -e "$note_content"
|
||||
echo ""
|
||||
fi
|
||||
in_note=false
|
||||
note_content=""
|
||||
fi
|
||||
done < "$NOTES_FILE"
|
||||
|
||||
# Print last note if file doesn't end with empty line
|
||||
if [ "$in_note" = true ] && [ -n "$note_content" ]; then
|
||||
echo -e "$note_content"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
local total_notes=$(grep -c "^#[0-9]" "$NOTES_FILE")
|
||||
echo -e "''${GRAY}$(printf '%.0s─' {1..50})''${NC}"
|
||||
echo -e "''${GRAY}Total: ''${BOLD}$total_notes''${NC} ''${GRAY}notes''${NC}"
|
||||
}
|
||||
|
||||
# Function to delete a note
|
||||
delete_note() {
|
||||
local note_num="$1"
|
||||
|
||||
if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then
|
||||
echo -e "''${RED}✗''${NC} No notes found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! echo "$note_num" | grep -q "^[0-9][0-9]*$"; then
|
||||
echo -e "''${RED}✗''${NC} Invalid note number: $note_num"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if note exists
|
||||
if ! grep -q "^#$note_num " "$NOTES_FILE"; then
|
||||
echo -e "''${RED}✗''${NC} Note #$note_num not found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create temporary file without the specified note
|
||||
local temp_file=$(mktemp)
|
||||
local skip_lines=false
|
||||
|
||||
while IFS= read -r line; do
|
||||
if echo "$line" | grep -q "^#[0-9][0-9]* "; then
|
||||
local current_num=$(echo "$line" | sed 's/^#\([0-9]*\) .*/\1/')
|
||||
if [ "$current_num" = "$note_num" ]; then
|
||||
skip_lines=true
|
||||
continue
|
||||
else
|
||||
skip_lines=false
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$skip_lines" = false ]; then
|
||||
echo "$line" >> "$temp_file"
|
||||
elif [ -z "$line" ]; then
|
||||
# Stop skipping when we hit an empty line (end of note)
|
||||
skip_lines=false
|
||||
fi
|
||||
done < "$NOTES_FILE"
|
||||
|
||||
mv "$temp_file" "$NOTES_FILE"
|
||||
echo -e "''${GREEN}✓''${NC} Note #$note_num deleted"
|
||||
}
|
||||
|
||||
# Function to clear all notes
|
||||
clear_notes() {
|
||||
if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then
|
||||
echo -e "''${YELLOW}📝 No notes to clear''${NC}"
|
||||
return
|
||||
fi
|
||||
|
||||
local total_notes=$(grep -c "^#[0-9]" "$NOTES_FILE")
|
||||
echo -e "''${YELLOW}⚠''${NC} This will delete all $total_notes notes. Are you sure? ''${GRAY}[y/N]''${NC}"
|
||||
read -r confirmation
|
||||
|
||||
if echo "$confirmation" | grep -qi "^y"; then
|
||||
> "$NOTES_FILE"
|
||||
echo -e "''${GREEN}✓''${NC} All notes cleared"
|
||||
else
|
||||
echo -e "''${BLUE}ℹ''${NC} Operation cancelled"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main script logic
|
||||
main() {
|
||||
# Check if input is being piped
|
||||
if [ ! -t 0 ]; then
|
||||
# Read from stdin (pipe)
|
||||
local piped_content=""
|
||||
while IFS= read -r line; do
|
||||
if [ -z "$piped_content" ]; then
|
||||
piped_content="$line"
|
||||
else
|
||||
piped_content="$piped_content"$'\n'"$line"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$piped_content" ]; then
|
||||
add_note "$piped_content"
|
||||
else
|
||||
echo -e "''${RED}✗''${NC} No input received from pipe"
|
||||
exit 1
|
||||
fi
|
||||
return
|
||||
fi
|
||||
|
||||
# Handle command line arguments
|
||||
case "$1" in
|
||||
"")
|
||||
display_notes
|
||||
;;
|
||||
"del")
|
||||
if [ -z "$2" ]; then
|
||||
echo -e "''${RED}✗''${NC} Please specify note number to delete"
|
||||
echo -e "''${GRAY}Usage: ''${CYAN}note del <number>''${NC}"
|
||||
exit 1
|
||||
fi
|
||||
delete_note "$2"
|
||||
;;
|
||||
"clear")
|
||||
clear_notes
|
||||
;;
|
||||
"help"|"--help"|"-h")
|
||||
show_usage
|
||||
;;
|
||||
*)
|
||||
# Everything else is treated as note content
|
||||
add_note "$*"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
main "$@"
|
||||
''
|
||||
8
modules/home/scripts/rofi-launcher.nix
Normal file
@@ -0,0 +1,8 @@
|
||||
{ pkgs }:
|
||||
pkgs.writeShellScriptBin "rofi-launcher" ''
|
||||
# check if rofi is already running
|
||||
if pidof rofi > /dev/null; then
|
||||
pkill rofi
|
||||
fi
|
||||
rofi -show drun
|
||||
''
|
||||
438
modules/home/scripts/saugcli.nix
Normal file
@@ -0,0 +1,438 @@
|
||||
{ pkgs
|
||||
, profile
|
||||
, backupFiles ? [ ".config/mimeapps.list.backup" ]
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
backupFilesString = pkgs.lib.strings.concatStringsSep " " backupFiles;
|
||||
in
|
||||
|
||||
pkgs.writeShellScriptBin "saugcli" ''
|
||||
#!${pkgs.bash}/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# --- Configuration ---
|
||||
PROJECT="zaneyos/SaugOS"
|
||||
PROFILE="${profile}"
|
||||
BACKUP_FILES_STR="${backupFilesString}"
|
||||
VERSION="1.0.0"
|
||||
FLAKE_NIX_PATH="$HOME/$PROJECT/flake.nix"
|
||||
|
||||
read -r -a BACKUP_FILES <<< "$BACKUP_FILES_STR"
|
||||
|
||||
# --- Helper Functions ---
|
||||
verify_hostname() {
|
||||
local current_hostname
|
||||
local flake_hostname
|
||||
|
||||
current_hostname="$(hostname)"
|
||||
|
||||
if [ -f "$FLAKE_NIX_PATH" ]; then
|
||||
flake_hostname=$(${pkgs.gnugrep}/bin/grep -E '^[[:space:]]*host[[:space:]]*=' "$FLAKE_NIX_PATH" | ${pkgs.gnused}/bin/sed 's/.*=[[:space:]]*"\([^"]*\)".*/\1/')
|
||||
|
||||
if [ -z "$flake_hostname" ]; then
|
||||
echo "Error: Could not find 'host' variable in $FLAKE_NIX_PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$current_hostname" != "$flake_hostname" ]; then
|
||||
echo "Error: Hostname mismatch!" >&2
|
||||
echo " Current hostname: '$current_hostname'" >&2
|
||||
echo " Flake.nix host: '$flake_hostname'" >&2
|
||||
echo "" >&2
|
||||
echo "Hint: Run 'saugcli update-host' to automatically update flake.nix" >&2
|
||||
echo " or manually edit $FLAKE_NIX_PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Error: Flake.nix not found at $FLAKE_NIX_PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local folder="$HOME/$PROJECT/hosts/$current_hostname"
|
||||
if [ ! -d "$folder" ]; then
|
||||
echo "Error: Matching host not found in $PROJECT, Missing folder: $folder" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
print_help() {
|
||||
echo "SaugOS CLI Utility -- version $VERSION"
|
||||
echo ""
|
||||
echo "Usage: saugcli [command] [options]"
|
||||
echo ""
|
||||
echo "Commands:"
|
||||
echo " cleanup - Clean up old system generations."
|
||||
echo " diag - Create a system diagnostic report (~diag.txt)."
|
||||
echo " list-gens - List user and system generations."
|
||||
echo " rebuild - Rebuild the NixOS system configuration."
|
||||
echo " rebuild-boot - Rebuild and set as boot default (activates on next restart)."
|
||||
echo " trim - Trim filesystems to improve SSD performance."
|
||||
echo " update - Update the flake and rebuild the system."
|
||||
echo " update-host - Auto set host and profile in flake.nix."
|
||||
echo " (Opt: saugcli update-host [hostname] [profile])"
|
||||
echo " add-host - Add a new host configuration."
|
||||
echo " del-host - Delete a host configuration."
|
||||
echo ""
|
||||
echo "Options for rebuild, rebuild-boot, and update commands:"
|
||||
echo " --dry, -n - Show what would be done without doing it"
|
||||
echo " --ask, -a - Ask for confirmation before proceeding"
|
||||
echo " --cores N - Limit build to N cores (useful for low-resource machines)"
|
||||
echo " --verbose, -v - Show verbose output"
|
||||
echo " --no-nom - Don't use nix-output-monitor"
|
||||
echo ""
|
||||
echo " help - Show this help message."
|
||||
}
|
||||
|
||||
handle_backups() {
|
||||
if [ ''${#BACKUP_FILES[@]} -eq 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
for file_path in "''${BACKUP_FILES[@]}"; do
|
||||
full_path="$HOME/$file_path"
|
||||
if [ -f "$full_path" ]; then
|
||||
echo "Removing stale backup file: $full_path"
|
||||
rm "$full_path"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
detect_gpu_profile() {
|
||||
local detected_profile=""
|
||||
local has_intel=false
|
||||
local has_amd=false
|
||||
local has_vm=false
|
||||
|
||||
if ${pkgs.pciutils}/bin/lspci &> /dev/null; then
|
||||
if ${pkgs.pciutils}/bin/lspci | ${pkgs.gnugrep}/bin/grep -qi 'vga\|3d'; then
|
||||
while read -r line; do
|
||||
if echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'amd'; then
|
||||
has_amd=true
|
||||
elif echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'intel'; then
|
||||
has_intel=true
|
||||
elif echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'virtio\|vmware'; then
|
||||
has_vm=true
|
||||
fi
|
||||
done < <(${pkgs.pciutils}/bin/lspci | ${pkgs.gnugrep}/bin/grep -i 'vga\|3d')
|
||||
|
||||
if "$has_vm"; then
|
||||
detected_profile="vm"
|
||||
elif "$has_amd"; then
|
||||
detected_profile="amd"
|
||||
elif "$has_intel"; then
|
||||
detected_profile="intel"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "Warning: lspci command not found. Cannot auto-detect GPU profile." >&2
|
||||
fi
|
||||
echo "$detected_profile"
|
||||
}
|
||||
|
||||
parse_nh_args() {
|
||||
local args_string=""
|
||||
local options_selected=()
|
||||
shift
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--dry|-n)
|
||||
args_string="$args_string --dry"
|
||||
options_selected+=("dry run mode (showing what would be done)")
|
||||
shift
|
||||
;;
|
||||
--ask|-a)
|
||||
args_string="$args_string --ask"
|
||||
options_selected+=("confirmation prompts enabled")
|
||||
shift
|
||||
;;
|
||||
--cores)
|
||||
if [[ -n $2 && $2 =~ ^[0-9]+$ ]]; then
|
||||
args_string="$args_string -- --cores $2"
|
||||
options_selected+=("limited to $2 CPU cores")
|
||||
shift 2
|
||||
else
|
||||
echo "Error: --cores requires a numeric argument" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--verbose|-v)
|
||||
args_string="$args_string --verbose"
|
||||
options_selected+=("verbose output enabled")
|
||||
shift
|
||||
;;
|
||||
--no-nom)
|
||||
args_string="$args_string --no-nom"
|
||||
options_selected+=("nix-output-monitor disabled")
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
args_string="$args_string -- $*"
|
||||
options_selected+=("additional arguments: $*")
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
echo "Warning: Unknown flag '$1' - passing through to nh" >&2
|
||||
args_string="$args_string $1"
|
||||
options_selected+=("unknown flag '$1' passed through")
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
echo "Error: Unexpected argument '$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ''${#options_selected[@]} -gt 0 ]]; then
|
||||
echo "Options selected:" >&2
|
||||
for option in "''${options_selected[@]}"; do
|
||||
echo " ✓ $option" >&2
|
||||
done
|
||||
echo >&2
|
||||
fi
|
||||
|
||||
echo "$args_string"
|
||||
}
|
||||
|
||||
# --- Main Logic ---
|
||||
if [ "$#" -eq 0 ]; then
|
||||
echo "Error: No command provided." >&2
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
cleanup)
|
||||
echo "Warning! This will remove old generations of your system."
|
||||
read -p "How many generations to keep (default: all)? " keep_count
|
||||
|
||||
if [ -z "$keep_count" ]; then
|
||||
read -p "This will remove all but the current generation. Continue (y/N)? " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
${pkgs.nh}/bin/nh clean all -v
|
||||
else
|
||||
echo "Cleanup cancelled."
|
||||
fi
|
||||
else
|
||||
read -p "This will keep the last $keep_count generations. Continue (y/N)? " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
${pkgs.nh}/bin/nh clean all -k "$keep_count" -v
|
||||
else
|
||||
echo "Cleanup cancelled."
|
||||
fi
|
||||
fi
|
||||
|
||||
LOG_DIR="$HOME/saugcli-cleanup-logs"
|
||||
mkdir -p "$LOG_DIR"
|
||||
LOG_FILE="$LOG_DIR/saugcli-cleanup-$(${pkgs.coreutils}/bin/date +%Y-%m-%d_%H-%M-%S).log"
|
||||
echo "Cleaning up old log files..." >> "$LOG_FILE"
|
||||
${pkgs.findutils}/bin/find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1
|
||||
echo "Cleanup process logged to $LOG_FILE"
|
||||
;;
|
||||
diag)
|
||||
echo "Generating system diagnostic report..."
|
||||
${pkgs.inxi}/bin/inxi --full > "$HOME/diag.txt"
|
||||
echo "Diagnostic report saved to $HOME/diag.txt"
|
||||
;;
|
||||
help)
|
||||
print_help
|
||||
;;
|
||||
list-gens)
|
||||
echo "--- User Generations ---"
|
||||
${pkgs.nix}/bin/nix-env --list-generations | ${pkgs.coreutils}/bin/cat || echo "Could not list user generations."
|
||||
echo ""
|
||||
echo "--- System Generations ---"
|
||||
${pkgs.nix}/bin/nix profile history --profile /nix/var/nix/profiles/system | ${pkgs.coreutils}/bin/cat || echo "Could not list system generations."
|
||||
;;
|
||||
rebuild)
|
||||
verify_hostname
|
||||
handle_backups
|
||||
|
||||
extra_args=$(parse_nh_args "$@")
|
||||
|
||||
echo "Starting NixOS rebuild for host: $(${pkgs.nettools}/bin/hostname)"
|
||||
if eval "${pkgs.nh}/bin/nh os switch --hostname '$PROFILE' $extra_args"; then
|
||||
echo "Rebuild finished successfully"
|
||||
else
|
||||
echo "Rebuild Failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
rebuild-boot)
|
||||
verify_hostname
|
||||
handle_backups
|
||||
|
||||
extra_args=$(parse_nh_args "$@")
|
||||
|
||||
echo "Starting NixOS rebuild (boot) for host: $(${pkgs.nettools}/bin/hostname)"
|
||||
echo "Note: Configuration will be activated on next reboot"
|
||||
if eval "${pkgs.nh}/bin/nh os boot --hostname '$PROFILE' $extra_args"; then
|
||||
echo "Rebuild-boot finished successfully"
|
||||
echo "New configuration set as boot default - restart to activate"
|
||||
else
|
||||
echo "Rebuild-boot Failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
trim)
|
||||
echo "Running 'sudo fstrim -v /' may take a few minutes and impact system performance."
|
||||
read -p "Enter (y/Y) to run now or enter to exit (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Running fstrim..."
|
||||
sudo ${pkgs.util-linux}/bin/fstrim -v /
|
||||
echo "fstrim complete."
|
||||
else
|
||||
echo "Trim operation cancelled."
|
||||
fi
|
||||
;;
|
||||
update)
|
||||
verify_hostname
|
||||
handle_backups
|
||||
|
||||
extra_args=$(parse_nh_args "$@")
|
||||
|
||||
echo "Updating flake and rebuilding system for host: $(${pkgs.nettools}/bin/hostname)"
|
||||
if eval "${pkgs.nh}/bin/nh os switch --hostname '$PROFILE' --update $extra_args"; then
|
||||
echo "Update and rebuild finished successfully"
|
||||
else
|
||||
echo "Update and rebuild Failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
update-host)
|
||||
target_hostname=""
|
||||
target_profile=""
|
||||
|
||||
if [ "$#" -eq 3 ]; then
|
||||
target_hostname="$2"
|
||||
target_profile="$3"
|
||||
elif [ "$#" -eq 1 ]; then
|
||||
echo "Attempting to auto-detect hostname and GPU profile..."
|
||||
target_hostname=$(${pkgs.nettools}/bin/hostname)
|
||||
target_profile=$(detect_gpu_profile)
|
||||
|
||||
if [ -z "$target_profile" ]; then
|
||||
echo "Error: Could not auto-detect a specific GPU profile. Please provide it manually." >&2
|
||||
echo "Usage: saugcli update-host [hostname] [profile]" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "Auto-detected Hostname: $target_hostname"
|
||||
echo "Auto-detected Profile: $target_profile"
|
||||
else
|
||||
echo "Error: Invalid number of arguments for 'update-host'." >&2
|
||||
echo "Usage: saugcli update-host [hostname] [profile]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Updating $FLAKE_NIX_PATH..."
|
||||
|
||||
if ${pkgs.gnused}/bin/sed -i "s/^[[:space:]]*host[[:space:]]*=[[:space:]]*\".*\"/ host = \"$target_hostname\"/" "$FLAKE_NIX_PATH"; then
|
||||
echo "Successfully updated host to: $target_hostname"
|
||||
else
|
||||
echo "Error: Failed to update host in $FLAKE_NIX_PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ${pkgs.gnused}/bin/sed -i "s/^[[:space:]]*profile[[:space:]]*=[[:space:]]*\".*\"/ profile = \"$target_profile\"/" "$FLAKE_NIX_PATH"; then
|
||||
echo "Successfully updated profile to: $target_profile"
|
||||
else
|
||||
echo "Error: Failed to update profile in $FLAKE_NIX_PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Flake.nix updated successfully!"
|
||||
;;
|
||||
add-host)
|
||||
hostname=""
|
||||
profile_arg=""
|
||||
|
||||
if [ "$#" -ge 2 ]; then
|
||||
hostname="$2"
|
||||
fi
|
||||
if [ "$#" -eq 3 ]; then
|
||||
profile_arg="$3"
|
||||
fi
|
||||
|
||||
if [ -z "$hostname" ]; then
|
||||
read -p "Enter the new hostname: " hostname
|
||||
fi
|
||||
|
||||
if [ -d "$HOME/$PROJECT/hosts/$hostname" ]; then
|
||||
echo "Error: Host '$hostname' already exists." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Copying default host configuration..."
|
||||
${pkgs.coreutils}/bin/cp -r "$HOME/$PROJECT/hosts/default" "$HOME/$PROJECT/hosts/$hostname"
|
||||
|
||||
detected_profile=""
|
||||
if [[ -n "$profile_arg" && "$profile_arg" =~ ^(intel|amd|vm)$ ]]; then
|
||||
detected_profile="$profile_arg"
|
||||
else
|
||||
echo "Detecting GPU profile..."
|
||||
detected_profile=$(detect_gpu_profile)
|
||||
echo "Detected GPU profile: $detected_profile"
|
||||
read -p "Is this correct? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
||||
read -p "Enter the correct profile (intel, amd, vm): " new_profile
|
||||
while [[ ! "$new_profile" =~ ^(intel|amd|vm)$ ]]; do
|
||||
echo "Invalid profile. Please enter one of the following: intel, amd, vm"
|
||||
read -p "Enter the correct profile: " new_profile
|
||||
done
|
||||
detected_profile=$new_profile
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Setting profile to '$detected_profile'..."
|
||||
${pkgs.gnused}/bin/sed -i "s/profile = .*/profile = \"$detected_profile\";/" "$HOME/$PROJECT/hosts/$hostname/default.nix"
|
||||
|
||||
read -p "Generate new hardware.nix? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Generating hardware.nix..."
|
||||
sudo nixos-generate-config --show-hardware-config > "$HOME/$PROJECT/hosts/$hostname/hardware.nix"
|
||||
echo "hardware.nix generated."
|
||||
fi
|
||||
|
||||
echo "Adding new host to git..."
|
||||
${pkgs.git}/bin/git -C "$HOME/$PROJECT" add .
|
||||
echo "hostname: $hostname added"
|
||||
;;
|
||||
del-host)
|
||||
hostname=""
|
||||
if [ "$#" -eq 2 ]; then
|
||||
hostname="$2"
|
||||
else
|
||||
read -p "Enter the hostname to delete: " hostname
|
||||
fi
|
||||
|
||||
if [ ! -d "$HOME/$PROJECT/hosts/$hostname" ]; then
|
||||
echo "Error: Host '$hostname' does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
read -p "Are you sure you want to delete the host '$hostname'? (y/N) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Deleting host '$hostname'..."
|
||||
${pkgs.coreutils}/bin/rm -rf "$HOME/$PROJECT/hosts/$hostname"
|
||||
${pkgs.git}/bin/git -C "$HOME/$PROJECT" add .
|
||||
echo "hostname: $hostname removed"
|
||||
else
|
||||
echo "Deletion cancelled."
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Error: Invalid command '$1'" >&2
|
||||
print_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
''
|
||||
5
modules/home/scripts/screenshootin.nix
Normal file
@@ -0,0 +1,5 @@
|
||||
{ pkgs }:
|
||||
|
||||
pkgs.writeShellScriptBin "screenshootin" ''
|
||||
grim -g "$(slurp)" - | swappy -f -
|
||||
''
|
||||
23
modules/home/scripts/squirtle.nix
Normal file
@@ -0,0 +1,23 @@
|
||||
{ pkgs }:
|
||||
|
||||
pkgs.writeShellScriptBin "squirtle" ''
|
||||
echo "
|
||||
[38;2;0;0;0m ████████ ██████
|
||||
[38;2;0;0;0m ██[38;2;82;156;154m██[38;2;115;198;243m██████[38;2;0;0;0m████ ██[38;2;115;198;243m██████[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;115;200;243m████████████[38;2;85;137;157m██[38;2;8;0;0m██[38;2;0;0;0m██ ██[38;2;115;198;243m██████[38;2;79;159;151m████[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;115;200;243m████████████[38;2;123;206;235m██[38;2;46;69;78m██[38;2;189;107;37m██[38;2;0;0;0m████ ██[38;2;115;198;243m████[38;2;82;156;154m██[38;2;57;66;65m██[38;2;68;113;108m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m██[38;2;115;198;243m██[38;2;115;200;243m████[38;2;159;208;204m██[38;2;96;162;155m██[38;2;115;198;243m██████[38;2;82;156;154m██[38;2;66;61;66m██[38;2;214;132;38m██[38;2;198;119;38m██[38;2;0;0;0m██[38;2;86;146;154m██[38;2;107;214;243m██[38;2;82;156;154m██[38;2;66;66;66m██[38;2;82;156;154m████[38;2;0;0;0m██
|
||||
[38;2;0;0;0m██[38;2;115;198;243m██[38;2;115;200;243m████[38;2;33;115;105m██[38;2;222;255;254m██[38;2;0;0;0m██[38;2;115;198;243m████[38;2;82;156;154m██[38;2;66;61;66m██[38;2;140;96;52m██[38;2;198;119;38m████[38;2;66;78;66m██[38;2;86;146;154m██[38;2;82;156;154m██[38;2;66;66;66m██[38;2;82;156;154m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m██[38;2;115;198;243m██[38;2;115;200;243m████[38;2;77;144;162m██[38;2;0;4;0m██[38;2;41;8;1m██[38;2;123;214;235m██[38;2;82;156;154m████[38;2;66;66;66m██[38;2;255;255;255m██[38;2;140;82;44m██[38;2;214;140;46m██[38;2;90;103;88m██[38;2;49;111;121m██[38;2;85;159;151m██[38;2;46;80;76m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;115;200;243m████[38;2;115;214;243m██[38;2;0;4;0m██[38;2;68;77;79m██[38;2;96;145;157m██[38;2;82;156;154m██[38;2;66;66;66m██[38;2;192;192;192m██[38;2;255;255;255m██[38;2;140;82;44m██[38;2;214;140;46m██[38;2;173;86;21m██[38;2;90;103;88m██[38;2;85;159;151m██[38;2;8;0;0m██[38;2;0;0;0m
|
||||
[38;2;0;0;0m [38;2;8;0;0m██[38;2;49;77;76m██[38;2;82;156;154m████[38;2;99;132;115m████[38;2;57;74;81m██[38;2;118;129;107m██[38;2;66;66;66m██[38;2;148;198;220m██[38;2;255;255;255m██[38;2;140;82;44m██[38;2;189;103;37m██[38;2;66;66;66m██[38;2;82;156;154m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m [38;2;8;0;0m██[38;2;91;154;152m██[38;2;66;66;66m████[38;2;49;103;113m██[38;2;198;189;118m██[38;2;239;239;159m██[38;2;57;74;81m██[38;2;148;198;220m██[38;2;66;66;66m██[38;2;255;255;255m██[38;2;140;82;44m██[38;2;148;91;47m██[38;2;66;66;66m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ████[38;2;247;231;143m██████[38;2;66;66;66m██[38;2;115;198;243m██████[38;2;66;66;66m██[38;2;140;82;44m██[38;2;189;107;37m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;206;173;94m████[38;2;66;66;66m██[38;2;115;198;243m████[38;2;82;156;154m██[38;2;66;66;66m██[38;2;140;82;44m██[38;2;189;107;37m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;57;115;105m██[38;2;80;85;69m██[38;2;239;239;159m██[38;2;255;231;127m██[38;2;74;66;58m██[38;2;82;156;154m██[38;2;66;66;66m██[38;2;58;69;71m██[38;2;173;198;197m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;57;115;105m██[38;2;80;85;69m██[38;2;0;8;24m██[38;2;195;176;104m████[38;2;66;66;66m████[38;2;115;133;134m██[38;2;58;69;71m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ████ ██[38;2;66;66;66m██[38;2;115;206;243m██[38;2;76;151;151m██[38;2;82;156;154m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██[38;2;76;151;151m██[38;2;57;123;105m██[38;2;82;156;154m██[38;2;0;0;0m██
|
||||
[38;2;0;0;0m ██████ [0m
|
||||
"
|
||||
''
|
||||
6
modules/home/scripts/task-waybar.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ pkgs }:
|
||||
|
||||
pkgs.writeShellScriptBin "task-waybar" ''
|
||||
sleep 0.1
|
||||
${pkgs.swaynotificationcenter}/bin/swaync-client -t &
|
||||
''
|
||||
24
modules/home/scripts/wallsetter.nix
Normal file
@@ -0,0 +1,24 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
pkgs.writeShellScriptBin "wallsetter" ''
|
||||
|
||||
TIMEOUT=720
|
||||
|
||||
for pid in $(pidof -o %PPID -x wallsetter); do
|
||||
kill $pid
|
||||
done
|
||||
|
||||
if ! [ -d ~/Pictures/Wallpapers ]; then notify-send -t 5000 "~/Pictures/Wallpapers does not exist" && exit 1; fi
|
||||
if [ $(ls -1 ~/Pictures/Wallpapers | wc -l) -lt 1 ]; then notify-send -t 9000 "The wallpaper folder is expected to have more than 1 image. Exiting Wallsetter." && exit 1; fi
|
||||
|
||||
while true; do
|
||||
while [ "$WALLPAPER" == "$PREVIOUS" ]; do
|
||||
WALLPAPER=$(find ~/Pictures/Wallpapers -name '*' | awk '!/.git/' | tail -n +2 | shuf -n 1)
|
||||
done
|
||||
|
||||
PREVIOUS=$WALLPAPER
|
||||
|
||||
${pkgs.swww}/bin/swww img "$WALLPAPER" --transition-type random --transition-step 1 --transition-fps 60
|
||||
sleep $TIMEOUT
|
||||
done
|
||||
''
|
||||
47
modules/home/scripts/web-search.nix
Normal file
@@ -0,0 +1,47 @@
|
||||
{ pkgs }:
|
||||
pkgs.writeShellScriptBin "web-search" ''
|
||||
# check if rofi is already running
|
||||
if pidof rofi > /dev/null; then
|
||||
pkill rofi
|
||||
fi
|
||||
|
||||
declare -A URLS
|
||||
|
||||
URLS=(
|
||||
["🌎 Search"]="https://search.brave.com/search?q="
|
||||
["❄️ Unstable Packages"]="https://search.nixos.org/packages?channel=unstable&from=0&size=50&sort=relevance&type=packages&query="
|
||||
["🎞️ YouTube"]="https://www.youtube.com/results?search_query="
|
||||
["🦥 Arch Wiki"]="https://wiki.archlinux.org/title/"
|
||||
["🐃 Gentoo Wiki"]="https://wiki.gentoo.org/index.php?title="
|
||||
)
|
||||
|
||||
# List for rofi
|
||||
gen_list() {
|
||||
for i in "''${!URLS[@]}"
|
||||
do
|
||||
echo "$i"
|
||||
done
|
||||
}
|
||||
|
||||
main() {
|
||||
# Pass the list to rofi
|
||||
platform=$( (gen_list) | ${pkgs.rofi}/bin/rofi -dmenu -config ~/.config/rofi/config-long.rasi )
|
||||
|
||||
if [[ -n "$platform" ]]; then
|
||||
query=$( (echo ) | ${pkgs.rofi}/bin/rofi -dmenu -config ~/.config/rofi/config-long.rasi )
|
||||
|
||||
if [[ -n "$query" ]]; then
|
||||
url=''${URLS[$platform]}$query
|
||||
xdg-open "$url"
|
||||
else
|
||||
exit
|
||||
fi
|
||||
else
|
||||
exit
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
|
||||
exit 0
|
||||
''
|
||||
14
modules/home/stylix.nix
Normal file
@@ -0,0 +1,14 @@
|
||||
_: {
|
||||
stylix.targets = {
|
||||
waybar.enable = false;
|
||||
rofi.enable = false;
|
||||
hyprland.enable = false;
|
||||
hyprlock.enable = true;
|
||||
swaylock.enable = true;
|
||||
ghostty.enable = true;
|
||||
qt = {
|
||||
enable = true;
|
||||
platform = "qtct";
|
||||
};
|
||||
};
|
||||
}
|
||||
16
modules/home/swappy.nix
Normal file
@@ -0,0 +1,16 @@
|
||||
{ username, ... }: {
|
||||
home.file = {
|
||||
".config/swappy/config".text = ''
|
||||
[Default]
|
||||
save_dir=/home/${username}/Pictures/Screenshots
|
||||
save_filename_format=swappy-%Y%m%d-%H%M%S.png
|
||||
show_panel=false
|
||||
line_size=5
|
||||
text_size=20
|
||||
text_font=Ubuntu
|
||||
paint_mode=brush
|
||||
early_exit=true
|
||||
fill_shape=false
|
||||
'';
|
||||
};
|
||||
}
|
||||
311
modules/home/swaync.nix
Normal file
@@ -0,0 +1,311 @@
|
||||
{ config, ... }: {
|
||||
services.swaync = {
|
||||
enable = true;
|
||||
settings = {
|
||||
positionX = "right";
|
||||
positionY = "top";
|
||||
layer = "overlay";
|
||||
control-center-margin-top = 10;
|
||||
control-center-margin-bottom = 10;
|
||||
control-center-margin-right = 10;
|
||||
control-center-margin-left = 10;
|
||||
notification-icon-size = 64;
|
||||
notification-body-image-height = 100;
|
||||
notification-body-image-width = 200;
|
||||
timeout = 10;
|
||||
timeout-low = 5;
|
||||
timeout-critical = 0;
|
||||
fit-to-screen = false;
|
||||
control-center-width = 500;
|
||||
control-center-height = 1025;
|
||||
notification-window-width = 500;
|
||||
keyboard-shortcuts = true;
|
||||
image-visibility = "when-available";
|
||||
transition-time = 200;
|
||||
hide-on-clear = false;
|
||||
hide-on-action = true;
|
||||
script-fail-notify = true;
|
||||
widget-config = {
|
||||
title = {
|
||||
text = "Notification Center";
|
||||
clear-all-button = true;
|
||||
button-text = " Clear All";
|
||||
};
|
||||
dnd = {
|
||||
text = "Do Not Disturb";
|
||||
};
|
||||
label = {
|
||||
max-lines = 1;
|
||||
text = "Notification Center";
|
||||
};
|
||||
mpris = {
|
||||
image-size = 96;
|
||||
image-radius = 7;
|
||||
};
|
||||
volume = {
|
||||
label = "";
|
||||
};
|
||||
backlight = {
|
||||
label = "";
|
||||
};
|
||||
};
|
||||
widgets = [
|
||||
"title"
|
||||
"mpris"
|
||||
"volume"
|
||||
"backlight"
|
||||
"dnd"
|
||||
"notifications"
|
||||
];
|
||||
};
|
||||
style = ''
|
||||
* {
|
||||
font-family: JetBrainsMono Nerd Font Mono;
|
||||
font-weight: bold;
|
||||
}
|
||||
.control-center .notification-row:focus,
|
||||
.control-center .notification-row:hover {
|
||||
opacity: 0.9;
|
||||
background: #${config.lib.stylix.colors.base00}
|
||||
}
|
||||
.notification-row {
|
||||
outline: none;
|
||||
margin: 10px;
|
||||
padding: 0;
|
||||
}
|
||||
.notification {
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
margin: 0px;
|
||||
}
|
||||
.notification-content {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
border: 2px solid #${config.lib.stylix.colors.base0D};
|
||||
margin: 0;
|
||||
}
|
||||
.notification-default-action {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.close-button {
|
||||
background: #${config.lib.stylix.colors.base08};
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
text-shadow: none;
|
||||
padding: 0;
|
||||
border-radius: 5px;
|
||||
margin-top: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.close-button:hover {
|
||||
box-shadow: none;
|
||||
background: #${config.lib.stylix.colors.base0D};
|
||||
transition: all .15s ease-in-out;
|
||||
border: none
|
||||
}
|
||||
.notification-action {
|
||||
border: 2px solid #${config.lib.stylix.colors.base0D};
|
||||
border-top: none;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.notification-default-action:hover,
|
||||
.notification-action:hover {
|
||||
color: #${config.lib.stylix.colors.base0B};
|
||||
background: #${config.lib.stylix.colors.base0B}
|
||||
}
|
||||
.notification-default-action {
|
||||
border-radius: 5px;
|
||||
margin: 0px;
|
||||
}
|
||||
.notification-default-action:not(:only-child) {
|
||||
border-bottom-left-radius: 7px;
|
||||
border-bottom-right-radius: 7px
|
||||
}
|
||||
.notification-action:first-child {
|
||||
border-bottom-left-radius: 10px;
|
||||
background: #${config.lib.stylix.colors.base00}
|
||||
}
|
||||
.notification-action:last-child {
|
||||
border-bottom-right-radius: 10px;
|
||||
background: #${config.lib.stylix.colors.base00}
|
||||
}
|
||||
.inline-reply {
|
||||
margin-top: 8px
|
||||
}
|
||||
.inline-reply-entry {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
caret-color: #${config.lib.stylix.colors.base05};
|
||||
border: 1px solid #${config.lib.stylix.colors.base09};
|
||||
border-radius: 5px
|
||||
}
|
||||
.inline-reply-button {
|
||||
margin-left: 4px;
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
border: 1px solid #${config.lib.stylix.colors.base09};
|
||||
border-radius: 5px;
|
||||
color: #${config.lib.stylix.colors.base05}
|
||||
}
|
||||
.inline-reply-button:disabled {
|
||||
background: initial;
|
||||
color: #${config.lib.stylix.colors.base03};
|
||||
border: 1px solid transparent
|
||||
}
|
||||
.inline-reply-button:hover {
|
||||
background: #${config.lib.stylix.colors.base00}
|
||||
}
|
||||
.body-image {
|
||||
margin-top: 6px;
|
||||
background-color: #${config.lib.stylix.colors.base05};
|
||||
border-radius: 5px
|
||||
}
|
||||
.summary {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
background: transparent;
|
||||
color: rgba(158, 206, 106, 1);
|
||||
text-shadow: none
|
||||
}
|
||||
.time {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
background: transparent;
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
text-shadow: none;
|
||||
margin-right: 18px
|
||||
}
|
||||
.body {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
background: transparent;
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
text-shadow: none
|
||||
}
|
||||
.control-center {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
border: 2px solid #${config.lib.stylix.colors.base0C};
|
||||
border-radius: 5px;
|
||||
}
|
||||
.control-center-list {
|
||||
background: transparent
|
||||
}
|
||||
.control-center-list-placeholder {
|
||||
opacity: .5
|
||||
}
|
||||
.floating-notifications {
|
||||
background: transparent
|
||||
}
|
||||
.blank-window {
|
||||
background: alpha(black, 0)
|
||||
}
|
||||
.widget-title {
|
||||
color: #${config.lib.stylix.colors.base0B};
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
padding: 5px 10px;
|
||||
margin: 10px 10px 5px 10px;
|
||||
font-size: 1.5rem;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.widget-title>button {
|
||||
font-size: 1rem;
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
text-shadow: none;
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
box-shadow: none;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.widget-title>button:hover {
|
||||
background: #${config.lib.stylix.colors.base08};
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
}
|
||||
.widget-dnd {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
padding: 5px 10px;
|
||||
margin: 10px 10px 5px 10px;
|
||||
border-radius: 5px;
|
||||
font-size: large;
|
||||
color: #${config.lib.stylix.colors.base0B};
|
||||
}
|
||||
.widget-dnd>switch {
|
||||
border-radius: 5px;
|
||||
/* border: 1px solid #${config.lib.stylix.colors.base0B}; */
|
||||
background: #${config.lib.stylix.colors.base0B};
|
||||
}
|
||||
.widget-dnd>switch:checked {
|
||||
background: #${config.lib.stylix.colors.base08};
|
||||
border: 1px solid #${config.lib.stylix.colors.base08};
|
||||
}
|
||||
.widget-dnd>switch slider {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
border-radius: 5px
|
||||
}
|
||||
.widget-dnd>switch:checked slider {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
border-radius: 5px
|
||||
}
|
||||
.widget-label {
|
||||
margin: 10px 10px 5px 10px;
|
||||
}
|
||||
.widget-label>label {
|
||||
font-size: 1rem;
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
}
|
||||
.widget-mpris {
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
padding: 5px 10px;
|
||||
margin: 10px 10px 5px 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.widget-mpris > box > button {
|
||||
border-radius: 5px;
|
||||
}
|
||||
.widget-mpris-player {
|
||||
padding: 5px 10px;
|
||||
margin: 10px
|
||||
}
|
||||
.widget-mpris-title {
|
||||
font-weight: 700;
|
||||
font-size: 1.25rem
|
||||
}
|
||||
.widget-mpris-subtitle {
|
||||
font-size: 1.1rem
|
||||
}
|
||||
.widget-menubar>box>.menu-button-bar>button {
|
||||
border: none;
|
||||
background: transparent
|
||||
}
|
||||
.topbar-buttons>button {
|
||||
border: none;
|
||||
background: transparent
|
||||
}
|
||||
.widget-volume {
|
||||
background: #${config.lib.stylix.colors.base01};
|
||||
padding: 5px;
|
||||
margin: 10px 10px 5px 10px;
|
||||
border-radius: 5px;
|
||||
font-size: x-large;
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
}
|
||||
.widget-volume>box>button {
|
||||
background: #${config.lib.stylix.colors.base0B};
|
||||
border: none
|
||||
}
|
||||
.per-app-volume {
|
||||
background-color: #${config.lib.stylix.colors.base00};
|
||||
padding: 4px 8px 8px;
|
||||
margin: 0 8px 8px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.widget-backlight {
|
||||
background: #${config.lib.stylix.colors.base01};
|
||||
padding: 5px;
|
||||
margin: 10px 10px 5px 10px;
|
||||
border-radius: 5px;
|
||||
font-size: x-large;
|
||||
color: #${config.lib.stylix.colors.base05}
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
||||
10
modules/home/tealdeer.nix
Normal file
@@ -0,0 +1,10 @@
|
||||
{ ... }: {
|
||||
programs.tealdeer = {
|
||||
enable = true;
|
||||
settings = {
|
||||
display.compact = false;
|
||||
display.use_pager = true;
|
||||
updates.auto_update = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
118
modules/home/tmux.nix
Normal file
@@ -0,0 +1,118 @@
|
||||
# Tmux is a terminal multiplexer that allows you to run multiple terminal sessions in a single window.
|
||||
{ pkgs, ... }: {
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
mouse = true;
|
||||
shell = "${pkgs.zsh}/bin/zsh";
|
||||
prefix = "C-a";
|
||||
terminal = "kitty";
|
||||
keyMode = "vi";
|
||||
|
||||
extraConfig = ''
|
||||
set-option -g status-position top
|
||||
|
||||
#set -g default-terminal "screen-256color"
|
||||
set-option -g history-limit 5000
|
||||
unbind %
|
||||
unbind '"'
|
||||
|
||||
bind-key h select-pane -L
|
||||
bind-key j select-pane -D
|
||||
bind-key k select-pane -U
|
||||
bind-key l select-pane -R
|
||||
|
||||
set -gq allow-passthrough on
|
||||
bind-key x kill-pane # skip "kill-pane 1? (y/n)" prompt
|
||||
|
||||
bind-key -n C-Tab next-window
|
||||
bind-key -n C-S-Tab previous-window
|
||||
bind-key -n M-Tab new-window
|
||||
|
||||
|
||||
# Start windows and panes index at 1, not 0.
|
||||
set -g base-index 1
|
||||
setw -g pane-base-index 1
|
||||
|
||||
|
||||
bind-key "|" split-window -h -c "#{pane_current_path}"
|
||||
bind-key "\\" split-window -fh -c "#{pane_current_path}"
|
||||
|
||||
bind-key "-" split-window -v -c "#{pane_current_path}"
|
||||
bind-key "_" split-window -fv -c "#{pane_current_path}"
|
||||
|
||||
bind -r C-j resize-pane -D 15
|
||||
bind -r C-k resize-pane -U 15
|
||||
bind -r C-h resize-pane -L 15
|
||||
bind -r C-l resize-pane -R 15
|
||||
|
||||
# 'c' to new window
|
||||
bind-key c new-window
|
||||
|
||||
# 'n' next window
|
||||
bind-key n next-window
|
||||
|
||||
# 'p' next previous
|
||||
bind-key n previous-window
|
||||
|
||||
unbind r
|
||||
bind r source-file ~/.config/tmux/tmux.conf
|
||||
|
||||
bind -r m resize-pane -Z
|
||||
|
||||
bind-key t clock-mode
|
||||
bind-key q display-panes
|
||||
bind-key u refresh-client
|
||||
bind-key o select-pane -t :.+
|
||||
|
||||
|
||||
##### Display Popups #####
|
||||
|
||||
bind C-y display-popup \
|
||||
-d "#{pane_current_path}" \
|
||||
-w 80% \
|
||||
-h 80% \
|
||||
-E "lazygit"
|
||||
bind C-n display-popup -E 'bash -i -c "read -p \"Session name: \" name; tmux new-session -d -s \$name && tmux switch-client -t \$name"'
|
||||
bind C-j display-popup -E "tmux list-sessions | sed -E 's/:.*$//' | grep -v \"^$(tmux display-message -p '#S')\$\" | fzf --reverse | xargs tmux switch-client -t"
|
||||
#bind C-p display-popup -E "ipython"
|
||||
#bind C-f display-popup \
|
||||
# -w 80% \
|
||||
# -h 80% \
|
||||
# -E 'rmpc'
|
||||
bind C-r display-popup \
|
||||
-d "#{pane_current_path}" \
|
||||
-w 90% \
|
||||
-h 90% \
|
||||
-E "yazi"
|
||||
bind C-z display-popup \
|
||||
-w 90% \
|
||||
-h 90% \
|
||||
-E 'nvim ~/ddubsos/flake.nix'
|
||||
#bind C-g display-popup -E "bash -i ~/.tmux/scripts/chat-popup.sh"
|
||||
bind C-t display-popup \
|
||||
-d "#{pane_current_path}" \
|
||||
-w 75% \
|
||||
-h 75% \
|
||||
-E "zsh"
|
||||
|
||||
##### Display Menu #####
|
||||
|
||||
bind d display-menu -T "#[align=centre]Dotfiles" -x C -y C \
|
||||
"SaugOS flake.nix" f "display-popup -E 'nvim ~/zaneyos/SaugOS/flake.nix'" \
|
||||
"SaugOS packages" p "display-popup -E 'nvim ~/zaneyos/SaugOS/modules/core/packages.nix'" \
|
||||
"SaugOS keybinds" k "display-popup -E 'nvim ~/zaneyos/SaugOS/modules/home/niri/binds.nix'" \
|
||||
"SaugOS variables" e "display-popup -E 'nvim ~/zaneyos/SaugOS/hosts/default/variables.nix'" \
|
||||
"SaugOS windowrules" w "display-popup -E 'nvim ~/zaneyos/SaugOS/modules/home/niri/windowrules.nix'" \
|
||||
"Exit" q ""
|
||||
|
||||
|
||||
|
||||
'';
|
||||
|
||||
plugins = with pkgs; [
|
||||
tmuxPlugins.vim-tmux-navigator
|
||||
tmuxPlugins.sensible
|
||||
tmuxPlugins.tokyo-night-tmux
|
||||
];
|
||||
};
|
||||
}
|
||||
57
modules/home/vscode.nix
Normal file
@@ -0,0 +1,57 @@
|
||||
{ pkgs, pkgs-unstable, lib, ... }: {
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
programs.vscode = {
|
||||
enable = true;
|
||||
package = pkgs-unstable.vscode;
|
||||
mutableExtensionsDir = true;
|
||||
|
||||
profiles.default = {
|
||||
enableExtensionUpdateCheck = true;
|
||||
enableUpdateCheck = true;
|
||||
|
||||
extensions = with pkgs-unstable.vscode-extensions; [
|
||||
bbenoist.nix
|
||||
jeff-hykin.better-nix-syntax
|
||||
ms-vscode.cpptools-extension-pack
|
||||
vscodevim.vim # Vim emulation
|
||||
mads-hartmann.bash-ide-vscode
|
||||
tamasfe.even-better-toml
|
||||
zainchen.json
|
||||
shd101wyy.markdown-preview-enhanced
|
||||
# Copilot
|
||||
github.copilot
|
||||
github.copilot-chat
|
||||
|
||||
|
||||
# Programming languages
|
||||
golang.go
|
||||
ziglang.vscode-zig
|
||||
ms-python.python
|
||||
ms-python.vscode-pylance
|
||||
# Jupyter notebooks
|
||||
ms-toolsai.jupyter
|
||||
ms-toolsai.jupyter-keymap
|
||||
ms-toolsai.jupyter-renderers
|
||||
# Icons
|
||||
catppuccin.catppuccin-vsc-icons
|
||||
];
|
||||
|
||||
userSettings = {
|
||||
"workbench.sideBar.location" = "right";
|
||||
"workbench.iconTheme" = "catppuccin-macchiato";
|
||||
"github.copilot.enable" = {
|
||||
"*" = false;
|
||||
"plaintext" = false;
|
||||
"markdown" = false;
|
||||
"scminput" = false;
|
||||
};
|
||||
"workbench.panel.defaultLocation" = "left";
|
||||
"editor.fontFamily" = lib.mkForce "JetBrainsMono Nerd Font, FiraCode Nerd Font, monospace";
|
||||
"editor.fontLigatures" = true;
|
||||
"editor.fontSize" = lib.mkForce 12;
|
||||
"terminal.integrated.fontFamily" = lib.mkForce "JetBrainsMono Nerd Font, FiraCode Nerd Font, monospace";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
275
modules/home/waybar/waybar-curved.nix
Normal file
@@ -0,0 +1,275 @@
|
||||
{ pkgs
|
||||
, lib
|
||||
, host
|
||||
, config
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)";
|
||||
inherit (import ../../../hosts/${host}/variables.nix) clock24h;
|
||||
in
|
||||
with lib; {
|
||||
# Configure & Theme Waybar
|
||||
programs.waybar = {
|
||||
enable = true;
|
||||
package = pkgs.waybar;
|
||||
settings = [
|
||||
{
|
||||
layer = "top";
|
||||
position = "top";
|
||||
modules-center = [ "niri/workspaces" ];
|
||||
modules-left = [
|
||||
"custom/startmenu"
|
||||
"niri/window"
|
||||
"pulseaudio"
|
||||
"cpu"
|
||||
"memory"
|
||||
"idle_inhibitor"
|
||||
];
|
||||
modules-right = [
|
||||
"custom/hyprbindings"
|
||||
"custom/notification"
|
||||
"custom/exit"
|
||||
"battery"
|
||||
"tray"
|
||||
"clock"
|
||||
];
|
||||
|
||||
"niri/workspaces" = {
|
||||
format = "{name}";
|
||||
format-icons = {
|
||||
default = " ";
|
||||
active = " ";
|
||||
urgent = " ";
|
||||
};
|
||||
};
|
||||
"clock" = {
|
||||
format =
|
||||
if clock24h == true
|
||||
then '' {:L%H:%M}''
|
||||
else '' {:L%I:%M %p}'';
|
||||
tooltip = true;
|
||||
tooltip-format = "<big>{:%A, %d.%B %Y }</big>\n<tt><small>{calendar}</small></tt>";
|
||||
};
|
||||
"niri/window" = {
|
||||
max-length = 22;
|
||||
separate-outputs = false;
|
||||
rewrite = {
|
||||
"" = " 🙈 No Windows? ";
|
||||
};
|
||||
};
|
||||
"memory" = {
|
||||
interval = 5;
|
||||
format = " {}%";
|
||||
tooltip = true;
|
||||
};
|
||||
"cpu" = {
|
||||
interval = 5;
|
||||
format = " {usage:2}%";
|
||||
tooltip = true;
|
||||
};
|
||||
"disk" = {
|
||||
format = " {free}";
|
||||
tooltip = true;
|
||||
};
|
||||
"network" = {
|
||||
format-icons = [
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
];
|
||||
format-ethernet = " {bandwidthDownOctets}";
|
||||
format-wifi = "{icon} {signalStrength}%";
|
||||
format-disconnected = "";
|
||||
tooltip = false;
|
||||
};
|
||||
"tray" = {
|
||||
spacing = 12;
|
||||
};
|
||||
"pulseaudio" = {
|
||||
format = "{icon} {volume}% {format_source}";
|
||||
format-bluetooth = "{volume}% {icon} {format_source}";
|
||||
format-bluetooth-muted = " {icon} {format_source}";
|
||||
format-muted = " {format_source}";
|
||||
format-source = " {volume}%";
|
||||
format-source-muted = "";
|
||||
format-icons = {
|
||||
headphone = "";
|
||||
hands-free = "";
|
||||
headset = "";
|
||||
phone = "";
|
||||
portable = "";
|
||||
car = "";
|
||||
default = [
|
||||
""
|
||||
""
|
||||
""
|
||||
];
|
||||
};
|
||||
on-click = "sleep 0.1 && pavucontrol";
|
||||
};
|
||||
"custom/exit" = {
|
||||
tooltip = false;
|
||||
format = "";
|
||||
on-click = "sleep 0.1 && wlogout";
|
||||
};
|
||||
"custom/startmenu" = {
|
||||
tooltip = false;
|
||||
format = "";
|
||||
# exec = "rofi -show drun";
|
||||
on-click = "sleep 0.1 && rofi-launcher";
|
||||
};
|
||||
"custom/hyprbindings" = {
|
||||
tooltip = false;
|
||||
format = "";
|
||||
on-click = "sleep 0.1 && list-keybinds";
|
||||
};
|
||||
"idle_inhibitor" = {
|
||||
format = "{icon}";
|
||||
format-icons = {
|
||||
activated = "";
|
||||
deactivated = "";
|
||||
};
|
||||
tooltip = "true";
|
||||
};
|
||||
"custom/notification" = {
|
||||
tooltip = false;
|
||||
format = "{icon} {}";
|
||||
format-icons = {
|
||||
notification = "<span foreground='red'><sup></sup></span>";
|
||||
none = "";
|
||||
dnd-notification = "<span foreground='red'><sup></sup></span>";
|
||||
dnd-none = "";
|
||||
inhibited-notification = "<span foreground='red'><sup></sup></span>";
|
||||
inhibited-none = "";
|
||||
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
|
||||
dnd-inhibited-none = "";
|
||||
};
|
||||
return-type = "json";
|
||||
exec-if = "which swaync-client";
|
||||
exec = "swaync-client -swb";
|
||||
on-click = "sleep 0.1 && task-waybar";
|
||||
escape = true;
|
||||
};
|
||||
"battery" = {
|
||||
states = {
|
||||
warning = 30;
|
||||
critical = 15;
|
||||
};
|
||||
format = "{icon} {capacity}%";
|
||||
format-charging = " {capacity}%";
|
||||
format-plugged = " {capacity}%";
|
||||
format-icons = [
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
];
|
||||
on-click = "";
|
||||
tooltip = false;
|
||||
};
|
||||
}
|
||||
];
|
||||
style = concatStrings [
|
||||
''
|
||||
* {
|
||||
font-family: JetBrainsMono Nerd Font Mono;
|
||||
font-size: 16px;
|
||||
border-radius: 0px;
|
||||
border: none;
|
||||
min-height: 0px;
|
||||
}
|
||||
window#waybar {
|
||||
background: rgba(0,0,0,0);
|
||||
}
|
||||
#workspaces {
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
background: #${config.lib.stylix.colors.base01};
|
||||
margin: 4px 4px;
|
||||
padding: 5px 5px;
|
||||
border-radius: 16px;
|
||||
}
|
||||
#workspaces button {
|
||||
font-weight: bold;
|
||||
padding: 0px 5px;
|
||||
margin: 0px 3px;
|
||||
border-radius: 16px;
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
|
||||
opacity: 0.5;
|
||||
transition: ${betterTransition};
|
||||
}
|
||||
#workspaces button.active {
|
||||
font-weight: bold;
|
||||
padding: 0px 5px;
|
||||
margin: 0px 3px;
|
||||
border-radius: 16px;
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
|
||||
transition: ${betterTransition};
|
||||
opacity: 1.0;
|
||||
min-width: 40px;
|
||||
}
|
||||
#workspaces button:hover {
|
||||
font-weight: bold;
|
||||
border-radius: 16px;
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
|
||||
opacity: 0.8;
|
||||
transition: ${betterTransition};
|
||||
}
|
||||
tooltip {
|
||||
background: #${config.lib.stylix.colors.base00};
|
||||
border: 1px solid #${config.lib.stylix.colors.base08};
|
||||
border-radius: 12px;
|
||||
}
|
||||
tooltip label {
|
||||
color: #${config.lib.stylix.colors.base08};
|
||||
}
|
||||
#window, #pulseaudio, #cpu, #memory, #idle_inhibitor {
|
||||
font-weight: bold;
|
||||
margin: 4px 0px;
|
||||
margin-left: 7px;
|
||||
padding: 0px 18px;
|
||||
background: #${config.lib.stylix.colors.base04};
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
border-radius: 24px 10px 24px 10px;
|
||||
}
|
||||
#custom-startmenu {
|
||||
color: #${config.lib.stylix.colors.base0B};
|
||||
background: #${config.lib.stylix.colors.base02};
|
||||
font-size: 28px;
|
||||
margin: 0px;
|
||||
padding: 0px 30px 0px 15px;
|
||||
border-radius: 0px 0px 40px 0px;
|
||||
}
|
||||
#custom-hyprbindings, #network, #battery,
|
||||
#custom-notification, #tray, #custom-exit {
|
||||
font-weight: bold;
|
||||
background: #${config.lib.stylix.colors.base0F};
|
||||
color: #${config.lib.stylix.colors.base00};
|
||||
margin: 4px 0px;
|
||||
margin-right: 7px;
|
||||
border-radius: 10px 24px 10px 24px;
|
||||
padding: 0px 18px;
|
||||
}
|
||||
#clock {
|
||||
font-weight: bold;
|
||||
color: #0D0E15;
|
||||
background: linear-gradient(90deg, #${config.lib.stylix.colors.base0E}, #${config.lib.stylix.colors.base0C});
|
||||
margin: 0px;
|
||||
padding: 0px 15px 0px 30px;
|
||||
border-radius: 0px 0px 0px 40px;
|
||||
}
|
||||
''
|
||||
];
|
||||
};
|
||||
}
|
||||
82
modules/home/wezterm.nix
Normal file
@@ -0,0 +1,82 @@
|
||||
{ pkgs, ... }: {
|
||||
programs.wezterm = {
|
||||
enable = true;
|
||||
package = pkgs.wezterm;
|
||||
};
|
||||
home.file."./.config/wezterm/wezterm.lua".text = ''
|
||||
-- Config from Drew @justaguylinux small mods
|
||||
|
||||
local wezterm = require("wezterm")
|
||||
|
||||
local config = wezterm.config_builder()
|
||||
|
||||
config.enable_wayland = false
|
||||
|
||||
-- General appearance and visuals
|
||||
config.colors = {
|
||||
tab_bar = {
|
||||
background = "#00141d", -- col_gray1, your main DWM bar background
|
||||
|
||||
active_tab = {
|
||||
bg_color = "#80bfff", -- col_gray2 (selected tab in bright blue)
|
||||
fg_color = "#00141d", -- contrast text on active tab
|
||||
},
|
||||
|
||||
inactive_tab = {
|
||||
bg_color = "#1a1a1a", -- col_gray4 (dark background for inactive tabs)
|
||||
fg_color = "#FFFFFF", -- col_gray3 (white text on inactive tabs)
|
||||
},
|
||||
|
||||
new_tab = {
|
||||
bg_color = "#1a1a1a", -- same as inactive
|
||||
fg_color = "#4fc3f7", -- col_barbie (for the "+" button)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
config.window_background_opacity = 0.90
|
||||
config.color_scheme = "nightfox"
|
||||
config.font_size = 12
|
||||
config.font = wezterm.font("FiraCode", { weight = "Regular", italic = false })
|
||||
|
||||
config.window_padding = {
|
||||
left = 10,
|
||||
right = 10,
|
||||
top = 10,
|
||||
bottom = 10,
|
||||
}
|
||||
|
||||
config.use_fancy_tab_bar = true
|
||||
config.window_frame = {
|
||||
-- font = wezterm.font({ family = "FiraCode Nerd Font Mono", weight = "Regular" }),
|
||||
font = wezterm.font({ family = "JetBrainsMono Nerd Font Mono", weight = "Regular" }),
|
||||
}
|
||||
|
||||
config.default_cursor_style = "BlinkingUnderline"
|
||||
config.cursor_blink_rate = 500
|
||||
config.term = "xterm-256color"
|
||||
config.max_fps = 144
|
||||
config.animation_fps = 30
|
||||
|
||||
-- Keybindings using ALT for tabs & splits
|
||||
config.keys = {
|
||||
-- Tab management
|
||||
{ key = "t", mods = "ALT", action = wezterm.action.SpawnTab("CurrentPaneDomain") },
|
||||
{ key = "w", mods = "ALT", action = wezterm.action.CloseCurrentTab({ confirm = false }) },
|
||||
{ key = "n", mods = "ALT", action = wezterm.action.ActivateTabRelative(1) },
|
||||
{ key = "p", mods = "ALT", action = wezterm.action.ActivateTabRelative(-1) },
|
||||
|
||||
-- Pane management
|
||||
{ key = "v", mods = "ALT", action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }) },
|
||||
{ key = "h", mods = "ALT", action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) },
|
||||
{ key = "q", mods = "ALT", action = wezterm.action.CloseCurrentPane({ confirm = false }) },
|
||||
|
||||
-- Pane navigation (move between panes with ALT + Arrows)
|
||||
{ key = "LeftArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Left") },
|
||||
{ key = "RightArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Right") },
|
||||
{ key = "UpArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Up") },
|
||||
{ key = "DownArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Down") },
|
||||
}
|
||||
return config
|
||||
'';
|
||||
}
|
||||
107
modules/home/wlogout/default.nix
Normal file
@@ -0,0 +1,107 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.wlogout = {
|
||||
enable = true;
|
||||
layout = [
|
||||
{
|
||||
label = "shutdown";
|
||||
action = "sleep 1; systemctl poweroff";
|
||||
text = "Shutdown";
|
||||
keybind = "s";
|
||||
}
|
||||
{
|
||||
"label" = "reboot";
|
||||
"action" = "sleep 1; systemctl reboot";
|
||||
"text" = "Reboot";
|
||||
"keybind" = "r";
|
||||
}
|
||||
{
|
||||
"label" = "logout";
|
||||
"action" = "sleep 1; hyprctl dispatch exit";
|
||||
"text" = "Exit";
|
||||
"keybind" = "e";
|
||||
}
|
||||
{
|
||||
"label" = "suspend";
|
||||
"action" = "sleep 1; systemctl suspend";
|
||||
"text" = "Suspend";
|
||||
"keybind" = "u";
|
||||
}
|
||||
{
|
||||
"label" = "lock";
|
||||
"action" = "sleep 1; hyprlock";
|
||||
"text" = "Lock";
|
||||
"keybind" = "l";
|
||||
}
|
||||
{
|
||||
"label" = "hibernate";
|
||||
"action" = "sleep 1; systemctl hibernate";
|
||||
"text" = "Hibernate";
|
||||
"keybind" = "h";
|
||||
}
|
||||
];
|
||||
style = ''
|
||||
* {
|
||||
font-family: "JetBrainsMono NF", FontAwesome, sans-serif;
|
||||
background-image: none;
|
||||
transition: 20ms;
|
||||
}
|
||||
window {
|
||||
background-color: rgba(12, 12, 12, 0.1);
|
||||
}
|
||||
button {
|
||||
color: #${config.lib.stylix.colors.base05};
|
||||
font-size:20px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: 25%;
|
||||
border-style: solid;
|
||||
background-color: rgba(12, 12, 12, 0.3);
|
||||
border: 3px solid #${config.lib.stylix.colors.base05};
|
||||
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
|
||||
}
|
||||
button:focus,
|
||||
button:active,
|
||||
button:hover {
|
||||
color: #${config.lib.stylix.colors.base0B};
|
||||
background-color: rgba(12, 12, 12, 0.5);
|
||||
border: 3px solid #${config.lib.stylix.colors.base0B};
|
||||
}
|
||||
#logout {
|
||||
margin: 10px;
|
||||
border-radius: 20px;
|
||||
background-image: image(url("icons/logout.png"));
|
||||
}
|
||||
#suspend {
|
||||
margin: 10px;
|
||||
border-radius: 20px;
|
||||
background-image: image(url("icons/suspend.png"));
|
||||
}
|
||||
#shutdown {
|
||||
margin: 10px;
|
||||
border-radius: 20px;
|
||||
background-image: image(url("icons/shutdown.png"));
|
||||
}
|
||||
#reboot {
|
||||
margin: 10px;
|
||||
border-radius: 20px;
|
||||
background-image: image(url("icons/reboot.png"));
|
||||
}
|
||||
#lock {
|
||||
margin: 10px;
|
||||
border-radius: 20px;
|
||||
background-image: image(url("icons/lock.png"));
|
||||
}
|
||||
#hibernate {
|
||||
margin: 10px;
|
||||
border-radius: 20px;
|
||||
background-image: image(url("icons/hibernate.png"));
|
||||
}
|
||||
'';
|
||||
};
|
||||
home.file.".config/wlogout/icons" = {
|
||||
source = ./icons;
|
||||
recursive = true;
|
||||
};
|
||||
}
|
||||
BIN
modules/home/wlogout/icons/hibernate.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
modules/home/wlogout/icons/lock.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
modules/home/wlogout/icons/logout.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
modules/home/wlogout/icons/reboot.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
modules/home/wlogout/icons/shutdown.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
modules/home/wlogout/icons/suspend.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
37
modules/home/xdg.nix
Normal file
@@ -0,0 +1,37 @@
|
||||
{ pkgs, host, ... }:
|
||||
let
|
||||
vars = import ../../hosts/${host}/variables.nix;
|
||||
browserDesktop = {
|
||||
"firefox" = "firefox.desktop";
|
||||
"brave" = "brave-browser.desktop";
|
||||
"google-chrome" = "google-chrome.desktop";
|
||||
"google-chrome-stable" = "google-chrome.desktop";
|
||||
"chromium" = "chromium-browser.desktop";
|
||||
"zen" = "zen.desktop";
|
||||
"floorp" = "floorp.desktop";
|
||||
"librewolf" = "librewolf.desktop";
|
||||
"vivaldi" = "vivaldi-stable.desktop";
|
||||
};
|
||||
defaultBrowser = browserDesktop.${vars.browser} or "${vars.browser}.desktop";
|
||||
in
|
||||
{
|
||||
xdg = {
|
||||
enable = true;
|
||||
mime.enable = true;
|
||||
mimeApps = {
|
||||
enable = true;
|
||||
defaultApplications = {
|
||||
"text/html" = defaultBrowser;
|
||||
"x-scheme-handler/http" = defaultBrowser;
|
||||
"x-scheme-handler/https" = defaultBrowser;
|
||||
"x-scheme-handler/about" = defaultBrowser;
|
||||
"x-scheme-handler/unknown" = defaultBrowser;
|
||||
};
|
||||
};
|
||||
portal = {
|
||||
enable = true;
|
||||
extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
|
||||
config.common.default = "*";
|
||||
};
|
||||
};
|
||||
}
|
||||
32
modules/home/yazi/default.nix
Normal file
@@ -0,0 +1,32 @@
|
||||
{ pkgs, ... }:
|
||||
let
|
||||
settings = import ./yazi.nix;
|
||||
keymap = import ./keymap.nix;
|
||||
theme = import ./theme.nix;
|
||||
in
|
||||
{
|
||||
programs.yazi = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
enableBashIntegration = true;
|
||||
enableFishIntegration = true;
|
||||
shellWrapperName = "yy";
|
||||
settings = settings;
|
||||
keymap = keymap;
|
||||
theme = theme;
|
||||
plugins = {
|
||||
lazygit = pkgs.yaziPlugins.lazygit;
|
||||
full-border = pkgs.yaziPlugins.full-border;
|
||||
git = pkgs.yaziPlugins.git;
|
||||
smart-enter = pkgs.yaziPlugins.smart-enter;
|
||||
};
|
||||
|
||||
initLua = ''
|
||||
require("full-border"):setup()
|
||||
require("git"):setup()
|
||||
require("smart-enter"):setup {
|
||||
open_multi = true,
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
||||
1201
modules/home/yazi/keymap.nix
Normal file
3404
modules/home/yazi/theme.nix
Normal file
389
modules/home/yazi/yazi.nix
Normal file
@@ -0,0 +1,389 @@
|
||||
{
|
||||
settings = {
|
||||
manager = {
|
||||
ratio = [ 1 4 3 ];
|
||||
sort_by = "alphabetical";
|
||||
sort_sensitive = false;
|
||||
sort_reverse = false;
|
||||
sort_dir_first = true;
|
||||
sort_translit = false;
|
||||
linemode = "none";
|
||||
show_hidden = false;
|
||||
show_symlink = true;
|
||||
scrolloff = 5;
|
||||
mouse_events = [ "click" "scroll" ];
|
||||
title_format = "Yazi: {cwd}";
|
||||
};
|
||||
preview = {
|
||||
wrap = "no";
|
||||
tab_size = 2;
|
||||
max_width = 600;
|
||||
max_height = 900;
|
||||
cache_dir = "";
|
||||
image_delay = 30;
|
||||
image_filter = "triangle";
|
||||
image_quality = 75;
|
||||
sixel_fraction = 15;
|
||||
ueberzug_scale = 1;
|
||||
ueberzug_offset = [ 0 0 0 0 ];
|
||||
};
|
||||
opener = {
|
||||
edit = [
|
||||
{
|
||||
run = ''${"EDITOR:-vi"} "$@"'';
|
||||
desc = "$EDITOR";
|
||||
block = true;
|
||||
for = "unix";
|
||||
}
|
||||
{
|
||||
run = "code %*";
|
||||
orphan = true;
|
||||
desc = "code";
|
||||
for = "windows";
|
||||
}
|
||||
{
|
||||
run = "code -w %*";
|
||||
block = true;
|
||||
desc = "code (block)";
|
||||
for = "windows";
|
||||
}
|
||||
];
|
||||
open = [
|
||||
{
|
||||
run = ''xdg-open "$1"'';
|
||||
desc = "Open";
|
||||
for = "linux";
|
||||
}
|
||||
{
|
||||
run = ''open "$@"'';
|
||||
desc = "Open";
|
||||
for = "macos";
|
||||
}
|
||||
{
|
||||
run = ''start "" "%1"'';
|
||||
orphan = true;
|
||||
desc = "Open";
|
||||
for = "windows";
|
||||
}
|
||||
{
|
||||
run = ''termux-open "$1"'';
|
||||
desc = "Open";
|
||||
for = "android";
|
||||
}
|
||||
];
|
||||
reveal = [
|
||||
{
|
||||
run = ''xdg-open "$(dirname "$1")"'';
|
||||
desc = "Reveal";
|
||||
for = "linux";
|
||||
}
|
||||
{
|
||||
run = ''open -R "$1"'';
|
||||
desc = "Reveal";
|
||||
for = "macos";
|
||||
}
|
||||
{
|
||||
run = ''explorer /select,"%1"'';
|
||||
orphan = true;
|
||||
desc = "Reveal";
|
||||
for = "windows";
|
||||
}
|
||||
{
|
||||
run = ''termux-open "$(dirname "$1")"'';
|
||||
desc = "Reveal";
|
||||
for = "android";
|
||||
}
|
||||
{
|
||||
run = ''exiftool "$1"; echo "Press enter to exit"; read _'';
|
||||
block = true;
|
||||
desc = "Show EXIF";
|
||||
for = "unix";
|
||||
}
|
||||
];
|
||||
extract = [
|
||||
{
|
||||
run = ''ya pub extract --list "$@"'';
|
||||
desc = "Extract here";
|
||||
for = "unix";
|
||||
}
|
||||
{
|
||||
run = "ya pub extract --list %*";
|
||||
desc = "Extract here";
|
||||
for = "windows";
|
||||
}
|
||||
];
|
||||
play = [
|
||||
{
|
||||
run = ''mpv --force-window "$@"'';
|
||||
orphan = true;
|
||||
for = "unix";
|
||||
}
|
||||
{
|
||||
run = "mpv --force-window %*";
|
||||
orphan = true;
|
||||
for = "windows";
|
||||
}
|
||||
{
|
||||
run = ''mediainfo "$1"; echo "Press enter to exit"; read _'';
|
||||
block = true;
|
||||
desc = "Show media info";
|
||||
for = "unix";
|
||||
}
|
||||
];
|
||||
};
|
||||
open = {
|
||||
rules = [
|
||||
{
|
||||
name = "*/";
|
||||
use = [ "edit" "open" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime = "text/*";
|
||||
use = [ "edit" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime = "image/*";
|
||||
use = [ "open" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime = "{audio,video}/*";
|
||||
use = [ "play" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime =
|
||||
"application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}";
|
||||
use = [ "extract" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime = "application/{json,ndjson}";
|
||||
use = [ "edit" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime = "*/javascript";
|
||||
use = [ "edit" "reveal" ];
|
||||
}
|
||||
{
|
||||
mime = "inode/empty";
|
||||
use = [ "edit" "reveal" ];
|
||||
}
|
||||
{
|
||||
name = "*";
|
||||
use = [ "open" "reveal" ];
|
||||
}
|
||||
];
|
||||
};
|
||||
tasks = {
|
||||
micro_workers = 10;
|
||||
macro_workers = 10;
|
||||
bizarre_retry = 3;
|
||||
image_alloc = 536870912;
|
||||
image_bound = [ 0 0 ];
|
||||
suppress_preload = false;
|
||||
};
|
||||
plugin = {
|
||||
fetchers = [{
|
||||
id = "mime";
|
||||
name = "*";
|
||||
run = "mime";
|
||||
prio = "high";
|
||||
}];
|
||||
spotters = [
|
||||
{
|
||||
name = "*/";
|
||||
run = "folder";
|
||||
}
|
||||
{
|
||||
mime = "text/*";
|
||||
run = "code";
|
||||
}
|
||||
{
|
||||
mime = "application/{mbox,javascript,wine-extension-ini}";
|
||||
run = "code";
|
||||
}
|
||||
{
|
||||
mime = "image/{avif,hei?,jxl,svg+xml}";
|
||||
run = "magick";
|
||||
}
|
||||
{
|
||||
mime = "image/*";
|
||||
run = "image";
|
||||
}
|
||||
{
|
||||
mime = "video/*";
|
||||
run = "video";
|
||||
}
|
||||
{
|
||||
name = "*";
|
||||
run = "file";
|
||||
}
|
||||
];
|
||||
preloaders = [
|
||||
{
|
||||
mime = "image/{avif,hei?,jxl,svg+xml}";
|
||||
run = "magick";
|
||||
}
|
||||
{
|
||||
mime = "image/*";
|
||||
run = "image";
|
||||
}
|
||||
{
|
||||
mime = "video/*";
|
||||
run = "video";
|
||||
}
|
||||
{
|
||||
mime = "application/pdf";
|
||||
run = "pdf";
|
||||
}
|
||||
{
|
||||
mime = "font/*";
|
||||
run = "font";
|
||||
}
|
||||
{
|
||||
mime = "application/ms-opentype";
|
||||
run = "font";
|
||||
}
|
||||
];
|
||||
previewers = [
|
||||
{
|
||||
name = "*/";
|
||||
run = "folder";
|
||||
sync = true;
|
||||
}
|
||||
{
|
||||
mime = "text/*";
|
||||
run = "code";
|
||||
}
|
||||
{
|
||||
mime = "application/{mbox,javascript,wine-extension-ini}";
|
||||
run = "code";
|
||||
}
|
||||
{
|
||||
mime = "application/{json,ndjson}";
|
||||
run = "json";
|
||||
}
|
||||
{
|
||||
mime = "image/{avif,hei?,jxl,svg+xml}";
|
||||
run = "magick";
|
||||
}
|
||||
{
|
||||
mime = "image/*";
|
||||
run = "image";
|
||||
}
|
||||
{
|
||||
mime = "video/*";
|
||||
run = "video";
|
||||
}
|
||||
{
|
||||
mime = "application/pdf";
|
||||
run = "pdf";
|
||||
}
|
||||
{
|
||||
mime =
|
||||
"application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}";
|
||||
run = "archive";
|
||||
}
|
||||
{
|
||||
mime =
|
||||
"application/{debian*-package,redhat-package-manager,rpm,android.package-archive}";
|
||||
run = "archive";
|
||||
}
|
||||
{
|
||||
name = "*.{AppImage,appimage}";
|
||||
run = "archive";
|
||||
}
|
||||
{
|
||||
mime = "application/{iso9660-image,qemu-disk,ms-wim,apple-diskimage}";
|
||||
run = "archive";
|
||||
}
|
||||
{
|
||||
mime = "application/virtualbox-{vhd,vhdx}";
|
||||
run = "archive";
|
||||
}
|
||||
{
|
||||
name = "*.{img,fat,ext,ext2,ext3,ext4,squashfs,ntfs,hfs,hfsx}";
|
||||
run = "archive";
|
||||
}
|
||||
{
|
||||
mime = "font/*";
|
||||
run = "font";
|
||||
}
|
||||
{
|
||||
mime = "application/ms-opentype";
|
||||
run = "font";
|
||||
}
|
||||
{
|
||||
mime = "inode/empty";
|
||||
run = "empty";
|
||||
}
|
||||
{
|
||||
name = "*";
|
||||
run = "file";
|
||||
}
|
||||
];
|
||||
prepend_fetchers = [
|
||||
{
|
||||
id = "git";
|
||||
name = "*";
|
||||
run = "git";
|
||||
}
|
||||
{
|
||||
id = "git";
|
||||
name = "*/";
|
||||
run = "git";
|
||||
}
|
||||
];
|
||||
};
|
||||
input = {
|
||||
cursor_blink = false;
|
||||
cd_title = "Change directory:";
|
||||
cd_origin = "top-center";
|
||||
cd_offset = [ 0 2 50 3 ];
|
||||
create_title = [ "Create:" "Create (dir):" ];
|
||||
create_origin = "top-center";
|
||||
create_offset = [ 0 2 50 3 ];
|
||||
rename_title = "Rename:";
|
||||
rename_origin = "hovered";
|
||||
rename_offset = [ 0 1 50 3 ];
|
||||
filter_title = "Filter:";
|
||||
filter_origin = "top-center";
|
||||
filter_offset = [ 0 2 50 3 ];
|
||||
find_title = [ "Find next:" "Find previous:" ];
|
||||
find_origin = "top-center";
|
||||
find_offset = [ 0 2 50 3 ];
|
||||
search_title = "Search via {n}:";
|
||||
search_origin = "top-center";
|
||||
search_offset = [ 0 2 50 3 ];
|
||||
shell_title = [ "Shell:" "Shell (block):" ];
|
||||
shell_origin = "top-center";
|
||||
shell_offset = [ 0 2 50 3 ];
|
||||
};
|
||||
confirm = {
|
||||
trash_title = "Trash {n} selected file{s}?";
|
||||
trash_origin = "center";
|
||||
trash_offset = [ 0 0 70 20 ];
|
||||
delete_title = "Permanently delete {n} selected file{s}?";
|
||||
delete_origin = "center";
|
||||
delete_offset = [ 0 0 70 20 ];
|
||||
overwrite_title = "Overwrite file?";
|
||||
overwrite_content = "Will overwrite the following file:";
|
||||
overwrite_origin = "center";
|
||||
overwrite_offset = [ 0 0 50 15 ];
|
||||
quit_title = "Quit?";
|
||||
quit_content =
|
||||
"The following tasks are still running, are you sure you want to quit?";
|
||||
quit_origin = "center";
|
||||
quit_offset = [ 0 0 50 15 ];
|
||||
};
|
||||
pick = {
|
||||
open_title = "Open with:";
|
||||
open_origin = "hovered";
|
||||
open_offset = [ 0 1 50 7 ];
|
||||
};
|
||||
which = {
|
||||
sort_by = "none";
|
||||
sort_sensitive = false;
|
||||
sort_reverse = false;
|
||||
sort_translit = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
13
modules/home/zoxide.nix
Normal file
@@ -0,0 +1,13 @@
|
||||
_: {
|
||||
programs = {
|
||||
zoxide = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
enableBashIntegration = true;
|
||||
options = [
|
||||
"--cmd cd"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
63
modules/home/zsh/default.nix
Normal file
@@ -0,0 +1,63 @@
|
||||
{ profile
|
||||
, pkgs
|
||||
, lib
|
||||
, ...
|
||||
}: {
|
||||
imports = [
|
||||
./zshrc-personal.nix
|
||||
];
|
||||
|
||||
programs.zsh = {
|
||||
enable = true;
|
||||
autosuggestion.enable = true;
|
||||
syntaxHighlighting = {
|
||||
enable = true;
|
||||
highlighters = [ "main" "brackets" "pattern" "regexp" "root" "line" ];
|
||||
};
|
||||
historySubstringSearch.enable = true;
|
||||
|
||||
history = {
|
||||
ignoreDups = true;
|
||||
save = 10000;
|
||||
size = 10000;
|
||||
};
|
||||
|
||||
oh-my-zsh = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
plugins = [
|
||||
{
|
||||
name = "powerlevel10k";
|
||||
src = pkgs.zsh-powerlevel10k;
|
||||
file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
|
||||
}
|
||||
{
|
||||
name = "powerlevel10k-config";
|
||||
src = lib.cleanSource ./p10k-config;
|
||||
file = "p10k.zsh";
|
||||
}
|
||||
];
|
||||
|
||||
initContent = ''
|
||||
bindkey "\eh" backward-word
|
||||
bindkey "\ej" down-line-or-history
|
||||
bindkey "\ek" up-line-or-history
|
||||
bindkey "\el" forward-word
|
||||
if [ -f $HOME/.zshrc-personal ]; then
|
||||
source $HOME/.zshrc-personal
|
||||
fi
|
||||
'';
|
||||
|
||||
shellAliases = {
|
||||
sv = "sudo nvim";
|
||||
v = "nvim";
|
||||
c = "clear";
|
||||
fr = "nh os switch --hostname ${profile}";
|
||||
fu = "nh os switch --hostname ${profile} --update";
|
||||
ncg = "nix-collect-garbage --delete-old && sudo nix-collect-garbage -d && sudo /run/current-system/bin/switch-to-configuration boot";
|
||||
cat = "bat";
|
||||
man = "batman";
|
||||
};
|
||||
};
|
||||
}
|
||||