diff --git a/kitty_tests/shell_integration.py b/kitty_tests/shell_integration.py index 821225ab8..effb05a3a 100644 --- a/kitty_tests/shell_integration.py +++ b/kitty_tests/shell_integration.py @@ -274,8 +274,13 @@ PS1="{ps1}" pty.send_cmd_to_child('printf "%s\x16\a%s" "a" "b"') pty.wait_till(lambda: pty.screen_contents().count(ps1) == 2) self.ae(pty.screen_contents(), f'{ps1}printf "%s^G%s" "a" "b"\nab{ps1}') + self.assertTrue(pty.screen.last_reported_cwd.endswith(self.home_dir)) pty.send_cmd_to_child('echo $HISTFILE') pty.wait_till(lambda: '.bash_history' in pty.screen_contents()) + q = os.path.join(self.home_dir, 'testing-cwd-notification') + os.mkdir(q) + pty.send_cmd_to_child(f'cd {q}') + pty.wait_till(lambda: pty.screen.last_reported_cwd.endswith(q)) for ps1 in ('line1\\nline\\2\\prompt> ', 'line1\nprompt> ', 'line1\\nprompt> ',): with self.subTest(ps1=ps1), self.run_shell( diff --git a/shell-integration/bash/kitty.bash b/shell-integration/bash/kitty.bash index ca8b89d71..9df08f86a 100644 --- a/shell-integration/bash/kitty.bash +++ b/shell-integration/bash/kitty.bash @@ -71,16 +71,19 @@ fi # which is not available on older bash builtin declare -A _ksi_prompt _ksi_prompt=( - [cursor]='y' [title]='y' [mark]='y' [complete]='y' [ps0]='' [ps0_suffix]='' [ps1]='' [ps1_suffix]='' [ps2]='' - [hostname_prefix]='' [sourced]='y' + [cursor]='y' [title]='y' [mark]='y' [complete]='y' [cwd]='y' [ps0]='' [ps0_suffix]='' [ps1]='' [ps1_suffix]='' [ps2]='' + [hostname_prefix]='' [sourced]='y' [last_reported_cwd]='' ) _ksi_main() { for i in ${KITTY_SHELL_INTEGRATION[@]}; do - if [[ "$i" == "no-cursor" ]]; then _ksi_prompt[cursor]='n'; fi - if [[ "$i" == "no-title" ]]; then _ksi_prompt[title]='n'; fi - if [[ "$i" == "no-prompt-mark" ]]; then _ksi_prompt[mark]='n'; fi - if [[ "$i" == "no-complete" ]]; then _ksi_prompt[complete]='n'; fi + case "$i" in + "no-cursor") _ksi_prompt[cursor]='n';; + "no-title") _ksi_prompt[title]='n';; + "no-prompt-mark") _ksi_prompt[mark]='n';; + "no-complete") _ksi_prompt[complete]='n';; + "no-cwd") _ksi_prompt[cwd]='n';; + esac done builtin unset KITTY_SHELL_INTEGRATION @@ -147,6 +150,16 @@ _ksi_main() { PS2=${PS2//\\\[\\e\]133;k;start_kitty\\a\\\]*end_kitty\\a\\\]} PS2="${_ksi_prompt[ps2]}$PS2" fi + + if [[ "${_ksi_prompt[cwd]}" == "y" ]]; then + # unfortunately bash provides no hooks to detect cwd changes + # in particular this means cwd reporting will not happen for a + # command like cd /test && cat. PS0 is evaluated before cd is run. + if [[ "${_ksi_prompt[last_reported_cwd]}" != "$PWD" ]]; then + _ksi_prompt[last_reported_cwd]="$PWD"; + builtin printf "\e]7;kitty-shell-cwd://%s%s\a" "$HOST" "$PWD" + fi + fi } if [[ "${_ksi_prompt[cursor]}" == "y" ]]; then @@ -245,5 +258,3 @@ _ksi_main() { } _ksi_main builtin unset -f _ksi_main -# freeze _ksi_prompt to prevent it from being changed -builtin declare -r _ksi_prompt