Jump to content

Nushell: Difference between revisions

From NixOS Wiki
mention environment shells in the example snippet
Malix (talk | contribs)
general enhancement
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]]
See [[Command Shell]] example if you want Nushell as your default shell
example if you want Nushell as your default shell.
{{file|3={
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  pkgs,
environment.shells = [ pkgs.nushell ];
  ...
users.users.myuser= {
}:
  ... 
{
        shell = pkgs.nushell;
  environment.shells = [
};
    pkgs.nushell
</nowiki>}}
  ];
  users.users.myuser= {
    shell = pkgs.nushell;
  };
}|name=/etc/nixos/configuration.nix|lang=nix}}


== 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] or [https://fishshell.com/ fish shell]<syntaxhighlight lang="nix" line="1">
A configuration with [https://starship.rs/ Starship] prompt and autosuggestion support with [https://search.nixos.org/packages?show=carapace carapace] or [https://fishshell.com/ fish shell]:
{ lib, pkgs, ... }:
{{File|3={ lib, pkgs, ... }:
{
{
   programs = {
   programs = {
Line 28: Line 32:
         # 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
Line 39: Line 43:
         # + 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 50: Line 54:


         # 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 57: Line 61:


         # 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 64: Line 68:
         # 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 73: Line 77:
             $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 80: Line 84:


           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 101: Line 105:
           }
           }
         }  
         }  
         $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 127: Line 131:
     };
     };
   };
   };
}
}|name=~/.config/nixpkgs/home.nix|lang=nix}}


</syntaxhighlight>Legacy config:{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
Legacy config:{{file|3=programs = {
programs = {
     nushell = { enable = true;
     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
Line 136: Line 139:
       # for editing directly to config.nu  
       # for editing directly to config.nu  
       extraConfig = ''
       extraConfig = ''
       let carapace_completer = {|spans|
       let carapace_completer = {{{!}}spans{{!}}
           carapace $spans.0 nushell ...$spans | from json
           carapace $spans.0 nushell ...$spans {{!}} from json
       }
       }
       $env.config = {
       $env.config = {
Line 155: Line 158:
         }
         }
       }  
       }  
       $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 179: Line 182:
     };
     };
   };
   };
};
};|name=~/.config/nixpkgs/home.nix|lang=nix}}
</nowiki>}}


==See also==
==See also==
* [[Command Shell]]
* [[Command Shell]]
[[Category:Shell]]
[[Category:Shell]]

Revision as of 17:27, 13 August 2025

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

Installation

See Command Shell example if you want Nushell as your default shell

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

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
 $"value(char tab)description(char newline)" + $in

Legacy config:

❄︎ ~/.config/nixpkgs/home.nix
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 = ''
       let carapace_completer = {|spans|
           carapace $spans.0 nushell ...$spans | from json
       }
       $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: $carapace_completer # check 'carapace_completer' 
          }
        }
       } 
       $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