.dotfiles/Wiki.org

17 KiB

Useful Nix bits

This pages houses a few configuration snippets that might be useful if you are new to the nix ecosystem. It will be infrequently updated as I come across things that I deem to be interesting to such a reader.

Importing a NixOS module that is not in nixpkgs

This requires changes in multiple locations. As an example we will use an early version of the mautrix-signal module by Niklas Korz.

  1. Add the module source to flake.nix:

      {
        inputs = {
          [...]
            # provides expressions for mautrix-signal
            nixpkgs-mautrix-signal ={
            url = github:niklaskorz/nixpkgs/nixos-23.11-mautrix-signal;
          };
          [...]
        };
    
        outputs = inputs@{
          self,
            [...]
              nixpkgs-mautrix-signal,
            [...]
        }: let
          [...]
            pkgsmautrix = import nixpkgs-mautrix-signal { inherit system;
                                                          config.allowUnfree = true;
                                                        };
          [...]
        in {
          nixosConfigurations = {
            matrix = nixpkgs.lib.nixosSystem {
              pkgs = pkgsmautrix;
              # this is to import a service module that is not on nixpkgs
              # this way avoids infinite recursion errors
              specialArgs.unstable = nixpkgs-mautrix-signal;
              modules = [
                [...]
              ];
            };
          };
        }
      }
  2. Import the module in the configuration:

      [...]
        imports = [
        [...]
        (unstable + "/nixos/modules/services/matrix/mautrix-signal.nix")
      ];
    
      [...]

Build a firefox addon

  1. app id can be found in the manifest.json file of the .xpi (.xpi is just a normal archive)
  2. url can be found by copy url of the "add extension" button on the addon page
  3. the rest of the information is also found in the manifest.json, but might not be needed
  programs.firefox = {
    [...]
     profiles.default = {
       [...]
       extensions = with pkgs.nur.repos.rycee.firefox-addons; [
         [...]
         (buildFirefoxXpiAddon {
           pname = ":emoji:";
           version = "0.1.3";
           addonId = "gonelf@gmail.com";
           url = "https://addons.mozilla.org/firefox/downloads/file/3365324/emojidots-0.1.3.xpi";
           sha256 = "4f7cc25c478fe52eb82f37c9ff4978dcaa3f95020398c5b184e517f6efa2c201";
           meta = with lib;
             {
               description = "emoji autocomplete anywhere on the internet";
               mozPermissions = [ "https://gist.githubusercontent.com/gonelf/d8ae3ccb7902b501c4a5dd625d4089da/raw/5eeda197ba92f8c8139e846a1225d5640077e06f/emoji_pretty.json" "tabs" "storage"];
               platforms = platforms.all;
             };
         })
   [...]

Define shell utility as package

  home.packages = with pkgs; [ # or for NixOS environment.systemPackages = with pkgs; [
    [...]
    (pkgs.writeShellApplication {
        name = "pass-fuzzel";
        runtimeInputs = [ pkgs.pass pkgs.fuzzel ];
        text = ''
         shopt -s nullglob globstar

         typeit=0
         if [[ $# -ge 1 && $1 == "--type" ]]; then
           typeit=1
           shift
         fi

         export PASSWORD_STORE_DIR=~/.local/share/password-store
         prefix=''${PASSWORD_STORE_DIR-~/.local/share/password-store}
         password_files=( "$prefix"/**/*.gpg )
         password_files=( "''${password_files[@]#"$prefix"/}" )
         password_files=( "''${password_files[@]%.gpg}" )

         password=$(printf '%s\n' "''${password_files[@]}" | fuzzel --dmenu "$@")

         [[ -n $password ]] || exit

         if [[ $typeit -eq 0 ]]; then
           pass show -c "$password" &>/tmp/pass-fuzzel
         else
           pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } | wtype -
         fi
         notify-send -u critical -a pass -t 1000 "Copied/Typed Password"
       '';
      })

    [...]

Add program with prebuild binaries to nix store

  home.packages = with pkgs; [ # or for NixOS environment.systemPackages = with pkgs; [
    [...]
     (stdenv.mkDerivation {
      name = "oama";

      src = pkgs.fetchurl {
          name = "oama";
          url = "https://github.com/pdobsan/oama/releases/download/0.13.1/oama-0.13.1-Linux-x86_64-static.tgz";
          sha256 = "sha256-OTdCObVfnMPhgZxVtZqehgUXtKT1iyqozdkPIV+i3Gc=";
      };

      phases = [
        "unpackPhase"
      ];

      unpackPhase = ''
      mkdir -p $out/bin
      tar xvf $src -C $out/
      mv $out/oama-0.13.1-Linux-x86_64-static/oama $out/bin/
      '';

  })

    [...]

let-block for overriding a package in nixpkgs (here: replacing airsonic with airsonic-advanced)

This can be useful if a module does not let you use your own package yourself.

  pkgs = import nixpkgs { inherit system;
                          overlays = [ emacs-overlay.overlay
                                       nur.overlay
                                       nixgl.overlay
                                       (self: super: {
                                         airsonic = super.airsonic.overrideAttrs (_: rec {
                                           version = "11.0.2-kagemomiji";
                                           name = "airsonic-advanced-${version}";
                                           src = super.fetchurl {
                                             url = "https://github.com/kagemomiji/airsonic-advanced/releases/download/11.0.2/airsonic.war";
                                             sha256 = "PgErtEizHraZgoWHs5jYJJ5NsliDd9VulQfS64ackFo=";
                                           };
                                         });
                                       })
                                     ];
                          config.allowUnfree = true;
                        };

Reference configurations

Configurations that I have retired or are there for the general study.

non-nixos

My Surface Pro 3, only used for on-the-go university work. Be careful when pushing large changes to this machine, as it easily runs out of memory on large switches. At the moment the only machine running non-NixOS, so special care must be taken not to break this one during updates.

Channel setup

This installs nixGL, which is needed to run GL apps installed through home-manager, since this machine is not using NixOS.

This is not super clean (because it is not fully replicative), but I do not really care.

  1. Install nixGL:
  nix-channel --add https://github.com/guibou/nixGL/archive/main.tar.gz nixgl && nix-channel --update
    nix-env -iA nixgl.auto.nixGLDefault   # or replace `nixGLDefault` with your desired wrapper

This is needed in order to use EGL. Prefix programs that use it with `nixGL`

Home manager

Special things to note here: We are running xcape to allow CAPS to act as CTRL and ESC. Also we are using nixGL in most places.

  { config, pkgs, lib, fetchFromGitHub, ... }:

  {
    programs.home-manager.enable = true;
    home.username = "leons";
    home.homeDirectory = "/home/leons";

    home.stateVersion = "23.05"; # Please read the comment before changing.

     stylix.image = ../../wallpaper/surfacewp.png;
    <<theme>>

    nixpkgs = {
      config = {
        allowUnfree = true;
        allowUnfreePredicate = (_: true);
      };
    };
    services.xcape = {
      enable = true;
      mapExpression = {
        Control_L = "Escape";
      };
    };
    #keyboard config
    home.keyboard.layout = "us";

    sops.age.sshKeyPaths = [ "${config.home.homeDirectory}/.ssh/sops" ];

    # waybar config
    programs.waybar.settings.mainBar.cpu.format = "{icon0} {icon1} {icon2} {icon3}";

    programs.waybar.settings.mainBar.temperature.hwmon-path = "/sys/devices/platform/coretemp.0/hwmon/hwmon3/temp3_input";
    programs.waybar.settings.mainBar.modules-right = ["custom/outer-left-arrow-dark" "mpris" "custom/left-arrow-light"
                                                      "network"
                                                      "custom/left-arrow-dark"
                                                      "pulseaudio"
                                                      "custom/left-arrow-light"
                                                      "battery"
                                                      "custom/left-arrow-dark"
                                                      "temperature"
                                                      "custom/left-arrow-light"
                                                      "disk"
                                                      "custom/left-arrow-dark"
                                                      "memory"
                                                      "custom/left-arrow-light"
                                                      "cpu"
                                                      "custom/left-arrow-dark"
                                                      "tray"
                                                      "custom/left-arrow-light"
                                                      "clock#2"
                                                      "custom/left-arrow-dark"
                                                      "clock#1" ];
    services.blueman-applet.enable = true;
    home.packages = with pkgs; [
      # nixgl.auto.nixGLDefault
      evince
      # nodejs_20

      # messaging
      # we use gomuks for RAM preservation, but keep schildi around for files and images
    ];

    programs.zsh.initExtra = "
  export GPG_TTY=\"$(tty)\"
  export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
  gpgconf --launch gpg-agent
        ";

    # sway config
    wayland.windowManager.sway= {
      config = rec {
        input = {
          "*" = {
            xkb_layout = "us";
            xkb_options = "ctrl:nocaps,grp:win_space_toggle";
            xkb_variant = "altgr-intl";
          };
          "type:touchpad" = {
            dwt = "enabled";
            tap = "enabled";
            natural_scroll = "enabled";
            middle_emulation = "enabled";
          };
        };

        output = {
          eDP-1 = {
            mode = "2160x1440@59.955Hz";
            scale = "1";
            bg = "~/.dotfiles/wallpaper/surfacewp.png fill";
          };
        };

        keybindings = let
          modifier = config.wayland.windowManager.sway.config.modifier;
        in {
          "${modifier}+F2"  = "exec brightnessctl set +5%";
          "${modifier}+F1"= "exec brightnessctl set 5%-";
          "${modifier}+n" = "exec sway output eDP-1 transform normal, splith";
          "${modifier}+Ctrl+p" = "exec nixGL wl-mirror eDP-1";
          "${modifier}+t" = "exec sway output eDP-1 transform 90, splitv";
          "${modifier}+XF86AudioLowerVolume" = "exec grim -g \"$(slurp)\" -t png - | wl-copy -t image/png";
          "${modifier}+XF86AudioRaiseVolume" = "exec grim -g \"$(slurp)\" -t png - | wl-copy -t image/png";
          "${modifier}+w" = "exec \"bash ~/.dotfiles/scripts/checkgomuks.sh\"";
        };

        startup = [
          { command = "sleep 60 && nixGL nextcloud --background";}
          # { command = "sleep 60 && nixGL spotify";}
          { command = "sleep 60 && nixGL discord --start-minimized -enable-features=UseOzonePlatform -ozone-platform=wayland";}
          # { command = "sleep 60 && nixGL schildichat-desktop --hidden";}
          { command = "sleep 60 && nixGL syncthingtray --wait"; }
          { command = "sleep 60 && ANKI_WAYLAND=1 nixGL anki";}
          { command = "nm-applet --indicator";}
          { command = "sleep 60 && OBSIDIAN_USE_WAYLAND=1 nixGL obsidian -enable-features=UseOzonePlatform -ozone-platform=wayland";}
        ];

        keycodebindings = {
          "124" = "exec systemctl suspend";
        };
      };

      extraConfig = "
      exec swaymsg input 7062:6917:NTRG0001:01_1B96:1B05 map_to_output eDP-1
      exec swaymsg input 7062:6917:NTRG0001:01_1B96:1B05_Stylus map_to_output eDP-1
      ";
    };
  }

nixos

Onett (Lenovo Y510P)

My laptop, sadly soon to be replaced by a new one, since most basic functions are stopping to work lately.

NixOS
  { config, lib, pkgs, inputs, ... }:

  {

    <<wrap>>

    services = {
      greetd.settings.initial_session.user ="swarsel";
      xserver.videoDrivers = ["nvidia"];
    };


    hardware = {
      nvidia = {
        modesetting.enable = true;
        powerManagement.enable = true;
        prime = {
          intelBusId = "PCI:0:2:0";
          nvidiaBusId = "PCI:1:0:0";
          sync.enable = true;
        };
      };
      pulseaudio.configFile = pkgs.runCommand "default.pa" {} ''
                   sed 's/module-udev-detect$/module-udev-detect tsched=0/' \
                     ${pkgs.pulseaudio}/etc/pulse/default.pa > $out
                   '';
      bluetooth.enable = true;
    };

    stylix.image = ../../wallpaper/lenovowp.png;
    <<theme>>

    boot.loader.grub = {
      enable = true;
      device = "/dev/sda";
      useOSProber = true;
    };

    networking.hostName = "onett"; # Define your hostname.
    networking.enableIPv6 = false;

    users.users.swarsel = {
      isNormalUser = true;
      description = "Leon S";
      extraGroups = [ "networkmanager" "wheel" "lp"];
      packages = with pkgs; [];
    };

    system.stateVersion = "23.05"; # Did you read the comment?

    environment.systemPackages = with pkgs; [
    ];


  }
Home Manager
  { config, pkgs, lib, fetchFromGitHub, ... }:

  {

    <<gpgagent>>

    home = {
      username = "swarsel";
      homeDirectory = "/home/swarsel";
      stateVersion = "23.05"; # Please read the comment before changing.
      keyboard.layout = "de";
      packages = with pkgs; [
      ];
    };

    sops.age.sshKeyPaths = [ "${config.home.homeDirectory}/.ssh/sops" ];

    # # waybar config
    programs.waybar.settings.mainBar = {
      cpu.format = "{icon0} {icon1} {icon2} {icon3} {icon4} {icon5} {icon6} {icon7}";
      temperature.hwmon-path = "/sys/devices/platform/coretemp.0/hwmon/hwmon3/temp3_input";
    };
    <<waybarlaptop>>

    services.blueman-applet.enable = true;

    wayland.windowManager.sway= {
      config = rec {
        input = {
          "1:1:AT_Translated_Set_2_keyboard" = {
            xkb_layout = "us";
            xkb_options = "grp:win_space_toggle";
            # xkb_options = "ctrl:nocaps,grp:win_space_toggle";
            xkb_variant = "altgr-intl";
          };
          "2362:33538:ipad_keyboard_Keyboard" = {
            xkb_layout = "us";
            xkb_options = "altwin:swap_lalt_lwin,ctrl:nocaps,grp:win_space_toggle";
            xkb_variant = "colemak_dh";
          };
          "36125:53060:splitkb.com_Kyria_rev3" = {
            xkb_layout = "us";
            xkb_variant = "altgr-intl";
          };

          "type:touchpad" = {
            dwt = "enabled";
            tap = "enabled";
            natural_scroll = "enabled";
            middle_emulation = "enabled";
          };
        };

        output = {
          eDP-1 = {
            mode = "1920x1080";
            scale = "1";
            bg = "~/.dotfiles/wallpaper/lenovowp.png fill";
            position = "1920,0";
          };
          VGA-1 = {
            mode = "1920x1080";
            scale = "1";
            bg = "~/.dotfiles/wallpaper/lenovowp.png fill";
            position = "0,0";
          };
        };

        keybindings = let
          modifier = config.wayland.windowManager.sway.config.modifier;
        in {
          "${modifier}+F2"  = "exec brightnessctl set +5%";
          "${modifier}+F1"= "exec brightnessctl set 5%-";
          "XF86MonBrightnessUp"  = "exec brightnessctl set +5%";
          "XF86MonBrightnessDown"= "exec brightnessctl set 5%-";
          "${modifier}+Ctrl+p" = "exec wl-mirror eDP-1";
          "XF86HomePage" = "exec wtype -P Escape -p Escape";
          "${modifier}+w" = "exec \"bash ~/.dotfiles/scripts/checkschildi.sh\"";
        };
        keycodebindings = {
          "94" = "exec wtype c";
          "Shift+94" = "exec wtype C";
          "Ctrl+94" = "exec wtype -M ctrl c -m ctrl";
          "Ctrl+Shift+94" = "exec wtype -M ctrl -M shift c -m ctrl -m shift";
        };

        startup = [
          <<startupnixos>>
        ];
      };

      extraConfig = "
   ";
    };
  }