{ config, lib, pkgs, ... }: with lib; { meta.maintainers = [ maintainers.rycee ]; options.programs = let description = '' Whether to enable integration with terminals using the VTE library. This will let the terminal track the current working directory. ''; in { bash.enableVteIntegration = mkEnableOption "" // { inherit description; }; zsh.enableVteIntegration = mkEnableOption "" // { inherit description; }; }; config = mkMerge [ (mkIf config.programs.bash.enableVteIntegration { # Unfortunately we have to do a little dance here to fix two # problems with the upstream vte.sh file: # # - It does `PROMPT_COMMAND="__vte_prompt_command"` which # clobbers any previously assigned prompt command. # # - Its `__vte_prompt_command` function runs commands that will # overwrite the exit status of the command the user ran. programs.bash.initExtra = '' __HM_PROMPT_COMMAND="''${PROMPT_COMMAND:+''${PROMPT_COMMAND%;};}__hm_vte_prompt_command" . ${pkgs.vte}/etc/profile.d/vte.sh if [[ $(type -t __vte_prompt_command) = function ]]; then __hm_vte_prompt_command() { local old_exit_status=$? __vte_prompt_command return $old_exit_status } PROMPT_COMMAND="$__HM_PROMPT_COMMAND" fi unset __HM_PROMPT_COMMAND ''; }) (mkIf config.programs.zsh.enableVteIntegration { programs.zsh.initExtra = '' . ${pkgs.vte}/etc/profile.d/vte.sh ''; }) ]; }