Nushell: Difference between revisions

mention environment shells in the example snippet
TLATER (talk | contribs)
m Improve wording around setting nu as a login shell
 
(8 intermediate revisions by 3 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]]
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:
example if you want Nushell as your default shell.
{{File|3={ pkgs, ... }: {
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  environment.shells = [
environment.shells = [ pkgs.nushell ];
    pkgs.nushell
users.users.myuser= {
  ];
  ... 
 
        shell = pkgs.nushell;
  programs.bash.interactiveShellInit = ''
};
    if ! [ "$TERM" = "dumb" ]; then
</nowiki>}}
      exec nu
    fi
  '';
}|name=/etc/nixos/configuration.nix|lang=nix}}
The [[Command Shell]] page explains the process for setting shells as login shells if this is still desired.


== 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://carapace.sh/ carapace] or [https://fishshell.com/ fish shell]:
{{File|3=<nowiki>
{ lib, pkgs, ... }:
{ lib, pkgs, ... }:
{
{
Line 28: 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
Line 39: Line 44:
         # + 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 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 57: 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 64: 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 73: 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 80: 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 101: 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 128: Line 133:
   };
   };
}
}
 
</nowiki>|name=~/.config/nixpkgs/home.nix|lang=nix}}
</syntaxhighlight>Legacy config:{{file|~/.config/nixpkgs/home.nix|nix|<nowiki>
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)";
      };
    };
  };
};
</nowiki>}}
 
==See also==
==See also==
* [[Command Shell]]
* [[Command Shell]]
[[Category:Shell]]
[[Category:Shell]]