dynamic systemctl unit completions

This commit is contained in:
atagen 2026-03-29 14:12:08 +11:00
parent 845ff03632
commit 45709ff0bf

View file

@ -57,40 +57,50 @@
imports = [ ./nix/module.nix ];
programs.inshellah.package = self.packages.${pkgs.stdenv.hostPlatform.system}.default;
programs.inshellah.snippet = ''
let inshellah_complete = { |spans|
let completions = inshellah complete ...$spans | from json
# special case nix completions, for `nix run nixpkgs#..` type input
let additional = if ($completions == null and
($spans | length) > 0 and $spans.0 == "nix") {
$env.NIX_GET_COMPLETIONS = ($spans | length) - 1
let nix_output = $spans | run-external $in | split row -r '\n' | str trim | skip 1
let entries = $nix_output |
if (($in | length) < 6 and
($spans | last) =~ "[a-zA-Z][a-zA-Z0-9_-]*#[a-zA-Z][a-zA-Z0-9_-]*") {
hide-env NIX_GET_COMPLETIONS
$env.NIX_ALLOW_UNFREE = 1
$env.NIX_ALLOW_BROKEN = 1
$in | par-each { |e|
try {
{ value: $e, description: (^nix eval --impure $e --apply "f: f.meta.description" err> /dev/null) }
} catch {} finally {
{ value: $e, description: "" }
let inshellah_complete = { |spans|
let completions = (^inshellah complete ...$spans) | from json
# dynamic completions
let additional = if ($completions == null and
($spans | length) > 0) {
match $spans.0 {
"nix" => {
$env.NIX_GET_COMPLETIONS = ($spans | length) - 1
let nix_output = $spans | run-external $in | split row -r '\n' | str trim | skip 1
let entries = if (($nix_output | length) < 6 and
($spans | last) =~ "[a-zA-Z][a-zA-Z0-9_-]*#[a-zA-Z][a-zA-Z0-9_-]*") {
hide-env NIX_GET_COMPLETIONS
$env.NIX_ALLOW_UNFREE = 1
$env.NIX_ALLOW_BROKEN = 1
$nix_output | par-each { |e|
try {
{ value: $e, description: (^nix eval --impure $e --apply "f: f.meta.description" err> /dev/null) }
} catch {} finally {
{ value: $e, description: "" }
}
}
} else {
$nix_output | each { |e| { value: $e, description: "" } }
}
$entries
}
"systemctl" => {
if ($spans | length) < 3 { null } else {
let kw = $spans | last
^systemctl list-units --all --no-legend --plain --no-pager --full $"($kw)*"
| lines | each { |l|
let cols = $l | split row -r '\s\s+'
let name = $cols | first | str trim
let desc = if ($cols | length) > 1 { $cols | last | str trim } else { "" }
{value: $name, description: $desc}
}
}
}
} else {
$in | each { |e| { value: $e, description: "" } }
}
$entries
} else {
null
}
$completions | append $additional
}
$env.config.completions.external = {
enable: true
max_results: 200
completer: $inshellah_complete
_ => { null }
}
} else { null }
$completions | append $additional
}
$env.config.completions.external = {enable: true, max_results: 200, completer: $inshellah_complete}
'';
};
};