mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-13 11:42:21 +00:00
Add new 'nobackslashctrl' shell option; other minor editor tweaks
The following emacs editor 'feature' kept making me want to go back to bash. I forget a backslash escape in a command somewhere. So I go back to insert it. I type the \, then want to go forward. My right arrow key, instead of moving the cursor, then replaces my backslash with garbage. Why? The backslash escapes the following control character at the editor level and inserts it literally. The vi editor has a variant of this which is much less harmful. It only works in insert mode and the backslash only escapes the next kill or erase character. In both editors, this feature is completely redundant with the 'stty lnext' character which is ^V by default -- and works better as well because it also escapes ^C, ^J (linefeed) and ^M (Return). [In fact, you could even issue 'stty lnext \\' and get a much more consistent version of this feature on any shell. You have to type two backslashes to enter one, but it won't kill your cursor keys.] If it were up to me alone, I'd simply remove this misfeature from both editors. However, it is long-standing documented behaviour. It's in the 1995 book. Plus, POSIX specifies the vi variant of it. So, this adds a shell option instead. It was quite trivial to do. Now I can 'set --nobackslashctrl' in my ~/.kshrc. What a relief! Note: To keep .kshrc compatibile with older ksh versions, use: command set --nobackslashctrl 2>/dev/null src/cmd/ksh93/include/shell.h, src/cmd/ksh93/data/options.c: - Add new SH_NOBACKSLCTRL/"nobackslashctrl" long-form option. The "no" prefix shows it to the user as "backslashctrl" which is on by default. This avoids unexpectedly changing historic behaviour. src/cmd/ksh93/edit/emacs.c: ed_emacsread(), src/cmd/ksh93/edit/vi.c: getline(): - Only set the flag for special backslash handling if SH_NOBACKSLCTRL is off. src/cmd/ksh93/sh.1, src/cmd/ksh93/data/builtins.c: - Document the new option (as "backslashctrl", on by default). Other minor tweaks: src/cmd/ksh93/edit/edit.c: - ed_setup(): Add fallback #error if no tput method is set. This should never be triggered; it's to catch future editing mistakes. - escape(): cntl('\t') is nonsense as '\t' is already a control character, so change this to just '\t'. - xcommands(): Let's enable the ^X^D command for debugging information on non-release builds. src/cmd/ksh93/features/cmds: - The tput feature tests assumed a functioning terminal in $TERM. However, for all we know we might be compiling with no tty and TERM=dumb. The tput commands won't work then. So set TERM=ansi to use a standard default.
This commit is contained in:
parent
786a549e49
commit
24598fed7c
10 changed files with 51 additions and 7 deletions
11
NEWS
11
NEWS
|
@ -3,6 +3,17 @@ For full details, see the git log at: https://github.com/ksh93/ksh
|
||||||
|
|
||||||
Any uppercase BUG_* names are modernish shell bug IDs.
|
Any uppercase BUG_* names are modernish shell bug IDs.
|
||||||
|
|
||||||
|
2021-02-15:
|
||||||
|
|
||||||
|
- A new 'backslashctrl' shell option has been added. It is on by default.
|
||||||
|
Turning it off (set +o backslashctrl or set --nobackslashctrl) disables the
|
||||||
|
special escaping behaviour of the backslash character in the emacs and vi
|
||||||
|
built-in editors. Particularly in the emacs editor, this makes it much easier
|
||||||
|
to go back, insert a forgotten backslash into a command, and then continue
|
||||||
|
editing without having your next cursor key replace your backslash with
|
||||||
|
garbage. Note that Ctrl+V (or whatever other character was set using
|
||||||
|
'stty lnext') always escapes all control characters in either editing mode.
|
||||||
|
|
||||||
2021-02-14:
|
2021-02-14:
|
||||||
|
|
||||||
- Due to a deficiency in some UNIX veriants, the 'sleep' built-in command could
|
- Due to a deficiency in some UNIX veriants, the 'sleep' built-in command could
|
||||||
|
|
|
@ -204,6 +204,10 @@ const char sh_set[] =
|
||||||
"off. This can be repeated to enable/disable multiple options. "
|
"off. This can be repeated to enable/disable multiple options. "
|
||||||
"The value of \aoption\a must be one of the following:]{"
|
"The value of \aoption\a must be one of the following:]{"
|
||||||
"[+allexport?Equivalent to \b-a\b.]"
|
"[+allexport?Equivalent to \b-a\b.]"
|
||||||
|
"[+backslashctrl?The backslash character \b\\\b escapes the "
|
||||||
|
"next control character in the \bemacs\b built-in "
|
||||||
|
"editor and the next \aerase\a or \akill\a character "
|
||||||
|
"in the \bvi\b built-in editor. On by default.]"
|
||||||
"[+bgnice?Runs background jobs at lower priorities.]"
|
"[+bgnice?Runs background jobs at lower priorities.]"
|
||||||
#if SHOPT_BRACEPAT
|
#if SHOPT_BRACEPAT
|
||||||
"[+braceexpand?Equivalent to \b-B\b.] "
|
"[+braceexpand?Equivalent to \b-B\b.] "
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
const Shtable_t shtab_options[] =
|
const Shtable_t shtab_options[] =
|
||||||
{
|
{
|
||||||
"allexport", SH_ALLEXPORT,
|
"allexport", SH_ALLEXPORT,
|
||||||
|
"nobackslashctrl", SH_NOBACKSLCTRL,
|
||||||
"bgnice", SH_BGNICE,
|
"bgnice", SH_BGNICE,
|
||||||
#if SHOPT_BRACEPAT
|
#if SHOPT_BRACEPAT
|
||||||
"braceexpand", SH_BRACEEXPAND,
|
"braceexpand", SH_BRACEEXPAND,
|
||||||
|
|
|
@ -785,6 +785,8 @@ void ed_setup(register Edit_t *ep, int fd, int reedit)
|
||||||
sh_trap(".sh.subscript=$(" _pth_tput " cuu1 2>/dev/null)",0);
|
sh_trap(".sh.subscript=$(" _pth_tput " cuu1 2>/dev/null)",0);
|
||||||
#elif _tput_termcap
|
#elif _tput_termcap
|
||||||
sh_trap(".sh.subscript=$(" _pth_tput " up 2>/dev/null)",0);
|
sh_trap(".sh.subscript=$(" _pth_tput " up 2>/dev/null)",0);
|
||||||
|
#else
|
||||||
|
#error no tput method
|
||||||
#endif
|
#endif
|
||||||
if(pp=nv_getval(SH_SUBSCRNOD))
|
if(pp=nv_getval(SH_SUBSCRNOD))
|
||||||
strncpy(CURSOR_UP,pp,sizeof(CURSOR_UP)-1);
|
strncpy(CURSOR_UP,pp,sizeof(CURSOR_UP)-1);
|
||||||
|
|
|
@ -378,7 +378,7 @@ int ed_emacsread(void *context, int fd,char *buff,int scend, int reedit)
|
||||||
}
|
}
|
||||||
for(i= ++eol; i>cur; i--)
|
for(i= ++eol; i>cur; i--)
|
||||||
out[i] = out[i-1];
|
out[i] = out[i-1];
|
||||||
backslash = (c == '\\');
|
backslash = (c == '\\' && !sh_isoption(SH_NOBACKSLCTRL));
|
||||||
out[cur++] = c;
|
out[cur++] = c;
|
||||||
draw(ep,APPEND);
|
draw(ep,APPEND);
|
||||||
continue;
|
continue;
|
||||||
|
@ -1010,7 +1010,7 @@ static int escape(register Emacs_t* ep,register genchar *out,int count)
|
||||||
if(ep->ed->e_tabcount==1)
|
if(ep->ed->e_tabcount==1)
|
||||||
{
|
{
|
||||||
ep->ed->e_tabcount=2;
|
ep->ed->e_tabcount=2;
|
||||||
ed_ungetchar(ep->ed,cntl('\t'));
|
ed_ungetchar(ep->ed,'\t');
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
beep();
|
beep();
|
||||||
|
@ -1229,7 +1229,7 @@ static void xcommands(register Emacs_t *ep,int count)
|
||||||
show_info(ep,hbuf);
|
show_info(ep,hbuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
# if 0 /* debugging, modify as required */
|
# if !AST_ksh_release /* debugging, modify as required */
|
||||||
case cntl('D'): /* ^X^D show debugging info */
|
case cntl('D'): /* ^X^D show debugging info */
|
||||||
{
|
{
|
||||||
char debugbuf[MAXLINE];
|
char debugbuf[MAXLINE];
|
||||||
|
|
|
@ -1583,7 +1583,7 @@ static void getline(register Vi_t* vp,register int mode)
|
||||||
mode = APPEND;
|
mode = APPEND;
|
||||||
max_virt = last_virt+3;
|
max_virt = last_virt+3;
|
||||||
}
|
}
|
||||||
backslash = (c == '\\');
|
backslash = (c == '\\' && !sh_isoption(SH_NOBACKSLCTRL));
|
||||||
append(vp,c, mode);
|
append(vp,c, mode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@ pth ed fail{
|
||||||
pth tput
|
pth tput
|
||||||
|
|
||||||
tput_terminfo note{ does tput support terminfo codes }end run{
|
tput_terminfo note{ does tput support terminfo codes }end run{
|
||||||
|
TERM=ansi
|
||||||
|
export TERM
|
||||||
case ${_pth_tput-} in
|
case ${_pth_tput-} in
|
||||||
\"/*/tput\")
|
\"/*/tput\")
|
||||||
tput=`echo "${_pth_tput}" | sed 's/^"//; s/"$//'`
|
tput=`echo "${_pth_tput}" | sed 's/^"//; s/"$//'`
|
||||||
|
@ -21,6 +23,8 @@ tput_terminfo note{ does tput support terminfo codes }end run{
|
||||||
}end
|
}end
|
||||||
|
|
||||||
tput_termcap note{ does tput support termcap codes }end run{
|
tput_termcap note{ does tput support termcap codes }end run{
|
||||||
|
TERM=ansi
|
||||||
|
export TERM
|
||||||
case ${_pth_tput-} in
|
case ${_pth_tput-} in
|
||||||
\"/*/tput\")
|
\"/*/tput\")
|
||||||
tput=`echo "${_pth_tput}" | sed 's/^"//; s/"$//'`
|
tput=`echo "${_pth_tput}" | sed 's/^"//; s/"$//'`
|
||||||
|
|
|
@ -132,6 +132,7 @@ typedef union Shnode_u Shnode_t;
|
||||||
#endif
|
#endif
|
||||||
#define SH_POSIX 46
|
#define SH_POSIX 46
|
||||||
#define SH_MULTILINE 47
|
#define SH_MULTILINE 47
|
||||||
|
#define SH_NOBACKSLCTRL 48
|
||||||
#define SH_LOGIN_SHELL 67
|
#define SH_LOGIN_SHELL 67
|
||||||
#define SH_NOUSRPROFILE 79 /* internal use only */
|
#define SH_NOUSRPROFILE 79 /* internal use only */
|
||||||
#define SH_COMMANDLINE 0x100 /* bit flag for invocation-only options ('set -o' cannot change them) */
|
#define SH_COMMANDLINE 0x100 /* bit flag for invocation-only options ('set -o' cannot change them) */
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */
|
#define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */
|
||||||
#define SH_RELEASE_SVER "1.0.0-alpha" /* semantic version number: https://semver.org */
|
#define SH_RELEASE_SVER "1.0.0-alpha" /* semantic version number: https://semver.org */
|
||||||
#define SH_RELEASE_DATE "2021-02-14" /* must be in this format for $((.sh.version)) */
|
#define SH_RELEASE_DATE "2021-02-15" /* must be in this format for $((.sh.version)) */
|
||||||
#define SH_RELEASE_CPYR "(c) 2020-2021 Contributors to ksh " SH_RELEASE_FORK
|
#define SH_RELEASE_CPYR "(c) 2020-2021 Contributors to ksh " SH_RELEASE_FORK
|
||||||
|
|
||||||
/* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */
|
/* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */
|
||||||
|
|
|
@ -4964,7 +4964,9 @@ Multiply parameter of next command by 4.
|
||||||
.PP
|
.PP
|
||||||
.TP 10
|
.TP 10
|
||||||
.BI \e
|
.BI \e
|
||||||
Escape next character.
|
If the
|
||||||
|
.B backslashctrl
|
||||||
|
shell option is on (which is the default setting), this escapes the next character.
|
||||||
Editing characters, the user's erase, kill and
|
Editing characters, the user's erase, kill and
|
||||||
interrupt (normally
|
interrupt (normally
|
||||||
.BR ^? )
|
.BR ^? )
|
||||||
|
@ -4976,6 +4978,9 @@ The
|
||||||
.B \e
|
.B \e
|
||||||
removes the next character's
|
removes the next character's
|
||||||
editing features (if any).
|
editing features (if any).
|
||||||
|
See also
|
||||||
|
.I lnext
|
||||||
|
which is not subject to any shell option.
|
||||||
.PP
|
.PP
|
||||||
.TP 10
|
.TP 10
|
||||||
.B M-^V
|
.B M-^V
|
||||||
|
@ -5074,7 +5079,9 @@ On some systems the \f3viraw\fP option
|
||||||
may be required for this to work.
|
may be required for this to work.
|
||||||
.TP 10
|
.TP 10
|
||||||
.BI \e
|
.BI \e
|
||||||
Escape the next
|
If the
|
||||||
|
.B backslashctrl
|
||||||
|
shell option is on (which is the default setting), this escapes the next
|
||||||
.I erase
|
.I erase
|
||||||
or
|
or
|
||||||
.I kill
|
.I kill
|
||||||
|
@ -7004,6 +7011,20 @@ The following argument can be one of the following option names:
|
||||||
Same as
|
Same as
|
||||||
.BR \-a .
|
.BR \-a .
|
||||||
.TP 8
|
.TP 8
|
||||||
|
.B backslashctrl
|
||||||
|
The backslash character
|
||||||
|
.B \\\\
|
||||||
|
escapes the next control character in the
|
||||||
|
.B emacs
|
||||||
|
built-in editor and the next
|
||||||
|
.I erase
|
||||||
|
or
|
||||||
|
.I kill
|
||||||
|
character in the
|
||||||
|
.B vi
|
||||||
|
built-in editor.
|
||||||
|
On by default.
|
||||||
|
.TP 8
|
||||||
.B bgnice
|
.B bgnice
|
||||||
All background jobs are run at a lower priority.
|
All background jobs are run at a lower priority.
|
||||||
This is the default mode.
|
This is the default mode.
|
||||||
|
|
Loading…
Reference in a new issue