Nushell: Difference between revisions
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]] | ||