summaryrefslogtreecommitdiffstats
path: root/krebs/5pkgs/simple/fzfmenu/default.nix
blob: 030c1b1b1aa259888e57893cda5c013ab1b79e8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
{ pkgs, stockholm, ... }@args:
with stockholm.lib;

let
  # config cannot be declared in the input attribute set because that would
  # cause callPackage to inject the wrong config.  Instead, get it from ...
  # via args.
  config = args.config or {};

  cfg = eval.config;

  eval = evalModules {
    modules = singleton {
      _file = toString ./profile.nix;
      imports = singleton config;
      options = {
        appName = mkOption {
          default = "fzfmenu";
          type = types.label;
        };
        defaultPrompt = mkOption {
          default = ">";
          type = types.str;
        };
        printQuery = mkOption {
          default = true;
          type = types.bool;
        };
        reverse = mkOption {
          default = true;
          type = types.bool;
        };
        windowTitle = mkOption {
          default = "fzfmenu";
          type = types.str;
        };
      };
    };
  };
in

pkgs.writers.writeDashBin "fzfmenu" ''
  set -efu

  # Spawn terminal if called without one, like e.g. from a window manager.
  if [ -z ''${TERM+x} ] || [ $TERM = dumb ]; then
    exec 3<&0
    exec 4>&1
    export FZFMENU_INPUT_FD=3
    export FZFMENU_OUTPUT_FD=4
    exec ${pkgs.alacritty}/bin/alacritty \
        --config-file /var/theme/config/alacritty.yaml \
        --class ${cfg.appName} \
        --title ${shell.escape cfg.windowTitle} \
        --command "$0" "$@"
  else
    exec 0<&''${FZFMENU_INPUT_FD-0}
    exec 1>&''${FZFMENU_OUTPUT_FD-1}
  fi

  PROMPT=${shell.escape cfg.defaultPrompt}
  for i in "$@"; do
    case $i in
      -p)
        PROMPT=$2
        shift 2
        break
        ;;
      -l)
        # no reason to filter number of lines
        LINES=$2
        shift 2
        break
        ;;
      -i)
        # we do this anyway
        shift
        break
        ;;
      *)
        echo "Unknown option $1" >&2
        shift
        ;;
    esac
  done

  if test -n "''${FZFMENU_FZF_DEFAULT_OPTS-}"; then
    FZF_DEFAULT_OPTS=''${FZFMENU_FZF_DEFAULT_OPTS-}
    export FZF_DEFAULT_OPTS
  fi

  ${pkgs.fzf}/bin/fzf \
      --history=/dev/null \
      --prompt="$PROMPT" \
      ${optionalString cfg.reverse "--reverse"} \
      ${optionalString cfg.printQuery "--print-query"} \
  ${optionalString cfg.printQuery "| ${pkgs.coreutils}/bin/tail -1"}
''