From 20bcd44cc1f33c8ca9342d3b111ac41d5bd76b06 Mon Sep 17 00:00:00 2001 From: Alejandro Angulo Date: Sun, 18 Sep 2022 12:42:30 -0700 Subject: [PATCH] Added nix config --- .gitignore | 3 + apply-system.sh | 4 + apply-users.sh | 5 + flake.lock | 48 +++++ flake.nix | 89 ++++++++++ system/carbon/configuration.nix | 177 +++++++++++++++++++ system/carbon/hardware-configuration-zfs.nix | 114 ++++++++++++ system/carbon/vpn.nix | 25 +++ system/carbon/zfs.nix | 62 +++++++ system/gospel/configuration.nix | 129 ++++++++++++++ system/gospel/hardware-configuration.nix | 63 +++++++ system/gospel/vpn.nix | 23 +++ system/gospel/zfs.nix | 34 ++++ system/virtual/configuration.nix | 121 +++++++++++++ system/virtual/hardware-configuration.nix | 34 ++++ update.sh | 2 + users/alejandro/alacritty.nix | 33 ++++ users/alejandro/git.nix | 56 ++++++ users/alejandro/gpg.nix | 19 ++ users/alejandro/home.nix | 62 +++++++ users/alejandro/mako.nix | 24 +++ users/alejandro/rofi.nix | 17 ++ users/alejandro/sway/keybindings.nix | 160 +++++++++++++++++ users/alejandro/sway/sway.nix | 88 +++++++++ users/alejandro/sway/waybar.nix | 148 ++++++++++++++++ users/alejandro/sway/waybar_style.css | 132 ++++++++++++++ users/alejandro/tmux.nix | 68 +++++++ users/alejandro/vim/vim.nix | 166 +++++++++++++++++ users/alejandro/zsh.nix | 72 ++++++++ 29 files changed, 1978 insertions(+) create mode 100644 .gitignore create mode 100755 apply-system.sh create mode 100755 apply-users.sh create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 system/carbon/configuration.nix create mode 100644 system/carbon/hardware-configuration-zfs.nix create mode 100644 system/carbon/vpn.nix create mode 100644 system/carbon/zfs.nix create mode 100644 system/gospel/configuration.nix create mode 100644 system/gospel/hardware-configuration.nix create mode 100644 system/gospel/vpn.nix create mode 100644 system/gospel/zfs.nix create mode 100644 system/virtual/configuration.nix create mode 100644 system/virtual/hardware-configuration.nix create mode 100755 update.sh create mode 100644 users/alejandro/alacritty.nix create mode 100644 users/alejandro/git.nix create mode 100644 users/alejandro/gpg.nix create mode 100644 users/alejandro/home.nix create mode 100644 users/alejandro/mako.nix create mode 100644 users/alejandro/rofi.nix create mode 100644 users/alejandro/sway/keybindings.nix create mode 100644 users/alejandro/sway/sway.nix create mode 100644 users/alejandro/sway/waybar.nix create mode 100644 users/alejandro/sway/waybar_style.css create mode 100644 users/alejandro/tmux.nix create mode 100644 users/alejandro/vim/vim.nix create mode 100644 users/alejandro/zsh.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15dc2cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.swp + +result diff --git a/apply-system.sh b/apply-system.sh new file mode 100755 index 0000000..0642ddb --- /dev/null +++ b/apply-system.sh @@ -0,0 +1,4 @@ +#!/bin/sh +pushd ~/nix-config +sudo nixos-rebuild switch --flake .# +popd diff --git a/apply-users.sh b/apply-users.sh new file mode 100755 index 0000000..d0a023c --- /dev/null +++ b/apply-users.sh @@ -0,0 +1,5 @@ +#!/bin/sh +pushd ~/nix-config +nix build .#homeManagerConfigurations.alejandro.activationPackage +./result/activate +popd diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..5a474aa --- /dev/null +++ b/flake.lock @@ -0,0 +1,48 @@ +{ + "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1656169755, + "narHash": "sha256-Nlnm4jeQWEGjYrE6hxi/7HYHjBSZ/E0RtjCYifnNsWk=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "4a3d01fb53f52ac83194081272795aa4612c2381", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-22.05", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1663410121, + "narHash": "sha256-+SN249gXLmawmwTVo3AhydVoVwgi/gbqutJV7YHrj0Y=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f21492b413295ab60f538d5e1812ab908e3e3292", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-22.05", + "type": "indirect" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..8f21716 --- /dev/null +++ b/flake.nix @@ -0,0 +1,89 @@ +{ + description = "My Nix Configuration"; + + inputs = { + nixpkgs.url = "nixpkgs/nixos-22.05"; + home-manager.url = "github:nix-community/home-manager/release-22.05"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { + nixpkgs, + home-manager, + ... + }: let + system = "x86_64-linux"; + + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = true; + }; + }; + + lib = nixpkgs.lib; + in { + homeManagerConfigurations = { + alejandro = home-manager.lib.homeManagerConfiguration { + inherit system pkgs; + username = "alejandro"; + homeDirectory = "/home/alejandro"; + stateVersion = "22.05"; + configuration = { + imports = [ + ./users/alejandro/home.nix + ]; + }; + }; + }; + + nixosConfigurations = { + virtual = lib.nixosSystem { + inherit system; + + modules = [ + ./system/virtual/configuration.nix + ]; + }; + + carbon = lib.nixosSystem { + inherit system; + + modules = [ + ./system/carbon/configuration.nix + ]; + }; + + gospel = lib.nixosSystem { + inherit system; + + modules = [ + ./system/gospel/configuration.nix + ]; + }; + }; + + devShells.${system} = { + default = pkgs.mkShell { + name = "nixosbuildshell"; + buildInputs = with pkgs; [ + git + git-crypt + nixFlakes + alejandra + pre-commit + ]; + + shellHook = '' + echo "You can apply this flake to your system with nixos-rebuild switch --flake .#" + + PATH=${pkgs.writeShellScriptBin "nix" '' + ${pkgs.nixFlakes}/bin/nix --experimental-features "nix-command flakes" "$@" + ''}/bin:$PATH + ''; + }; + }; + + formatter = pkgs.alejandra; + }; +} diff --git a/system/carbon/configuration.nix b/system/carbon/configuration.nix new file mode 100644 index 0000000..5d94b83 --- /dev/null +++ b/system/carbon/configuration.nix @@ -0,0 +1,177 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). +{ + config, + pkgs, + ... +}: { + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration-zfs.nix + ./zfs.nix + ./vpn.nix + ]; + + # Make ready for nix flakes + nix.package = pkgs.nixFlakes; + nix.extraOptions = '' + experimental-features = nix-command flakes + ''; + + networking = { + hostName = "carbon"; # Define your hostname. + networkmanager.enable = true; # Enables wireless support via wpa_supplicant. + + #wg-quick.interfaces = { + #wg0 = { + #address = [ "10.10.13.25/32" ]; + #dns = [ "192.168.113.69" ]; + #listenPort = 51820; + #privateKeyFile = "/home/alejandro/wireguard_keys/carbon.pub"; + + #peers = [ + #{ + #publicKey = "HGm7lx+DbACPxEN7gaiuz4XklV/RdzmBj//FBSO7QUU="; + #allowedIPs = [ "10.13.13.0/24" "192.168.113.0/24" ]; + #endpoint = "wg.kilonull.com:51820"; + #} + #]; + #}; + #}; + }; + + # Set your time zone. + time.timeZone = "America/Los_Angeles"; + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. + # i18n.defaultLocale = "en_US.UTF-8"; + # console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + # }; + + # Enable the X11 windowing system. + # services.xserver.enable = true; + + # Configure keymap in X11 + # services.xserver.layout = "us"; + # services.xserver.xkbOptions = "eurosign:e"; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound. + # sound.enable = true; + # hardware.pulseaudio.enable = true; + + # Enable touchpad support (enabled default in most desktopManager). + # services.xserver.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.alejandro = { + isNormalUser = true; + extraGroups = ["wheel" "video" "networkmanager"]; + shell = pkgs.zsh; + }; + + fonts.fonts = with pkgs; [ + (nerdfonts.override {fonts = ["Hack"];}) + ]; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + git + vim_configurable # Using this instead of vim for python3 support + wget + firefox + wl-clipboard + stow + tmux + zsh + home-manager + sanoid + killall + usbutils + # Below 3 installed for sanoid + pv + lzop + mbuffer + + # Installed for gammastep + geoclue2 + + wireguard-tools + + prusa-slicer + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + programs.zsh.enable = true; + + programs.light.enable = true; + + programs.sway = { + enable = true; + wrapperFeatures.gtk = true; # so that gtk works properly + extraPackages = with pkgs; [ + swaylock + swayidle + wl-clipboard + mako + alacritty + rofi + waybar + pavucontrol + ]; + }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + services.openssh.enable = true; + + services.avahi.enable = true; + services.geoclue2 = { + enable = true; + #appConfig."gammastep" = { + #isAllowed = true; + #isSystem = true; + #users = ["1000"]; + #}; + }; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "21.11"; # Did you read the comment? +} diff --git a/system/carbon/hardware-configuration-zfs.nix b/system/carbon/hardware-configuration-zfs.nix new file mode 100644 index 0000000..c23c901 --- /dev/null +++ b/system/carbon/hardware-configuration-zfs.nix @@ -0,0 +1,114 @@ +# 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 = "rpool_/nixos/ROOT/default"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/boot" = { + device = "bpool_/nixos/BOOT/default"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/home" = { + device = "rpool_/nixos/DATA/default/home"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/root" = { + device = "rpool_/nixos/DATA/default/root"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/srv" = { + device = "rpool_/nixos/DATA/default/srv"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/usr/local" = { + device = "rpool_/nixos/DATA/default/usr/local"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/var/log" = { + device = "rpool_/nixos/DATA/default/var/log"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/var/spool" = { + device = "rpool_/nixos/DATA/default/var/spool"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/nix" = { + device = "rpool_/nixos/DATA/local/nix"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/state" = { + device = "rpool_/nixos/DATA/default/state"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + fileSystems."/etc/nixos" = { + device = "/state/etc/nixos"; + fsType = "none"; + options = ["bind"]; + }; + + fileSystems."/etc/cryptkey.d" = { + device = "/state/etc/cryptkey.d"; + fsType = "none"; + options = ["bind"]; + }; + + fileSystems."/boot/efis/nvme-SAMSUNG_MZVLW256HEHP-000L7_S35ENX1K539085-part1" = { + device = "/dev/disk/by-uuid/F429-235F"; + fsType = "vfat"; + options = ["x-systemd.idle-timeout=1min" "x-systemd.automount" "noauto"]; + }; + + fileSystems."/boot/efis/nvme-WDC_PC_SN520_SDAPTUW-512G_182747800010-part1" = { + device = "/dev/disk/by-uuid/F429-AB41"; + fsType = "vfat"; + options = ["x-systemd.idle-timeout=1min" "x-systemd.automount" "noauto"]; + }; + + fileSystems."/var/lib/docker" = { + device = "rpool_/nixos/DATA/default/var/lib/docker"; + fsType = "zfs"; + options = ["zfsutil" "X-mount.mkdir"]; + }; + + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + # high-resolution display + hardware.video.hidpi.enable = lib.mkDefault true; +} diff --git a/system/carbon/vpn.nix b/system/carbon/vpn.nix new file mode 100644 index 0000000..b7dcc7a --- /dev/null +++ b/system/carbon/vpn.nix @@ -0,0 +1,25 @@ +{ + config, + pkgs, + ... +}: { + # enable the tailscale daemon; this will do a + # variety of tasks: + # 1. create the TUN network device + # 2. setup some IP routes to route through the TUN + services.tailscale = {enable = true;}; + + # Let's open the UDP port with which the network is tunneled through + networking.firewall.allowedUDPPorts = [41641]; + + # Disable SSH access through the firewall Only way into the machine will be + # through This may cause a chicken & egg problem since you need to register + # a machine first using `tailscale up` + # Better to rely on EC2 SecurityGroups + # services.openssh.openFirewall = false; + + # Let's make the tailscale binary avilable to all users + environment.systemPackages = [pkgs.tailscale]; + + # TODO: Enable SSH via tailscale +} diff --git a/system/carbon/zfs.nix b/system/carbon/zfs.nix new file mode 100644 index 0000000..591d638 --- /dev/null +++ b/system/carbon/zfs.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + ... +}: { + boot.supportedFilesystems = ["zfs"]; + networking.hostId = "b2d25606"; + boot.zfs.devNodes = "/dev/disk/by-id"; + boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; + swapDevices = [ + { + device = "/dev/disk/by-id/nvme-SAMSUNG_MZVLW256HEHP-000L7_S35ENX1K539085-part4"; + randomEncryption.enable = true; + } + { + device = "/dev/disk/by-id/nvme-WDC_PC_SN520_SDAPTUW-512G_182747800010-part4"; + randomEncryption.enable = true; + } + ]; + systemd.services.zfs-mount.enable = false; + environment.etc."machine-id".source = "/state/etc/machine-id"; + environment.etc."zfs/zpool.cache".source = "/state/etc/zfs/zpool.cache"; + boot.loader.efi.efiSysMountPoint = "/boot/efis/nvme-SAMSUNG_MZVLW256HEHP-000L7_S35ENX1K539085-part1"; + boot.loader.efi.canTouchEfiVariables = false; + ##if UEFI firmware can detect entries + #boot.loader.efi.canTouchEfiVariables = true; + + boot.loader = { + generationsDir.copyKernels = true; + ##for problematic UEFI firmware + grub.efiInstallAsRemovable = true; + grub.enable = true; + grub.version = 2; + grub.copyKernels = true; + grub.efiSupport = true; + grub.zfsSupport = true; + # for systemd-autofs + grub.extraPrepareConfig = '' + mkdir -p /boot/efis /boot/efi + for i in /boot/efis/*; do mount $i ; done + mount /boot/efi + ''; + grub.extraInstallCommands = '' + export ESP_MIRROR=$(mktemp -d -p /tmp) + cp -r /boot/efis/nvme-SAMSUNG_MZVLW256HEHP-000L7_S35ENX1K539085-part1/EFI $ESP_MIRROR + for i in /boot/efis/*; do + cp -r $ESP_MIRROR/EFI $i + done + rm -rf $ESP_MIRROR + ''; + grub.devices = [ + "/dev/disk/by-id/nvme-SAMSUNG_MZVLW256HEHP-000L7_S35ENX1K539085" + "/dev/disk/by-id/nvme-WDC_PC_SN520_SDAPTUW-512G_182747800010" + ]; + }; + users.users.root.initialHashedPassword = "$6$VOzIHqv12iJGQIFl$NQf1GeiGhtdLfZFmtZl4vab.xvtVvI7.5ty9zbMFI2dpmHoFdc6XnGwTlClVe./CbcrsQjtPpt7NKf0dNttcw."; + + services.zfs = { + autoScrub.enable = true; + autoSnapshot.enable = true; + }; +} diff --git a/system/gospel/configuration.nix b/system/gospel/configuration.nix new file mode 100644 index 0000000..f7bebde --- /dev/null +++ b/system/gospel/configuration.nix @@ -0,0 +1,129 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, pkgs, ... }: + +{ + imports = + [ # Include the results of the hardware scan. + ./hardware-configuration.nix ./zfs.nix ./vpn.nix + ]; + + hardware.opengl.enable = true; + + # Make ready for nix flakes + nix.package = pkgs.nixFlakes; + nix.extraOptions = '' + experimental-features = nix-command flakes + ''; + + networking.hostName = "gospel"; # Define your hostname. + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + # networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Set your time zone. + time.timeZone = "America/Los_Angeles"; + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. + # i18n.defaultLocale = "en_US.UTF-8"; + # console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + # useXkbConfig = true; # use xkbOptions in tty. + # }; + + # Enable the X11 windowing system. + + + + + # Configure keymap in X11 + # "eurosign:e"; + # "caps:escape" # map caps to escape. + # }; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound. + # sound.enable = true; + # hardware.pulseaudio.enable = true; + + # Enable touchpad support (enabled default in most desktopManager). + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.alejandro = { + isNormalUser = true; + extraGroups = ["wheel" "video" "networkmanager"]; + shell = pkgs.zsh; + }; + + programs.sway = { + enable = true; + wrapperFeatures.gtk = true; # so that gtk works properly + extraPackages = with pkgs; [ swaylock ]; + }; + + fonts.fonts = with pkgs; [ + (nerdfonts.override {fonts = ["Hack"];}) + ]; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. + wget + git + killall + usbutils + pavucontrol + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + services.openssh.enable = true; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Copy the NixOS configuration file and link it from the resulting system + # (/run/current-system/configuration.nix). This is useful in case you + # accidentally delete configuration.nix. + # system.copySystemConfiguration = true; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "22.05"; # Did you read the comment? + +} + diff --git a/system/gospel/hardware-configuration.nix b/system/gospel/hardware-configuration.nix new file mode 100644 index 0000000..b9dd936 --- /dev/null +++ b/system/gospel/hardware-configuration.nix @@ -0,0 +1,63 @@ +# 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 = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "rpool/nixos/root"; + fsType = "zfs"; options = [ "zfsutil" "X-mount.mkdir" ]; + }; + + fileSystems."/home" = + { device = "rpool/nixos/home"; + fsType = "zfs"; options = [ "zfsutil" "X-mount.mkdir" ]; + }; + + fileSystems."/var/lib" = + { device = "rpool/nixos/var/lib"; + fsType = "zfs"; options = [ "zfsutil" "X-mount.mkdir" ]; + }; + + fileSystems."/var/log" = + { device = "rpool/nixos/var/log"; + fsType = "zfs"; options = [ "zfsutil" "X-mount.mkdir" ]; + }; + + fileSystems."/boot" = + { device = "bpool/nixos/root"; + fsType = "zfs"; options = [ "zfsutil" "X-mount.mkdir" ]; + }; + + fileSystems."/boot/efis/nvme-WDC_WDS100T2B0C-00PXH0_21111Y801086-part1" = + { device = "/dev/disk/by-uuid/1443-371C"; + fsType = "vfat"; + }; + + fileSystems."/boot/efi" = + { device = "/boot/efis/nvme-WDC_WDS100T2B0C-00PXH0_21111Y801086-part1"; + fsType = "none"; + options = [ "bind" ]; + }; + + swapDevices = [ ]; + + # 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.eno1.useDHCP = lib.mkDefault true; + + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/system/gospel/vpn.nix b/system/gospel/vpn.nix new file mode 100644 index 0000000..291372a --- /dev/null +++ b/system/gospel/vpn.nix @@ -0,0 +1,23 @@ +{ + config, + pkgs, + ... +}: { + # enable the tailscale daemon; this will do a + # variety of tasks: + # 1. create the TUN network device + # 2. setup some IP routes to route through the TUN + services.tailscale = {enable = true;}; + + # Let's open the UDP port with which the network is tunneled through + networking.firewall.allowedUDPPorts = [41641]; + + # Disable SSH access through the firewall Only way into the machine will be + # through This may cause a chicken & egg problem since you need to register + # a machine first using `tailscale up` + # Better to rely on EC2 SecurityGroups + # services.openssh.openFirewall = false; + + # Let's make the tailscale binary avilable to all users + environment.systemPackages = [pkgs.tailscale]; +} diff --git a/system/gospel/zfs.nix b/system/gospel/zfs.nix new file mode 100644 index 0000000..e2f11a2 --- /dev/null +++ b/system/gospel/zfs.nix @@ -0,0 +1,34 @@ +{ config, pkgs, ... }: + +{ boot.supportedFilesystems = [ "zfs" ]; + networking.hostId = "f8616592"; + boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; +boot.loader.efi.efiSysMountPoint = "/boot/efi"; +boot.loader.efi.canTouchEfiVariables = false; +boot.loader.generationsDir.copyKernels = true; +boot.loader.grub.efiInstallAsRemovable = true; +boot.loader.grub.enable = true; +boot.loader.grub.version = 2; +boot.loader.grub.copyKernels = true; +boot.loader.grub.efiSupport = true; +boot.loader.grub.zfsSupport = true; +boot.loader.grub.extraPrepareConfig = '' + mkdir -p /boot/efis + for i in /boot/efis/*; do mount $i ; done + + mkdir -p /boot/efi + mount /boot/efi +''; +boot.loader.grub.extraInstallCommands = '' +ESP_MIRROR=$(mktemp -d) +cp -r /boot/efi/EFI $ESP_MIRROR +for i in /boot/efis/*; do + cp -r $ESP_MIRROR/EFI $i +done +rm -rf $ESP_MIRROR +''; +boot.loader.grub.devices = [ + "/dev/disk/by-id/nvme-WDC_WDS100T2B0C-00PXH0_21111Y801086" + ]; +users.users.root.initialHashedPassword = "$6$3Ps2Vmff.gUBkiCv$FCeCQjDvNTdWynQU81qtCXFHQht86w4unWNalUgkcyq7lkkI2klzRyTK3dZiQUjIrn8qPKtwJcY9SNdyE8v1L/"; +} diff --git a/system/virtual/configuration.nix b/system/virtual/configuration.nix new file mode 100644 index 0000000..2649abd --- /dev/null +++ b/system/virtual/configuration.nix @@ -0,0 +1,121 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). +{ + config, + pkgs, + ... +}: { + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; + + hardware.opengl.enable = true; + + # Make ready for nix flakes + nix.package = pkgs.nixFlakes; + nix.extraOptions = '' + experimental-features = nix-command flakes + ''; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + # networking.hostName = "nixos"; # Define your hostname. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + + # Set your time zone. + time.timeZone = "America/Los_Angeles"; + + # The global useDHCP flag is deprecated, therefore explicitly set to false here. + # Per-interface useDHCP will be mandatory in the future, so this generated config + # replicates the default behaviour. + networking.useDHCP = false; + networking.interfaces.enp1s0.useDHCP = true; + networking.hostName = "virtual"; + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. + # i18n.defaultLocale = "en_US.UTF-8"; + # console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + # }; + + # Enable the X11 windowing system. + # services.xserver.enable = true; + + # Configure keymap in X11 + # services.xserver.layout = "us"; + # services.xserver.xkbOptions = "eurosign:e"; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound. + # sound.enable = true; + # hardware.pulseaudio.enable = true; + + # Enable touchpad support (enabled default in most desktopManager). + # services.xserver.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.alejandro = { + isNormalUser = true; + extraGroups = ["wheel"]; # Enable ‘sudo’ for the user. + initialPassword = "test"; + shell = pkgs.zsh; + }; + + fonts.fonts = with pkgs; [ + (nerdfonts.override {fonts = ["Hack"];}) + ]; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. + wget + git + ripgrep + killall + # firefox + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + services.spice-vdagentd.enable = true; + + # Enable the OpenSSH daemon. + services.openssh = { + enable = true; + passwordAuthentication = true; + }; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "22.05"; # Did you read the comment? +} diff --git a/system/virtual/hardware-configuration.nix b/system/virtual/hardware-configuration.nix new file mode 100644 index 0000000..3507739 --- /dev/null +++ b/system/virtual/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 + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = ["ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-intel"]; + boot.extraModulePackages = []; + + hardware.opengl.enable = true; + fileSystems."/" = { + device = "/dev/disk/by-uuid/8468529a-7215-4da3-af26-0c7f859e77f4"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/BBE3-1963"; + fsType = "vfat"; + }; + + swapDevices = []; + + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..919cd48 --- /dev/null +++ b/update.sh @@ -0,0 +1,2 @@ +#!/bin/sh +nix flake update diff --git a/users/alejandro/alacritty.nix b/users/alejandro/alacritty.nix new file mode 100644 index 0000000..86accae --- /dev/null +++ b/users/alejandro/alacritty.nix @@ -0,0 +1,33 @@ +{ + config, + pkgs, + ... +}: { + home.packages = [pkgs.alacritty]; + + programs.alacritty = { + enable = true; + settings = { + window.opacity = 0.98; + font = { + size = 11.0; + normal = { + family = "Hack Nerd Font"; + style = "Regular"; + }; + bold = { + family = "Hack Nerd Font"; + style = "Bold"; + }; + italic = { + family = "Hack Nerd Font"; + style = "Italic"; + }; + bold_italic = { + family = "Hack Nerd Font"; + style = "Bold Italic"; + }; + }; + }; + }; +} diff --git a/users/alejandro/git.nix b/users/alejandro/git.nix new file mode 100644 index 0000000..9c23500 --- /dev/null +++ b/users/alejandro/git.nix @@ -0,0 +1,56 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [ + git + git-crypt + ]; + + programs.git = { + delta = { + enable = true; + options = { + line-numbers = true; + navigate = true; + }; + }; + + enable = true; + userName = "Alejandro Angulo"; + userEmail = "iam@alejandr0angul0.dev"; + + aliases = { + lol = "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"; + pushup = "push -u origin HEAD"; + }; + + ignores = [ + # PyCharm + ".idea/" + + # Vim artifacts + "*.swp" + "*.swo" + "tags" + ".vimspector.json" + ".vimlocal" + "Session.vim*" + + # direnv + ".envrc" + ".direnv" + ]; + + extraConfig = { + init = { + defaultBranch = "main"; + }; + + pull = { + rebase = true; + }; + }; + }; +} diff --git a/users/alejandro/gpg.nix b/users/alejandro/gpg.nix new file mode 100644 index 0000000..d4d24c0 --- /dev/null +++ b/users/alejandro/gpg.nix @@ -0,0 +1,19 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [ + gnupg + pinentry-curses + ]; + + programs.gpg = { + enable = true; + }; + + services.gpg-agent = { + enable = true; + pinentryFlavor = "curses"; + }; +} diff --git a/users/alejandro/home.nix b/users/alejandro/home.nix new file mode 100644 index 0000000..57c6469 --- /dev/null +++ b/users/alejandro/home.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + ... +}: { + imports = [ + ./alacritty.nix + ./git.nix + ./git.nix + ./mako.nix + ./rofi.nix + ./sway/sway.nix + ./tmux.nix + ./vim/vim.nix + ./zsh.nix + ]; + + # Home Manager needs a bit of information about you and the + # paths it should manage. + home.username = "alejandro"; + home.homeDirectory = "/home/alejandro"; + + home.packages = with pkgs; [ + kitty + signal-desktop + nodejs # For vim's CoC plugin + pamixer # For sway binding to control audio + # TODO: Remove this? Need to add programs.light.enable in system config + #light # For sway binding to control backlight + #swaynagmode + python310 + gammastep + super-slicer + + firefox + + kanshi + #pkgs.busybox + + playerctl + ]; + + services.gammastep = { + enable = true; + provider = "geoclue2"; + #latitude = 34.0; + #longitude = -118.4; + }; + + # This value determines the Home Manager release that your + # configuration is compatible with. This helps avoid breakage + # when a new Home Manager release introduces backwards + # incompatible changes. + # + # You can update Home Manager without changing this value. See + # the Home Manager release notes for a list of state version + # changes in each release. + home.stateVersion = "22.05"; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; +} diff --git a/users/alejandro/mako.nix b/users/alejandro/mako.nix new file mode 100644 index 0000000..ebee882 --- /dev/null +++ b/users/alejandro/mako.nix @@ -0,0 +1,24 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [ + mako + libnotify + ]; + # TODO: Add hack nerd font + + programs.mako = { + enable = true; + + font = "'Hack Nerd Font' Regular 9"; + + backgroundColor = "#1D2021F0"; + textColor = "#FFFFDF"; + borderColor = "#1C1C1C"; + borderRadius = 10; + + padding = "10"; + }; +} diff --git a/users/alejandro/rofi.nix b/users/alejandro/rofi.nix new file mode 100644 index 0000000..0bb0075 --- /dev/null +++ b/users/alejandro/rofi.nix @@ -0,0 +1,17 @@ +{ + config, + pkgs, + ... +}: { + home.packages = [pkgs.rofi]; + # TODO: Add Hack Nerd Font + + programs.rofi = { + enable = true; + font = "Hack Nerd Font 10"; + theme = "gruvbox-dark-hard"; + extraConfig = { + show-icons = true; + }; + }; +} diff --git a/users/alejandro/sway/keybindings.nix b/users/alejandro/sway/keybindings.nix new file mode 100644 index 0000000..3393ea0 --- /dev/null +++ b/users/alejandro/sway/keybindings.nix @@ -0,0 +1,160 @@ +{ + config, + pkgs, + ... +}: let + cfg = config.wayland.windowManager.sway.config; + nag = "swaynag"; + leaveModeKeys = { + "Insert" = "mode default"; + "Escape" = "mode default"; + "Return" = "mode default"; + }; +in { + config.wayland.windowManager.sway.config = { + modes = { + resize = + { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + "${cfg.left}" = "resize shrink width 50px"; + "${cfg.down}" = "resize grow height 50px"; + "${cfg.up}" = "resize shrink height 50px"; + "${cfg.right}" = "resize grow width 50px"; + + # Ditto, with arrow keys + "Left" = "resize shrink width 50px"; + "Down" = "resize grow height 50px"; + "Up" = "resize shrink height 50px"; + "Right" = "resize grow width 50px"; + } + // leaveModeKeys; + + nag = { + "Ctrl+d" = "mode default"; + + "Ctrl+c" = "exec ${nag} --exit"; + "q" = "exec ${nag} --exit"; + "Escape" = "exec ${nag} --exit"; + + "Return" = "exec ${nag} --confirm"; + + "j" = "exec ${nag} --next"; + "Tab" = "exec ${nag} --next"; + "Up" = "exec ${nag} --next"; + + "k" = "exec ${nag} --prev"; + "Shift+Tab" = "exec ${nag} prev"; + "Down" = "exec ${nag} prev"; + }; + }; + + keybindings = { + # Activate modes + "${cfg.modifier}+s" = "mode resize"; + + # Misc + "${cfg.modifier}+Return" = "exec ${cfg.terminal}"; + "${cfg.modifier}+c" = "kill"; + "${cfg.modifier}+p" = "exec ${cfg.menu}"; + "${cfg.modifier}+z" = "reload"; + "${cfg.modifier}+x" = "exec swaylock -i ${config.home.homeDirectory}/wallpaper.png"; + + # Volume control + "XF86AudioRaiseVolume" = " exec 'pamixer --increase 5'"; + "XF86AudioLowerVolume" = " exec 'pamixer --decrease 5'"; + "XF86AudioMute" = " exec 'pamixer --toggle-mute'"; + + # Music player control + "XF86AudioPrev" = "exec 'playerctl previous'"; + "XF86AudioNext" = "exec 'playerctl next'"; + "XF86AudioPlay" = "exec 'playerctl play-pause'"; + "${cfg.modifier}+Down" = "exec 'playerctl pause'"; + "${cfg.modifier}+Up" = "exec 'playerctl play'"; + "${cfg.modifier}+Right" = "exec 'playerctl next'"; + "${cfg.modifier}+Left" = "exec 'playerctl previous'"; + + # Backlight keys + "XF86MonBrightnessDown" = "exec 'light -U 5'"; + "XF86MonBrightnessUp" = "exec 'light -A 5'"; + + # Navigation + + ## Focus + + ### Move your focus around + "${cfg.modifier}+${cfg.left}" = "focus left"; + "${cfg.modifier}+${cfg.down}" = "focus down"; + "${cfg.modifier}+${cfg.up}" = "focus up"; + "${cfg.modifier}+${cfg.right}" = "focus right"; + + ### Move the focused window with the same, but add Shift + "${cfg.modifier}+Shift+${cfg.left}" = "move left"; + "${cfg.modifier}+Shift+${cfg.down}" = "move down"; + "${cfg.modifier}+Shift+${cfg.up}" = "move up"; + "${cfg.modifier}+Shift+${cfg.right}" = "move right"; + + ## Workspaces + + ### Switch to a workspace + "${cfg.modifier}+q" = "workspace number 1"; + "${cfg.modifier}+w" = "workspace number 2"; + "${cfg.modifier}+e" = "workspace number 3"; + "${cfg.modifier}+r" = "workspace number 4"; + "${cfg.modifier}+t" = "workspace number 5"; + "${cfg.modifier}+y" = "workspace number 6"; + "${cfg.modifier}+u" = "workspace number 7"; + "${cfg.modifier}+i" = "workspace number 8"; + "${cfg.modifier}+o" = "workspace number 9"; + + ### Move focused container to workspace + "${cfg.modifier}+Shift+q" = "move container to workspace number 1"; + "${cfg.modifier}+Shift+w" = "move container to workspace number 2"; + "${cfg.modifier}+Shift+e" = "move container to workspace number 3"; + "${cfg.modifier}+Shift+r" = "move container to workspace number 4"; + "${cfg.modifier}+Shift+t" = "move container to workspace number 5"; + "${cfg.modifier}+Shift+y" = "move container to workspace number 6"; + "${cfg.modifier}+Shift+u" = "move container to workspace number 7"; + "${cfg.modifier}+Shift+i" = "move container to workspace number 8"; + "${cfg.modifier}+Shift+o" = "move container to workspace number 9"; + + # Layout + + ## Split direction + "${cfg.modifier}+v" = "splith"; + "${cfg.modifier}+g" = "splitv"; + + ## Switch the current container between different layout styles + "${cfg.modifier}+b" = "layout stacking"; + "${cfg.modifier}+n" = "layout tabbed"; + "${cfg.modifier}+m" = "layout toggle split"; + + ## Make the current focus fullscreen + "${cfg.modifier}+f" = "fullscreen"; + + ## move container between displays + "${cfg.modifier}+semicolon" = "move workspace to output right"; + + ## Toggle the current focus between tiling and floating mode + "${cfg.modifier}+Shift+f" = "floating toggle"; + + ## Swap focus between the tiling area and the floating area + "${cfg.modifier}+space" = "focus mode_toggle"; + + ## Move focus to the parent container + "${cfg.modifier}+a" = "focus parent"; + + # Scratchpad + # Move the currently focused window to the scratchpad + "${cfg.modifier}+Shift+minus" = "move scratchpad"; + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + "${cfg.modifier}+minus" = "scratchpad show"; + + # Exit sway (logs you out of your Wayland session) + "${cfg.modifier}+Shift+z" = "exec ${nag} -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit' -b 'Reload' 'swaymsg reload'"; + }; + }; +} diff --git a/users/alejandro/sway/sway.nix b/users/alejandro/sway/sway.nix new file mode 100644 index 0000000..94c891e --- /dev/null +++ b/users/alejandro/sway/sway.nix @@ -0,0 +1,88 @@ +{ + config, + pkgs, + ... +}: { + imports = [ + ./keybindings.nix + ./waybar.nix + ]; + + home.packages = with pkgs; [ + #light # TODO: Not enough to have this package, need it enabled in system config. + pamixer + playerctl + rofi + swaylock + wl-clipboard + ]; + + services.playerctld.enable = true; + + services.swayidle = { + timeouts = [ + { + timeout = 300; + command = "${pkgs.swaylock}/bin/swaylock -i ${config.home.homeDirectory}/wallpaper.png"; + } + { + timeout = 600; + command = "${pkgs.swaymsg}/bin/swaymsg 'ouput * dpms off'"; + resumeCommand = "${pkgs.swaymsg}/bin/swaymsg 'output * dpms on'"; + } + ]; + events = [ + { + event = "before-sleep"; + command = "${pkgs.swaylock}/bin/swaylock"; + } + ]; + }; + + wayland.windowManager.sway = { + enable = true; + swaynag.enable = true; + wrapperFeatures.gtk = true; # so that gtk works properly + + config = { + modifier = "Mod4"; + terminal = "alacritty"; # TODO: include in packages above? + menu = "rofi -show run"; + + colors = { + focused = { + border = "#484848"; + background = "#2B3C44"; + text = "#FFFFFF"; + indicator = "#333333"; + childBorder = "#000000"; + }; + focusedInactive = { + border = "#484848"; + background = "#333333"; + text = "#FFFFFF"; + indicator = "#000000"; + childBorder = "#000000"; + }; + unfocused = { + border = "#484848"; + background = "#333333"; + text = "#FFFFFF"; + indicator = "#000000"; + childBorder = "#000000"; + }; + }; + + output = { + "*".bg = "${config.home.homeDirectory}/wallpaper.png fill"; + "eDP-1".scale = "1"; + + "Dell Inc. DELL S2721QS 47W7M43" = { + transform = "270"; + position = "1920 0"; + }; + "Dell Inc. DELL S2721QS 4FR7M43".position = "4080 830"; + }; + }; + }; +} diff --git a/users/alejandro/sway/waybar.nix b/users/alejandro/sway/waybar.nix new file mode 100644 index 0000000..ba033a7 --- /dev/null +++ b/users/alejandro/sway/waybar.nix @@ -0,0 +1,148 @@ +{ + config, + pkgs, + options, + ... +}: { + home.packages = with pkgs; [ + #pactl + waybar + ]; + + programs.waybar = { + enable = true; + systemd.enable = true; + + style = builtins.readFile ./waybar_style.css; + + settings = [ + { + layer = "top"; + position = "top"; + height = 20; + modules-left = ["sway/workspaces"]; + modules-center = ["clock"]; + modules-right = [ + "idle_inhibitor" + "temperature" + "cpu" + "pulseaudio" + "battery" + "memory" + "backlight" + "network" + "tray" + ]; + + "sway/workspaces" = { + disable-scroll = false; + all-outputs = true; + format = "{icon}"; + format-icons = { + "1" = "q"; + "2" = "w"; + "3" = "e"; + "4" = "r"; + "5" = "t"; + "6" = "y"; + "7" = "u"; + "8" = "i"; + "9" = "o"; + urgent = " "; + focused = " "; + default = " "; + }; + }; + + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = " "; + deactivated = " "; + }; + }; + + temperature = { + critical-threshold = 80; + format = "{temperatureC}°C {icon}"; + format-icons = [" " " " " "]; + }; + + cpu = { + format = "{usage}%  "; + tooltip = false; + }; + + pulseaudio = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{icon} {volume}% {format_source}"; + format-bluetooth-muted = "  {volume}% {format_source}"; + format-muted = " {format_source}"; + format-source = " "; + format-source-muted = " "; + format-icons = { + headphone = " "; + hands-free = " "; + headset = " "; + phone = " "; + portable = " "; + car = " "; + default = [" " " " " "]; + }; + tooltip-format = "{desc}, {volume}%"; + # TODO: Figure out how to get pactl binary? + on-click = "pactl set-sink-mute @DEFAULT_SINK@ toggle"; + on-click-right = "pactl set-source-mute @DEFAULT_SOURCE@ toggle"; + on-click-middle = "pavucontrol"; + }; + + battery = { + states = { + warning = 30; + critical = 1; + }; + format = "{icon} {capacity}%"; + tooltip-format = "{timeTo}, {capacity}%"; + format-charging = " {capacity}%"; + format-plugged = " "; + format-alt = "{time} {icon}"; + format-icons = ["" "" "" "" ""]; + }; + + memory = { + format = "{}%  "; + }; + + backlight = { + format = "{icon} {percent}%"; + format-icons = [" " " "]; + on-scroll-up = "light -A 1"; + on-scroll-down = "light -U 1"; + }; + + network = { + format-wifi = "直 "; + format-ethernet = "{ifname}: {ipaddr}/{cidr}  "; + format-linked = "{ifname} (No IP)  "; + format-disconnected = "睊 "; + format-alt = "{ifname}: {ipaddr}/{cidr}"; + tooltip-format = "{essid} {signalStrength}%"; + }; + + tray = { + spacing = 10; + }; + } + ]; + }; + + wayland.windowManager.sway.config.bars = []; + #wayland.windowManager.sway.config.bars = [ + #{ + #position = "top"; + #statusCommand = "${pkgs.waybar}/bin/waybar"; + #workspaceNumbers = false; + #workspaceButtons = false; + #} + #]; +} diff --git a/users/alejandro/sway/waybar_style.css b/users/alejandro/sway/waybar_style.css new file mode 100644 index 0000000..735be25 --- /dev/null +++ b/users/alejandro/sway/waybar_style.css @@ -0,0 +1,132 @@ +* { + border: none; + font-family: Hack Nerd Font, sans-serif; + font-size: 10px; +} + +window#waybar { + background-color: rgba(29, 32, 33, 0.9); + border-bottom: 3px solid #1d2021; + color: #ffffdf; + transition-property: background-color; + transition-duration: .5s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +#workspaces, +#mode, +#cpu, +#memory, +#temperature, +#clock, +#idle_inhibitor, +#language, +#pulseaudio, +#backlight, +#battery, +#network, +#tray { + background-color: #303030; + padding: 0 10px; + margin: 3px; + border: 3px solid rgba(0, 0, 0, 0); + border-radius: 90px; + background-clip: padding-box; +} + +#workspaces button { + padding: 0 5px; + min-width: 20px; + color: #87afaf; +} + +#workspaces button:hover { + background-color: rgba(0, 0, 0, 1) +} + +#workspaces button.focused { + color: #ffaf00; +} + +#workspaces button.urgent { + color: #e06c75; +} + +#clock { + color: #61afef; +} + +#idle_inhibitor { + color: #abb2bf; +} + +#idle_inhibitor.activated { + background-color: #abb2bf; + color: #1e222a; +} + +#temperature { + color: #fb4934; +} + +#temperature.critical { + color: #1d2021; + background-color: #9d0006; +} + +#cpu { + color: #ff8700; +} + +#memory { + color: #87af87; +} + +#battery { + color: #b8bb26; +} + +#battery.charging, #battery.plugged { + background-color: #1f321c; + color: #ffffaf; +} + +@keyframes blink { + to { + background-color: #1f321c; + color: #ffffaf; + } +} + +#battery.critical:not(.charging) { + background-color: #afaf00; + color: #303030; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#pulseaudio { + color: #fabd2f; +} + +#pulseaudio.muted { + color: #b57614; +} + +#backlight { + color: #17ccd5; +} + +#network { + color: #d787af; +} + +#network.disconnected { + color: #875f87; +} diff --git a/users/alejandro/tmux.nix b/users/alejandro/tmux.nix new file mode 100644 index 0000000..b93f154 --- /dev/null +++ b/users/alejandro/tmux.nix @@ -0,0 +1,68 @@ +{ + config, + pkgs, + ... +}: { + programs.tmux = { + enable = true; + keyMode = "vi"; + newSession = true; + sensibleOnTop = true; + terminal = "screen-256color"; + + plugins = with pkgs.tmuxPlugins; [ + { + plugin = resurrect; + extraConfig = '' + set -g @resurrect-capture-pane-contents 'on' + set -g @resurrect-strategy-vim 'session' + ''; + } + { + plugin = vim-tmux-navigator; + extraConfig = '' + ''; + } + ]; + + extraConfig = '' + # Color fix + # set-option -ga terminal-overrides ",alacritty:Tc,xterm-256color:Tc" + + # Scrolling with mouse wheel scrolls output instead of previous commands + setw -g mouse on + + # Open panes in the same directory + bind c new-window -c "#{pane_current_path}" + bind '"' split-window -c "#{pane_current_path}" + bind % split-window -h -c "#{pane_current_path}" + + # Eye Candy + # set -g @plugin 'mattdavis90/base16-tmux' + # set -g @colors-base16 'darktooth' + + # Integration with tmuxline.vim + source-file ~/theme + + # Smart pane switching with awareness of Vim splits. + # See: https://github.com/christoomey/vim-tmux-navigator + is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ + | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?\\.?g?(view|n?vim?x?)(-wrapped)?(diff)?$'" + bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L' + bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D' + bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U' + bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R' + tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")' + if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \ + "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'" + if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \ + "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'" + + bind-key -T copy-mode-vi 'C-h' select-pane -L + bind-key -T copy-mode-vi 'C-j' select-pane -D + bind-key -T copy-mode-vi 'C-k' select-pane -U + bind-key -T copy-mode-vi 'C-l' select-pane -R + bind-key -T copy-mode-vi 'C-\' select-pane -l + ''; + }; +} diff --git a/users/alejandro/vim/vim.nix b/users/alejandro/vim/vim.nix new file mode 100644 index 0000000..7861a57 --- /dev/null +++ b/users/alejandro/vim/vim.nix @@ -0,0 +1,166 @@ +{ + config, + pkgs, + ... +}: { + # home.packages = [ pkgs.vim ]; + home.packages = [pkgs.fzf]; + + programs.vim = { + enable = true; + + plugins = with pkgs.vimPlugins; [ + base16-vim + vim-airline + vim-airline-themes + vim-devicons + tmuxline-vim + + gitgutter + fugitive + rhubarb + + fzf-vim + + nerdcommenter + nerdtree + + tmux-navigator + + vimspector + + ale + coc-nvim + # TODO: Add coc plugins + + vim-obsession + ]; + + extraConfig = '' + set tabstop=4 + set shiftwidth=4 + set mouse=a + set ttymouse=sgr + set mousemodel=popup_setpos + set updatetime=100 + set expandtab + set number + set autoindent + set laststatus=2 + set encoding=utf-8 + syntax on + + let mapleader = "'" + + " ALE (need to happen before ALE loaded) + let g:ale_display_lsp = 1 + + filetype plugin indent on + + " Use tabs for makefile + autocmd Filetype make setlocal noexpandtab + + " Toggle line highlighting based on focus + autocmd BufEnter * setlocal cursorline + autocmd BufLeave * setlocal nocursorline + + " airline + let g:airline_theme='base16_vim' + let g:airline_powerline_fonts = 1 + + " Colorscheme + if !exists('g:colors_name') || g:colors_name != 'base16-darktooth' + set background=dark + let base16colorspace=256 + colorscheme base16-darktooth + hi Normal ctermbg=NONE guibg=NONE + endif + + " Toggle relative line numbers + nmap num :set invrelativenumber + + " Tab completion + set wildmode=longest,list,full + set wildmenu + + " Move splits + function! MarkWindowSwap() + let g:markedWinNum = winnr() + endfunction + + function! DoWindowSwap() + " Mark destination + let curnum = winnr() + let curBut = bufnr( "%" ) + " Switch to source and shuffle dest->source + let markedBuf = bufnr( "%" ) + " Hide and open so that we aren't prompted and keep history + exe 'hide buf' curBuf + " Switch to dest and shuffle source->dest + exe curnum . "wincmd w" + " Hide and open so that we aren't prompted and keep history + exe 'hide buf' markedBuf + endfunction + + nmap mv :call MarkWindowSwap() + nmap pw :call DoWindowSwap() + + " NERDTree + nnoremap n :NERDTreeFocus + nnoremap :NERDTree + nnoremap :NERDTreeToggle + nnoremap :NERDTreeFind + + let g:NERDTreeQuitOnOpen = 1 + let g:NERDTreeShowHidden = 1 + + " vimspector + let g:vimspector_enable_mappings = 'HUMAN' + let g:vimspector_enable_gadgets = ['debugpy', 'CodeLLDB'] + let g:vimspector_base_dir = expand('$HOME/.vim/bundle/vimspector') + + nmap di VimspectorBalloonEval + xmap di VimspectorBalloonEval + + " fzf + nnoremap :GFiles + nnoremap :Rg + + " coc.nvim + inoremap pumvisible() ? "\" : "\u\" + + " use for trigger completion and navigate to the next complete item + function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~ '\s' + endfunction + + inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() + + " uses tab and shift-tab to navigate completion list + inoremap pumvisible() ? "\" : "\" + inoremap pumvisible() ? "\" : "\" + + nnoremap cmd :CocCommand + nnoremap cfg :CocConfig + nnoremap def :call CocAction('jumpDefinition') + nnoremap fmt :call CocActionAsync('format') + noremap bro :GBrowse + + " GoTo code navigation. + nmap gd (coc-definition) + nmap gs :call CocAction('jumpDefinition', 'split') + nmap gv :call CocAction('jumpDefinition', 'vsplit') + nmap gn :call CocAction('jumpDefinition', 'tabe') + nmap gy (coc-type-definition) + nmap gi (coc-implementation) + nmap gr (coc-references) + + " Project-specific config + silent! so .vimlocal + ''; + }; +} diff --git a/users/alejandro/zsh.nix b/users/alejandro/zsh.nix new file mode 100644 index 0000000..4cfa3d0 --- /dev/null +++ b/users/alejandro/zsh.nix @@ -0,0 +1,72 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [ + # TODO: Should zsh be added here if already part of system configuration? + #zsh + ripgrep + bat + htop + ranger + lsd + ]; + + programs.direnv = { + enable = true; + enableZshIntegration = true; + }; + + programs.zsh = { + enable = true; + enableAutosuggestions = true; + enableCompletion = true; + envExtra = '' + export PATH=~/.local/bin:$PATH + export EDITOR=vim + ''; + initExtra = '' + base16_darktooth + source ~/.p10k.zsh + bindkey -v + bindkey '^R' history-incremental-search-backward + alias view="vim -R $1" + alias ls=lsd + alias l=ls + ''; + + plugins = with pkgs; [ + { + name = "zsh-syntax-highlighting"; + src = fetchFromGitHub { + owner = "zsh-users"; + repo = "zsh-syntax-highlighting"; + rev = "0.6.0"; + sha256 = "0zmq66dzasmr5pwribyh4kbkk23jxbpdw4rjxx0i7dx8jjp2lzl4"; + }; + file = "zsh-syntax-highlighting.zsh"; + } + { + name = "powerlevel10k"; + src = fetchFromGitHub { + owner = "romkatv"; + repo = "powerlevel10k"; + rev = "v1.16.1"; + sha256 = "0fkfh8j7rd8mkpgz6nsx4v7665d375266shl1aasdad8blgqmf0c"; + }; + file = "powerlevel10k.zsh-theme"; + } + { + name = "base16-shell"; + src = fetchFromGitHub { + owner = "chriskempson"; + repo = "base16-shell"; + rev = "ce8e1e540367ea83cc3e01eec7b2a11783b3f9e1"; + sha256 = "1yj36k64zz65lxh28bb5rb5skwlinixxz6qwkwaf845ajvm45j1q"; + }; + file = "base16-shell.plugin.zsh"; + } + ]; + }; +}