{ 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\S+)\s+\S+\s+\S+\s+\S+\s+(?P.*)' 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} ''; }; }; }