dotfiles/modules/nushell.nix

118 lines
4.7 KiB
Nix
Raw Permalink Normal View History

2025-09-09 20:49:56 +02:00
{ lib, pkgs, ... }:
let
hx = lib.getExe pkgs.helix;
nix = lib.getExe pkgs.nix;
in
{
2025-09-09 18:03:42 +02:00
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;
2025-09-09 20:49:56 +02:00
# for editing directly to config.nu
2025-09-09 18:03:42 +02:00
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|
2025-09-09 20:49:56 +02:00
${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | str join " ")"'
2025-09-09 18:03:42 +02:00
| $"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 = {
fg = "job unfreeze";
2025-09-09 20:49:56 +02:00
nano = hx;
vi = hx;
devenv-init = "${nix} flake init --template github:cachix/devenv";
devenv-enter = "${nix} develop --impure";
rust-init = "${nix} flake init --template templates#rust";
c-init = "${nix} flake init --template templates#c-hello";
go-hello = "${nix} flake init --template templates#go-hello";
haskell-hello = "${nix} flake init --template templates#haskell-hello";
g = "${lib.getExe pkgs.git}";
2025-09-09 22:06:57 +02:00
copy = "${pkgs.wl-clipboard}/bin/wl-copy";
2025-09-09 18:03:42 +02:00
};
};
carapace.enable = true;
carapace.enableNushellIntegration = true;
2025-09-09 20:49:56 +02:00
starship = {
enable = true;
};
2025-09-09 18:03:42 +02:00
};
}