From 2584cd0634fbba1e251276c21d2f4b821c366212 Mon Sep 17 00:00:00 2001 From: tg Date: Sat, 18 Feb 2017 02:33:15 +0000 Subject: [PATCH] fixup relation between lksh and mksh (somewhat minimal delta) --- Build.sh | 5 ++- check.t | 64 +++--------------------------------- dot.mkshrc | 93 +++++++++++++++++++++++++++------------------------- funcs.c | 4 +-- lex.c | 6 ++-- lksh.1 | 78 ++++++++++++------------------------------- misc.c | 8 ++--- sh.h | 14 ++------ sh_flags.opt | 16 ++++----- 9 files changed, 91 insertions(+), 197 deletions(-) diff --git a/Build.sh b/Build.sh index d0ff130..ad809bc 100644 --- a/Build.sh +++ b/Build.sh @@ -1,5 +1,5 @@ #!/bin/sh -srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.707 2016/11/11 23:31:29 tg Exp $' +srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.708 2017/02/18 02:33:08 tg Exp $' #- # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012, 2013, 2014, 2015, 2016 @@ -586,11 +586,10 @@ fi rmf a.exe* a.out* conftest.c conftest.exe* *core core.* ${tfn}* *.bc *.dbg \ *.ll *.o *.gen *.cat1 Rebuild.sh lft no signames.inc test.sh x vv.out -SRCS="lalloc.c eval.c exec.c expr.c funcs.c histrap.c jobs.c" +SRCS="lalloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c jobs.c" SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c" if test $legacy = 0; then - SRCS="$SRCS edit.c" check_categories="$check_categories shell:legacy-no int:32" else check_categories="$check_categories shell:legacy-yes" diff --git a/check.t b/check.t index 4af069e..e75ad0f 100644 --- a/check.t +++ b/check.t @@ -1,4 +1,4 @@ -# $MirOS: src/bin/mksh/check.t,v 1.757 2017/02/17 22:40:09 tg Exp $ +# $MirOS: src/bin/mksh/check.t,v 1.758 2017/02/18 02:33:09 tg Exp $ # -*- mode: sh -*- #- # Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, @@ -30,7 +30,7 @@ # (2013/12/02 20:39:44) http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/regress/bin/ksh/?sortby=date expected-stdout: - @(#)MIRBSD KSH R54 2017/02/17 + @(#)MIRBSD KSH R54 2017/02/18 description: Check version of shell. stdin: @@ -39,7 +39,7 @@ name: KSH_VERSION category: shell:legacy-no --- expected-stdout: - @(#)LEGACY KSH R54 2017/02/17 + @(#)LEGACY KSH R54 2017/02/18 description: Check version of legacy shell. stdin: @@ -92,23 +92,6 @@ category: disabled stdin: set --- -name: selftest-legacy -description: - Check some things in the LEGACY KSH -category: shell:legacy-yes -stdin: - set +o emacs - set +o vi - [[ "$(set +o) -o" = *"-o emacs -o"* ]] && echo 1=emacs - [[ "$(set +o) -o" = *"-o vi -o"* ]] && echo 1=vi - set -o emacs - set -o vi - [[ "$(set +o) -o" = *"-o emacs -o"* ]] && echo 2=emacs - [[ "$(set +o) -o" = *"-o vi -o"* ]] && echo 2=vi -expected-stdout: - 2=emacs - 2=vi ---- name: selftest-direct-builtin-call description: Check that direct builtin calls work @@ -10187,7 +10170,6 @@ name: bashiop-1 description: Check if GNU bash-like I/O redirection works Part 1: this is also supported by GNU bash -category: shell:legacy-no stdin: exec 3>&1 function threeout { @@ -10208,7 +10190,6 @@ name: bashiop-2a description: Check if GNU bash-like I/O redirection works Part 2: this is *not* supported by GNU bash -category: shell:legacy-no stdin: exec 3>&1 function threeout { @@ -10229,7 +10210,6 @@ name: bashiop-2b description: Check if GNU bash-like I/O redirection works Part 2: this is *not* supported by GNU bash -category: shell:legacy-no stdin: exec 3>&1 function threeout { @@ -10250,7 +10230,6 @@ name: bashiop-2c description: Check if GNU bash-like I/O redirection works Part 2: this is supported by GNU bash 4 only -category: shell:legacy-no stdin: echo mir >foo set -o noclobber @@ -10274,7 +10253,6 @@ name: bashiop-3a description: Check if GNU bash-like I/O redirection fails correctly Part 1: this is also supported by GNU bash -category: shell:legacy-no stdin: echo mir >foo set -o noclobber @@ -10296,7 +10274,6 @@ name: bashiop-3b description: Check if GNU bash-like I/O redirection fails correctly Part 2: this is *not* supported by GNU bash -category: shell:legacy-no stdin: echo mir >foo set -o noclobber @@ -10320,7 +10297,6 @@ description: Check if GNU bash-like I/O redirection works Part 4: this is also supported by GNU bash, but failed in some mksh versions -category: shell:legacy-no stdin: exec 3>&1 function threeout { @@ -10342,11 +10318,10 @@ expected-stdout: ras dwa --- -name: bashiop-5-normal +name: bashiop-5 description: Check if GNU bash-like I/O redirection is only supported in !POSIX !sh mode as it breaks existing scripts' syntax -category: shell:legacy-no stdin: :>x; echo 1 "$("$__progname" -c 'echo foo>/dev/null&>x echo bar')" = "$(x; echo 2 "$("$__progname" -o posix -c 'echo foo>/dev/null&>x echo bar')" = "$(x; echo 1 "$("$__progname" -c 'echo foo>/dev/null&>x echo bar')" = "$(x; echo 2 "$("$__progname" -o posix -c 'echo foo>/dev/null&>x echo bar')" = "$(x; echo 3 "$("$__progname" -o sh -c 'echo foo>/dev/null&>x echo bar')" = "$(cld <<-EOF #!$__perlname @@ -10639,22 +10599,6 @@ stdin: expected-stdout: Fowl --- -name: fd-cloexec-3 -description: - Verify that file descriptors > 2 are not private for LEGACY KSH -category: shell:legacy-yes -stdin: - cat >cld <<-EOF - #!$__perlname - open(my \$fh, ">&", 9) or die "E: open \$!"; - syswrite(\$fh, "Fowl\\n", 5) or die "E: write \$!"; - EOF - chmod +x cld - exec 9>&1 - ./cld -expected-stdout: - Fowl ---- name: comsub-1a description: COMSUB are now parsed recursively, so this works diff --git a/dot.mkshrc b/dot.mkshrc index 13a1f54..ef1c742 100644 --- a/dot.mkshrc +++ b/dot.mkshrc @@ -1,8 +1,8 @@ # $Id$ -# $MirOS: src/bin/mksh/dot.mkshrc,v 1.108 2016/07/26 22:03:41 tg Exp $ +# $MirOS: src/bin/mksh/dot.mkshrc,v 1.109 2017/02/18 02:33:11 tg Exp $ #- # Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012, 2013, 2014, 2015, 2016 +# 2011, 2012, 2013, 2014, 2015, 2016, 2017 # mirabilos # # Provided that these terms and disclaimer and all copyright notices @@ -22,19 +22,56 @@ #- # ${ENV:-~/.mkshrc}: mksh initialisation file for interactive shells -# catch non-mksh (including lksh) trying to run this file +# catch non-mksh, non-lksh, trying to run this file case ${KSH_VERSION:-} in -*MIRBSD\ KSH*) ;; +*LEGACY\ KSH*|*MIRBSD\ KSH*) ;; *) return 0 ;; esac -PS1='#'; (( USER_ID )) && PS1='$'; \: "${TERM:=vt100}${HOSTNAME:=$(\ulimit -c \ - 0; hostname 2>/dev/null)}${EDITOR:=/bin/ed}${USER:=$(\ulimit -c 0; id -un \ - 2>/dev/null || \echo \?)}${MKSH:=$(\builtin whence -p mksh)}" -HOSTNAME=${HOSTNAME%%*([ ]).*}; HOSTNAME=${HOSTNAME##*([ ])} -[[ $HOSTNAME = ?(ip6-)localhost?(6) ]] && HOSTNAME= -\: "${HOSTNAME:=nil}${MKSH:=/bin/mksh}"; \export EDITOR HOSTNAME MKSH TERM USER -PS4='[$EPOCHREALTIME] '; PS1=$'\001\r''${| +# give MidnightBSD's laffer1 a bit of csh feeling +function setenv { + if (( $# )); then + \eval '\export "$1"="${2:-}"' + else + \typeset -x + fi +} + +# pager (not control character safe) +smores() ( + \set +m + \cat "$@" |& + \trap "rv=\$?; 'kill' $! >/dev/null 2>&1; 'exit' \$rv" EXIT + while IFS= \read -pr line; do + llen=${%line} + (( llen == -1 )) && llen=${#line} + (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 )) + if (( (curlin += llen) >= LINES )); then + \builtin print -n -- '\e[7m--more--\e[0m' + \read -u1 || \exit $? + [[ $REPLY = [Qq]* ]] && \exit 0 + curlin=$llen + fi + \builtin print -r -- "$line" + done +) + +\: "${EDITOR:=/bin/ed}${TERM:=vt100}${HOSTNAME:=$(\ulimit -c 0; \echo \ + $(hostname 2>/dev/null))}${USER:=$(\ulimit -c 0; id -un 2>/dev/null)}" +[[ $HOSTNAME = ?(?(ip6-)localhost?(6)) ]] && HOSTNAME=nil; \: "${USER:=?}" +\alias ls=ls l='ls -F' la='l -a' ll='l -l' lo='l -alo'; \unalias ls +\export EDITOR HOSTNAME TERM USER + +# minimal support for lksh users +if [[ $KSH_VERSION = *LEGACY\ KSH* ]]; then + PS1='$USER@${HOSTNAME%%.*}:$PWD>' + return 0 +fi + +# mksh-specific from here +\: "${MKSH:=$(\builtin whence -p mksh)}"; \: "${MKSH:=/bin/mksh}"; \export MKSH + +PS4='[$EPOCHREALTIME] '; PS1='#'; (( USER_ID )) && PS1='$'; PS1=$'\001\r''${| \typeset e=$? (( e )) && REPLY+="$e|" @@ -47,12 +84,6 @@ PS4='[$EPOCHREALTIME] '; PS1=$'\001\r''${| \return $e } '"$PS1 " -\alias ls=ls -\unalias ls -\alias l='ls -F' -\alias la='l -a' -\alias ll='l -l' -\alias lo='l -alo' \alias doch='sudo mksh -c "$(\builtin fc -ln -1)"' \command -v rot13 >/dev/null || \alias rot13='tr \ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \ @@ -249,25 +280,6 @@ function pushd { \dirs $fa } -# pager (not control character safe) -smores() ( - \set +m - \cat "$@" |& - \trap "rv=\$?; 'kill' $! >/dev/null 2>&1; 'exit' \$rv" EXIT - while IFS= \read -pr line; do - llen=${%line} - (( llen == -1 )) && llen=${#line} - (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 )) - if (( (curlin += llen) >= LINES )); then - \builtin print -n -- '\e[7m--more--\e[0m' - \read -u1 || \exit $? - [[ $REPLY = [Qq]* ]] && \exit 0 - curlin=$llen - fi - \builtin print -r -- "$line" - done -) - # base64 encoder and decoder, RFC compliant, NUL safe, not EBCDIC safe function Lb64decode { \set +U @@ -380,15 +392,6 @@ function Lstripcom { done } -# give MidnightBSD's laffer1 a bit of csh feeling -function setenv { - if (( $# )); then - \eval '\export "$1"="${2:-}"' - else - \typeset -x - fi -} - # toggle built-in aliases and utilities, and aliases and functions from mkshrc function enable { \typeset doprnt=0 mode=1 x y z rv=0 diff --git a/funcs.c b/funcs.c index 590ab7f..849ff44 100644 --- a/funcs.c +++ b/funcs.c @@ -38,7 +38,7 @@ #endif #endif -__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.322 2017/02/18 01:27:24 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.323 2017/02/18 02:33:11 tg Exp $"); #if HAVE_KILLPG /* @@ -2809,7 +2809,6 @@ c_exec(const char **wp MKSH_A_UNUSED) for (i = 0; i < NUFILE; i++) { if (e->savefd[i] > 0) close(e->savefd[i]); -#ifndef MKSH_LEGACY_MODE /* * keep all file descriptors > 2 private for ksh, * but not for POSIX or legacy/kludge sh @@ -2817,7 +2816,6 @@ c_exec(const char **wp MKSH_A_UNUSED) if (!Flag(FPOSIX) && !Flag(FSH) && i > 2 && e->savefd[i]) fcntl(i, F_SETFD, FD_CLOEXEC); -#endif } e->savefd = NULL; } diff --git a/lex.c b/lex.c index 741bb93..0596ea7 100644 --- a/lex.c +++ b/lex.c @@ -2,7 +2,7 @@ /*- * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - * 2011, 2012, 2013, 2014, 2015, 2016 + * 2011, 2012, 2013, 2014, 2015, 2016, 2017 * mirabilos * * Provided that these terms and disclaimer and all copyright notices @@ -23,7 +23,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.228 2016/08/01 21:38:03 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.229 2017/02/18 02:33:12 tg Exp $"); /* * states while lexing word @@ -893,9 +893,7 @@ yylex(int cf) dp = Xstring(ws, wp); if (state == SBASE && ( -#ifndef MKSH_LEGACY_MODE (c == '&' && !Flag(FSH) && !Flag(FPOSIX)) || -#endif c == '<' || c == '>') && ((c2 = Xlength(ws, wp)) == 0 || (c2 == 2 && dp[0] == CHAR && ksh_isdigit(dp[1])))) { struct ioword *iop = alloc(sizeof(struct ioword), ATEMP); diff --git a/lksh.1 b/lksh.1 index a9f8be7..44070b9 100644 --- a/lksh.1 +++ b/lksh.1 @@ -1,6 +1,6 @@ -.\" $MirOS: src/bin/mksh/lksh.1,v 1.20 2016/11/11 23:31:35 tg Exp $ +.\" $MirOS: src/bin/mksh/lksh.1,v 1.21 2017/02/18 02:33:13 tg Exp $ .\"- -.\" Copyright (c) 2008, 2009, 2010, 2012, 2013, 2015, 2016 +.\" Copyright (c) 2008, 2009, 2010, 2012, 2013, 2015, 2016, 2017 .\" mirabilos .\" .\" Provided that these terms and disclaimer and all copyright notices @@ -74,7 +74,7 @@ .\" with -mandoc, it might implement .Mx itself, but we want to .\" use our own definition. And .Dd must come *first*, always. .\" -.Dd $Mdocdate: November 11 2016 $ +.Dd $Mdocdate: February 18 2017 $ .\" .\" Check which macro package we use, and do other -mdoc setup. .\" @@ -173,9 +173,15 @@ It is built on refer to its manual page for details on the scripting language. It is recommended to port scripts to .Nm mksh -instead of relying on legacy or idiotic POSIX-mandated behaviour, +instead of relying on legacy or objectionable POSIX-mandated behaviour, since the MirBSD Korn Shell scripting language is much more consistent. .Pp +Do not use +.Nm +as an interactive or login shell; use +.Nm mksh +instead. +.Pp Note that it's strongly recommended to invoke .Nm with at least the @@ -195,15 +201,6 @@ currently has the following differences from .Nm mksh : .Bl -bullet .It -.\"XXX TODO: remove (some systems may wish to have lksh as ksh) -There is no explicit support for interactive use, -nor any command line editing or history code. -Hence, -.Nm -is not suitable as a user's login shell, either; use -.Nm mksh -instead. -.It The .Ev KSH_VERSION string identifies @@ -241,25 +238,11 @@ Division of the largest negative number by \-1 is Undefined Behaviour. The compiler is permitted to delete all data and crash the system if Undefined Behaviour occurs (see above for an example). .It -.\"XXX TODO: move this to FPOSIX The rotation arithmetic operators are not available. .It The shift arithmetic operators take all bits of the second operand into account; if they exceed permitted precision, the result is unspecified. .It -.\"XXX TODO: move this to FPOSIX -The -.Tn GNU -.Nm bash -extension &\*(Gt to redirect stdout and stderr in one go is not parsed. -.It -.\"XXX TODO: drop along with allowing interactivity -The -.Nm mksh -command line option -.Fl T -is not available. -.It Unless .Ic set -o posix is active, @@ -275,24 +258,13 @@ passes through the errorlevel from the .Xr getopt 1 command. .It -.\"XXX TODO: move to FPOSIX/FSH -Unlike -.At -.Nm ksh , -.Nm mksh -in -.Fl o Ic posix -or -.Fl o Ic sh -mode and -.Nm lksh -do not keep file descriptors \*(Gt 2 private from sub-processes. -.It Functions defined with the .Ic function reserved word share the shell options .Pq Ic set -o instead of locally scoping them. +.It +Support for persistent history is never compiled in. .El .Sh SEE ALSO .Xr mksh 1 @@ -301,12 +273,6 @@ instead of locally scoping them. .Pp .Pa https://www.mirbsd.org/ksh\-chan.htm .Sh CAVEATS -The distinction between the shell variants -.Pq Nm lksh / Nm mksh -and shell flags -.Pq Fl o Ic posix / Ic sh -will be reworked for an upcoming release. -.Pp To use .Nm as @@ -315,16 +281,22 @@ compilation to enable .Ic set -o posix by default if called as .Nm sh +.Pq adding Dv \-DMKSH_BINSHPOSIX to Dv CPPFLAGS is highly recommended for better standards compliance. +.Pp For better compatibility with legacy scripts, such as many .Tn Debian maintainer scripts, Upstart and SYSV init scripts, and other -unfixed scripts, using the compile-time options for enabling +unfixed scripts, also adding the +.Dv \-DMKSH_BINSHREDUCED +compile-time option to enable .Em both .Ic set -o posix -o sh when the shell is run as -.Nm sh -is recommended. +.Nm sh , +as well as integrating the optional disrecommended +.Xr printf 1 +builtin, might be necessary. .Pp .Nm tries to make a cross between a legacy bourne/posix compatibl-ish @@ -332,14 +304,6 @@ shell and a legacy pdksh-alike but .Dq legacy is not exactly specified. .Pp -The -.Ic set -built-in command does not currently have all options one would expect -from a full-blown -.Nm mksh -or -.Nm pdksh . -.Pp Talk to the .Mx development team using the mailing list at diff --git a/misc.c b/misc.c index 1f845c2..c7c15a7 100644 --- a/misc.c +++ b/misc.c @@ -3,7 +3,7 @@ /*- * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - * 2011, 2012, 2013, 2014, 2015, 2016 + * 2011, 2012, 2013, 2014, 2015, 2016, 2017 * mirabilos * * Provided that these terms and disclaimer and all copyright notices @@ -30,7 +30,7 @@ #include #endif -__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.250 2016/11/12 03:54:48 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.251 2017/02/18 02:33:13 tg Exp $"); #define KSH_CHVT_FLAG #ifdef MKSH_SMALL @@ -40,10 +40,6 @@ __RCSID("$MirOS: src/bin/mksh/misc.c,v 1.250 2016/11/12 03:54:48 tg Exp $"); #define KSH_CHVT_CODE #define KSH_CHVT_FLAG #endif -#ifdef MKSH_LEGACY_MODE -#undef KSH_CHVT_CODE -#undef KSH_CHVT_FLAG -#endif /* type bits for unsigned char */ unsigned char chtypes[UCHAR_MAX + 1]; diff --git a/sh.h b/sh.h index 84db7ca..a6cae69 100644 --- a/sh.h +++ b/sh.h @@ -10,7 +10,7 @@ /*- * Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - * 2011, 2012, 2013, 2014, 2015, 2016 + * 2011, 2012, 2013, 2014, 2015, 2016, 2017 * mirabilos * * Provided that these terms and disclaimer and all copyright notices @@ -175,9 +175,9 @@ #endif #ifdef EXTERN -__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.792 2017/02/17 22:40:13 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.793 2017/02/18 02:33:14 tg Exp $"); #endif -#define MKSH_VERSION "R54 2017/02/17" +#define MKSH_VERSION "R54 2017/02/18" /* arithmetic types: C implementation */ #if !HAVE_CAN_INTTYPES @@ -630,14 +630,6 @@ im_sorry_dave(void) } while (/* CONSTCOND */ 0) #endif -#ifdef MKSH_LEGACY_MODE -#ifndef MKSH_NO_CMDLINE_EDITING -#define MKSH_NO_CMDLINE_EDITING /* defined */ -#endif -#undef MKSH_S_NOVI -#define MKSH_S_NOVI 1 -#endif - #ifdef MKSH_SMALL #ifndef MKSH_NOPWNAM #define MKSH_NOPWNAM /* defined */ diff --git a/sh_flags.opt b/sh_flags.opt index 9f364d5..795d198 100644 --- a/sh_flags.opt +++ b/sh_flags.opt @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2013, 2014, 2015 + * Copyright (c) 2013, 2014, 2015, 2017 * mirabilos * * Provided that these terms and disclaimer and all copyright notices @@ -19,7 +19,7 @@ */ @SHFLAGS_DEFNS -__RCSID("$MirOS: src/bin/mksh/sh_flags.opt,v 1.4 2015/12/12 21:08:44 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/sh_flags.opt,v 1.5 2017/02/18 02:33:15 tg Exp $"); @SHFLAGS_ENUMS #define FN(sname,cname,flags,ochar) cname, #define F0(sname,cname,flags,ochar) cname = 0, @@ -52,7 +52,7 @@ FN("bgnice", FBGNICE, OF_ANY FN("braceexpand", FBRACEEXPAND, OF_ANY /* ./. Emacs command line editing mode */ ->|!defined(MKSH_NO_CMDLINE_EDITING) || defined(MKSH_LEGACY_MODE) +>|!MKSH_NO_CMDLINE_EDITING FN("emacs", FEMACS, OF_ANY /* -e quit on error */ @@ -60,7 +60,7 @@ FN("emacs", FEMACS, OF_ANY FN("errexit", FERREXIT, OF_ANY /* ./. Emacs command line editing mode, gmacs variant */ ->|!defined(MKSH_NO_CMDLINE_EDITING) || defined(MKSH_LEGACY_MODE) +>|!MKSH_NO_CMDLINE_EDITING FN("gmacs", FGMACS, OF_ANY /* ./. reading EOF does not exit */ @@ -160,19 +160,19 @@ FN("utf8-mode", FUNICODE, OF_ANY FN("verbose", FVERBOSE, OF_ANY /* ./. Vi command line editing mode */ ->|!defined(MKSH_NO_CMDLINE_EDITING) || defined(MKSH_LEGACY_MODE) +>|!MKSH_NO_CMDLINE_EDITING FN("vi", FVI, OF_ANY /* ./. enable ESC as file name completion character (non-standard) */ ->|!defined(MKSH_NO_CMDLINE_EDITING) || defined(MKSH_LEGACY_MODE) +>|!MKSH_NO_CMDLINE_EDITING FN("vi-esccomplete", FVIESCCOMPLETE, OF_ANY /* ./. enable Tab as file name completion character (non-standard) */ ->|!defined(MKSH_NO_CMDLINE_EDITING) || defined(MKSH_LEGACY_MODE) +>|!MKSH_NO_CMDLINE_EDITING FN("vi-tabcomplete", FVITABCOMPLETE, OF_ANY /* ./. always read in raw mode (no effect) */ ->|!defined(MKSH_NO_CMDLINE_EDITING) || defined(MKSH_LEGACY_MODE) +>|!MKSH_NO_CMDLINE_EDITING FN("viraw", FVIRAW, OF_ANY /* -x execution trace (display commands as they are run) */