diff --git a/nixos/modules/programs/fish.nix b/nixos/modules/programs/fish.nix index eb969ee1ce0..c8d94a47be2 100644 --- a/nixos/modules/programs/fish.nix +++ b/nixos/modules/programs/fish.nix @@ -104,8 +104,6 @@ in environment.etc."fish/foreign-env/interactiveShellInit".text = cfge.interactiveShellInit; environment.etc."fish/nixos-env-preinit.fish".text = '' - # avoid clobbering the environment if it's been set by a parent shell - # This happens before $__fish_datadir/config.fish sets fish_function_path, so it is currently # unset. We set it and then completely erase it, leaving its configuration to $__fish_datadir/config.fish set fish_function_path ${pkgs.fish-foreign-env}/share/fish-foreign-env/functions $__fish_datadir/functions @@ -120,7 +118,7 @@ in environment.etc."fish/config.fish".text = '' # /etc/fish/config.fish: DO NOT EDIT -- this file has been generated automatically. - # if our parent shell didn't source the general config, do it + # if we haven't sourced the general config, do it if not set -q __fish_nixos_general_config_sourced set fish_function_path ${pkgs.fish-foreign-env}/share/fish-foreign-env/functions $fish_function_path fenv source /etc/fish/foreign-env/shellInit > /dev/null @@ -128,11 +126,12 @@ in ${cfg.shellInit} - # and leave a note to our children to spare them the same work - set -gx __fish_nixos_general_config_sourced 1 + # and leave a note so we don't source this config section again from + # this very shell (children will source the general config anew) + set -g __fish_nixos_general_config_sourced 1 end - # if our parent shell didn't source the login config, do it + # if we haven't sourced the login config, do it status --is-login; and not set -q __fish_nixos_login_config_sourced and begin set fish_function_path ${pkgs.fish-foreign-env}/share/fish-foreign-env/functions $fish_function_path @@ -141,11 +140,12 @@ in ${cfg.loginShellInit} - # and leave a note to our children to spare them the same work - set -gx __fish_nixos_login_config_sourced 1 + # and leave a note so we don't source this config section again from + # this very shell (children will source the general config anew) + set -g __fish_nixos_login_config_sourced 1 end - # if our parent shell didn't source the interactive config, do it + # if we haven't sourced the interactive config, do it status --is-interactive; and not set -q __fish_nixos_interactive_config_sourced and begin ${fishAliases} @@ -158,8 +158,10 @@ in ${cfg.promptInit} ${cfg.interactiveShellInit} - # and leave a note to our children to spare them the same work - set -gx __fish_nixos_interactive_config_sourced 1 + # and leave a note so we don't source this config section again from + # this very shell (children will source the general config anew, + # allowing configuration changes in, e.g, aliases, to propagate) + set -g __fish_nixos_interactive_config_sourced 1 end ''; diff --git a/pkgs/shells/fish/default.nix b/pkgs/shells/fish/default.nix index 32b7694ba34..798d00b0be1 100644 --- a/pkgs/shells/fish/default.nix +++ b/pkgs/shells/fish/default.nix @@ -45,10 +45,15 @@ let ''; fishPreInitHooks = '' - # source nixos environment if we're a login shell + # source nixos environment + # note that this is required: + # 1. For all shells, not just login shells (mosh needs this as do some other command-line utilities) + # 2. Before the shell is initialized, so that config snippets can find the commands they use on the PATH builtin status --is-login + or test -z "$__fish_nixos_env_preinit_sourced" -a -z "$ETC_PROFILE_SOURCED" -a -z "$ETC_ZSHENV_SOURCED" and test -f /etc/fish/nixos-env-preinit.fish and source /etc/fish/nixos-env-preinit.fish + and set -gx __fish_nixos_env_preinit_sourced 1 test -n "$NIX_PROFILES" and begin