From 92691d750620f6436ee2b28fb1631ebabaee0b4c Mon Sep 17 00:00:00 2001 From: FredzyW Date: Sun, 7 Apr 2024 18:47:20 +0200 Subject: [PATCH] changes --- .xinitrc | 21 ++ README.md | 7 + config/base.nix | 125 +++++++++++ config/home.nix | 159 ++++++++++++++ config/server.nix | 98 +++++++++ config/users.nix | 27 +++ flake.lock | 121 ++++++++++ flake.nix | 86 ++++++++ install.sh | 18 ++ maskiner/desktop/configuration.nix | 23 ++ maskiner/desktop/hardware-configuration.nix | 39 ++++ maskiner/jobb/configuration.nix | 22 ++ maskiner/jobb/hardware-configuration.nix | 41 ++++ maskiner/laptop/configuration.nix | 23 ++ maskiner/laptop/hardware-configuration.nix | 39 ++++ maskiner/server/configuration.nix | 112 ++++++++++ maskiner/server/hardware-configuration.nix | 34 +++ moduler/common/dmenu.nix | 19 ++ moduler/common/dunst/default.nix | 24 ++ moduler/common/dwm-2.nix | 26 +++ moduler/common/dwm.nix | 36 +++ moduler/common/firefox.nix | 21 ++ moduler/common/git.nix | 8 + moduler/common/kitty.nix | 24 ++ moduler/common/lazygit.nix | 29 +++ moduler/common/neovim/config/mappings.lua | 86 ++++++++ moduler/common/neovim/config/options.lua | 10 + moduler/common/neovim/config/plugins.lua | 167 ++++++++++++++ moduler/common/neovim/config/setup.lua | 230 ++++++++++++++++++++ moduler/common/nixpkgs.nix | 12 + moduler/common/nvim.nix | 52 +++++ moduler/common/spotifyd.nix | 10 + moduler/common/ssh.nix | 20 ++ moduler/common/tmux.nix | 47 ++++ moduler/common/zathura.nix | 9 + moduler/common/zsh-server.nix | 66 ++++++ moduler/common/zsh.nix | 71 ++++++ themes/catppuccin.diff | 15 ++ wallpapers/nix-black-4k.png | Bin 0 -> 50996 bytes xresources | 34 +++ 40 files changed, 2011 insertions(+) create mode 100755 .xinitrc create mode 100644 README.md create mode 100644 config/base.nix create mode 100644 config/home.nix create mode 100644 config/server.nix create mode 100644 config/users.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100755 install.sh create mode 100644 maskiner/desktop/configuration.nix create mode 100644 maskiner/desktop/hardware-configuration.nix create mode 100644 maskiner/jobb/configuration.nix create mode 100644 maskiner/jobb/hardware-configuration.nix create mode 100644 maskiner/laptop/configuration.nix create mode 100644 maskiner/laptop/hardware-configuration.nix create mode 100644 maskiner/server/configuration.nix create mode 100644 maskiner/server/hardware-configuration.nix create mode 100644 moduler/common/dmenu.nix create mode 100644 moduler/common/dunst/default.nix create mode 100644 moduler/common/dwm-2.nix create mode 100644 moduler/common/dwm.nix create mode 100644 moduler/common/firefox.nix create mode 100644 moduler/common/git.nix create mode 100644 moduler/common/kitty.nix create mode 100644 moduler/common/lazygit.nix create mode 100644 moduler/common/neovim/config/mappings.lua create mode 100644 moduler/common/neovim/config/options.lua create mode 100644 moduler/common/neovim/config/plugins.lua create mode 100644 moduler/common/neovim/config/setup.lua create mode 100644 moduler/common/nixpkgs.nix create mode 100644 moduler/common/nvim.nix create mode 100644 moduler/common/spotifyd.nix create mode 100644 moduler/common/ssh.nix create mode 100644 moduler/common/tmux.nix create mode 100644 moduler/common/zathura.nix create mode 100644 moduler/common/zsh-server.nix create mode 100644 moduler/common/zsh.nix create mode 100644 themes/catppuccin.diff create mode 100644 wallpapers/nix-black-4k.png create mode 100644 xresources diff --git a/.xinitrc b/.xinitrc new file mode 100755 index 0000000..af87184 --- /dev/null +++ b/.xinitrc @@ -0,0 +1,21 @@ +#!/bin/sh +# +if test -z "$DBUS_SESSION_BUS_ADDRESS"; then + eval $(dbus-launch --exit-with-session --sh-syntax) +fi +systemctl --user import-environment DISPLAY XAUTHORITY + +if command -v dbus-update-activation-environment >/dev/null 2>&1; then + dbus-update-activation-environment DISPLAY XAUTHORITY +fi + +xrdb -merge ~/.Xresources +setxkbmap -option caps:swapescape + +feh --bg-scale ~/wallpapers/nix-black-4k.png +dwmblocks & +dunst & +xbanish & +picom -b + +exec dwm diff --git a/README.md b/README.md new file mode 100644 index 0000000..60326ca --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# NixOS + +Ett repo för att hantera konfigurationsfiler för mina datorer. + +- nix-laptop (Acer Swift 3) +- nix-desktop (Lenovo ThinkCentre) +- fw-jobb (Dell) diff --git a/config/base.nix b/config/base.nix new file mode 100644 index 0000000..bf3314a --- /dev/null +++ b/config/base.nix @@ -0,0 +1,125 @@ +# This is your system's configuration file. +# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix) +{ + inputs, + lib, + config, + pkgs, + ... +}: { + nixpkgs = { + overlays = [ + ]; + config = { + allowUnfree = true; + }; + }; + + nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs); + + nix.nixPath = ["/etc/nix/path"]; + environment.etc = + lib.mapAttrs' + (name: value: { + name = "nix/path/${name}"; + value.source = value.flake; + }) + config.nix.registry; + + nix.settings = { + experimental-features = "nix-command flakes"; + auto-optimise-store = true; + }; + + virtualisation.docker = { + enable = true; + }; + + hardware = { + pulseaudio.enable = true; + bluetooth = { + enable = true; + powerOnBoot = true; + }; + }; + + networking.networkmanager.enable = true; + + environment.sessionVariables = { + EDITOR = "nvim"; + TERM = "xterm-256color"; + }; + + time.timeZone = "Europe/Stockholm"; + + fonts.packages = with pkgs; [ + (nerdfonts.override { + fonts = [ + "FiraCode" + "DroidSansMono" + ]; + }) + ]; + + + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "sv_SE.UTF-8"; + LC_IDENTIFICATION = "sv_SE.UTF-8"; + LC_MEASUREMENT = "sv_SE.UTF-8"; + LC_MONETARY = "sv_SE.UTF-8"; + LC_NAME = "sv_SE.UTF-8"; + LC_NUMERIC = "sv_SE.UTF-8"; + LC_PAPER = "sv_SE.UTF-8"; + LC_TELEPHONE = "sv_SE.UTF-8"; + LC_TIME = "sv_SE.UTF-8"; + }; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + console.keyMap = "sv-latin1"; + programs.zsh.enable = true; + + services = { + openssh = { + enable = true; + }; + picom = { + enable = true; + }; + spotifyd = { + enable = true; + }; + strongswan = { + enable = true; + secrets = [ + "ipsec.d/ipsec.nm-l2tp.secrets" + ]; + }; + xserver = { + enable = true; + layout = "se"; + xkbVariant = ""; + displayManager = { + startx = { + enable = true; + }; + }; + windowManager = { + dwm = { + enable = true; + }; + }; + }; + locate = { + enable = true; + locate = pkgs.mlocate; + }; + blueman = { + enable = true; + }; + }; + + system.stateVersion = "23.11"; +} + diff --git a/config/home.nix b/config/home.nix new file mode 100644 index 0000000..740ea9f --- /dev/null +++ b/config/home.nix @@ -0,0 +1,159 @@ +# This is your home-manager configuration file +# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix) +{ + inputs, + lib, + config, + pkgs, + myhostname, + ... +}: { + imports = [ + ../moduler/common/dwm.nix + ../moduler/common/dmenu.nix + ../moduler/common/kitty.nix + ../moduler/common/tmux.nix + ../moduler/common/zsh.nix + ../moduler/common/git.nix + ../moduler/common/nixpkgs.nix + ../moduler/common/firefox.nix + ../moduler/common/zathura.nix + ../moduler/common/lazygit.nix + ../moduler/common/spotifyd.nix + ../moduler/common/ssh.nix + ]; + + nixpkgs = { + overlays = []; + config = { + allowUnfree = true; + allowUnfreePredicate = _: true; + permittedInsecurePackages = [ + "electron-25.9.0" + "nix-2.16.2" + ]; + }; + }; + + + home.packages = with pkgs; [ + # System + arion + wget + alsa-utils + killall + upower + mpv + gcc + gnumake + htop + openssh + xsel + unzip + nixops_unstable + killall + cmake + feh + brightnessctl + scrot + dunst + xbanish + rofi + networkmanager + pavucontrol + fd + bat + steam-run + appimage-run + + #Terminal + git + tmux + zathura + yt-dlp + fzf + ripgrep + spotify-tui + wiki-tui + speedcrunch + + #Desktop + aerc + firefox + vimb + thunderbird + spotify + signal-desktop + darktable + discord + slack + lunarvim + kitty + neovim + neofetch + obsidian + lazygit + betterdiscordctl + + + #Dev + python3 + python311Packages.pip + ranger + python311Packages.pynvim + ueberzugpp + + #LSP + nil + python311Packages.python-lsp-server + marksman + clojure-lsp + omnisharp-roslyn + haskell-language-server + java-language-server + nodePackages_latest.bash-language-server + dockerfile-language-server-nodejs + yaml-language-server + ansible-language-server + lua-language-server + tree-sitter + nodejs_21 + nodePackages_latest.vls + nodePackages_latest.volar + vscode-langservers-extracted + + #VPN + openvpn + networkmanagerapplet + networkmanager-l2tp + strongswan + ansible + + #Funk + cabal-install + ghc + haskellPackages.hoogle + haskellPackages.fast-tags + + #Disk + clojure + leiningen + + # Jobb + remmina + dotnet-sdk_8 + mono5 + dotnetPackages.Nuget + ]; + programs.home-manager.enable = true; + + xsession.enable = true; + xsession.windowManager.command = "exec dwm"; + + home.username = "fw"; + home.homeDirectory = "/home/fw"; + + home.stateVersion = "23.11"; # Did you read the comment? + + systemd.user.startServices = "sd-switch"; +} diff --git a/config/server.nix b/config/server.nix new file mode 100644 index 0000000..ffc6a6d --- /dev/null +++ b/config/server.nix @@ -0,0 +1,98 @@ +# This is your home-manager configuration file +# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix) +{ + inputs, + lib, + config, + pkgs, + myhostname, + ... +}: { + imports = [ + ../moduler/common/git.nix + ../moduler/common/nixpkgs.nix + ../moduler/common/lazygit.nix + ../moduler/common/zsh-server.nix + ]; + + nixpkgs = { + overlays = []; + config = { + allowUnfree = true; + allowUnfreePredicate = _: true; + permittedInsecurePackages = [ + "nix-2.16.2" + ]; + }; + }; + + + home.packages = with pkgs; [ + # System + arion + wget + killall + gcc + gnumake + htop + openssh + xsel + unzip + nixops_unstable + cmake + networkmanager + fd + bat + + #Terminal + git + yt-dlp + fzf + ripgrep + + #Desktop + neovim + lazygit + + #Dev + python3 + python311Packages.pip + ranger + python311Packages.pynvim + ueberzugpp + + #LSP + nil + python311Packages.python-lsp-server + marksman + clojure-lsp + omnisharp-roslyn + haskell-language-server + java-language-server + nodePackages_latest.bash-language-server + dockerfile-language-server-nodejs + yaml-language-server + ansible-language-server + lua-language-server + tree-sitter + nodejs_21 + nodePackages_latest.vls + nodePackages_latest.volar + vscode-langservers-extracted + + #VPN + openvpn + networkmanagerapplet + networkmanager-l2tp + strongswan + ansible + ]; + programs.home-manager.enable = true; + + home.username = "fw"; + home.homeDirectory = "/home/fw"; + + home.stateVersion = "23.11"; # Did you read the comment? + + systemd.user.startServices = "sd-switch"; +} diff --git a/config/users.nix b/config/users.nix new file mode 100644 index 0000000..750fba2 --- /dev/null +++ b/config/users.nix @@ -0,0 +1,27 @@ +{ config +, pkgs +, ... +}: { + # TODO: Configure your system-wide user settings (groups, etc), add more users as needed. + users = { + defaultUserShell = pkgs.zsh; + users = { + fw = { + initialPassword = "password"; + isNormalUser = true; + description = "Fredrik Wastring"; + extraGroups = [ + "networkmanager" + "wheel" + "audio" + "docker" + ]; + openssh.authorizedKeys = { + keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDALsdpwvC0w/Aj+1fWtzJyyWoUrGkdh8o2thVHeQQBNo0D7cmVberYmi4Cv9gWGX6PaElrnOl0KRdGyro2wxOYokSxgk2VgWW67BFITAQAbKyG2NhXXPbhb4jccDo7WH7TtOG8IofuJTPRu1Duda6k4RN0I0CkyAN6LGX+zy49cq0qKf9ijXYhCDYNih3+Fu/ig0aW/SYmsVoUl2VFTWdI5x5/wLvIjTEZhmAtYIeYADaLnom356cFrUysZa++FUujQAz3Ow236BvP95XZdTsqvfWNZFNIpC9VYF72JeIDCs5wDIr0GFmanF2On1nar+jJpoOE8SdHt357p5g/PqXV5TisN2xQRkqVwO9tWtMl4sF84jA4ULnY2gQWv9jErMxymUQ1IwuPUzDDlbRHCtfexAtkBy7wv6xslKAzG1QahvF/btNs5Caj3LN31rgAuxyooCbKGKTeBP3kHPKcz1iupgidfbO/QqVXBRQJTEdGyAKa8hVmLQZZPC/XUhxESAk= fw@fw-nix" + ]; + }; + }; + }; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..98d2245 --- /dev/null +++ b/flake.lock @@ -0,0 +1,121 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1709336216, + "narHash": "sha256-Dt/wOWeW6Sqm11Yh+2+t0dfEWxoMxGBvv3JpIocFl9E=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7b3c975cf067e56e7cda6cb098ebe3fb4d74ca2", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1710888565, + "narHash": "sha256-s9Hi4RHhc6yut4EcYD50sZWRDKsugBJHSbON8KFwoTw=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "f33900124c23c4eca5831b9b5eb32ea5894375ce", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-23.11", + "repo": "home-manager", + "type": "github" + } + }, + "nix-gaming": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1711847810, + "narHash": "sha256-gLeUuU3hQ2ErboVIyzDNes2bywdTYDidvi6wG5+tnQ8=", + "owner": "fufexan", + "repo": "nix-gaming", + "rev": "4ec1bf4262e913af85e3f699f564769ec2f23cff", + "type": "github" + }, + "original": { + "owner": "fufexan", + "repo": "nix-gaming", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1711715736, + "narHash": "sha256-9slQ609YqT9bT/MNX9+5k5jltL9zgpn36DpFB7TkttM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "807c549feabce7eddbf259dbdcec9e0600a0660d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1709237383, + "narHash": "sha256-cy6ArO4k5qTx+l5o+0mL9f5fa86tYUX3ozE1S+Txlds=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1536926ef5621b09bba54035ae2bb6d806d72ac8", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1711668574, + "narHash": "sha256-u1dfs0ASQIEr1icTVrsKwg2xToIpn7ZXxW3RHfHxshg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "219951b495fc2eac67b1456824cc1ec1fd2ee659", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nix-gaming": "nix-gaming", + "nixpkgs": "nixpkgs_2" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..821d151 --- /dev/null +++ b/flake.nix @@ -0,0 +1,86 @@ +{ + description = "NixOS Deployments"; + + inputs = { + # Nixpkgs + nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11"; + + # Home manager + home-manager.url = "github:nix-community/home-manager/release-23.11"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + nix-gaming.url = "github:fufexan/nix-gaming"; + + # TODO: Add any other flake you might need + # hardware.url = "github:nixos/nixos-hardware"; + }; + + outputs = { + self, + nixpkgs, + home-manager, + ... + } @ inputs: let + inherit (self) outputs; + in { + # NixOS configuration entrypoint + # Available through 'nixos-rebuild --flake .#your-hostname' + nixosConfigurations = { + nix-laptop = nixpkgs.lib.nixosSystem { + specialArgs = {inherit inputs outputs;}; + modules = [./maskiner/laptop/configuration.nix]; + }; + nix-desktop = nixpkgs.lib.nixosSystem { + specialArgs = {inherit inputs outputs;}; + modules = [./maskiner/desktop/configuration.nix]; + }; + fw-jobb = nixpkgs.lib.nixosSystem { + specialArgs = {inherit inputs outputs;}; + modules = [./maskiner/jobb/configuration.nix]; + }; + server = nixpkgs.lib.nixosSystem { + specialArgs = {inherit inputs outputs;}; + modules = [./maskiner/server/configuration.nix]; + }; + }; + + # Standalone home-manager configuration entrypoint + # Available through 'home-manager --flake .#your-username@your-hostname' + homeConfigurations = { + "fw@nix-laptop" = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + extraSpecialArgs = { + inherit inputs outputs; + myhostname = "nix-laptop"; + }; + modules = [./config/home.nix]; + }; + "fw@nix-desktop" = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + extraSpecialArgs = { + inherit inputs outputs; + myhostname = "nix-desktop"; + }; + # > Our main home-manager configuration file < + modules = [./config/home.nix]; + }; + "fw@fw-jobb" = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + extraSpecialArgs = { + inherit inputs outputs; + myhostname = "fw-jobb"; + }; + # > Our main home-manager configuration file < + modules = [./config/home.nix]; + }; + "fw@server" = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + extraSpecialArgs = { + inherit inputs outputs; + myhostname = "server"; + }; + # > Our main home-manager configuration file < + modules = [./config/server.nix]; + }; + }; + }; +} diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..d4d001f --- /dev/null +++ b/install.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +#sudo cp /etc/nixos/hardware-configuration.nix ./$1/nixos + +#sudo nixos-rebuild switch --flake ".#$2" + +sudo nix-channel --add https://github.com/nix-community/home-manager/archive/release-23.11.tar.gz home-manager +sudo nix-channel --update + +nix-shell '' -A install + +#cp .xinitrc ~ + +#mkdir ~/wallpapers + +#cp ./wallpapers/nix-black-4k.png ~/wallpapers/ + +#home-manager switch --flake ".#$3@$2" diff --git a/maskiner/desktop/configuration.nix b/maskiner/desktop/configuration.nix new file mode 100644 index 0000000..913729c --- /dev/null +++ b/maskiner/desktop/configuration.nix @@ -0,0 +1,23 @@ +# This is your system's configuration file. +# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix) +{ + inputs, + lib, + config, + pkgs, + ... +}: { + # You can import other NixOS modules here + imports = [ + ./hardware-configuration.nix + ../../config/base.nix + ../../config/users.nix + ]; + + security.rtkit.enable = true; + networking.hostName = "nix-desktop"; + + services.xserver.dpi = 100; + + system.stateVersion = "23.11"; +} diff --git a/maskiner/desktop/hardware-configuration.nix b/maskiner/desktop/hardware-configuration.nix new file mode 100644 index 0000000..41d5f7c --- /dev/null +++ b/maskiner/desktop/hardware-configuration.nix @@ -0,0 +1,39 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/0f77fba6-7da6-4cb7-9607-b70b1964f1f7"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/67FD-B0D4"; + fsType = "vfat"; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/87dbf5cf-5a06-4bf8-bd2c-bfd269249eae"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/maskiner/jobb/configuration.nix b/maskiner/jobb/configuration.nix new file mode 100644 index 0000000..3727ec2 --- /dev/null +++ b/maskiner/jobb/configuration.nix @@ -0,0 +1,22 @@ +# This is your system's configuration file. +# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix) +{ + inputs, + lib, + config, + pkgs, + ... +}: { + # You can import other NixOS modules here + imports = [ + ./hardware-configuration.nix + ../../config/base.nix + ../../config/users.nix + ]; + + networking.hostName = "fw-jobb"; + + services.xserver.dpi = 140; + + system.stateVersion = "23.11"; +} diff --git a/maskiner/jobb/hardware-configuration.nix b/maskiner/jobb/hardware-configuration.nix new file mode 100644 index 0000000..c2ea262 --- /dev/null +++ b/maskiner/jobb/hardware-configuration.nix @@ -0,0 +1,41 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "usbhid" "sd_mod" "rtsx_pci_sdmmc" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/231d66c5-7d08-4317-8c3c-b0a160af83e7"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/2646-A8BA"; + fsType = "vfat"; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/cc350407-ca49-4831-9780-b7757b6540a6"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true; + # networking.interfaces.enp59s0u1u2.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp2s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/maskiner/laptop/configuration.nix b/maskiner/laptop/configuration.nix new file mode 100644 index 0000000..67ba1bb --- /dev/null +++ b/maskiner/laptop/configuration.nix @@ -0,0 +1,23 @@ +# This is your system's configuration file. +# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix) +{ + inputs, + lib, + config, + pkgs, + ... +}: { + # You can import other NixOS modules here + imports = [ + ./hardware-configuration.nix + ../../config/base.nix + ../../config/users.nix + ]; + + networking.hostName = "nix-laptop"; + + services.xserver.dpi = 140; + + # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion + system.stateVersion = "23.11"; +} diff --git a/maskiner/laptop/hardware-configuration.nix b/maskiner/laptop/hardware-configuration.nix new file mode 100644 index 0000000..8dc9704 --- /dev/null +++ b/maskiner/laptop/hardware-configuration.nix @@ -0,0 +1,39 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/af77f921-bcba-43c6-8670-a90e1bde1915"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/346C-F5FE"; + fsType = "vfat"; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/3fa47cf3-f18d-4ab7-80e5-39bfaeada0d1"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp0s20f3.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/maskiner/server/configuration.nix b/maskiner/server/configuration.nix new file mode 100644 index 0000000..ba09090 --- /dev/null +++ b/maskiner/server/configuration.nix @@ -0,0 +1,112 @@ +# This is your system's configuration file. +# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix) +{ + inputs, + lib, + config, + pkgs, + ... +}: { + # You can import other NixOS modules here + imports = [ + ./hardware-configuration.nix + ../../config/users.nix + ]; + + networking.hostName = "server"; + nixpkgs = { + overlays = [ + ]; + config = { + allowUnfree = true; + }; + }; + + nix.registry = (lib.mapAttrs (_: flake: {inherit flake;})) ((lib.filterAttrs (_: lib.isType "flake")) inputs); + + nix.nixPath = ["/etc/nix/path"]; + environment.etc = + lib.mapAttrs' + (name: value: { + name = "nix/path/${name}"; + value.source = value.flake; + }) + config.nix.registry; + + nix.settings = { + experimental-features = "nix-command flakes"; + auto-optimise-store = true; + }; + + virtualisation.docker = { + enable = true; + }; + + networking.networkmanager.enable = true; + + environment.sessionVariables = { + EDITOR = "nvim"; + TERM = "xterm-256color"; + }; + + time.timeZone = "Europe/Stockholm"; + + fonts.packages = with pkgs; [ + (nerdfonts.override { + fonts = [ + "FiraCode" + "DroidSansMono" + ]; + }) + ]; + + + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "sv_SE.UTF-8"; + LC_IDENTIFICATION = "sv_SE.UTF-8"; + LC_MEASUREMENT = "sv_SE.UTF-8"; + LC_MONETARY = "sv_SE.UTF-8"; + LC_NAME = "sv_SE.UTF-8"; + LC_NUMERIC = "sv_SE.UTF-8"; + LC_PAPER = "sv_SE.UTF-8"; + LC_TELEPHONE = "sv_SE.UTF-8"; + LC_TIME = "sv_SE.UTF-8"; + }; + + boot.loader.grub = { + enable = true; + device = "/dev/sdc"; + useOSProber = true; + }; + + console.keyMap = "sv-latin1"; + programs.zsh.enable = true; + + services = { + xserver = { + enable = true; + displayManager = { + startx.enable = true; + }; + }; + openssh = { + enable = true; + ports = [55502]; + settings = { + PermitRootLogin = "no"; + PasswordAuthentication = false; + X11Forwarding = true; + }; + extraConfig = '' + AllowUsers fw + ''; + }; + locate = { + enable = true; + locate = pkgs.mlocate; + }; + }; + + system.stateVersion = "23.11"; +} diff --git a/maskiner/server/hardware-configuration.nix b/maskiner/server/hardware-configuration.nix new file mode 100644 index 0000000..3f90dc2 --- /dev/null +++ b/maskiner/server/hardware-configuration.nix @@ -0,0 +1,34 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/220bde85-e58e-48ad-bf5c-e1d3907642c0"; + fsType = "ext4"; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/f11bdce3-851b-427f-a3ab-9ebc9792269a"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp33s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/moduler/common/dmenu.nix b/moduler/common/dmenu.nix new file mode 100644 index 0000000..93401ce --- /dev/null +++ b/moduler/common/dmenu.nix @@ -0,0 +1,19 @@ +{ pkgs, lib, ... }: +let + dmenu = pkgs.dmenu.overrideAttrs (old: { + src = builtins.fetchGit { + url = "https://github.com/FredzyW/dmenu.git"; + rev = "7ec109778998462a6762745c65c47a73283b810e"; + }; + nativeBuildInputs = with pkgs; [ + xorg.libX11.dev + xorg.libXft + imlib2 + xorg.libXinerama + ]; + }); +in +{ + home.packages = [ dmenu ]; +} + diff --git a/moduler/common/dunst/default.nix b/moduler/common/dunst/default.nix new file mode 100644 index 0000000..08ade48 --- /dev/null +++ b/moduler/common/dunst/default.nix @@ -0,0 +1,24 @@ +{ config +, pkgs +, ... +}: { + services.dunst = { + enable = true; + settings = { + global = { + width = 300; + height = 300; + offset = "30x50"; + origin = "top-right"; + transparency = 5; + frame_color = "#eceff1"; + corner_radius = 10; + }; + urgency_normal = { + background = "#181818"; + foreground = "#dfdfdf"; + timeout = 10; + }; + }; + }; +} diff --git a/moduler/common/dwm-2.nix b/moduler/common/dwm-2.nix new file mode 100644 index 0000000..354e1ec --- /dev/null +++ b/moduler/common/dwm-2.nix @@ -0,0 +1,26 @@ +{ pkgs, lib, ... }: +let + dwm = pkgs.dwm.overrideAttrs (old: { + src = builtins.fetchGit { + url = "https://github.com/FredzyW/dwm-conf.git"; + rev = "99a1e812295bcf65625a4b5a0dc1022658977920"; + }; + nativeBuildInputs = with pkgs; [ + xorg.libX11.dev + xorg.libXft + imlib2 + xorg.libXinerama + ]; + }); + dwmblocks = pkgs.dwmblocks.overrideAttrs (old: { + src = builtins.fetchGit { + url = "https://github.com/FredzyW/dwmblocks.git"; + rev = "a334789ec7b9171a3c8e1fcac2ffe8463ee438dc"; + + }; + }); +in +{ + home.packages = [ dwm dwmblocks ]; +} + diff --git a/moduler/common/dwm.nix b/moduler/common/dwm.nix new file mode 100644 index 0000000..ab4db84 --- /dev/null +++ b/moduler/common/dwm.nix @@ -0,0 +1,36 @@ +{ pkgs, lib, myhostname, ... }: +let + dwm = pkgs.dwm.overrideAttrs (old: { + src = builtins.fetchGit { + # url = "https://github.com/FredzyW/dwm-conf.git"; + # rev = "99a1e812295bcf65625a4b5a0dc1022658977920"; + url = "https://git.wastring.com/fw/dwm.git"; + rev = "04039f157960b83f1ab8abebb0ea77c72a75a249"; + }; + nativeBuildInputs = with pkgs; [ + xorg.libX11.dev + xorg.libXft + imlib2 + xorg.libXinerama + ]; + }); + dwmblocks = if myhostname == "nix-desktop" then pkgs.dwmblocks.overrideAttrs (old: { + src = builtins.fetchGit { + # url = "https://github.com/FredzyW/dwmblocks.git"; + # rev = "a334789ec7b9171a3c8e1fcac2ffe8463ee438dc"; + url = "https://git.wastring.com/fw/dwmblocks.git"; + rev = "ce19d482155f3292dc77179a2485670a48d2669c"; + }; + }) else pkgs.dwmblocks.overrideAttrs (old: { + src = builtins.fetchGit { + # url = "https://github.com/FredzyW/dwmblocks.git"; + # rev = "7c81c55390f2deec2a3804217abe80221ef6f46a"; + url = "https://git.wastring.com/fw/dwmblocks.git"; + rev = "52198f692f5965b3e86577e8481e035d4c37ab52"; + }; + }); +in +{ + home.packages = [ dwm dwmblocks ]; +} + diff --git a/moduler/common/firefox.nix b/moduler/common/firefox.nix new file mode 100644 index 0000000..2f98cf6 --- /dev/null +++ b/moduler/common/firefox.nix @@ -0,0 +1,21 @@ +{ pkgs, lib, ... }: +{ + programs.firefox = { + enable = true; + profiles.default = { + isDefault = true; + userChrome = '' + @import "${ + builtins.fetchGit { + url = "https://github.com/rockofox/firefox-minima"; + ref = "main"; + rev = "c5580fd04e9b198320f79d441c78a641517d7af5"; # <-- Change this + } + }/userChrome.css"; + ''; + settings = { + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + }; + }; + }; +} diff --git a/moduler/common/git.nix b/moduler/common/git.nix new file mode 100644 index 0000000..9f8bfcc --- /dev/null +++ b/moduler/common/git.nix @@ -0,0 +1,8 @@ +{ pkgs, lib, ... }: +{ + programs.git = { + enable = true; + userName = "FredzyW"; + userEmail = "fredrik@wastring.com"; + }; +} diff --git a/moduler/common/kitty.nix b/moduler/common/kitty.nix new file mode 100644 index 0000000..e16ec38 --- /dev/null +++ b/moduler/common/kitty.nix @@ -0,0 +1,24 @@ +{ pkgs, lib, myhostname, ... }: +{ + programs.kitty = { + enable = true; + font = if myhostname == "nix-desktop" then { + name = "FiraCode Nerd Font"; + size = 18; + } else { + name = "FiraCode Nerd Font"; + size = 24; + }; + shellIntegration = { + enableZshIntegration = true; + mode = "no-cursor"; + }; + theme = "Catppuccin-Macchiato"; + settings = { + confirm_os_window_close = 2; + cursor_shape = "block"; + cursor_blink_interval = 0; + enable_audio_bell = false; + }; + }; +} diff --git a/moduler/common/lazygit.nix b/moduler/common/lazygit.nix new file mode 100644 index 0000000..a92fb64 --- /dev/null +++ b/moduler/common/lazygit.nix @@ -0,0 +1,29 @@ + +{ pkgs, lib, ... }: +{ + programs.lazygit = { + enable = true; + settings = { + gui = { + theme = { + activeBorderColor = [ "#a6da95" "bold" ]; + inactiveBorderColor = [ "#a5adcb" ]; + optionsTextColor = [ "#8aadf4" ]; + selectedLineBgColor = [ "#363a4f" ]; + cherryPickedCommitBgColor = [ "#494d64" ]; + cherryPickedCommitFgColor = [ "#a6da95" ]; + unstagedChangesColor = [ "#ed8796" ]; + defaultFgColor = [ "#cad3f5" ]; + searchingActiveBorderColor = [ "#eed49f" ]; + }; + + authorColors = { + "*" = "#b7bdf8"; + }; + showRandomTip = false; + showBottomLine = false; + sidePanelWidth = 0.5; + }; + }; + }; +} diff --git a/moduler/common/neovim/config/mappings.lua b/moduler/common/neovim/config/mappings.lua new file mode 100644 index 0000000..edf2217 --- /dev/null +++ b/moduler/common/neovim/config/mappings.lua @@ -0,0 +1,86 @@ +vim.keymap.set('n', 'z', '(leap)') +vim.keymap.set('n', 'Z', '(leap-from-window)') +vim.keymap.set({ 'x', 'o' }, 'z', '(leap-forward)') +vim.keymap.set({ 'x', 'o' }, 'Z', '(leap-backward)') + +-- Harpoon +vim.keymap.set('n', 'ha', ':lua require("harpoon.mark").add_file()') +vim.keymap.set('n', 'hf', ':Telescope harpoon marks') +vim.keymap.set('n', 'he', ':lua require("harpoon.ui").toggle_quick_menu()') +vim.keymap.set('n', 'hn', ':lua require("harpoon.ui").nav_next()') +vim.keymap.set('n', 'hb', ':lua require("harpoon.ui").nav_prev()') + +vim.cmd('highlight! HarpoonInactive guibg=NONE guifg=#63698c') +vim.cmd('highlight! HarpoonActive guibg=NONE guifg=white') +vim.cmd('highlight! HarpoonNumberActive guibg=NONE guifg=#7aa2f7') +vim.cmd('highlight! HarpoonNumberInactive guibg=NONE guifg=#7aa2f7') +vim.cmd('highlight! TabLineFill guibg=NONE guifg=white') + +local opts = { noremap = true, silent = true } + +-- Substitute +vim.keymap.set("n", "s", require('substitute').operator, { noremap = true }) +vim.keymap.set("n", "ss", require('substitute').line, { noremap = true }) +vim.keymap.set("n", "S", require('substitute').eol, { noremap = true }) +vim.keymap.set("x", "s", require('substitute').visual, { noremap = true }) + +-- Move commands +vim.keymap.set('n', '', ':MoveLine(1)', opts) +vim.keymap.set('n', '', ':MoveLine(-1)', opts) +vim.keymap.set('v', '', ':MoveBlock(1)', opts) +vim.keymap.set('v', '', ':MoveBlock(-1)', opts) + +-- Good navigation mappings for wrap +vim.api.nvim_set_keymap('n', 'j', 'gj', { noremap = true, silent = true }) +vim.api.nvim_set_keymap('n', 'k', 'gk', { noremap = true, silent = true }) + +-- Buffer navigation +vim.api.nvim_set_keymap('n', '', ':bnext', { noremap = true, silent = true }) +vim.api.nvim_set_keymap('n', '', ':bprevious', { noremap = true, silent = true }) + +-- Window navigation +vim.api.nvim_set_keymap('n', '', ':wincmd k', { silent = true }) +vim.api.nvim_set_keymap('n', '', ':wincmd j', { silent = true }) +vim.api.nvim_set_keymap('n', '', ':wincmd h', { silent = true }) +vim.api.nvim_set_keymap('n', '', ':wincmd l', { silent = true }) + +vim.api.nvim_set_keymap('n', 'c', ':bd', { silent = true }) + +-- Sniprun +vim.api.nvim_set_keymap('v', 'f', 'SnipRun', { silent = true }) +vim.api.nvim_set_keymap('n', 'f', 'SnipRunOperator', { silent = true }) +vim.api.nvim_set_keymap('n', 'ff', 'SnipRun', { silent = true }) + +-- Highlight yanked +vim.api.nvim_create_autocmd('TextYankPost', { + group = vim.api.nvim_create_augroup('highlight_yank', {}), + desc = 'Hightlight selection on yank', + pattern = '*', + callback = function() + vim.highlight.on_yank { higroup = 'IncSearch', timeout = 200 } + end, +}) + +-- Telescope bindings +vim.keymap.set('n', 'ff', builtin.find_files, {}) +vim.keymap.set('n', 'fg', builtin.live_grep, {}) +vim.keymap.set('n', 'fb', builtin.buffers, {}) +vim.keymap.set('n', 'fh', builtin.help_tags, {}) + + +-- Bindings for save and quit +vim.api.nvim_set_keymap('n', 'w', ':w', { noremap = true, silent = true }) +vim.api.nvim_set_keymap('n', 'q', ':q', {}) + +-- Neotree bindings +vim.api.nvim_set_keymap('n', 'e', ':RnvimrToggle', { noremap = true, silent = true }) +vim.api.nvim_set_var('rnvimr_enable_ex', 1) +vim.api.nvim_set_var('rnvimr_enable_picker', 1) +vim.api.nvim_set_var('rnvimr_edit_cmd', 'drop') +vim.api.nvim_set_var('rnvimr_draw_border', 0) +vim.api.nvim_set_var('rnvimr_hide_gitignore', 1) +vim.api.nvim_set_var('rnvimr_border_attr', {fg = 14, bg = -1}) +vim.api.nvim_set_var('rnvimr_enable_bw', 1) +vim.api.nvim_set_var('rnvimr_shadow_winblend', 70) +vim.api.nvim_set_var('rnvimr_ranger_cmd', {'ranger', '--cmd=set draw_borders both'}) + diff --git a/moduler/common/neovim/config/options.lua b/moduler/common/neovim/config/options.lua new file mode 100644 index 0000000..9ecc2a4 --- /dev/null +++ b/moduler/common/neovim/config/options.lua @@ -0,0 +1,10 @@ +vim.opt.wrap = true +vim.opt.shiftwidth = 4 +vim.opt.tabstop = 4 +vim.o.termguicolors = true +vim.wo.relativenumber = true +vim.wo.number = true +vim.g.mapleader = ' ' + +vim.opt.termguicolors = true + diff --git a/moduler/common/neovim/config/plugins.lua b/moduler/common/neovim/config/plugins.lua new file mode 100644 index 0000000..2b7f216 --- /dev/null +++ b/moduler/common/neovim/config/plugins.lua @@ -0,0 +1,167 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + + +require("lazy").setup({ + { + 'm4xshen/autoclose.nvim', + }, + { + "BurntSushi/ripgrep", + }, + { + 'kevinhwang91/rnvimr', + }, + { + 'ThePrimeagen/harpoon', + }, + { + 'ggandor/leap.nvim', + }, + { + 'gfanto/fzf-lsp.nvim', + }, + { + 'junegunn/fzf.vim', + }, + { + "junegunn/fzf", + name = "fzf", + dir = "~/.fzf", + build = "./install --all" + }, + { + 'RRethy/base16-nvim', + }, + { + "folke/which-key.nvim", + }, + { + "folke/neodev.nvim", + }, + { + "mfussenegger/nvim-dap", + }, + { + 'neovim/nvim-lspconfig' + }, + { + 'hrsh7th/cmp-nvim-lsp' + }, + { + 'hrsh7th/nvim-cmp' + }, + { + 'nvim-focus/focus.nvim', + version = false + }, + { + "folke/neoconf.nvim", + cmd = "Neoconf" + }, + { + "lukas-reineke/indent-blankline.nvim", + main = "ibl", + opts = {} + }, + { + 'mrjones2014/legendary.nvim', + -- since legendary.nvim handles all your keymaps/commands, + -- its recommended to load legendary.nvim before other plugins + priority = 10000, + lazy = false, + -- sqlite is only needed if you want to use frecency sorting + -- dependencies = { 'kkharji/sqlite.lua' } + }, + { + 'VonHeikemen/lsp-zero.nvim', + branch = 'v3.x' + }, + { + "catppuccin/nvim", + name = "catppuccin", + priority = 1000 + }, + { + 'kevinhwang91/nvim-bqf' + }, + { + 'akinsho/bufferline.nvim', + version = "*", + dependencies = 'nvim-tree/nvim-web-devicons' + }, + { + 'nvim-telescope/telescope-fzf-native.nvim', + build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' + }, + { + "L3MON4D3/LuaSnip", + version = "v2.*", + build = "make install_jsregexp" + }, + { + "gbprod/substitute.nvim", + opts = {} + }, + { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate" + }, + { + "michaelb/sniprun", + branch = "master", + build = "sh install.sh", + config = function() + require("sniprun").setup({}) + end, + }, + { + 'nvim-telescope/telescope.nvim', + tag = '0.1.6', + dependencies = { + 'nvim-lua/plenary.nvim' + } + }, + { + 'mrcjkb/haskell-tools.nvim', + version = '^3', + ft = { 'haskell', 'lhaskell', 'cabal', 'cabalproject' }, + }, + { + "kdheepak/lazygit.nvim", + cmd = { + "LazyGit", + "LazyGitConfig", + "LazyGitCurrentFile", + "LazyGitFilter", + "LazyGitFilterCurrentFile", + }, + dependencies = { + "nvim-lua/plenary.nvim", + }, + keys = { + { "gg", "LazyGit", desc = "LazyGit" } + } + }, + { + 'nvim-lualine/lualine.nvim', + dependencies = { 'nvim-tree/nvim-web-devicons' } + }, + { + 'numToStr/Comment.nvim', + opts = {}, + lazy = false, + }, + +}) + diff --git a/moduler/common/neovim/config/setup.lua b/moduler/common/neovim/config/setup.lua new file mode 100644 index 0000000..661611f --- /dev/null +++ b/moduler/common/neovim/config/setup.lua @@ -0,0 +1,230 @@ +-- Define a function to generate keybinds for navigating to files +local function setup_file_navigation_keybinds(start, stop) + for i = start, stop do + local keybind = string.format('h%d', i) + local command = string.format(':lua require("harpoon.ui").nav_file(%d)', i) + vim.keymap.set('n', keybind, command) + end +end + +setup_file_navigation_keybinds(1, 9) + +require'fzf_lsp'.setup() + +require("autoclose").setup({ + keys = { + ["$"] = { escape = true, close = true, pair = "$$", disabled_filetypes = { "haskell" } }, + ["'"] = { escape = true, close = true, pair = "''", disabled_filetypes = { "markdown" } }, + ["`"] = { escape = true, close = true, pair = "``", disabled_filetypes = { "markdown" } }, + }, +}) + + +require('bqf').setup() +require("ibl").setup() +require("focus").setup() +require("bufferline").setup() + +local wk = require("which-key") +wk.register(mappings, opts) + +local parser_config = require "nvim-treesitter.parsers".get_parser_configs() +parser_config.csharp = { + install_info = { + url = "https://github.com/tree-sitter/tree-sitter-c-sharp", -- local path or git repo + files = {"src/parser.c"}, -- note that some parsers also require src/scanner.c or src/scanner.cc + branch = "master", -- default branch in case of git repo if different from master + generate_requires_npm = false, -- if stand-alone parser without npm dependencies + requires_generate_from_grammar = false, -- if folder contains pre-generated src/parser.c + }, + filetype = "cs", -- if filetype does not match the parser name +} + +require'nvim-treesitter.configs'.setup { + ensure_installed = { "c", "lua", "vim", "vimdoc", "query", "haskell", "python", "bash", "clojure", "nix", "dockerfile", "latex", "csharp", "markdown" }, + sync_install = false, + auto_install = true, + ignore_install = { "javascript" }, + + highlight = { + enable = true, + + disable = function(lang, buf) + local max_filesize = 100 * 1024 -- 100 KB + local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) + if ok and stats and stats.size > max_filesize then + return true + end + end, + additional_vim_regex_highlighting = false, + }, +} + + + +local function lsp() + local clients = vim.lsp.buf_get_clients() + if next(clients) == nil then + return + end + + for _, client in pairs(clients) do + return ("[" .. client.name .. "]") + end +end + +require('lualine').setup { + options = { + icons_enabled = true, + theme = 'base16', + component_separators = { left = '|', right = '|' }, + section_separators = { left = '', right = '' }, + disabled_filetypes = { + statusline = { 'neo-tree' }, + winbar = {}, + }, + ignore_focus = {}, + always_divide_middle = true, + globalstatus = false, + refresh = { + statusline = 1000, + tabline = 1000, + winbar = 1000, + } + }, + sections = { + lualine_a = { 'mode' }, + lualine_b = { 'branch', 'diff', 'diagnostics' }, + lualine_c = { 'filename' }, + lualine_x = { lsp }, + lualine_y = { 'filetype' }, + lualine_z = {} + }, + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = {}, + lualine_z = {} + }, + tabline = {}, + winbar = {}, + inactive_winbar = {}, + extensions = {} +} + +require("telescope").load_extension('harpoon') + +-- LSP Setup +local lsp_zero = require('lsp-zero') + +lsp_zero.on_attach(function(client, bufnr) + lsp_zero.default_keymaps({ buffer = bufnr }) +end) +require 'lspconfig'.hls.setup {} +require 'lspconfig'.omnisharp.setup { + cmd = { "/home/fw/.nix-profile/bin/dotnet", "/nix/store/jdp56g0j6mf7yjvqy9npw28y4pxcvgsw-omnisharp-roslyn-1.39.10/lib/omnisharp-roslyn/OmniSharp.dll" }, +} +require 'lspconfig'.clojure_lsp.setup {} +require 'lspconfig'.nil_ls.setup {} +require 'lspconfig'.marksman.setup {} +require 'lspconfig'.pylsp.setup {} +require 'lspconfig'.bashls.setup {} +require 'lspconfig'.dockerls.setup {} +require 'lspconfig'.docker_compose_language_service.setup {} +require 'lspconfig'.ansiblels.setup {} +require 'lspconfig'.yamlls.setup {} +require 'lspconfig'.lua_ls.setup { + settings = { + Lua = { + diagnostics = { + globals = { 'vim' } + } + } + } +} + + +require("catppuccin").setup({ + flavour = "macchiato", + background = { + light = "latte", + dark = "mocha", + }, + transparent_background = false, + show_end_of_buffer = false, + term_colors = false, + dim_inactive = { + enabled = false, + shade = "dark", + percentage = 0.15, + }, + no_italic = false, + no_bold = false, + no_underline = false, + styles = { + comments = { "italic" }, + conditionals = { "italic" }, + loops = {}, + functions = {}, + keywords = {}, + strings = {}, + variables = {}, + numbers = {}, + booleans = {}, + properties = {}, + types = {}, + operators = {}, + }, + color_overrides = {}, + custom_highlights = {}, + integrations = { + cmp = true, + gitsigns = true, + nvimtree = true, + treesitter = true, + notify = false, + mini = { + enabled = true, + indentscope_color = "", + }, + }, +}) + +vim.cmd('colorscheme base16-catppuccin-macchiato') + +local cmp = require('cmp') + +cmp.setup({ + sources = { + { name = 'nvim_lsp' }, + }, + mapping = { + [''] = cmp.mapping.confirm({ select = false }), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.select_prev_item({ behavior = 'select' }), + [''] = cmp.mapping.select_next_item({ behavior = 'select' }), + [''] = cmp.mapping.select_next_item({ behavior = 'select' }), + [''] = cmp.mapping(function() + if cmp.visible() then + cmp.select_prev_item({ behavior = 'insert' }) + else + cmp.complete() + end + end), + [''] = cmp.mapping(function() + if cmp.visible() then + cmp.select_next_item({ behavior = 'insert' }) + else + cmp.complete() + end + end), + }, + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, +}) + diff --git a/moduler/common/nixpkgs.nix b/moduler/common/nixpkgs.nix new file mode 100644 index 0000000..5dd0532 --- /dev/null +++ b/moduler/common/nixpkgs.nix @@ -0,0 +1,12 @@ +{ pkgs, lib, ... }: +{ + nixpkgs = { + # Configure your nixpkgs instance + config = { + allowUnfree = true; + permittedInsecurePackages = [ + "electron-25.9.0" + ]; + }; + }; +} diff --git a/moduler/common/nvim.nix b/moduler/common/nvim.nix new file mode 100644 index 0000000..5e446bf --- /dev/null +++ b/moduler/common/nvim.nix @@ -0,0 +1,52 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [ + ]; + programs = { + neovim = { + plugins = [ + ## Treesitter + pkgs.vimPlugins.nvim-treesitter + pkgs.vimPlugins.nvim-lspconfig + + pkgs.vimPlugins.plenary-nvim + pkgs.vimPlugins.telescope-nvim + pkgs.vimPlugins.telescope-fzf-native-nvim + + ## cmp + pkgs.vimPlugins.nvim-cmp + pkgs.vimPlugins.cmp-nvim-lsp + + pkgs.vimPlugins.luasnip + pkgs.vimPlugins.cmp_luasnip + pkgs.vimPlugins.vim-surround + pkgs.vimPlugins.vim-obsession + pkgs.vimPlugins.neoformat + pkgs.vimPlugins.lazygit-nvim + pkgs.vimPlugins.gitsigns-nvim + pkgs.vimPlugins.lualine-nvim + pkgs.vimPlugins.nvim-web-devicons + pkgs.vimPlugins.leap-nvim + pkgs.vimPlugins.vim-repeat + + ## Debugging + pkgs.vimPlugins.nvim-dap + pkgs.vimPlugins.nvim-dap-ui + pkgs.vimPlugins.nvim-dap-virtual-text + ]; + + extraConfig = '' + lua << EOF + ${builtins.readFile config/mappings.lua} + ${builtins.readFile config/options.lua} + ${builtins.readFile config/setup.lua} + ''; + enable = true; + viAlias = true; + vimAlias = true; + }; + }; +} diff --git a/moduler/common/spotifyd.nix b/moduler/common/spotifyd.nix new file mode 100644 index 0000000..a49a4d9 --- /dev/null +++ b/moduler/common/spotifyd.nix @@ -0,0 +1,10 @@ +{ pkgs, lib, myhostname, ... }: +{ + services.spotifyd = { + enable = true; + settings = { + username = "fredzyw"; + device_name = myhostname; + }; + }; +} diff --git a/moduler/common/ssh.nix b/moduler/common/ssh.nix new file mode 100644 index 0000000..7a7cc37 --- /dev/null +++ b/moduler/common/ssh.nix @@ -0,0 +1,20 @@ +{ pkgs, lib, ... }: +{ + programs.ssh = { + enable = true; + matchBlocks = { + "git.wastring.com" = { + hostname = "git.wastring.com"; + port = 55503; + user = "git"; + identityFile = "/home/fw/.ssh/gitea"; + }; + "wastring.com" = { + hostname = "wastring.com"; + port = 55502; + user = "fw"; + identityFile = "/home/fw/.ssh/id_ed25519"; + }; + }; + }; +} diff --git a/moduler/common/tmux.nix b/moduler/common/tmux.nix new file mode 100644 index 0000000..6f9c0d9 --- /dev/null +++ b/moduler/common/tmux.nix @@ -0,0 +1,47 @@ +{ pkgs, lib, ... }: +{ + programs.tmux = { + enable = true; + mouse = true; + plugins = with pkgs; [ + tmuxPlugins.sensible + tmuxPlugins.tmux-fzf + tmuxPlugins.pain-control + tmuxPlugins.sessionist + # tmuxPlugins.catppuccin + # tmuxPlugins.weather + tmuxPlugins.resurrect + tmuxPlugins.continuum + ]; + prefix = "C-a"; + terminal = "xterm-256color"; + keyMode = "vi"; + escapeTime = 0; + extraConfig = " + set -g @catppuccin_flavour 'macchiato' + set -g @catppuccin_window_left_separator '█' + set -g @catppuccin_window_right_separator '█ ' + set -g @catppuccin_window_number_position 'right' + set -g @catppuccin_window_middle_separator ' █' + + set -g @catppuccin_window_default_fill 'number' + + set -g @catppuccin_window_current_fill 'number' + set -g @catppuccin_window_current_text '#{pane_current_path}' + + set -g @catppuccin_status_left_separator '' + set -g @catppuccin_status_right_separator ' ' + set -g @catppuccin_status_fill 'all' + set -g @catppuccin_status_connect_separator 'yes' + run-shell ${pkgs.tmuxPlugins.catppuccin}/share/tmux-plugins/catppuccin/catppuccin.tmux + run-shell ${pkgs.tmuxPlugins.weather}/share/tmux-plugins/weather/weather.tmux + set -g @catppuccin_status_modules_right 'date_time weather' + set -g @catppuccin_window_number_position 'right' + set -g @continuum-boot 'on' + set -g @continuum-restore 'on' + set -g @resurrect-strategy-nvim 'session' + set -g @resurrect-capture-pane-contents 'on' + set -g @resurrect-processes 'nvim' + "; + }; +} diff --git a/moduler/common/zathura.nix b/moduler/common/zathura.nix new file mode 100644 index 0000000..9281315 --- /dev/null +++ b/moduler/common/zathura.nix @@ -0,0 +1,9 @@ +{ pkgs, lib, ... }: +{ + programs.zathura = { + enable = true; + options = { + selection-clipboard = "clipboard"; + }; + }; +} diff --git a/moduler/common/zsh-server.nix b/moduler/common/zsh-server.nix new file mode 100644 index 0000000..f355e8d --- /dev/null +++ b/moduler/common/zsh-server.nix @@ -0,0 +1,66 @@ +{ pkgs, lib, ... }: +{ + programs.zsh = { + enable = true; + initExtra = '' + [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + export PATH=/home/fw/.local/bin:$PATH + ''; + plugins = with pkgs; [ + { + name = "zsh-z"; + file = "zsh-z.plugin.zsh"; + src = builtins.fetchGit { + url = "https://github.com/agkozak/zsh-z"; + rev = "afaf2965b41fdc6ca66066e09382726aa0b6aa04"; + }; + } + { + name = "powerlevel10k"; + src = pkgs.zsh-powerlevel10k; + file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; + } + ]; + shellAliases = { + ls="ls --color=auto"; + ll="ls -al --color=auto"; + ccr="gcc intopt.c && ./a.out"; + homec="nvim ~/nix/config/home.nix"; + nvimc="nvim ~/.config/nvim/init.lua"; + sdg="sudo nix-collect-garbage -d"; + udg="nix-collect-garbage -d"; + df="df -h"; + c="clear"; + }; + enableCompletion = true; + initExtraBeforeCompInit = '' + # Lines configured by zsh-newuser-install + home() { + cd ~/nix/ && home-manager switch --flake ".#fw@$(hostname)"; + } + update() { + sudo nix-channel --update && sudo nixos-rebuild switch --upgrade --flake '.#$(hostname)' + } + reb() { + cd ~/nix/ && sudo nixos-rebuild switch --flake ".#$(hostname)" + } + + HISTFILE=~/.histfile + HISTSIZE=1000 + SAVEHIST=1000 + setopt autocd extendedglob + bindkey -v + bindkey '^R' history-incremental-search-backward + bindkey '^[[1;5C' emacs-forward-word + bindkey '^[[1;5D' emacs-backward-word + # End of lines configured by zsh-newuser-install + # The following lines were added by compinstall + zstyle :compinstall filename '/home/fw/.zshrc' + + # autoload -Uz compinit + autoload -U compinit; compinit + zstyle ':completion:*' menu select + + ''; + }; +} diff --git a/moduler/common/zsh.nix b/moduler/common/zsh.nix new file mode 100644 index 0000000..324a0c2 --- /dev/null +++ b/moduler/common/zsh.nix @@ -0,0 +1,71 @@ +{ pkgs, lib, ... }: +{ + programs.zsh = { + enable = true; + initExtra = '' + [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + export PATH=/home/fw/.local/bin:$PATH + ''; + plugins = with pkgs; [ + { + name = "zsh-z"; + file = "zsh-z.plugin.zsh"; + src = builtins.fetchGit { + url = "https://github.com/agkozak/zsh-z"; + rev = "afaf2965b41fdc6ca66066e09382726aa0b6aa04"; + }; + } + { + name = "powerlevel10k"; + src = pkgs.zsh-powerlevel10k; + file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; + } + ]; + profileExtra = " + if [[ -z $DISPLAY ]]; then + exec startx + fi + "; + shellAliases = { + ls="ls --color=auto"; + ll="ls -al --color=auto"; + ccr="gcc intopt.c && ./a.out"; + homec="nvim ~/nix/config/home.nix"; + nvimc="nvim ~/.config/nvim/init.lua"; + sdg="sudo nix-collect-garbage -d"; + udg="nix-collect-garbage -d"; + df="df -h"; + c="clear"; + }; + enableCompletion = true; + initExtraBeforeCompInit = '' + # Lines configured by zsh-newuser-install + home() { + cd ~/nix/ && home-manager switch --flake ".#fw@$(hostname)"; + } + update() { + sudo nix-channel --update && sudo nixos-rebuild switch --upgrade --flake '.#$(hostname)' + } + reb() { + cd ~/nix/ && sudo nixos-rebuild switch --flake ".#$(hostname)" + } + + HISTFILE=~/.histfile + HISTSIZE=1000 + SAVEHIST=1000 + setopt autocd extendedglob + bindkey -v + bindkey '^R' history-incremental-search-backward + bindkey '^[[1;5C' emacs-forward-word + bindkey '^[[1;5D' emacs-backward-word + # End of lines configured by zsh-newuser-install + # The following lines were added by compinstall + zstyle :compinstall filename '/home/fw/.zshrc' + + # autoload -Uz compinit + autoload -U compinit; compinit + zstyle ':completion:*' menu select + + ''; + }; +} diff --git a/themes/catppuccin.diff b/themes/catppuccin.diff new file mode 100644 index 0000000..78542a7 --- /dev/null +++ b/themes/catppuccin.diff @@ -0,0 +1,15 @@ +--- config.def.h 2024-04-02 16:17:57.987476429 +0200 ++++ config.def.h.bak 2024-04-02 16:17:42.234351421 +0200 +@@ -9,9 +9,9 @@ + static const char *prompt = NULL; /* -p option; prompt to the left of input field */ + static const char *colors[SchemeLast][2] = { + /* fg bg */ +- [SchemeNorm] = { "#cad3f5", "#24273a" }, +- [SchemeSel] = { "#181926", "#91d7e3" }, +- [SchemeOut] = { "#000000", "#91d7e3" }, ++ [SchemeNorm] = { "#bbbbbb", "#222222" }, ++ [SchemeSel] = { "#eeeeee", "#005577" }, ++ [SchemeOut] = { "#000000", "#00ffff" }, + }; + /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ + static unsigned int lines = 0; diff --git a/wallpapers/nix-black-4k.png b/wallpapers/nix-black-4k.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f20a287070fc625f08d16491b4e099d77226d5 GIT binary patch literal 50996 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 literal 0 HcmV?d00001 diff --git a/xresources b/xresources new file mode 100644 index 0000000..0a6242e --- /dev/null +++ b/xresources @@ -0,0 +1,34 @@ +*background: #24273A +*foreground: #CAD3F5 + +! black +*color0: #494D64 +*color8: #5B6078 + +! red +*color1: #ED8796 +*color9: #ED8796 + +! green +*color2: #A6DA95 +*color10: #A6DA95 + +! yellow +*color3: #EED49F +*color11: #EED49F + +! blue +*color4: #8AADF4 +*color12: #8AADF4 + +! magenta +*color5: #F5BDE6 +*color13: #F5BDE6 + +! cyan +*color6: #8BD5CA +*color14: #8BD5CA + +! white +*color7: #B8C0E0 +*color15: #A5ADCB