Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add nix hm module #5

Merged
merged 1 commit into from
Oct 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
};
outputs = { nixpkgs, flake-utils, ... }:
flake-utils.lib.eachDefaultSystem (
let
tabryHmModule = import ./nix/tabry-hm-module.nix;
in flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = nixpkgs.legacyPackages."${system}";
Expand All @@ -22,5 +24,9 @@
];
};
}
);
) // {
homeModules = {
tabry = tabryHmModule;
};
};
}
33 changes: 33 additions & 0 deletions nix/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
## Tabry Nix Configurations

### Home Manager Module

This repository provides a home-manager (https://github.com/nix-community/home-manager)
module to make tabry easy to install and use via home manager.

To use the home-manager module via flakes, add this module to your home-manager
configuration:

```nix
{
inputs = {
tabry.url = "github:evanbattaglia/tabry-rs";
};
outputs = { ..., tabry }: {
homeConfigurations.<user> = {
modules = [
tabry.homeModules.tabry
{
config.programs.tabry = {
enable = true;
enableBashIntegration = true;
tabryFiles = [
./zellij.tabry
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I should probably figure out a better example, as zellij actually does have its own shell completion... When I do, I'll change it here

One useful example I may make (especially when I get delegation working better) is you could have your own aliases dc r, dc e, etc. -- one command with subcommands delegated to different commands -- and have shell completion for all the subcommands ... right now I don't actually know an easy way of doing that without tabry.

];
};
}
]
}
};
}
```
65 changes: 65 additions & 0 deletions nix/tabry-hm-module.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
{ config, lib, pkgs, ... }:

# This file contains a Home Manager module that installs tabry
# and sets up tabry configuration files to be used by tabry
#
let

cfg = config.programs.tabry;

tabry = pkgs.callPackage ../default.nix {};
tabryLang = pkgs.callPackage ./tabry-lang.nix { inherit tabry; };

# converts /nix/store/.../foo.tabry to "foo"
commandNameFromTabryFilename = fileName:
(builtins.replaceStrings [".tabry"] [""] (builtins.baseNameOf fileName));

mkInitFish = fileName: let
commandName = commandNameFromTabryFilename fileName;
in ''
tabry_completion_init ${commandName}
'';

compileTabryFiles = map tabryLang.compileTabryFile;

in {

options.programs.tabry = {
enable = lib.mkEnableOption "tabry, a tab completion library";
enableFishIntegration = lib.mkEnableOption "enables fish completions";
enableBashIntegration = lib.mkEnableOption "enables bash completions";
tabryFiles = lib.mkOption {
type = with lib.types; listOf path;
default = [];
description = ''
*.tabry files to be compiled to completion json
'';
};
};

config = lib.mkIf cfg.enable (
let
tabryImportsPath = builtins.concatStringsSep ":" (compileTabryFiles cfg.tabryFiles);
in {
home.packages = [tabry];

# for each file, compile it to json
# then add the dir to $TABRY_IMPORT_PATH

programs.fish.shellInit = lib.mkIf cfg.enableFishIntegration (
''
set -x TABRY_IMPORT_PATH "${tabryImportsPath}:$TABRY_IMPORT_PATH"
${tabry}/bin/tabry fish | source
${builtins.concatStringsSep "\n" (map mkInitFish cfg.tabryFiles)}
''
);

programs.bash.initExtra = lib.mkIf cfg.enableBashIntegration (
''
set -x TABRY_IMPORT_PATH "${tabryImportsPath}:$TABRY_IMPORT_PATH"
source <(${tabry}/bin/tabry bash)
''
);
}
);
}
27 changes: 27 additions & 0 deletions nix/tabry-lang.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{ stdenv, tabry, ... }:
let
# converts /nix/store/.../foo.tabry to "foo"
commandNameFromTabryFilename = filename:
(builtins.replaceStrings [".tabry"] [""] (builtins.baseNameOf filename));

formatJsonFilename = tabryFilename:
(commandNameFromTabryFilename tabryFilename) + ".json";

# This is a function that takes a .tabry file
# and returns a derivation that compiles that
# .tabry file into the tabry .json file
compileTabryFile = inFile: stdenv.mkDerivation {
name = "tabry-compile-file-${inFile}";
buildPhase = ''
mkdir $out
${tabry}/bin/tabry compile < ${inFile} > $out/${formatJsonFilename inFile}
'';
# by default, stdenv.mkDerivation will run `make install`
# which we don't want to do here
dontInstall = true;
dontUnpack = true;
};

in {
inherit compileTabryFile commandNameFromTabryFilename;
}