fish: add babelfish translation option
Configuration may be ran through fenv at shell start time (as previously) or translated to fish at build time with the babelfish package.
This commit is contained in:
parent
4aaa445477
commit
515d801aee
@ -13,6 +13,27 @@ let
|
||||
(filterAttrs (k: v: v != null) cfg.shellAliases)
|
||||
);
|
||||
|
||||
envShellInit = pkgs.writeText "shellInit" cfge.shellInit;
|
||||
|
||||
envLoginShellInit = pkgs.writeText "loginShellInit" cfge.loginShellInit;
|
||||
|
||||
envInteractiveShellInit = pkgs.writeText "interactiveShellInit" cfge.interactiveShellInit;
|
||||
|
||||
sourceEnv = file:
|
||||
if cfg.useBabelfish then
|
||||
"source /etc/fish/${file}.fish"
|
||||
else
|
||||
''
|
||||
set fish_function_path ${pkgs.fishPlugins.foreign-env}/share/fish-foreign-env/functions $fish_function_path
|
||||
fenv source /etc/fish/foreign-env/${file} > /dev/null
|
||||
set -e fish_function_path[1]
|
||||
'';
|
||||
|
||||
babelfishTranslate = path: name:
|
||||
pkgs.runCommand "${name}.fish" {
|
||||
nativeBuildInputs = [ pkgs.babelfish ];
|
||||
} "${pkgs.babelfish}/bin/babelfish < ${path} > $out;";
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
@ -29,6 +50,15 @@ in
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
useBabelfish = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
If enabled, the configured environment will be translated to native fish using <link xlink:href="https://github.com/bouk/babelfish">babelfish</link>.
|
||||
Otherwise, <link xlink:href="https://github.com/oh-my-fish/plugin-foreign-env">foreign-env</link> will be used.
|
||||
'';
|
||||
};
|
||||
|
||||
vendor.config.enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
@ -105,11 +135,32 @@ in
|
||||
# Required for man completions
|
||||
documentation.man.generateCaches = lib.mkDefault true;
|
||||
|
||||
environment.etc."fish/foreign-env/shellInit".text = cfge.shellInit;
|
||||
environment.etc."fish/foreign-env/loginShellInit".text = cfge.loginShellInit;
|
||||
environment.etc."fish/foreign-env/interactiveShellInit".text = cfge.interactiveShellInit;
|
||||
environment = mkMerge [
|
||||
(mkIf cfg.useBabelfish
|
||||
{
|
||||
etc."fish/setEnvironment.fish".source = babelfishTranslate config.system.build.setEnvironment "setEnvironment";
|
||||
etc."fish/shellInit.fish".source = babelfishTranslate envShellInit "shellInit";
|
||||
etc."fish/loginShellInit.fish".source = babelfishTranslate envLoginShellInit "loginShellInit";
|
||||
etc."fish/interactiveShellInit.fish".source = babelfishTranslate envInteractiveShellInit "interactiveShellInit";
|
||||
})
|
||||
|
||||
environment.etc."fish/nixos-env-preinit.fish".text = ''
|
||||
(mkIf (!cfg.useBabelfish)
|
||||
{
|
||||
etc."fish/foreign-env/shellInit".source = envShellInit;
|
||||
etc."fish/foreign-env/loginShellInit".source = envLoginShellInit;
|
||||
etc."fish/foreign-env/interactiveShellInit".source = envInteractiveShellInit;
|
||||
})
|
||||
|
||||
{
|
||||
etc."fish/nixos-env-preinit.fish".text =
|
||||
if cfg.useBabelfish
|
||||
then ''
|
||||
# source the NixOS environment config
|
||||
if [ -z "$__NIXOS_SET_ENVIRONMENT_DONE" ]
|
||||
source /etc/fish/setEnvironment.fish
|
||||
end
|
||||
''
|
||||
else ''
|
||||
# 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.fishPlugins.foreign-env}/share/fish/vendor_functions.d $__fish_datadir/functions
|
||||
@ -122,15 +173,15 @@ in
|
||||
# clear fish_function_path so that it will be correctly set when we return to $__fish_datadir/config.fish
|
||||
set -e fish_function_path
|
||||
'';
|
||||
}
|
||||
|
||||
environment.etc."fish/config.fish".text = ''
|
||||
{
|
||||
etc."fish/config.fish".text = ''
|
||||
# /etc/fish/config.fish: DO NOT EDIT -- this file has been generated automatically.
|
||||
|
||||
# if we haven't sourced the general config, do it
|
||||
if not set -q __fish_nixos_general_config_sourced
|
||||
set --prepend fish_function_path ${pkgs.fishPlugins.foreign-env}/share/fish/vendor_functions.d
|
||||
fenv source /etc/fish/foreign-env/shellInit > /dev/null
|
||||
set -e fish_function_path[1]
|
||||
${sourceEnv "shellInit"}
|
||||
|
||||
${cfg.shellInit}
|
||||
|
||||
@ -142,9 +193,7 @@ in
|
||||
# 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 --prepend fish_function_path ${pkgs.fishPlugins.foreign-env}/share/fish/vendor_functions.d
|
||||
fenv source /etc/fish/foreign-env/loginShellInit > /dev/null
|
||||
set -e fish_function_path[1]
|
||||
${sourceEnv "loginShellInit"}
|
||||
|
||||
${cfg.loginShellInit}
|
||||
|
||||
@ -158,9 +207,7 @@ in
|
||||
and begin
|
||||
${fishAliases}
|
||||
|
||||
set --prepend fish_function_path ${pkgs.fishPlugins.foreign-env}/share/fish/vendor_functions.d
|
||||
fenv source /etc/fish/foreign-env/interactiveShellInit > /dev/null
|
||||
set -e fish_function_path[1]
|
||||
${sourceEnv "interactiveShellInit"}
|
||||
|
||||
${cfg.promptInit}
|
||||
${cfg.interactiveShellInit}
|
||||
@ -171,23 +218,10 @@ in
|
||||
set -g __fish_nixos_interactive_config_sourced 1
|
||||
end
|
||||
'';
|
||||
}
|
||||
|
||||
programs.fish.interactiveShellInit = ''
|
||||
# add completions generated by NixOS to $fish_complete_path
|
||||
begin
|
||||
# joins with null byte to acommodate all characters in paths, then respectively gets all paths before (exclusive) / after (inclusive) the first one including "generated_completions",
|
||||
# splits by null byte, and then removes all empty lines produced by using 'string'
|
||||
set -l prev (string join0 $fish_complete_path | string match --regex "^.*?(?=\x00[^\x00]*generated_completions.*)" | string split0 | string match -er ".")
|
||||
set -l post (string join0 $fish_complete_path | string match --regex "[^\x00]*generated_completions.*" | string split0 | string match -er ".")
|
||||
set fish_complete_path $prev "/etc/fish/generated_completions" $post
|
||||
end
|
||||
# prevent fish from generating completions on first run
|
||||
if not test -d $__fish_user_data_dir/generated_completions
|
||||
${pkgs.coreutils}/bin/mkdir $__fish_user_data_dir/generated_completions
|
||||
end
|
||||
'';
|
||||
|
||||
environment.etc."fish/generated_completions".source =
|
||||
{
|
||||
etc."fish/generated_completions".source =
|
||||
let
|
||||
patchedGenerator = pkgs.stdenv.mkDerivation {
|
||||
name = "fish_patched-completion-generator";
|
||||
@ -228,19 +262,40 @@ in
|
||||
ignoreCollisions = true;
|
||||
paths = map generateCompletions config.environment.systemPackages;
|
||||
};
|
||||
}
|
||||
|
||||
# include programs that bring their own completions
|
||||
environment.pathsToLink = []
|
||||
{
|
||||
pathsToLink = []
|
||||
++ optional cfg.vendor.config.enable "/share/fish/vendor_conf.d"
|
||||
++ optional cfg.vendor.completions.enable "/share/fish/vendor_completions.d"
|
||||
++ optional cfg.vendor.functions.enable "/share/fish/vendor_functions.d";
|
||||
}
|
||||
|
||||
environment.systemPackages = [ pkgs.fish ];
|
||||
{ systemPackages = [ pkgs.fish ]; }
|
||||
|
||||
environment.shells = [
|
||||
{
|
||||
shells = [
|
||||
"/run/current-system/sw/bin/fish"
|
||||
"${pkgs.fish}/bin/fish"
|
||||
];
|
||||
}
|
||||
];
|
||||
|
||||
programs.fish.interactiveShellInit = ''
|
||||
# add completions generated by NixOS to $fish_complete_path
|
||||
begin
|
||||
# joins with null byte to acommodate all characters in paths, then respectively gets all paths before (exclusive) / after (inclusive) the first one including "generated_completions",
|
||||
# splits by null byte, and then removes all empty lines produced by using 'string'
|
||||
set -l prev (string join0 $fish_complete_path | string match --regex "^.*?(?=\x00[^\x00]*generated_completions.*)" | string split0 | string match -er ".")
|
||||
set -l post (string join0 $fish_complete_path | string match --regex "[^\x00]*generated_completions.*" | string split0 | string match -er ".")
|
||||
set fish_complete_path $prev "/etc/fish/generated_completions" $post
|
||||
end
|
||||
# prevent fish from generating completions on first run
|
||||
if not test -d $__fish_user_data_dir/generated_completions
|
||||
${pkgs.coreutils}/bin/mkdir $__fish_user_data_dir/generated_completions
|
||||
end
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user