111 lines
4.1 KiB
Nix
111 lines
4.1 KiB
Nix
{
|
|
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
|
|
|
outputs =
|
|
{ self, nixpkgs }:
|
|
let
|
|
forAllSystems =
|
|
f:
|
|
nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ] (
|
|
system: f (import nixpkgs { inherit system; })
|
|
);
|
|
in
|
|
{
|
|
devShells = forAllSystems (pkgs: {
|
|
default = pkgs.mkShell {
|
|
packages = with pkgs.ocamlPackages; [
|
|
dune_3
|
|
ocaml
|
|
angstrom
|
|
angstrom-unix
|
|
camlzip
|
|
ppx_inline_test
|
|
ocaml-lsp
|
|
ocamlformat
|
|
ocamlformat-rpc-lib
|
|
utop
|
|
];
|
|
};
|
|
});
|
|
|
|
packages = forAllSystems (pkgs: {
|
|
default = pkgs.ocamlPackages.buildDunePackage {
|
|
pname = "inshellah";
|
|
version = "0.1";
|
|
src = pkgs.lib.cleanSource ./.;
|
|
nativeBuildInputs = [ pkgs.git ];
|
|
buildInputs = with pkgs.ocamlPackages; [
|
|
dune_3
|
|
ocaml
|
|
angstrom
|
|
angstrom-unix
|
|
camlzip
|
|
];
|
|
|
|
meta.mainProgram = "inshellah";
|
|
};
|
|
});
|
|
|
|
nixosModules.default =
|
|
{
|
|
pkgs,
|
|
lib,
|
|
config,
|
|
...
|
|
}:
|
|
{
|
|
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
|
|
# 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 {
|
|
{ value: $e, description: "" }
|
|
}
|
|
}
|
|
} else {
|
|
$nix_output | each { |e|
|
|
{ value: $e, description: "" }
|
|
}
|
|
}
|
|
$entries
|
|
}
|
|
"systemctl" => {
|
|
if ($spans | length) < 3 { null } else {
|
|
let kw = $spans | last
|
|
let scope = if ("--user" in $spans) { [--user] } else { [] }
|
|
^systemctl ...$scope list-units --all --no-pager --plain --full --no-legend $"($kw)*"
|
|
| lines
|
|
| each { |l|
|
|
let parsed = $l | parse -r '(?P<unit>\S+)\s+\S+\s+\S+\s+\S+\s+(?P<desc>.*)'
|
|
if ($parsed | length) > 0 {
|
|
{value: $parsed.0.unit, description: ($parsed.0.desc | str trim)}
|
|
}
|
|
} | compact
|
|
}
|
|
}
|
|
_ => { null }
|
|
}
|
|
} else { null }
|
|
let result = ($completions | default []) | append ($additional | default []) | compact
|
|
if ($result | is-empty) { null } else { $result }
|
|
}
|
|
$env.config.completions.external = {enable: true, max_results: 200, completer: $inshellah_complete}
|
|
'';
|
|
};
|
|
};
|
|
}
|