{ config , lib , pkgs , inputs , ... }: with lib; let f = pkgs.writeFishApplication { name = "f"; runtimeInputs = with pkgs; [ fzf bat ]; text = /* fish */ '' fzf --query "$argv" \ --multi \ --bind "enter:become($EDITOR {+})" \ --preview "bat --color=always --style=header,grid --line-range :500 {+}" ''; }; which-nix = pkgs.writeFishApplication { name = "which-nix"; runtimeInputs = with pkgs; [ which coreutils-full procps ]; text = /* fish */ '' function recurse -a path; if not test -f "$path" return end echo $path if test -L $path recurse (readlink $path) end end for arg in $argv recurse (which $arg) end ''; completions = /* fish */ '' complete -c which-nix -fa '(__fish_complete_command)' ''; }; gi = pkgs.writeFishApplication { name = "gi"; runtimeInputs = with pkgs; [ fzf gum curl coreutils-full ]; text = /* fish */ '' set url https://www.gitignore.io/api if test (count $argv) -eq 0 set choice ( curl -sL $url/list \ | string split "," \ | fzf -m \ | string join "," ) else set choice (string join "," $argv[1..]) end set contents "$(curl -sL $url/$choice | head -n -2 | tail -n +4)" if gum confirm "Overwrite current .gitignore?" echo "$contents" > .gitignore else echo "$contents" >> .gitignore end ''; completions = /* fish */ '' set args (curl -sL https://www.gitignore.io/api/list | string split ",") complete -c gi -fa "$args" ''; }; in { users.users.root.openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGoAqa2m7hIzZ2LS96Z+RCIlRvhBM/j7h27tMBCwMT+a" # Moritz ]; users.users.moritz = { isNormalUser = true; home = "/home/moritz"; extraGroups = [ "wheel" "networkmanager" "video" ]; # initialPassword = "password"; # CHANGE ME PLEASE openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGoAqa2m7hIzZ2LS96Z+RCIlRvhBM/j7h27tMBCwMT+a" # Moritz "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDhtwHDGAZshiQWKkCcPWV9tC83b+bKBgjDcjP/N2CKO" # Laptop "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKl8gMhwSf1NsP5gp14xbbyjqQLZzcHLb/XKRMoHdXgI" # Desktop "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDHlemuKagHwz2T5rEwgJNlVUdUdOXyPtCEzD73CrwY2zmpR4AMj7y9u3Rm7HwHUDjLap1ZFwg+53bAsVP6HFZccCXoIfO/8BL0WDGQJrfgb+A+UiRhSqSvyZ77bGJkadbBkadguz3qR3PHcb41DOlhuqVcHxsY8ceHMxAuyb0pLJVJLeytMD+CHS/r7hoj2hckTNAZ+VhCXBtdZfZ7uPUBxLfluYRNNMmdwCglsg3RUS242nJUzy3A84+CXIGeWmNG9Fu45IDkwMthxSW9klyU9R38R9DBDcugkyb6vz+JKSuRVAa47qh/kmtsYekfL3ul9D2JN32P8S+6ZoXx+gXupGJ0ltwJWAFkhLJ+yeXj9kCOv/mIUmCB14jMGsvKiSwV25O/twyjqe2LEkMVgimgrjEYoHu+ZTyp0iFtUvSrFo4tsAhfWPV9yj4F/hUksW7xKIwq5Niyx7he5M/XddudtnAximyiBDGCdJm1Ejl0UaGa6ZQv7y6VZdx0PyZuraT7l9ub8so6JlE4cVgSSU9vE0IS2QqBuHhsIjh8RVksoTR2NQbeDdGaGpGnq2C8y0rDXwE/EJA4LK45khX/GPn73n8F0kBG8dBrWgRDAEODpmebScO7d5mCeM0z3lPcRmh+3e3DPnVVOl+uR7udlc7NauLzl7q913UtxZaF1PlD7Q==" # GPG ]; }; time.timeZone = "Europe/Berlin"; my = { nixpkgs = { overlays = [ (_: prev: { nur = import inputs.nur { pkgs = prev; nurpkgs = prev; }; } ) ( final: _: with final.lib; rec { fishFile = { name , destination , content , checkPhase ? null }: final.writeTextFile { inherit name destination; executable = true; allowSubstitutes = true; preferLocalBuild = false; text = '' #!${getExe final.fish} ${content} ''; checkPhase = if checkPhase == null then '' runHook preCheck ${getExe final.fish} -n "$target" runHook postCheck '' else checkPhase; }; writeFishApplication = { name , text , completions ? null , runtimeInputs ? [ ] , checkPhase ? null }: let runtimeHeader = optionalString (runtimeInputs != [ ]) ''export PATH="${makeBinPath runtimeInputs}:$PATH"''; script = fishFile { inherit checkPhase; name = "${name}_script"; destination = "/bin/${name}"; content = concatLines [ runtimeHeader text ]; }; completions_file = fishFile { inherit checkPhase; name = "${name}_completions"; destination = "/share/fish/vendor_completions.d/${name}.fish"; content = concatLines [ runtimeHeader completions ]; }; in final.symlinkJoin { inherit name; paths = [ script ] ++ optional (completions != null) completions_file; }; } ) ( _: prev: { xorg = prev.xorg // { lndir = prev.xorg.lndir.overrideAttrs (_: { meta.mainProgram = "lndir"; }); }; } ) ]; channels = { master = inputs.master; stable = inputs.stable; }; }; bin.enable = true; shell = { abbreviations = { us = "systemctl --user"; rs = "sudo systemctl"; uj = "journalctl --user"; rj = "sudo journalctl"; lg = "lazygit"; }; aliases = { ls = "${getExe pkgs.eza} -lh --icons --git"; cat = "bat"; rm = "rm -i"; mv = "mv -i"; }; variables = { EDITOR = "vim"; }; }; programs = { direnv.enable = true; fish.enable = true; git.enable = true; gpg.enable = true; nix = { gc.enable = true; optimise.enable = true; }; tmux.enable = true; tmux.keybinds = { prefix = { "-" = "split-window -v"; "|" = "split-window -h"; "C-l" = "send-keys C-l"; "R" = "source-file $XDG_CONFIG_HOME/tmux/tmux.conf \\; display-message 'Reloaded tmux.conf'"; "f" = "new-window ts"; "a" = "new-window ta"; }; copy-mode-vi = { "v" = "send -X begin-selection"; "V" = "send -X select-line"; "C-v" = "send -X rectangle-toggle"; }; }; }; }; console.keyMap = "de"; environment.systemPackages = with pkgs; [ # archives ouch # monitoring bottom # nix nix-output-monitor nixpkgs-fmt which-nix # utils (viu.override { withSixel = true; }) bat cht-sh f fd gi parallel ripgrep vim wget ]; fonts = { enableDefaultPackages = true; packages = [ (pkgs.nerdfonts.override { fonts = [ "FiraCode" ]; }) pkgs.master.intel-one-mono ]; }; programs = { mtr.enable = true; command-not-found.enable = false; }; services = { sshd.enable = true; # for agenix btrfs.autoScrub.enable = lib.mkDefault (builtins.any (filesystem: filesystem.fsType == "btrfs") (builtins.attrValues config.fileSystems)); }; i18n.extraLocaleSettings = { # LC_NUMERIC = "de_DE.UTF-8"; LC_PAPER = "de_DE.UTF-8"; LC_TIME = "de_DE.UTF-8"; }; home-manager.users.moritz = { programs = { # Let Home Manager install and manage itself. home-manager.enable = true; fzf = { enable = true; defaultOptions = [ "--height 50%" "--bind alt-j:preview-down,alt-k:preview-up" ]; }; zoxide = { enable = true; options = [ "--cmd c" ]; }; starship.enable = true; lazygit.enable = true; lazygit.settings = { customCommands = [ { key = ""; context = "global"; description = "Create new conventional commit"; prompts = [ { type = "menu"; key = "Type"; title = "Type of change"; options = [ { name = "build"; description = "Changes that affect the build system or external dependencies"; value = "build"; } { name = "feat"; description = "A new feature"; value = "feat"; } { name = "fix"; description = "A bug fix"; value = "fix"; } { name = "chore"; description = "Other changes that don't modify src or test files"; value = "chore"; } { name = "ci"; description = "Changes to CI configuration files and scripts"; value = "ci"; } { name = "docs"; description = "Documentation only changes"; value = "docs"; } { name = "perf"; description = "A code change that improves performance"; value = "perf"; } { name = "refactor"; description = "A code change that neither fixes a bug nor adds a feature"; value = "refactor"; } { name = "revert"; description = "Reverts a previous commit"; value = "revert"; } { name = "style"; description = "Changes that do not affect the meaning of the code"; value = "style"; } { name = "test"; description = "Adding missing tests or correcting existing tests"; value = "test"; } ]; } { type = "input"; title = "Scope"; key = "Scope"; initialValue = ""; } { type = "menu"; key = "Breaking"; title = "Breaking change"; options = [ { name = "no"; value = ""; } { name = "yes"; value = "!"; } ]; } { type = "input"; title = "message"; key = "Message"; initialValue = ""; } { type = "confirm"; key = "Confirm"; title = "Commit"; body = "Are you sure you want to commit?"; } ]; command = "git commit --message '{{.Form.Type}}{{ if .Form.Scope }}({{ .Form.Scope }}){{ end }}{{.Form.Breaking}}: {{.Form.Message}}'"; loadingText = "Creating conventional commit..."; } ]; }; }; home = { username = "moritz"; homeDirectory = "/home/moritz"; stateVersion = "21.05"; }; xdg.userDirs.enable = true; }; system.activationScripts.diff = '' if [ -e /run/current-system ]; then ${pkgs.nvd}/bin/nvd --nix-bin-dir ${pkgs.nix}/bin diff /run/current-system/ "$systemConfig" fi ''; }