Add ssh and git configuration

This commit is contained in:
Nina Chlóe Kassandra Reiß
2026-04-20 15:59:52 +02:00
parent 482cb354d3
commit 64817ef4ff
22 changed files with 569 additions and 429 deletions

View File

@@ -1,9 +1,14 @@
{ config, pkgs, lib, ... }: {
config,
pkgs,
lib,
...
}:
let let
profile = import ./profile.nix; profile = import ./profile.nix;
in in
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
fluffychat fluffychat
]; ];
} }

View File

@@ -1,6 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
} }

View File

@@ -1,113 +1,118 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
programs.firefox = {
enable = true;
policies = {
AppAutoUpdate = false;
AllowFileSelectionDialogs = true;
AutofillAddressEnabled = true;
AutofillCreditCardEnabled = false;
CaptivePortal = true;
DisableFirefoxAccounts = true;
DisableSecurityBypass = {
InvalidCertificate = false;
SafeBrowsing = false;
};
DisableSetDesktopBackground = true;
DisableTelemetry = true;
ExtensionUpdate = true;
FirefoxHome = {
Search = true;
TopSites = true;
SponsoredTopSites = false;
Highlights = true;
Pocket = false;
Stories = false;
SponsoredPocket = false;
SponsoredStories = false;
Snippets = true;
Locked = true;
};
PictureInPicture = {
Enabled = true;
Locked = false;
};
ExtensionSettings = {
"nextcloud-passwords@nextcloud.com" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/nextcloud-passwords/latest.xpi";
};
"instapaper@instapaper.com" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/instapaper-official/latest.xpi";
};
"weh@mozilla.org" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/video-downloadhelper/latest.xpi";
};
};
Preferences = {
# Tracking Protection
"browser.contentblocking.category" = "strict";
"privacy.trackingprotection.enabled" = true;
"privacy.trackingprotection.socialtracking.enabled" = true;
# Cookies
"network.cookie.cookieBehavior" = 1; # block third-party cookies
# Fingerprinting Protection
"privacy.resistFingerprinting" = true;
"privacy.resistFingerprinting.block_mozAddonManager" = true;
# WebRTC IP Leak verhindern
"media.peerconnection.enabled" = false;
# Telemetrie vollständig deaktivieren
"toolkit.telemetry.enabled" = false;
"toolkit.telemetry.unified" = false;
"toolkit.telemetry.archive.enabled" = false;
"datareporting.healthreport.uploadEnabled" = false;
"app.shield.optoutstudies.enabled" = false;
# SafeBrowsing (lokal behalten, aber keine unnötige Kommunikation)
"browser.safebrowsing.downloads.remote.enabled" = false;
# HTTPS-Only Mode
"dom.security.https_only_mode" = true;
# DNS over HTTPS Fallback deaktivieren
"network.trr.mode" = 3;
"network.trr.uri" = "https://dns.quad9.net/dns-query";
# Referrer reduzieren
"network.http.referer.XOriginPolicy" = 2;
# Clipboard API nur bei User Interaction
"dom.events.asyncClipboard.readText" = false;
# WebGL einschränken
"webgl.disabled" = true;
};
SearchEngines = {
Default = "Ecosia";
Add = [
{
Name = "Ecosia";
URLTemplate = "https://www.ecosia.org/search?q={searchTerms}";
Method = "GET";
}
];
Remove = [ "Google" "Bing" "Amazon.com" "eBay" ];
};
programs.firefox = {
enable = true;
policies = {
AppAutoUpdate = false;
AllowFileSelectionDialogs = true;
AutofillAddressEnabled = true;
AutofillCreditCardEnabled = false;
CaptivePortal = true;
DisableFirefoxAccounts = true;
DisableSecurityBypass = {
InvalidCertificate = false;
SafeBrowsing = false;
};
DisableSetDesktopBackground = true;
DisableTelemetry = true;
ExtensionUpdate = true;
FirefoxHome = {
Search = true;
TopSites = true;
SponsoredTopSites = false;
Highlights = true;
Pocket = false;
Stories = false;
SponsoredPocket = false;
SponsoredStories = false;
Snippets = true;
Locked = true;
};
PictureInPicture = {
Enabled = true;
Locked = false;
};
ExtensionSettings = {
"nextcloud-passwords@nextcloud.com" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/nextcloud-passwords/latest.xpi";
}; };
"instapaper@instapaper.com" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/instapaper-official/latest.xpi";
};
"weh@mozilla.org" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/video-downloadhelper/latest.xpi";
};
};
Preferences = {
# Tracking Protection
"browser.contentblocking.category" = "strict";
"privacy.trackingprotection.enabled" = true;
"privacy.trackingprotection.socialtracking.enabled" = true;
# Cookies
"network.cookie.cookieBehavior" = 1; # block third-party cookies
# Fingerprinting Protection
"privacy.resistFingerprinting" = true;
"privacy.resistFingerprinting.block_mozAddonManager" = true;
# WebRTC IP Leak verhindern
"media.peerconnection.enabled" = false;
# Telemetrie vollständig deaktivieren
"toolkit.telemetry.enabled" = false;
"toolkit.telemetry.unified" = false;
"toolkit.telemetry.archive.enabled" = false;
"datareporting.healthreport.uploadEnabled" = false;
"app.shield.optoutstudies.enabled" = false;
# SafeBrowsing (lokal behalten, aber keine unnötige Kommunikation)
"browser.safebrowsing.downloads.remote.enabled" = false;
# HTTPS-Only Mode
"dom.security.https_only_mode" = true;
# DNS over HTTPS Fallback deaktivieren
"network.trr.mode" = 3;
"network.trr.uri" = "https://dns.quad9.net/dns-query";
# Referrer reduzieren
"network.http.referer.XOriginPolicy" = 2;
# Clipboard API nur bei User Interaction
"dom.events.asyncClipboard.readText" = false;
# WebGL einschränken
"webgl.disabled" = true;
};
SearchEngines = {
Default = "Ecosia";
Add = [
{
Name = "Ecosia";
URLTemplate = "https://www.ecosia.org/search?q={searchTerms}";
Method = "GET";
}
];
Remove = [
"Google"
"Bing"
"Amazon.com"
"eBay"
];
};
}; };
} };
}

View File

@@ -1,29 +1,29 @@
{ pkgs, ... }: { pkgs, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
imports = [ imports = [
./browser.nix ./browser.nix
#./planner.nix #./planner.nix
./window-manager.nix ./window-manager.nix
../applications/matrix.nix ../applications/matrix.nix
]; ];
home.packages = with pkgs; [ home.packages = with pkgs; [
kitty kitty
pamixer pamixer
nemo-with-extensions nemo-with-extensions
]; ];
#services.dbus.enable = true; #services.dbus.enable = true;
#programs.dconf.enable = true; #programs.dconf.enable = true;
xdg.portal = { xdg.portal = {
enable = true; enable = true;
extraPortals = [ pkgs.xdg-desktop-portal-hyprland ]; extraPortals = [ pkgs.xdg-desktop-portal-hyprland ];
config.common.default = "*"; config.common.default = "*";
}; };
} }

View File

@@ -1,6 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
} }

View File

@@ -1,4 +1,9 @@
{ config, pkgs, lib, ... }: {
config,
pkgs,
lib,
...
}:
let let
tbProfile = pkgs.stdenv.mkDerivation { tbProfile = pkgs.stdenv.mkDerivation {
name = "thunderbird-profile"; name = "thunderbird-profile";
@@ -11,38 +16,38 @@ let
}; };
in in
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
programs.thunderbird = { programs.thunderbird = {
enable = true; enable = true;
package = pkgs.thunderbird; package = pkgs.thunderbird;
policies = { policies = {
DisableTelemetry = true; DisableTelemetry = true;
DisableAppUpdate = true; DisableAppUpdate = true;
Preferences = { Preferences = {
"mail.provider.enabled" = false; "mail.provider.enabled" = false;
"mail.openpgp.allow_external_gnupg" = true; "mail.openpgp.allow_external_gnupg" = true;
"calendar.timezone.local" = "Europe/Berlin"; "calendar.timezone.local" = "Europe/Berlin";
}; };
Certificates = { Certificates = {
ImportEnterpriseRoots = true; ImportEnterpriseRoots = true;
}; };
PasswordManagerEnabled = true; PasswordManagerEnabled = true;
Cookies = { Cookies = {
"Default" = false; "Default" = false;
"AcceptThirdParty" = "never"; "AcceptThirdParty" = "never";
"Locked" = true; "Locked" = true;
}; };
DefaultDownloadDirectory = "/tmp"; DefaultDownloadDirectory = "/tmp";
DisableBuiltinPDFViewer = true; DisableBuiltinPDFViewer = true;
DisablePasswordReveal = true; DisablePasswordReveal = true;
};
}; };
};
} }

View File

@@ -1,6 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
} }

View File

@@ -1,6 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
} }

View File

@@ -1,9 +1,9 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
imports = [ imports = [
#./window-manager/${profile.interface}.nix #./window-manager/${profile.interface}.nix
]; ];
} }

View File

@@ -1,59 +1,61 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
dotfiles_hypr = pkgs.fetchgit { dotfiles_hypr = pkgs.fetchgit {
url = "https://git.nichkara.eu/dotfiles/hypr"; url = "https://git.nichkara.eu/dotfiles/hypr";
rev = "83da92f0d64620c6503b8b2d9fa27bd79816e025"; rev = "83da92f0d64620c6503b8b2d9fa27bd79816e025";
sha256 = "sha256-kEKJiH0oK0PuciJZ6ucinTKX5eMWxPPZXYNS1+HIcRA="; sha256 = "sha256-kEKJiH0oK0PuciJZ6ucinTKX5eMWxPPZXYNS1+HIcRA=";
}; };
dotfiles_waybar = pkgs.fetchgit { dotfiles_waybar = pkgs.fetchgit {
url = "https://git.nichkara.eu/dotfiles/waybar"; url = "https://git.nichkara.eu/dotfiles/waybar";
rev = "cd3d5d8a97f9fbc1cc8a69fc9e570dfcf669dce7"; rev = "cd3d5d8a97f9fbc1cc8a69fc9e570dfcf669dce7";
sha256 = "sha256-FTpGumhxY6ChUXqnykO+aSJiFD4A80W0eqx7hXS9Iwc="; sha256 = "sha256-FTpGumhxY6ChUXqnykO+aSJiFD4A80W0eqx7hXS9Iwc=";
}; };
profile = import ../../profile.nix; profile = import ../../profile.nix;
in in
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
wofi wofi
grim grim
swaynotificationcenter swaynotificationcenter
swaylock swaylock
hyprpaper hyprpaper
lxsession lxsession
hyprshot hyprshot
wayvnc wayvnc
pamixer pamixer
pavucontrol pavucontrol
brightnessctl brightnessctl
python313Packages.requests python313Packages.requests
networkmanagerapplet networkmanagerapplet
]; ];
#fonts.packages = with pkgs; [ #fonts.packages = with pkgs; [
# nerd-fonts.space-mono # nerd-fonts.space-mono
# ]; # ];
programs.hyprland = { programs.hyprland = {
enable = true; enable = true;
withUWSM = true; withUWSM = true;
xwayland.enable = true; xwayland.enable = true;
}; };
programs.waybar = { programs.waybar = {
enable = true; enable = true;
}; };
home.file.".config/hypr" = { home.file.".config/hypr" = {
source = dotfiles_hypr; source = dotfiles_hypr;
recursive = true; force = true;
}; recursive = true;
};
home.file.".config/waybar" = { home.file.".config/waybar" = {
source = dotfiles_waybar; source = dotfiles_waybar;
recursive = true; force = true;
}; recursive = true;
};
} }

View File

@@ -1,6 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
# New system packages # New system packages
]; ];
} }

View File

@@ -1,9 +1,9 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
profile = import ./profile.nix; profile = import ./profile.nix;
home-directory = "/home/${profile.username}"; home-directory = "/home/${profile.username}";
ssh-filename = "${home-directory}/.ssh/id_ed25519"; ssh-filename = "${home-directory}/.ssh/id_ed25519";
in in
{ {
# Home Manager needs a bit of information about you and the paths it should # Home Manager needs a bit of information about you and the paths it should
@@ -27,18 +27,18 @@ in
# Home Manager is pretty good at managing dotfiles. The primary way to manage # Home Manager is pretty good at managing dotfiles. The primary way to manage
# plain files is through 'home.file'. # plain files is through 'home.file'.
home.file = { #home.file = {
# # Building this configuration will create a copy of 'dotfiles/screenrc' in # # Building this configuration will create a copy of 'dotfiles/screenrc' in
# # the Nix store. Activating the configuration will then make '~/.screenrc' a # # the Nix store. Activating the configuration will then make '~/.screenrc' a
# # symlink to the Nix store copy. # # symlink to the Nix store copy.
# ".screenrc".source = dotfiles/screenrc; # ".screenrc".source = dotfiles/screenrc;
# # You can also set the file content immediately. # # You can also set the file content immediately.
# ".gradle/gradle.properties".text = '' # ".gradle/gradle.properties".text = ''
# org.gradle.console=verbose # org.gradle.console=verbose
# org.gradle.daemon.idletimeout=3600000 # org.gradle.daemon.idletimeout=3600000
# ''; # '';
}; #};
home.sessionVariables = { home.sessionVariables = {
EDITOR = "nvim"; EDITOR = "nvim";

View File

@@ -1,12 +1,12 @@
{ {
username = "nichkara"; username = "nichkara";
hostname = "kathleen"; hostname = "kathleen";
hashed-password = "$y$j9T$51IqmPE8iKV9NmF89vaK40$TJFaBOiMgcxYRWxyj3M5q47QWAIzMbwDhSoqLM3EPk4"; hashed-password = "$y$j9T$51IqmPE8iKV9NmF89vaK40$TJFaBOiMgcxYRWxyj3M5q47QWAIzMbwDhSoqLM3EPk4";
interface = "hyprland"; interface = "hyprland";
modules = { modules = {
base = true; base = true;
office = false; office = false;
development = true; development = true;
science = true; science = true;
}; };
} }

View File

@@ -1,16 +1,16 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
imports = [ imports = [
./file-system.nix ./file-system.nix
./media.nix ./media.nix
]; ];
home.packages = with pkgs; [ home.packages = with pkgs; [
gnumake gnumake
python3 python3
]; ];
} }

View File

@@ -1,19 +1,19 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
#services.udisks2.enable = true; #services.udisks2.enable = true;
#services.gvfs.enable = true; #services.gvfs.enable = true;
home.packages = with pkgs; [ home.packages = with pkgs; [
nextcloud-client nextcloud-client
unzip unzip
deja-dup deja-dup
gnutar gnutar
xz xz
gzip gzip
gz-utils gz-utils
file file
fileinfo fileinfo
]; ];
} }

View File

@@ -1,12 +1,12 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
calibre calibre
kdePackages.okular kdePackages.okular
vlc vlc
totem totem
w3m w3m
epr epr
]; ];
} }

View File

@@ -1,15 +1,15 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
imports = [ ]; imports = [ ];
home.packages = with pkgs; [ home.packages = with pkgs; [
seahorse seahorse
]; ];
services.gnome.gnome-keyring.enable = true; services.gnome.gnome-keyring.enable = true;
security.pam.services.login.enableGnomeKeyring = true; security.pam.services.login.enableGnomeKeyring = true;
} }

View File

@@ -1,80 +1,115 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
imports = [ imports = [
./editor.nix ./editor.nix
./tex-environment.nix ./tex-environment.nix
]; ];
home.packages = with pkgs; [ home.packages = with pkgs; [
astyle git
hyfetch astyle
fzf-zsh hyfetch
distrobox fzf-zsh
distrobox
];
programs.tmux = {
enable = true;
clock24 = true;
extraConfig = builtins.readFile ./external/tmux.conf;
};
programs.direnv.enable = true;
programs.direnv.nix-direnv.enable = true;
programs.git = {
enable = true;
settings = {
user = {
name = "Nina Chlóe Kassandra Reiß";
email = "nina.reiss@nickr.eu";
};
push = {
autoSetupRemote = true;
};
};
};
programs.ssh = {
enable = true;
enableDefaultConfig = true;
extraConfig = ''
Host git.nickr.eu
HostName git.nickr.eu
Port 22
Host nickr.eu
HostName nickr.eu
Port 222
Host nichkara.eu
HostName nichkara.eu
Port 222
Host git.nichkara.eu
HostName git.nichkara.eu
Port 22
'';
};
programs.zsh = {
enable = true;
enableCompletion = true;
autocd = true;
autosuggestion = {
enable = true;
};
syntaxHighlighting = {
enable = true;
};
history = {
size = 4096;
ignoreSpace = true;
ignorePatterns = [ ];
saveNoDups = true;
ignoreAllDups = true;
};
oh-my-zsh = {
enable = true;
theme = "sonicradish";
plugins = [
"git"
"z"
"dotenv"
"battery"
"emoji"
"emoji-clock"
"fzf"
"kitty"
"themes"
"tmux"
"vi-mode"
];
};
setOptions = [
"HIST_IGNORE_ALL_DUPS"
]; ];
programs.tmux = { shellAliases = {
enable = true; ll = "ls -lh";
clock24 = true; nix-check = "nixos-rebuild build";
extraConfig = '' nix-update = "sudo nixos-rebuild switch";
sirc = "ssh -t nichkara.eu tmux new-session -A -s weechat weechat";
'';
};
programs.direnv.enable = true;
programs.direnv.nix-direnv.enable = true;
programs.zsh = {
enable = true;
enableCompletion = true;
autocd = true;
autosuggestion = {
enable = true;
};
syntaxHighlighting = {
enable = true;
};
history = {
size = 4096;
ignoreSpace = true;
ignorePatterns = [ ];
saveNoDups = true;
ignoreAllDups = true;
};
oh-my-zsh = {
enable = true;
theme = "sonicradish";
plugins = [
"git"
"z"
"dotenv"
"battery"
"emoji"
"emoji-clock"
"fzf"
"kitty"
"themes"
"tmux"
"vi-mode"
];
};
setOptions = [
"HIST_IGNORE_ALL_DUPS"
];
shellAliases = {
ll = "ls -lh";
nix-check = "nixos-rebuild build";
nix-update = "sudo nixos-rebuild switch";
sirc = "ssh -t nichkara.eu tmux new-session -A -s weechat weechat";
};
}; };
};
} }

View File

@@ -1,25 +1,26 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
vim vim
fzf fzf
ripgrep ripgrep
ripgrep-all ripgrep-all
ctags ctags
lua54Packages.luarocks-nix lua54Packages.luarocks-nix
]; nixfmt
];
programs.neovim = { programs.neovim = {
enable = true; enable = true;
defaultEditor = true; defaultEditor = true;
withPython3 = true; withPython3 = true;
withRuby = true; withRuby = true;
withNodeJs = true; withNodeJs = true;
viAlias = true; viAlias = true;
vimAlias = true; vimAlias = true;
}; };
} }

87
terminal-environment/external/tmux.conf vendored Normal file
View File

@@ -0,0 +1,87 @@
##### CORE #####
set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",xterm-256color:Tc"
set -g mouse on
set -g focus-events on
set -g history-limit 100000
set -g base-index 1
setw -g pane-base-index 1
##### TIMING / UX #####
set -g escape-time 10
set -g repeat-time 600
##### BELL / ACTIVITY #####
# Keine akustische Bell, nur visuell
set -g bell-action none
set -g visual-bell on
set -g visual-activity on
setw -g monitor-activity on
set -g activity-action none
# Window-Status bei Bell / Activity (Fallback-Styling)
set -g window-status-bell-style "fg=#ff5555,bold"
set -g window-status-activity-style "fg=#f1fa8c,bold"
##### COLORS (Dracula-ish) #####
set -g status-style "bg=#1e1f29,fg=#c0caf5"
set -g message-style "bg=#2a2b3d,fg=#c0caf5"
set -g pane-border-style "fg=#3b4261"
set -g pane-active-border-style "fg=#7aa2f7"
##### STATUS BAR #####
set -g status on
set -g status-interval 2
set -g status-position bottom
set -g status-justify left
set -g status-left-length 100
set -g status-right-length 100
##### LEFT: Session / Host #####
set -g status-left " \
#[fg=#7aa2f7,bold] #S#[default] \
#[fg=#565f89] #[fg=#9ece6a]#H#[default] \
"
##### WINDOW LIST #####
# Inactive windows
setw -g window-status-format " \
#[fg=#565f89] #I:#W#[default] \
#{?window_bell_flag,#[fg=#ff5555]🔔#[default],} \
"
# Active window
setw -g window-status-current-format " \
#[fg=#1e1f29,bg=#7aa2f7,bold] #I:#W#[default] \
#[fg=#1e1f29,bg=#7aa2f7]\
#{?window_bell_flag,🔔,}#[default] \
"
##### RIGHT: Clock only (no broken flags) #####
set -g status-right " \
#[fg=#565f89] #[fg=#7dcfff] %H:%M#[default] \
"
##### PANE INFO #####
set -g pane-border-status top
set -g pane-border-format " #[fg=#565f89]#P #[fg=#7aa2f7]#{pane_current_command}#[default] "
##### SMART SPLITS #####
bind | split-window -h
bind - split-window -v
#unbind '"'
#unbind %
##### COPY MODE (VI) #####
setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send -X copy-selection
##### DIM INACTIVE PANES #####
set -g window-style "bg=#1a1b26"
set -g window-active-style "bg=#1e1f29"

View File

@@ -2,64 +2,64 @@
let let
genv = pkgs.writeShellScriptBin "genv" '' genv = pkgs.writeShellScriptBin "genv" ''
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
DISTRO="$1" DISTRO="$1"
PRESET="$2" PRESET="$2"
if [ -z "$DISTRO" ] || [ -z "$PRESET" ]; then if [ -z "$DISTRO" ] || [ -z "$PRESET" ]; then
echo "Usage: genv <distro> <preset>" echo "Usage: genv <distro> <preset>"
exit 1 exit 1
fi
PROJECT=$(basename "$PWD")
BOX="genv-$PROJECT"
# distro mapping
case "$DISTRO" in
ubuntu) IMAGE="docker.io/library/ubuntu:24.04" ;;
arch) IMAGE="docker.io/library/archlinux:latest" ;;
alpine) IMAGE="docker.io/library/alpine:latest" ;;
*) IMAGE="$DISTRO" ;;
esac
echo "[genv] image: $IMAGE"
# container nur erstellen wenn nötig
if ! distrobox list | grep -q "$BOX"; then
distrobox create --name "$BOX" --image "$IMAGE"
fi
mkdir -p .genv
# preset kopieren
cp ${./presets}/$PRESET.sh .genv/setup.sh
chmod +x .genv/setup.sh
# envrc generieren
cat > .envrc <<EOF
export GENV_BOX="$BOX"
# container starten
distrobox start "$GENV_BOX" >/dev/null 2>&1 || true
# setup einmalig
if [ ! -f .genv/.init ]; then
echo "[genv] setup läuft"
distrobox enter "$GENV_BOX" -- bash .genv/setup.sh
touch .genv/.init
fi fi
PROJECT=$(basename "$PWD") # tmux workflow
BOX="genv-$PROJECT" if [ -z "$TMUX" ]; then
tmux new-session -A -s "$GENV_BOX" \
# distro mapping \; new-window -n editor "nvim" \
case "$DISTRO" in \; new-window -n dev "distrobox enter $GENV_BOX"
ubuntu) IMAGE="docker.io/library/ubuntu:24.04" ;;
arch) IMAGE="docker.io/library/archlinux:latest" ;;
alpine) IMAGE="docker.io/library/alpine:latest" ;;
*) IMAGE="$DISTRO" ;;
esac
echo "[genv] image: $IMAGE"
# container nur erstellen wenn nötig
if ! distrobox list | grep -q "$BOX"; then
distrobox create --name "$BOX" --image "$IMAGE"
fi fi
EOF
mkdir -p .genv echo "[genv] fertig direnv allow"
# preset kopieren
cp ${./presets}/$PRESET.sh .genv/setup.sh
chmod +x .genv/setup.sh
# envrc generieren
cat > .envrc <<EOF
export GENV_BOX="$BOX"
# container starten
distrobox start "$GENV_BOX" >/dev/null 2>&1 || true
# setup einmalig
if [ ! -f .genv/.init ]; then
echo "[genv] setup läuft"
distrobox enter "$GENV_BOX" -- bash .genv/setup.sh
touch .genv/.init
fi
# tmux workflow
if [ -z "$TMUX" ]; then
tmux new-session -A -s "$GENV_BOX" \
\; new-window -n editor "nvim" \
\; new-window -n dev "distrobox enter $GENV_BOX"
fi
EOF
echo "[genv] fertig direnv allow"
''; '';
in in
{ {

View File

@@ -1,11 +1,11 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
profile = import ../profile.nix; profile = import ../profile.nix;
in in
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
texliveMedium texliveMedium
]; ];
} }