dotfiles/README.md

239 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Custom environment
My personal NixOS configuration and dotfiles for user `hhhh` on host `nixos`
(`x86_64-linux`). The desktop uses Hyprland, Kitty, Neovim, and Bash, with
Home Manager linking application settings directly to this repository.
## Toolset
| Tool | Purpose |
| --- | --- |
| [Hyprland](https://hypr.land/) | Wayland desktop compositor |
| Waybar / Wofi / Mako | Status bar, application launcher, and notifications |
| SDDM / Hyprlock | Login screen and session locking |
| [Kitty](https://sw.kovidgoyal.net/kitty/) | Terminal emulator |
| [Neovim](https://neovim.io/) | Editor and development environment |
| [Starship](https://starship.rs/) | Fast, minimal shell prompt |
| [direnv](https://direnv.net/) | Per-project environment variables |
| [zoxide](https://github.com/ajeetdsouza/zoxide) | Smarter directory navigation |
| [Atuin](https://atuin.sh/) | Searchable shell history |
| ble.sh | Interactive Bash editing and completion |
| [fzf](https://github.com/junegunn/fzf) | Fuzzy finding from the command line |
| [eza](https://github.com/eza-community/eza) | Modern replacement for `ls` |
| [GitUI](https://github.com/gitui-org/gitui) | Terminal UI for Git |
The shell configuration also includes shortcuts for Meson and Ninja builds,
sanitizer-assisted test runs, `perf`, FlameGraph, and systemd user scopes.
## Repository layout
```text
.
├── flake.nix # Reproducible NixOS entry point
├── flake.lock # Pinned dependency revisions
├── nixos/ # Host and reusable NixOS modules
├── bash/ # Bash environment, aliases, and helper functions
├── atuin/ # Atuin configuration
├── git/ # Git settings and aliases
├── gitui/ # GitUI key bindings
├── kitty/ # Kitty settings and color themes
├── hypr/ # Hyprland Lua config, monitors, wallpapers, and locking
├── sddm/ # Custom Qt 6 login theme
├── mako/ # Notification settings
├── nvim/ # Neovim Lua configuration, plugins, LSP, and themes
├── waybar/ # Compact Hyprland status bar and power menu
├── wofi/ # Application launcher with icons
└── wallpapers/ # Desktop wallpapers
```
Starship, direnv, zoxide, fzf, and eza do not currently have dedicated
configuration directories tracked in this repository.
## NixOS
The flake exposes the `nixos` host. Its machine-specific configuration lives
in `nixos/hosts/nixos`, while reusable settings are grouped by purpose in
`nixos/modules`. Packages are split into desktop, development, shell, and
general utility modules under `nixos/modules/packages`. The main Nixpkgs input
uses `nixos-26.05`; Home Manager uses `release-26.05` and follows that input.
The configuration enables NVIDIA graphics, PipeWire audio, NetworkManager,
OpenSSH, Podman, and Throne with TUN support.
From the repository root, check and apply the configuration with:
```bash
nix flake check --no-build
sudo nixos-rebuild switch --flake .#nixos
```
Use `nix flake check` for a full check including builds; `--no-build` checks
configuration evaluation without building the checks.
On the first run, if flakes are not enabled in the currently booted system,
pass the feature flags explicitly:
```bash
sudo nixos-rebuild switch \
--extra-experimental-features 'nix-command flakes' \
--flake .#nixos
```
Update all pinned flake inputs and rebuild with:
```bash
nix flake update
sudo nixos-rebuild switch --flake .#nixos
```
Codex is taken from a separately pinned Nixpkgs `master` input so it can be
updated without upgrading the stable NixOS package set:
```bash
nix flake update codex-nixpkgs
sudo nixos-rebuild switch --flake .#nixos
```
The `codex-background-server` user service starts automatically when `hhhh`
logs in and listens on the local Unix socket. Connect with
`codex --remote unix://`. Check its status with
`systemctl --user status codex-background-server` and view its logs with
`journalctl --user -u codex-background-server`.
Before applying this configuration on another machine, replace
`nixos/hosts/nixos/hardware-configuration.nix` with that machine's configuration
and review the host name, user, graphics driver, and monitor settings.
`nixos/hosts/nixos/default.nix` also copies Windows EFI files from a specific
partition to `/boot/EFI/` during bootloader installation; adapt or remove that
hook if the target machine does not use this dual-boot layout.
Keep `system.stateVersion` and `home.stateVersion` at their initial setup
versions when updating packages. Ordinary package additions do not require
updating `flake.lock`.
## Hyprland desktop
The active configuration is `hypr/hyprland.lua`, which loads `monitors.lua`.
The neighboring `monitors.conf` and `workspaces.conf` are not loaded by it.
Workspaces 1–10 belong to `DP-3`; `HDMI-A-2` has a dedicated named workspace.
Monitor modes and positions live in `monitors.lua`, and wallpaper assignments
live in `hypr/hyprpaper.conf`.
Hyprland starts Hyprpaper, Waybar, and the Home Manager `udiskie` service.
Udiskie automatically mounts removable media without a tray icon.
| Shortcut | Action |
| --- | --- |
| `Super+T` | Open Kitty |
| `Super+R` | Open Wofi |
| `Super+C` | Close the active window |
| `Super+L` | Lock the session |
| `Super+Shift+S` | Copy a region screenshot to the clipboard |
| `Super+1` … `Super+0` | Select workspace 1–10 |
| `Super+Shift+1` … `Super+Shift+0` | Move a window to workspace 1–10 |
| `Alt+H` / `Alt+L` | Cycle primary-monitor workspaces |
| `Ctrl+Space` | Switch English/Russian keyboard layouts |
Waybar settings are in `waybar/config.jsonc` and `waybar/style.css`;
`waybar/power-menu.sh` provides lock, suspend, reboot, and power-off actions.
## Screen locking
The initial SDDM login screen uses a matching Qt 6 theme in `sddm/`, packaged
by `nixos/modules/login-theme.nix`. Its assets and ProFont are included in
the theme package so they are available before a user session starts.
It supports username/password entry, desktop session selection, and power
actions. Apply with `nixos-rebuild switch`; the theme appears at the next
login. Avoid restarting the display manager during an active session.
Hyprlock uses `hypr/hyprlock.conf` and the existing wallpaper assets for a
blurred, two-column lock screen with ProFont, a clock, and live system status.
Press `Super+L` or choose **Lock** in the Waybar power menu.
`hypr/hypridle.conf` defines session locking and a lock request before suspend,
with no idle timeout. Hypridle is not currently installed or started by the
tracked configuration; these hooks require installing and running it.
The NixOS Hyprlock module supplies its PAM authentication configuration.
## Home Manager
Home Manager is integrated into the NixOS flake and uses the same pinned
Nixpkgs input. The user configuration lives in `nixos/home/hhhh.nix`.
It manages `atuin`, `gitui`, `hypr`, `kitty`, `mako`, `nvim`, `waybar`, and
`wofi` under `~/.config`.
These directories link to `~/Git/Custom-environment` through
`mkOutOfStoreSymlink`, so edits in the repository are available immediately.
Reload or restart the affected application to pick up configuration changes.
Keep the repository at this location, or adjust `repo` in the user module.
Apply Home Manager changes together with the system configuration:
```bash
sudo nixos-rebuild switch --flake .#nixos
```
On activation, conflicting configuration files or links are backed up with
the `.hm-backup` suffix; links already pointing to the same content can be
adopted without a backup. Existing backups are preserved; move an old
backup aside if it blocks activation. Keep `home.stateVersion` at the version
used when first enabling Home Manager.
## Installation
On NixOS, clone the repository into the location expected by Home Manager,
review the machine-specific settings described above, then check and apply
the flake:
```bash
git clone git@github.com:Claucdan/Custom-environment.git ~/Git/Custom-environment
cd ~/Git/Custom-environment
nix flake check --no-build
sudo nixos-rebuild switch --flake .#nixos
```
On other distributions, install the tools using your system package manager
and link the configuration directories manually. Inspect existing settings
and move conflicting files or directories aside before creating links:
```bash
git clone git@github.com:Claucdan/Custom-environment.git ~/Git/Custom-environment
cd ~/Git/Custom-environment
mkdir -p "$HOME/.config"
for config in atuin gitui hypr kitty mako nvim waybar wofi; do
ln -s "$PWD/$config" "$HOME/.config/$config"
done
```
## Bash and Git
Home Manager does not manage `bash/` or `git/`. Review their settings and back
up any existing `~/.bashrc` and `~/.gitconfig` before linking them separately:
```bash
cd ~/Git/Custom-environment
ln -s "$PWD/bash/.bashrc" "$HOME/.bashrc"
ln -s "$PWD/git/.gitconfig" "$HOME/.gitconfig"
```
Link the Bash entry point rather than copying it: it resolves the `~/.bashrc`
symlink to locate `env.bash`, `aliases.bash`, `build.bash`, `perf.bash`,
`systemd.bash`, and `tools.bash`. Machine-specific additions belong in
`bash/local.*.bash`, which is ignored by Git. Start a new interactive Bash
session after changing the links.
The Git configuration includes `~/Git/Custom-environment/git/aliases.gitconfig`,
uses Neovim as its editor, and enables pull rebase with automatic stashing.
Adjust the include path if you keep the repository elsewhere.
## Notes
- NixOS installs ProFont Nerd Font, Font Awesome, and Noto fonts. Kitty uses
`ProFontWindows Nerd Font Mono`; install it separately on other distributions.
- Neovim plugins are managed with
[lazy.nvim](https://github.com/folke/lazy.nvim); open Neovim after linking the
configuration to install them. The entry point is `nvim/init.lua`, plugin
specifications are in `nvim/lua/plugins/`, and settings are in
`nvim/lua/configs/`. `nvim/lazy-lock.json` is currently ignored by Git, so
plugin versions are not pinned by this repository.
- This is a personal setup rather than a universal bootstrap script. Feel free
to copy or adapt any part of it.