Using bind -x to call cd or source a script that changes the directory
will not update the prompt to show the new directory after the script
finished:

user@host:~$ bind -x '"\C-t": "echo test;cd /"'

# I press Ctrl-T
test
user@host:~$

Prompt still shows ~ as the pwd. Once I press Return or Ctrl-L the
prompt shows root as the pwd.

Updating the prompt is useful when using the mc-wrapper.sh script for
Midnight Commander that changes the bash pwd to the last mc directory
when mc exits. There is a similar wrapper for vim for example.

Attached patch decodes the prompt string again after running the
command passed to bind -x.

Regards,
Bogdan
--- a/bashline.c	2017-01-20 21:22:01.000000000 +0200
+++ b/bashline.c	2018-08-06 10:05:31.670533840 +0300
@@ -55,6 +55,7 @@
 #include "shmbutil.h"
 #include "trap.h"
 #include "flags.h"
+#include "externs.h" /* decode_prompt_string() */
 
 #if defined (HAVE_MBSTR_H) && defined (HAVE_MBSCHR)
 #  include <mbstr.h>		/* mbschr */
@@ -4066,6 +4067,8 @@
 #endif
 }
   
+extern char *current_readline_prompt;
+
 static int
 bash_execute_unix_command (count, key)
      int count;	/* ignored */
@@ -4122,6 +4125,11 @@
   save_parser_state (&ps);
   r = parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST|SEVAL_NOFREE);
   restore_parser_state (&ps);
+  
+  /* current dir may have changed, decode prompt again */
+  FREE (current_readline_prompt);
+  current_readline_prompt = decode_prompt_string (current_prompt_string);
+  rl_expand_prompt (current_readline_prompt);
 
   v = find_variable ("READLINE_LINE");
   l1 = v ? value_cell (v) : 0;

Reply via email to