Now libedit supports embedded mode switch sequence, improve sh

support for them (adds PSlit variable to set the magic character).
This commit is contained in:
kre 2017-06-28 13:46:06 +00:00
parent 5a941ae679
commit 4754b1e8f4
5 changed files with 154 additions and 11 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: histedit.c,v 1.51 2017/06/27 23:27:03 christos Exp $ */
/* $NetBSD: histedit.c,v 1.52 2017/06/28 13:46:06 kre Exp $ */
/*-
* Copyright (c) 1993
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)histedit.c 8.2 (Berkeley) 5/4/95";
#else
__RCSID("$NetBSD: histedit.c,v 1.51 2017/06/27 23:27:03 christos Exp $");
__RCSID("$NetBSD: histedit.c,v 1.52 2017/06/28 13:46:06 kre Exp $");
#endif
#endif /* not lint */
@ -134,7 +134,8 @@ histedit(void)
if (el != NULL) {
if (hist)
el_set(el, EL_HIST, history, hist);
el_set(el, EL_PROMPT_ESC, getprompt, L'\1');
set_prompt_lit(lookupvar("PSlit"));
el_set(el, EL_SIGNAL, 1);
el_set(el, EL_ALIAS_TEXT, alias_text, NULL);
el_set(el, EL_ADDFN, "rl-complete",
@ -174,6 +175,27 @@ bad:
}
}
void
set_prompt_lit(const char *lit_ch)
{
wchar_t wc;
if (!(iflag && editing && el))
return;
if (lit_ch == NULL) {
el_set(el, EL_PROMPT, getprompt);
return;
}
mbtowc(&wc, NULL, 1); /* state init */
if (mbtowc(&wc, lit_ch, strlen(lit_ch)) <= 0)
el_set(el, EL_PROMPT, getprompt);
else
el_set(el, EL_PROMPT_ESC, getprompt, (int)wc);
}
void
set_editrc(const char *fname)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: myhistedit.h,v 1.12 2017/06/27 02:22:08 kre Exp $ */
/* $NetBSD: myhistedit.h,v 1.13 2017/06/28 13:46:06 kre Exp $ */
/*-
* Copyright (c) 1993
@ -42,6 +42,7 @@ void sethistsize(const char *);
void setterm(const char *);
int inputrc(int, char **);
void set_editrc(const char *);
void set_prompt_lit(const char *);
int not_fcnumber(char *);
int str_to_event(const char *, int);

View File

@ -1,4 +1,4 @@
.\" $NetBSD: sh.1,v 1.155 2017/06/27 12:43:44 kre Exp $
.\" $NetBSD: sh.1,v 1.156 2017/06/28 13:46:06 kre Exp $
.\" Copyright (c) 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@ -31,7 +31,7 @@
.\"
.\" @(#)sh.1 8.6 (Berkeley) 5/4/95
.\"
.Dd June 17, 2017
.Dd June 28, 2017
.Dt SH 1
.ds flags abCEeFfhnuvxIimpqV
.Os
@ -2756,9 +2756,109 @@ for the commands that can be given to configure
.Xr editline 7
in the file named by the
.Ev EDITRC
parameter, or using
parameter,
or a file used with the
.Ic inputrc
built-in command,
or using
.Xr editline 7 Ap s
configuration command line.
.Pp
When command line editing is enabled, the
.Xr editline 7
functions control printing of the
.Ev PS1
and
.Ev PS2
prompts when required.
As, in this mode, the command line editor needs to
keep track of what characters are in what position on
the command line, care needs to be taken when setting
the prompts.
Normal printing characters are handled automatically,
however mode setting sequences, which do not actually display
on the terminal, need to be identified to
.Xr editline 7 .
This is done, when needed, by choosing a character that
is not needed anywhere in the prompt, including in the mode
setting sequences, any single character is acceptable,
and assigning it to the shell parameter
.Ev PSlit .
Then that character should be used, in pairs, in the
prompt string.
Between each pair of
.Ev PSlit
characters are mode setting sequences, which affect the printing
attributes of the following (normal) characters of the prompt,
but do not themselves appear visibly, nor change the terminal's
cursor position.
.Pp
Each such sequence, that is
.Ev PSlit
character, mode setting character sequence, and another
.Ev PSlit
character, must currently be followed by at least one following
normal prompt character, or it will be ignored.
That is, a
.Ev PSlit
character cannot be the final character of
.Ev PS1
or
.Ev PS2 ,
nor may two
.Ev PSlit
delimited sequences appear adjacent to each other.
Each sequence can contain as many mode altering sequences as are
required however.
Only the first character from
.Ev PSlit
will be used.
When set
.Ev PSlit
should usually be set to a string containing just one
character, then it can simply be embedded in
.Ev PS1
(or
.Ev PS2 )
as in
.Dl PS1="${PSlit}mset${PSlit}XYZ${PSlit}mclr${PSlit}ABC"
The prompt visible will be
.Dq XYZABC
with the
.Dq XYZ
part shown according as defined by the mode setting characters
.Dq mset ,
and then cleared again by
.Dq mclr .
See
.Xr tput 1
for one method to generate appropriate mode sequences.
Note that both parts, XYZ and ABC, must each contain at least one
character.
.Pp
If
.Ev PSlit
is unset, which is its initial state, or set to a null string,
no literal character will be defined,
and all characters of the prompt strings will be assumed
to be visible characters (which includes spaces etc.)
To allow smooth use of prompts, without needing redefinition, when
.Xr editline 7
is disabled, the character chosen should be one which will be
ignored by the terminal if received, as when
.Xr edlitline 7
is not in use, the prompt strings are simply written to the terminal.
For example, setting:
.Bd -compact -literal -offset left
PSlit="$(printf\ '\e1')"
PS1="${PSlit}$(tput\ bold\ blink)${PSlit}\e$${PSlit}$(tput\ sgr0)${PSlit}\ "
.Ed
will arrange for the primary prompt to be a bold blinking dollar sign,
if supported by the current terminal, followed by an (ordinary) space,
and, as the SOH (Control-A) character ('\e1') will not normally affect
a terminal, this same prompt will usually work with
.Xr editline 7
enabled or disabled.
.Sh ENVIRONMENT
.Bl -tag -width MAILCHECK
.It Ev CDPATH
@ -2868,6 +2968,22 @@ The secondary prompt string, which defaults to
Output before each line when execution trace (set -x) is enabled,
defaults to
.Dq + \ .
.It Ev PSlit
Defines the character which may be embedded in pairs, in
.Ev PS1
or
.Ev PS2
to indicate to
.Xr editline 7
that the characters between each pair of occurrences of the
.Ev PSlit
character will not appear in the visible prompt, and will not
cause the terminal's cursor to change position, but rather set terminal
attributes for the following prompt character(s) at least one of
which must be present.
See
.Sx Command Line Editing
above for more information.
.It Ev TERM
The default terminal setting for the shell.
This is inherited by

View File

@ -1,4 +1,4 @@
/* $NetBSD: var.c,v 1.61 2017/06/27 02:22:08 kre Exp $ */
/* $NetBSD: var.c,v 1.62 2017/06/28 13:46:06 kre Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 5/4/95";
#else
__RCSID("$NetBSD: var.c,v 1.61 2017/06/27 02:22:08 kre Exp $");
__RCSID("$NetBSD: var.c,v 1.62 2017/06/28 13:46:06 kre Exp $");
#endif
#endif /* not lint */
@ -96,6 +96,7 @@ struct localvar *localvars;
struct var vhistsize;
struct var vterm;
struct var editrc;
struct var ps_lit;
#endif
struct var vifs;
struct var vmail;
@ -142,6 +143,8 @@ const struct varinit varinit[] = {
{ .set_func= setterm } },
{ &editrc, VSTRFIXED|VTEXTFIXED|VUNSET, "EDITRC=",
{ .set_func= set_editrc } },
{ &ps_lit, VSTRFIXED|VTEXTFIXED|VUNSET, "PSlit=",
{ .set_func= set_prompt_lit } },
#endif
{ &voptind, VSTRFIXED|VTEXTFIXED|VNOFUNC, "OPTIND=1",
{ .set_func= getoptsreset } },

View File

@ -1,4 +1,4 @@
/* $NetBSD: var.h,v 1.33 2017/06/27 02:22:08 kre Exp $ */
/* $NetBSD: var.h,v 1.34 2017/06/28 13:46:06 kre Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -89,11 +89,12 @@ extern struct var vps1;
extern struct var vps2;
extern struct var vps4;
extern struct var line_num;
extern struct var editrc;
#ifndef SMALL
extern struct var editrc;
extern struct var vterm;
extern struct var vtermcap;
extern struct var vhistsize;
extern struct var ps_lit;
#endif
extern int line_number;