diff options
| author | Daiderd Jordan <daiderd@gmail.com> | 2017-02-03 21:40:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-02-03 21:40:21 +0100 |
| commit | a1011ad98b728ff65fef318edd4b79dbbd8c70c2 (patch) | |
| tree | 0859923e4eab24b9d7bdcf34124c31e7b0f1a858 /modules/programs | |
| parent | 8cdebe9fa917f9eee42c7276ea6cb654868818f0 (diff) | |
| parent | 367a05488f7f454070d4fbdf1044e49866a1caa1 (diff) | |
Merge pull request #8 from yurrriq/feature/fish
Add programs.fish
Diffstat (limited to 'modules/programs')
| -rw-r--r-- | modules/programs/fish.nix | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix new file mode 100644 index 0000000..698bc32 --- /dev/null +++ b/modules/programs/fish.nix @@ -0,0 +1,154 @@ +{ config, lib, pkgs, ...}: + +with lib; + +let + + cfg = config.programs.fish; + cfge = config.environment; + + foreignEnv = pkgs.writeText "fish-foreign-env" '' + # TODO: environment.shellInit + ${cfge.extraInit} + ''; + + loginForeignEnv = pkgs.writeText "fish-login-foreign-env" '' + # TODO: environment.loginShellInit + ''; + + interactiveForeignEnv = pkgs.writeText "fish-interactive-foreign-env" '' + ${cfge.interactiveShellInit} + ''; + + shell = pkgs.runCommand pkgs.fish.name + { buildInputs = [ pkgs.makeWrapper ]; } + '' + source $stdenv/setup + + mkdir -p $out/bin + makeWrapper ${pkgs.fish}/bin/fish $out/bin/fish + ''; + + fishAliases = concatStringsSep "\n" ( + mapAttrsFlatten (k: v: "alias ${k} '${v}'") cfg.shellAliases + ); + + fishVariables = + mapAttrsToList (n: v: ''set -x ${n} "${v}"'') cfg.variables; + +in + +{ + + options = { + + programs.fish = { + + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to configure fish as an interactive shell. + ''; + }; + + variables = mkOption { + type = types.attrsOf (types.either types.str (types.listOf types.str)); + default = {}; + description = '' + A set of environment variables used in the global environment. + These variables will be set on shell initialisation. + The value of each variable can be either a string or a list of + strings. The latter is concatenated, interspersed with colon + characters. + ''; + apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v); + }; + + shellAliases = mkOption { + type = types.attrs; + default = cfge.shellAliases; + description = '' + Set of aliases for fish shell. See <option>environment.shellAliases</option> + for an option format description. + ''; + }; + + shellInit = mkOption { + type = types.lines; + default = ""; + description = '' + Shell Script code called during fish shell initialisation. + ''; + }; + + loginShellInit = mkOption { + type = types.lines; + default = ""; + description = '' + Shell script code called during fish login shell initialisation. + ''; + }; + + interactiveShellInit = mkOption { + type = types.lines; + default = ""; + description = '' + Shell script code called during interactive fish shell initialisation. + ''; + }; + + promptInit = mkOption { + type = types.lines; + default = ""; + description = '' + Shell script code used to initialise fish prompt. + ''; + }; + + }; + }; + + config = mkIf cfg.enable { + + environment.etc."fish/config.fish".text = '' + # /etc/fish/config.fish: DO NOT EDIT -- this file has been generated automatically. + + set fish_function_path $fish_function_path ${pkgs.fish-foreign-env}/share/fish-foreign-env/functions + + set PATH ${replaceStrings [":"] [" "] config.environment.systemPath} $PATH + + ${config.system.build.setEnvironment} + + fenv source ${foreignEnv} + ${cfg.shellInit} + + ${concatStringsSep "\n" fishVariables} + + if status --is-login + # TODO: environment.loginShellInit + ${cfg.loginShellInit} + end + + if status --is-interactive + ${fishAliases} + ${optionalString (cfge.interactiveShellInit != "") '' + fenv source ${interactiveForeignEnv} + ''} + + ${cfg.interactiveShellInit} + ${cfg.promptInit} + end + ''; + + # include programs that bring their own completions + # FIXME: environment.pathsToLink = [ "/share/fish/vendor_completions.d" ]; + + environment.systemPackages = [ pkgs.fish ]; + + environment.loginShell = mkDefault "${shell}/bin/fish -l"; + environment.variables.SHELL = mkDefault "${shell}/bin/fish"; + + }; + +} |
