Jump to content

Nushell: Difference between revisions

From Official NixOS Wiki
Add a extra condition to invoke `nu` in `.bashrc`. If `bash` is invoked with `-l` AND `-c`, the original `.bashrc` will start `nu` instead of executing the command. It broke `niri-session` for me. `nu` should not be started if the command string is not empty.
 
Line 33: Line 33:
         # Common ls aliases and sort them by type and then name
         # Common ls aliases and sort them by type and then name
         # Inspired by https://github.com/nushell/nushell/issues/7190
         # Inspired by https://github.com/nushell/nushell/issues/7190
         def lla [...args] { ls -la ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         def lla [...args] { ls -la ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }
         def la  [...args] { ls -a  ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         def la  [...args] { ls -a  ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }
         def ll  [...args] { ls -l  ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         def ll  [...args] { ls -l  ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }
         def l  [...args] { ls    ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         def l  [...args] { ls    ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }


         # Completions
         # Completions
         # mainly pieced together from https://www.nushell.sh/cookbook/external_completers.html
         # mainly pieced together from https://www.nushell.sh/cookbook/external_completers.html


         # carapce completions https://www.nushell.sh/cookbook/external_completers.html#carapace-completer
         # carapace completions https://www.nushell.sh/cookbook/external_completers.html#carapace-completer
         # + fix https://www.nushell.sh/cookbook/external_completers.html#err-unknown-shorthand-flag-using-carapace
         # + fix https://www.nushell.sh/cookbook/external_completers.html#err-unknown-shorthand-flag-using-carapace
         # enable the package and integration bellow
         # enable the package and integration bellow
         let carapace_completer = {{{!}}spans: list<string>{{!}}
         let carapace_completer = {|spans: list<string>|
           carapace $spans.0 nushell ...$spans
           carapace $spans.0 nushell ...$spans
           | from json
           | from json
           | if ($in | default [] {{!}} where value == $"($spans {{!}} last)ERR" {{!}} is-empty) { $in } else { null }
           | if ($in | default [] | where value == $"($spans | last)ERR" | is-empty) { $in } else { null }
         }
         }
         # some completions are only available through a bridge
         # some completions are only available through a bridge
Line 55: Line 55:


         # fish completions https://www.nushell.sh/cookbook/external_completers.html#fish-completer
         # fish completions https://www.nushell.sh/cookbook/external_completers.html#fish-completer
         let fish_completer = {{{!}}spans{{!}}
         let fish_completer = {|spans|
           ${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans {{!}} str join " ")"'
           ${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | str join " ")"'
           | $"value(char tab)description(char newline)" + $in
           | $"value(char tab)description(char newline)" + $in
           | from tsv --flexible --no-infer
           | from tsv --flexible --no-infer
Line 62: Line 62:


         # zoxide completions https://www.nushell.sh/cookbook/external_completers.html#zoxide-completer
         # zoxide completions https://www.nushell.sh/cookbook/external_completers.html#zoxide-completer
         let zoxide_completer = {{{!}}spans{{!}}
         let zoxide_completer = {|spans|
             $spans {{!}} skip 1 {{!}} zoxide query -l ...$in {{!}} lines {{!}} where {{{!}}x{{!}} $x != $env.PWD}
             $spans | skip 1 | zoxide query -l ...$in | lines | where {|x| $x != $env.PWD}
         }
         }


Line 69: Line 69:
         # the default will be carapace, but you can also switch to fish
         # the default will be carapace, but you can also switch to fish
         # https://www.nushell.sh/cookbook/external_completers.html#alias-completions
         # https://www.nushell.sh/cookbook/external_completers.html#alias-completions
         let multiple_completers = {{{!}}spans{{!}}
         let multiple_completers = {|spans|
           ## alias fixer start https://www.nushell.sh/cookbook/external_completers.html#alias-completions
           ## alias fixer start https://www.nushell.sh/cookbook/external_completers.html#alias-completions
           let expanded_alias = scope aliases
           let expanded_alias = scope aliases
Line 78: Line 78:
             $spans
             $spans
             | skip 1
             | skip 1
             | prepend ($expanded_alias | split row ' ' {{!}} take 1)
             | prepend ($expanded_alias | split row ' ' | take 1)
           } else {
           } else {
             $spans
             $spans
Line 85: Line 85:


           match $spans.0 {
           match $spans.0 {
             __zoxide_z {{!}} __zoxide_zi => $zoxide_completer
             __zoxide_z | __zoxide_zi => $zoxide_completer
             _ => $carapace_completer
             _ => $carapace_completer
           } {{!}} do $in $spans
           } | do $in $spans
         }
         }


Line 106: Line 106:
           }
           }
         }  
         }  
         $env.PATH = ($env.PATH {{!}}
         $env.PATH = ($env.PATH |
           split row (char esep) {{!}}
           split row (char esep) |
           prepend /home/myuser/.apps {{!}}
           prepend /home/myuser/.apps |
           append /usr/bin/env
           append /usr/bin/env
         )
         )
Line 134: Line 134:
}
}
</nowiki>|name=~/.config/nixpkgs/home.nix|lang=nix}}
</nowiki>|name=~/.config/nixpkgs/home.nix|lang=nix}}
==See also==
==See also==
* [[Command Shell]]
* [[Command Shell]]
[[Category:Shell]]
[[Category:Shell]]

Latest revision as of 16:13, 28 January 2026

Nushell is a powerful and modern non-POSIX shell written in Rust

Installation

Using nushell as a login shell is not recommended. Since nushell is not a POSIX shell, it cannot execute the global shell rcfiles, which means that various environment variables that the general NixOS configuration expects to be set will not be set. To avoid these problems use the default bash interactive shell as a login shell and launch nushell from there:

❄︎ /etc/nixos/configuration.nix
{ pkgs, ... }: {
  environment.shells = [
    pkgs.nushell
  ];

  programs.bash.interactiveShellInit = ''
    if ! [ "$TERM" = "dumb" ] && [ -z "$BASH_EXECUTION_STRING" ]; then
      exec nu
    fi
  '';
}

The Command Shell page explains the process for setting shells as login shells if this is still desired.

Configuration

Nushell can be configured with Home Manager

Example

A configuration with Starship prompt and autosuggestion support with carapace or fish shell:

❄︎ ~/.config/nixpkgs/home.nix
{ lib, pkgs, ... }:
{
  programs = {
    nushell = {
      enable = true;
      # The config.nu can be anywhere you want if you like to edit your Nushell with Nu
      configFile.source = ./.../config.nu;
      # for editing directly to config.nu 
      extraConfig = ''
        # Common ls aliases and sort them by type and then name
        # Inspired by https://github.com/nushell/nushell/issues/7190
        def lla [...args] { ls -la ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }
        def la  [...args] { ls -a  ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }
        def ll  [...args] { ls -l  ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }
        def l   [...args] { ls     ...(if $args == [] {["."]} else {$args}) | sort-by type name -i }

        # Completions
        # mainly pieced together from https://www.nushell.sh/cookbook/external_completers.html

        # carapace completions https://www.nushell.sh/cookbook/external_completers.html#carapace-completer
        # + fix https://www.nushell.sh/cookbook/external_completers.html#err-unknown-shorthand-flag-using-carapace
        # enable the package and integration bellow
        let carapace_completer = {|spans: list&lt;string&gt;|
          carapace $spans.0 nushell ...$spans
          | from json
          | if ($in | default [] | where value == $"($spans | last)ERR" | is-empty) { $in } else { null }
        }
        # some completions are only available through a bridge
        # eg. tailscale
        # https://carapace-sh.github.io/carapace-bin/setup.html#nushell
        $env.CARAPACE_BRIDGES = 'zsh,fish,bash,inshellisense'

        # fish completions https://www.nushell.sh/cookbook/external_completers.html#fish-completer
        let fish_completer = {|spans|
          ${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | str join " ")"'
          | $"value(char tab)description(char newline)" + $in
          | from tsv --flexible --no-infer
        }

        # zoxide completions https://www.nushell.sh/cookbook/external_completers.html#zoxide-completer
        let zoxide_completer = {|spans|
            $spans | skip 1 | zoxide query -l ...$in | lines | where {|x| $x != $env.PWD}
        }

        # multiple completions
        # the default will be carapace, but you can also switch to fish
        # https://www.nushell.sh/cookbook/external_completers.html#alias-completions
        let multiple_completers = {|spans|
          ## alias fixer start https://www.nushell.sh/cookbook/external_completers.html#alias-completions
          let expanded_alias = scope aliases
          | where name == $spans.0
          | get -i 0.expansion

          let spans = if $expanded_alias != null {
            $spans
            | skip 1
            | prepend ($expanded_alias | split row ' ' | take 1)
          } else {
            $spans
          }
          ## alias fixer end

          match $spans.0 {
            __zoxide_z | __zoxide_zi =&gt; $zoxide_completer
            _ =&gt; $carapace_completer
          } | do $in $spans
        }

        $env.config = {
          show_banner: false,
          completions: {
            case_sensitive: false # case-sensitive completions
            quick: true           # set to false to prevent auto-selecting completions
            partial: true         # set to false to prevent partial filling of the prompt
            algorithm: "fuzzy"    # prefix or fuzzy
            external: {
              # set to false to prevent nushell looking into $env.PATH to find more suggestions
              enable: true 
              # set to lower can improve completion performance at the cost of omitting some options
              max_results: 100 
              completer: $multiple_completers
            }
          }
        } 
        $env.PATH = ($env.PATH | 
          split row (char esep) |
          prepend /home/myuser/.apps |
          append /usr/bin/env
        )
      '';
      shellAliases = {
        vi = "hx";
        vim = "hx";
        nano = "hx";
      };
    };
    carapace.enable = true;
    carapace.enableNushellIntegration = true;

    starship = {
      enable = true;
      settings = {
        add_newline = true;
        character = {
          success_symbol = "[➜](bold green)";
          error_symbol = "[➜](bold red)";
        };
      };
    };
  };
}

See also