READLINE PATCH REPORT ===================== Readline-Release: 5.1 Patch-ID: readline51-004 Bug-Reported-by: Mike Stroyan Bug-Reference-ID: <20060203191607.GC27614@localhost> Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-02/msg00004.html Bug-Description: The displayed search prompt is corrupted when using non-incremental searches in vi and emacs mode if the prompt contains non-printing characters or spans multiple lines. The prompt is expanded more than once; the second time without the escape sequences that protect non- printing characters from the length calculations. Patch: *** readline-5.1-patched/display.c Wed Nov 30 14:05:02 2005 --- readline-5.1/display.c Sat Feb 18 12:14:58 2006 *************** *** 1983,1993 **** int pchar; { int len; ! char *pmt; rl_save_prompt (); ! if (saved_local_prompt == 0) { len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0; pmt = (char *)xmalloc (len + 2); --- 1998,2012 ---- int pchar; { int len; ! char *pmt, *p; rl_save_prompt (); ! /* We've saved the prompt, and can do anything with the various prompt ! strings we need before they're restored. We want the unexpanded ! portion of the prompt string after any final newline. */ ! p = rl_prompt ? strrchr (rl_prompt, '\n') : 0; ! if (p == 0) { len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0; pmt = (char *)xmalloc (len + 2); *************** *** 1998,2016 **** } else { ! len = *saved_local_prompt ? strlen (saved_local_prompt) : 0; pmt = (char *)xmalloc (len + 2); if (len) ! strcpy (pmt, saved_local_prompt); pmt[len] = pchar; pmt[len+1] = '\0'; ! local_prompt = savestring (pmt); ! prompt_last_invisible = saved_last_invisible; ! prompt_visible_length = saved_visible_length + 1; ! } prompt_physical_chars = saved_physical_chars + 1; - return pmt; } --- 2017,2033 ---- } else { ! p++; ! len = strlen (p); pmt = (char *)xmalloc (len + 2); if (len) ! strcpy (pmt, p); pmt[len] = pchar; pmt[len+1] = '\0'; ! } + /* will be overwritten by expand_prompt, called from rl_message */ prompt_physical_chars = saved_physical_chars + 1; return pmt; }