Jump to content

Nushell: Difference between revisions

From NixOS Wiki
Claes (talk | contribs)
Add category shell
Malix (talk | contribs)
m Example: link
 
(9 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[https://www.nushell.sh/ Nushell] is a powerfull [[Command Shell|shell]] written in Rust.
[https://www.nushell.sh/ Nushell] is a powerful and modern non-POSIX [[Command Shell|shell]] written in Rust  


== Installation ==
== Installation ==
See [[Command Shell]]
{{file|3={
example if you want Nushell as your default shell.
  pkgs,
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  ...
users.users.myuser= {
}:
  ... 
{
        shell = pkgs.nushell;
  environment.shells = [
};
    pkgs.nushell
</nowiki>}}
  ];
  users.users.myuser= {
    shell = pkgs.nushell;
  };
}|name=/etc/nixos/configuration.nix|lang=nix}}Also see the [[Command Shell]] example if you want to set Nushell as your default shell


== Configuration ==
== Configuration ==
Nushell can be configured with [[Home Manager]].
Nushell can be configured with [[Home Manager]]


====Examples====  
====Example====  
Configuration with [https://starship.rs/ Starship] prompt and autosuggestion support with [https://search.nixos.org/packages?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=carapace carapace]
A configuration with [https://starship.rs/ Starship] prompt and autosuggestion support with [https://carapace.sh/ carapace] or [https://fishshell.com/ fish shell]:
{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
{{File|3=<nowiki>
programs = {
{ lib, pkgs, ... }:
     nushell = { enable = true;
{
  programs = {
     nushell = {
      enable = true;
       # The config.nu can be anywhere you want if you like to edit your Nushell with Nu
       # The config.nu can be anywhere you want if you like to edit your Nushell with Nu
       configFile.source = ./.../config.nu;
       configFile.source = ./.../config.nu;
       # for editing directly to config.nu  
       # for editing directly to config.nu  
       extraConfig = ''
       extraConfig = ''
      let carapace_completer = {|spans|
        # Common ls aliases and sort them by type and then name
      carapace $spans.0 nushell $spans | from json
        # Inspired by https://github.com/nushell/nushell/issues/7190
      }
        def lla [...args] { ls -la ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
      $env.config = {
        def la  [...args] { ls -a  ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         show_banner: false,
        def ll  [...args] { ls -l  ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         completions: {
        def l  [...args] { ls    ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i }
         case_sensitive: false # case-sensitive completions
 
         quick: true    # set to false to prevent auto-selecting completions
        # Completions
         partial: true    # set to false to prevent partial filling of the prompt
        # mainly pieced together from https://www.nushell.sh/cookbook/external_completers.html
         algorithm: "fuzzy"    # prefix or fuzzy
 
         external: {
        # carapce completions https://www.nushell.sh/cookbook/external_completers.html#carapace-completer
        # set to false to prevent nushell looking into $env.PATH to find more suggestions
        # + fix https://www.nushell.sh/cookbook/external_completers.html#err-unknown-shorthand-flag-using-carapace
             enable: true
        # enable the package and integration bellow
        # set to lower can improve completion performance at the cost of omitting some options
        let carapace_completer = {{{!}}spans: list<string>{{!}}
             max_results: 100
          carapace $spans.0 nushell ...$spans
             completer: $carapace_completer # check 'carapace_completer'  
          | 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 => $zoxide_completer
            _ => $carapace_completer
          } {{!}} do $in $spans
         }
         }
      }
      $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;
        $env.config = {
      settings = {
          show_banner: false,
        add_newline = true;
          completions: {
        character = {  
            case_sensitive: false # case-sensitive completions
        success_symbol = "[➜](bold green)";
            quick: true          # set to false to prevent auto-selecting completions
        error_symbol = "[➜](bold red)";
            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)";
        };
      };
     };
     };
   };
   };
};
}
</nowiki>}}
</nowiki>|name=~/.config/nixpkgs/home.nix|lang=nix}}
 
==See also==
==See also==
* [[Command Shell]]
* [[Command Shell]]
[[Category:Shell]]
[[Category:Shell]]

Latest revision as of 17:46, 13 August 2025

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

Installation

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

Also see the Command Shell example if you want to set Nushell as your default shell

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

        # carapce 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