inshellah/flake.nix
2026-03-29 17:21:13 +11:00

110 lines
4 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 {} finally {
{ 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 }
if ($completions == null and $additional == null) { null }
else { $completions | default [] | append ($additional | default []) }
}
$env.config.completions.external = {enable: true, max_results: 200, completer: $inshellah_complete}
'';
};
};
}