Nushell: Difference between revisions
imported>Vieta First Nushell entry. Please feel free to change |
m Add carapace bridges |
||
(11 intermediate revisions by 5 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 powerfull [[Command Shell|shell]] written in Rust. | ||
== Installation == | == Installation == | ||
See [[Command Shell]] | See [[Command Shell]] | ||
example if you want Nushell as your default shell. | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
users.users.myuser= { | |||
... | ... | ||
shell = pkgs.nushell; | shell = pkgs.nushell; | ||
Line 14: | Line 14: | ||
Nushell can be configured with [[Home Manager]]. | Nushell can be configured with [[Home Manager]]. | ||
==== | ====Examples==== | ||
Configuration with [https://starship.rs/ | 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"> | ||
{{file|~/.config/nixpkgs/home.nix|nix|<nowiki> | { 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)"; | |||
}; | |||
}; | |||
}; | |||
}; | |||
} | |||
</syntaxhighlight>Legacy config:{{file|~/.config/nixpkgs/home.nix|nix|<nowiki> | |||
programs = { | programs = { | ||
nushell = { | nushell = { enable = true; | ||
# The config.nu can be anywhere you want if you like to edit your Nushell with Nu | |||
configFile.source = ./.../config.nu; | |||
starship = { | # 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 = { | settings = { | ||
add_newline = true; | |||
character = { | |||
success_symbol = "[➜](bold green)"; | success_symbol = "[➜](bold green)"; | ||
error_symbol = "[➜](bold red)"; | error_symbol = "[➜](bold red)"; | ||
Line 36: | Line 183: | ||
==See also== | ==See also== | ||
* [[Command Shell]] | * [[Command Shell]] | ||
[[Category:Shell]] |
Latest revision as of 23:01, 1 November 2024
Nushell is a powerfull shell written in Rust.
Installation
See Command Shell example if you want Nushell as your default shell.
/etc/nixos/configuration.nix
users.users.myuser= {
...
shell = pkgs.nushell;
};
Configuration
Nushell can be configured with Home Manager.
Examples
Configuration with Starship prompt and autosuggestion support with carapace or fish shell
{ 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)";
};
};
};
};
}
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)";
};
};
};
};