Nushell: Difference between revisions
Appearance
m carapace_completer errors out because of API changes. This is the new way from the docs |
m Improve wording around setting nu as a login shell |
||
| (11 intermediate revisions by 5 users not shown) | |||
| Line 1: | Line 1: | ||
[https://www.nushell.sh/ Nushell] is a | [https://www.nushell.sh/ Nushell] is a powerful and modern non-POSIX [[Command Shell|shell]] written in Rust | ||
== Installation == | == 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: | |||
{{File|3={ pkgs, ... }: { | |||
{{ | environment.shells = [ | ||
pkgs.nushell | |||
]; | |||
programs.bash.interactiveShellInit = '' | |||
if ! [ "$TERM" = "dumb" ]; then | |||
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]] | ||
==== | ====Example==== | ||
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> | ||
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 = '' | ||
# 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<string>{{!}} | |||
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 => $zoxide_completer | |||
_ => $carapace_completer | |||
} {{!}} do $in $spans | |||
} | } | ||
starship = { enable = true; | $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)"; | |||
}; | |||
}; | |||
}; | }; | ||
}; | }; | ||
} | } | ||
</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 14:10, 8 September 2025
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" ]; 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
# 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<string>{{!}}
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 => $zoxide_completer
_ => $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)";
};
};
};
};
}