## Debug with `nix repl` We've used `nix repl ''` many times to check the source code in this guide, it's really a powerful tool to help us understand how things work in Nix. Better take a look at the help message of `nix repl`: ``` › nix repl -f '' Welcome to Nix 2.13.3. Type :? for help. Loading installable ''... Added 17755 variables. nix-repl> :? The following commands are available: Evaluate and print expression = Bind expression to variable :a Add attributes from resulting set to scope :b Build a derivation :bl Build a derivation, creating GC roots in the working directory :e Open package or function in $EDITOR :i Build derivation, then install result into current profile :l Load Nix expression and add it to scope :lf Load Nix flake and add it to scope :p Evaluate and print expression recursively :q Exit nix-repl :r Reload all files :sh Build dependencies of derivation, then start nix-shell :t Describe result of evaluation :u Build derivation, then start nix-shell :doc Show documentation of a builtin function :log Show logs for a derivation :te [bool] Enable, disable or toggle showing traces for errors ``` Some expressions that I use frequently: `:lf `, `:e `. `:e ` is very intuitive, so I won't repeat it. let's take a look at `:lf `: ```nix # cd into my nix-config repo(you should replace it with your own nix-config repo) › cd ~/nix-config/ # enter nix repl › nix repl Welcome to Nix 2.13.3. Type :? for help. # load my nix flake and add it to scope nix-repl> :lf . Added 16 variables. # press to see what we have in scope nix-repl> # ......omit some outputs __isInt nixosConfigurations __isList null __isPath outPath __isString outputs __langVersion packages # ......omit some outputs # check what's in inputs nix-repl> inputs. inputs.agenix inputs.nixpkgs inputs.darwin inputs.nixpkgs-darwin inputs.home-manager inputs.nixpkgs-unstable inputs.hyprland inputs.nixpkgs-wayland inputs.nil inputs.nixos-generators # check what's in inputs.nil nix-repl> inputs.nil.packages. inputs.nil.packages.aarch64-darwin inputs.nil.packages.aarch64-linux inputs.nil.packages.x86_64-darwin inputs.nil.packages.x86_64-linux # check the outputs of my nix flake nix-repl> outputs.nixosConfigurations. outputs.nixosConfigurations.ai outputs.nixosConfigurations.aquamarine outputs.nixosConfigurations.kana outputs.nixosConfigurations.ruby nix-repl> outputs.nixosConfigurations.ai. outputs.nixosConfigurations.ai._module outputs.nixosConfigurations.ai._type outputs.nixosConfigurations.ai.class outputs.nixosConfigurations.ai.config outputs.nixosConfigurations.ai.extendModules outputs.nixosConfigurations.ai.extraArgs outputs.nixosConfigurations.ai.options outputs.nixosConfigurations.ai.pkgs outputs.nixosConfigurations.ai.type nix-repl> outputs.nixosConfigurations.ai.config. outputs.nixosConfigurations.ai.config.age outputs.nixosConfigurations.ai.config.appstream outputs.nixosConfigurations.ai.config.assertions outputs.nixosConfigurations.ai.config.boot outputs.nixosConfigurations.ai.config.console outputs.nixosConfigurations.ai.config.containers # ......omit other outputs nix-repl> outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home. outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.activation outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.activationPackage outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.emptyActivationPath outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.enableDebugInfo outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.enableNixpkgsReleaseCheck outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraActivationPath outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraBuilderCommands outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraOutputsToInstall outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.extraProfileCommands outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file # ......omit other outputs nix-repl> outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables. outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.BROWSER outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.DELTA_PAGER outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.EDITOR outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.GLFW_IM_MODULE outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.MANPAGER outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.QT_IM_MODULE outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.TERM # ......omit other outputs # check the value of `TERM` nix-repl> outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.sessionVariables.TERM "xterm-256color" # check all files defined by `home.file` nix-repl> outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file. outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..bash_profile outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..bashrc outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/fcitx5/profile outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/fcitx5/profile-bak outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/config outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/i3blocks.conf outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/keybindings outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/layouts outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/scripts outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/i3/wallpaper.png outputs.nixosConfigurations.ai.config.home-manager.users.ryan.home.file..config/rofi #...... ``` As you can see, we can check every attribute of my flake in the REPL after loading it, which is very convenient for debugging.