mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix bell character handling when redrawing command line (#250)
To set a window title in bash and zsh, the $PS1 prompt can be set with the title placed between $'\E]0;' and $'\a': set -o emacs # Or vi mode typeset -A fmt=( [start_title]=$'\E]0;' [end_title]=$'\a' ) PS1="${fmt[start_title]}$(hostname): $(uname)${fmt[end_title]}\$ " This also works in ksh unless the shell receives SIGWINCH. With a $PS1 that sets a window title, the prompt breaks until two interrupts are received. This is caused by ed_setup() skipping $'\a' (the bell character) when setting up the e_prompt buffer which is an edited version of the final line of the PS1 prompt for use when redrawing the command line. One fix would be to avoid cutting out the bell character. But if the prompt contains a bell, we only want the terminal to beep when a new prompt is printed, and not upon refreshing the command line, e.g. when receiving SIGWINCH or pressing Ctrl+L. To avoid the problem, this commit adds code that cuts out sequences of the form ESC ] <number> ; <text> BELL from the prompt redraw buffer altogether. They are not needed there because these sequences will already have taken effect when the full prompt was printed by io_prompt(). This commit also adds a tweak that should improve the recognition of other escape sequences to count their length. src/cmd/ksh93/edit/edit.c: ed_setup(): - When preparing the e_prompt buffer, cut out dtterm/xterm Operating System Commands that set window/icon title, etc. See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html - When counting the length of escape sequences in that part of PS1, try to recognize some more types of sequences. These changes are part of a ksh2020 patch: https://github.com/att/ast/issues/399 src/cmd/ksh93/sh.1: - Document that any '!' in escape sequences in the PS1 prompt needs to be changed to '!!'. To avoid breaking compatibility, this requirement is documented instead of backporting the changes to io_prompt() from https://github.com/att/ast/issues/399 which try to remove that requirement for specific escape sequences. Co-authored-by: Martijn Dekker <martijn@inlv.org>
This commit is contained in:
parent
ee34a96b8f
commit
56b530c433
4 changed files with 57 additions and 7 deletions
|
@ -108,7 +108,7 @@ typedef struct edit
|
|||
char *e_outptr; /* pointer to position in output buffer */
|
||||
char *e_outlast; /* pointer to end of output buffer */
|
||||
genchar *e_inbuf; /* pointer to input buffer */
|
||||
char *e_prompt; /* pointer to buffer containing the prompt */
|
||||
char *e_prompt; /* pointer to trimmed final line of PS1 prompt, used when redrawing command line */
|
||||
genchar *e_killbuf; /* pointer to delete buffer */
|
||||
char e_search[SEARCHSIZE]; /* search string */
|
||||
genchar *e_physbuf; /* temporary workspace buffer */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue