summaryrefslogtreecommitdiffstats
path: root/lass/3modules/klem.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lass/3modules/klem.nix')
-rw-r--r--lass/3modules/klem.nix75
1 files changed, 75 insertions, 0 deletions
diff --git a/lass/3modules/klem.nix b/lass/3modules/klem.nix
new file mode 100644
index 000000000..a297adcd1
--- /dev/null
+++ b/lass/3modules/klem.nix
@@ -0,0 +1,75 @@
+{ config, pkgs, ... }: with import <stockholm/lib>; let
+ cfg = config.lass.klem;
+in {
+ options.lass.klem = mkOption {
+ default = {};
+ type = types.attrsOf (types.submodule ({ config, ...}: {
+ options = {
+ target = mkOption {
+ default = ".*";
+ description = ''
+ regex of valid targets
+ can be shown with xclip -selection clipboard -t TARGETS
+ the first hit is taken as target argument
+ '';
+ type = types.str;
+ };
+ script = mkOption {
+ description = ''
+ file to run if entry is selected
+ '';
+ type = types.path;
+ };
+ label = mkOption {
+ default = config._module.args.name;
+ description = ''
+ label to show in dmenu for this script
+ '';
+ type = types.str;
+ };
+ };
+ }));
+ };
+ config = let
+ klem = pkgs.writers.writeDashBin "klem" ''
+ set -x
+
+ labels=""
+ # match filetype against patterns
+ ${concatMapStringsSep "\n" (script: ''
+ ${pkgs.xclip}/bin/xclip -selection clipboard -target TARGETS -out \
+ | grep -q '${script.target}'
+ if [ $? -eq 0 ]; then
+ labels="$labels:${script.label}"
+ fi
+ '') (attrValues cfg)}
+
+ #remove empty line, feed into dmenu
+ script=$(echo "$labels" \
+ | ${pkgs.gnused}/bin/sed 's/^://;s/:/\n/g' \
+ | ${pkgs.dmenu}/bin/dmenu)
+
+ #run the chosen script
+ case $script in
+ ${concatMapStringsSep "\n" (script: indent ''
+ ${script.label})
+ target=$(${pkgs.xclip}/bin/xclip -selection clipboard -target TARGETS -out \
+ | ${pkgs.gnugrep}/bin/grep '${script.target}' \
+ | ${pkgs.gnugrep}/bin/grep -v TARGETS \
+ | ${pkgs.coreutils}/bin/head -1)
+ ${pkgs.xclip}/bin/xclip -selection clipboard -target "$target" -out \
+ | ${script.script} \
+ | ${pkgs.xclip}/bin/xclip -selection clipboard -in
+ ;;
+ '') (attrValues cfg)}
+ esac
+ '';
+ in mkIf (cfg != {}) {
+ environment.systemPackages = [ klem ];
+ nixpkgs.overlays = [
+ (self: super: {
+ klem = klem;
+ })
+ ];
+ };
+}