Nix Based Configuration

I use NixOS and home-manager to manage my system and user configuration respectively. You can see what options I have added to configure the system and user configuration in the next chapters.

The source repo is configuration.nix.

Table of Contents

How to Use

If you are not me, then you probably shouldn't use this, but feel free to draw inspiration from what I have done c:.

First you want to see what your environment is; if you are using NixOS then you want to look at the NixOS Module Setup, if you are just using home-manager, then you should look at the homa-manager Module Setup. Or if you just want to use my NeoVIM configuration then look at the NeoVIM standalone setup.

NixOS Module Setup

Although I am talking about the NixOS module setup, this uses both NixOS and home-manager, so you can (and should) use both modules.

Setup from LiveISO

Follow the NixOS Manual until before you run nixos-generate-config.

First you will want to create a directory for your NixOS configuration. I like using ~/.config/nixos. You then want to run nixos-generate-config --root /mnt --dir ~/.config/nixos (assuming you mounted your filesystem to /mnt). Now you have configuration.nix and hardware-configuration.nix inside ~/.config/nixos. I like renaming configuration.nix to default.nix and putting it in a folder with the same hostname as the machine (See the source repo).

Now you can add a flake.nix file to your ~/.config/nixos and make it a flake based configuration. This is the general structure you'll want:

{
  inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
  # My custom configuration module
  inputs.config.url = "github:jalil-salame/configuration.nix";
  inputs.config.inputs.follows.nixpkgs = "nixpkgs";

  outputs = { self, nixpkgs, config }: let
    pc = import (./. + hostname);
    hostname = "nixos";
    system = "x86_64-linux";
    overlays = builtins.attrValues config.overlays;
    config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
      "steam-original"
    ];
    pkgs = import nixpkgs { inherit system overlays config; };
  in {
    nixosConfigurations.${hostname} = nixpkgs.lib.nixosSystem {
      inherit system pkgs;
      modules = [
        # My configuration module (includes home-manager)
        config.nixosModules.nixosModule
        # Results from `nixos-generate-config`
        pc
        # Custom options (see module configuration options)
        {
          # Enable my custom configuration
          jconfig.enable = true;
          jconfig.gui.enable = true; # Enable gui environment

          # Add users to use with home-manager
          users.users = {};

          # You should probably also enable wifi if needed

          # Add home-manager users configuration (here you can enable jhome options)
          home-manager.users = {};
          # home-manager globally set options
          home-manager.sharedModules = [{ jhome.hostName = hostname; }];
        }
      ];
    };
  };
}

Now you should be ready to do sudo nixos-rebuild switch --flake .#$hostname and use the configuration c:.

home-manager Module Setup

If you are not using NixOS, then you probably want to only use the home-manager configuration. In that case, you want to use the nixosModules.homeManagerModuleSandalone in your home-manager configuration, and probably disable GUI applications all together jhome.gui.enable = false.

Your flake should then look like this (follow the home-manager Manual for more information):

{
  inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
  inputs.home-manager.url = "github:nixos-community/home-manager";
  inputs.home-manager.inputs.follows.nixpkgs = "nixpkgs";

  # My custom configuration module
  inputs.config.url = "github:jalil-salame/configuration.nix";
  inputs.config.inputs.follows.nixpkgs = "nixpkgs";
  inputs.config.inputs.follows.home-manager = "home-manager";

  outputs = { self, nixpkgs, home-manager, config }: let
    hostname = "nixos";
    username = "jdoe";
    system = "x86_64-linux";
    overlays = builtins.attrValues config.overlays;
    pkgs = import nixpkgs { inherit system overlays; };
  in {
    homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration {
      inherit pkgs;
      modules = [
        # My configuration module (includes home-manager)
        config.nixosModules.homeManagerModuleSandalone
        # Custom options (see module configuration options and home-manager options)
        {
          # Enable my custom configuration
          jhome.enable = true;
          jhome.hostName = hostname;
          jhome.gui.enable = false;

          # Extra configuration options
        }
      ];
    };
  };
}

NeoVIM Standalone setup

My NeoVIM configuration is managed by NixVIM, so check that project out if you want to understand how it works. You can use this tutorial to extend my configuration without forking this repo or copying its files.

If you want to test out my configuration then you can run this handy nix command:

$ nix run github:jalil-salame/configuration.nix#nvim

It will download and build my NeoVIM configuration and run NeoVIM. Alternatively you can replace nix run with nix shell which will temporarily add my NeoVIM configuration to your shell and when you run nvim it will launch it.