Nushell: Difference between revisions
mention environment shells in the example snippet |
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 | [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 = [ | ||
environment.shells = [ pkgs.nushell ]; | 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> | |||
{ 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}) | def lla [...args] { ls -la ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i } | ||
def la [...args] { ls -a ...(if $args == [] {["."]} else {$args}) | def la [...args] { ls -a ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i } | ||
def ll [...args] { ls -l ...(if $args == [] {["."]} else {$args}) | def ll [...args] { ls -l ...(if $args == [] {["."]} else {$args}) {{!}} sort-by type name -i } | ||
def l [...args] { ls ...(if $args == [] {["."]} else {$args}) | 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 = { | let carapace_completer = {{{!}}spans: list<string>{{!}} | ||
carapace $spans.0 nushell ...$spans | carapace $spans.0 nushell ...$spans | ||
| from json | | from json | ||
| if ($in | default [] | | 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 = { | let fish_completer = {{{!}}spans{{!}} | ||
${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | ${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 = { | let zoxide_completer = {{{!}}spans{{!}} | ||
$spans | $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 = { | 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 ' ' | | prepend ($expanded_alias | split row ' ' {{!}} take 1) | ||
} else { | } else { | ||
$spans | $spans | ||
Line 80: | Line 85: | ||
match $spans.0 { | match $spans.0 { | ||
__zoxide_z | __zoxide_z {{!}} __zoxide_zi => $zoxide_completer | ||
_ => $carapace_completer | _ => $carapace_completer | ||
} | } {{!}} 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}} | |||
</ | |||
==See also== | ==See also== | ||
* [[Command Shell]] | * [[Command Shell]] | ||
[[Category:Shell]] | [[Category:Shell]] |