bring back the 'version' editing command at "ESC ^V" like AT&T ksh93+r

This commit is contained in:
tg 2006-08-01 12:44:17 +00:00
parent 711496f6fb
commit db107a9b05
4 changed files with 85 additions and 29 deletions

View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.47 2006/07/23 14:35:43 tg Exp $
# $MirOS: src/bin/mksh/check.t,v 1.48 2006/08/01 12:44:16 tg Exp $
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
@ -3784,5 +3784,5 @@ category: pdksh
stdin:
echo $KSH_VERSION
expected-stdout:
@(#)MIRBSD KSH R27 2006/07/23
@(#)MIRBSD KSH R27 2006/08/01
---

83
edit.c
View File

@ -5,7 +5,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.23 2006/07/11 14:51:01 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.24 2006/08/01 12:44:16 tg Exp $");
/* tty driver characters we are interested in */
typedef struct {
@ -47,6 +47,10 @@ static void x_sigwinch(int);
static volatile sig_atomic_t got_sigwinch;
static void check_sigwinch(void);
static int path_order_cmp(const void *aa, const void *bb);
static char *add_glob(const char *, int);
static void glob_table(const char *, XPtrV *, struct table *);
static void glob_path(int flags, const char *, XPtrV *, const char *);
static int x_file_glob(int, const char *, int, char ***);
static int x_command_glob(int, const char *, int, char ***);
static int x_locate_word(const char *, int, int, int *, int *);
@ -316,10 +320,6 @@ x_do_comment(char *buf, int bsize, int *lenp)
/* Common file/command completion code for vi/emacs */
static char *add_glob(const char *, int);
static void glob_table(const char *, XPtrV *, struct table *);
static void glob_path(int flags, const char *, XPtrV *, const char *);
void
x_print_expansions(int nwords, char * const *words, int is_command)
{
@ -455,8 +455,6 @@ struct path_order_info {
int path_order;
};
static int path_order_cmp(const void *aa, const void *bb);
/* Compare routine used in x_command_glob() */
static int
path_order_cmp(const void *aa, const void *bb)
@ -995,6 +993,11 @@ static char *x_lastcp(void);
static void do_complete(int, Comp_type);
static int x_emacs_putbuf(const char *, size_t);
static int unget_char = -1;
static int x_do_ins(const char *, int);
static void bind_if_not_bound(int, int, int);
#define XFUNC_abort 0
#define XFUNC_beg_hist 1
#define XFUNC_comp_comm 2
@ -1050,6 +1053,7 @@ static int x_emacs_putbuf(const char *, size_t);
#define XFUNC_fold_upper 52
#define XFUNC_set_arg 53
#define XFUNC_comment 54
#define XFUNC_version 55
static int x_abort (int);
static int x_beg_hist (int);
@ -1106,6 +1110,7 @@ static int x_fold_lower (int);
static int x_fold_upper (int);
static int x_set_arg (int);
static int x_comment (int);
static int x_version (int);
static const struct x_ftab x_ftab[] = {
{ x_abort, "abort", 0 },
@ -1163,6 +1168,7 @@ static const struct x_ftab x_ftab[] = {
{ x_fold_upper, "upcase-word", XF_ARG },
{ x_set_arg, "set-arg", XF_NOBIND },
{ x_comment, "comment", 0 },
{ x_version, "version", 0 },
{ 0, NULL, 0 }
};
@ -1219,6 +1225,7 @@ static struct x_defbindings const x_defbindings[] = {
{ XFUNC_kill_region, 0, MKCTRL('W') },
{ XFUNC_xchg_point_mark, 2, MKCTRL('X') },
{ XFUNC_literal, 0, MKCTRL('V') },
{ XFUNC_version, 1, MKCTRL('V') },
{ XFUNC_prev_histword, 1, '.' },
{ XFUNC_prev_histword, 1, '_' },
{ XFUNC_set_arg, 1, '0' },
@ -1351,8 +1358,6 @@ x_ins_string(int c)
return KSTD;
}
static int x_do_ins(const char *cp, int len);
static int
x_do_ins(const char *cp, int len)
{
@ -2349,8 +2354,6 @@ x_init_emacs(void)
Flag(FEMACSUSEMETA) = 0;
}
static void bind_if_not_bound(int p, int k, int func);
static void
bind_if_not_bound(int p, int k, int func)
{
@ -2574,7 +2577,6 @@ do_complete(int flags, /* XCF_{COMMAND,FILE,COMMAND_FILE} */
* RETURN VALUE:
* None
*/
static void
x_adjust(void)
{
@ -2589,8 +2591,6 @@ x_adjust(void)
x_flush();
}
static int unget_char = -1;
static void
x_e_ungetc(int c)
{
@ -2660,7 +2660,6 @@ x_e_puts(const char *s)
* RETURN VALUE:
* KSTD
*/
static int
x_set_arg(int c)
{
@ -2682,7 +2681,6 @@ x_set_arg(int c)
return KSTD;
}
/* Comment or uncomment the current line. */
static int
x_comment(int c __attribute__((unused)))
@ -2704,6 +2702,37 @@ x_comment(int c __attribute__((unused)))
return KSTD;
}
static int
x_version(int c __attribute__((unused)))
{
char *o_xbuf = xbuf, *o_xend = xend;
char *o_xbp = xbp, *o_xep = xep, *o_xcp = xcp;
int lim = x_lastcp() - xbp;
char *v = strdup(MKSH_VERSION + 4);
int vlen;
xbuf = xbp = xcp = v;
xend = xep = v + (vlen = strlen(v));
x_redraw(lim);
x_flush();
c = x_e_getc();
xbuf = o_xbuf;
xend = o_xend;
xbp = o_xbp;
xep = o_xep;
xcp = o_xcp;
x_redraw(vlen);
if (c < 0)
return KSTD;
/* This is what at&t ksh seems to do... Very bizarre */
if (c != ' ')
x_e_ungetc(c);
free(v);
return KSTD;
}
/* NAME:
* x_prev_histword - recover word from prev command
@ -2719,7 +2748,6 @@ x_comment(int c __attribute__((unused)))
* RETURN VALUE:
* KSTD
*/
static int
x_prev_histword(int c __attribute__((unused)))
{
@ -2798,7 +2826,6 @@ x_fold_capitalize(int c __attribute__((unused)))
* RETURN VALUE:
* None
*/
static int
x_fold_case(int c)
{
@ -2865,7 +2892,6 @@ x_fold_case(int c)
* RETURN VALUE:
* cp or NULL
*/
static char *
x_lastcp(void)
{
@ -3004,6 +3030,7 @@ const unsigned char classify[128] = {
#define VREDO 7 /* . */
#define VLIT 8 /* ^V */
#define VSEARCH 9 /* /, ? */
#define VVERSION 10 /* <ESC> ^V */
static char undocbuf[LINE];
@ -3088,7 +3115,7 @@ x_vi(char *buf, size_t len)
trapsig(c == edchars.intr ? SIGINT : SIGQUIT);
x_mode(false);
unwind(LSHELL);
} else if (c == edchars.eof) {
} else if (c == edchars.eof && state != VVERSION) {
if (es->linelen == 0) {
x_vi_zotc(edchars.eof);
c = -1;
@ -3168,6 +3195,14 @@ vi_hook(int ch)
return -1;
refresh(0);
}
if (state == VVERSION) {
save_cbuf();
es->cursor = 0;
es->linelen = 0;
putbuf(MKSH_VERSION + 4,
strlen(MKSH_VERSION + 4), 0);
refresh(0);
}
}
}
break;
@ -3182,6 +3217,12 @@ vi_hook(int ch)
state = VNORMAL;
break;
case VVERSION:
restore_cbuf();
state = VNORMAL;
refresh(0);
break;
case VARG1:
if (isdigit((unsigned char)ch))
argc1 = argc1 * 10 + ch - '0';
@ -3398,6 +3439,8 @@ nextstate(int ch)
return VXCH;
else if (ch == '.')
return VREDO;
else if (ch == Ctrl('v'))
return VVERSION;
else if (is_cmd(ch))
return VCMD;
else

23
mksh.1
View File

@ -1,8 +1,8 @@
.\" $MirOS: src/bin/mksh/mksh.1,v 1.41 2006/07/27 14:45:30 tg Exp $
.\" $MirOS: src/bin/mksh/mksh.1,v 1.42 2006/08/01 12:44:17 tg Exp $
.\" $OpenBSD: ksh.1,v 1.112 2006/04/22 14:10:36 jmc Exp $
.\" $OpenBSD: sh.1tbl,v 1.53 2004/12/10 01:56:56 jaredy Exp $
.\"
.Dd June 27, 2006
.Dd August 1, 2006
.Dt MKSH 1
.Os MirBSD
.Sh NAME
@ -1409,6 +1409,11 @@ This parameter is not imported from the environment when the shell is
started.
.It Ev KSH_VERSION
The name and version of the shell (read-only).
See also the version commands in
.Sx Emacs editing mode
and
.Sx Vi editing mode
sections, below.
.It Ev LINENO
The line number of the function or shell script that is currently being
executed.
@ -4521,7 +4526,7 @@ Introduces a 2-character command sequence.
The last
.Pq Ar n Ns th
word of the previous command is inserted at the cursor.
.It quote: ^^
.It quote: ^^ , ^V
The following character is taken literally rather than as an editing command.
.It redraw: ^L
Reprints the prompt string and the current input line.
@ -4584,8 +4589,11 @@ lines (earlier).
Uppercase the next
.Ar n
words.
.It quote: ^V
Synonym for ^^.
.It version: ^[^V
Display the version of
.Nm .
The current edit buffer is restored as soon as a key is pressed.
The restoring keypress is processed, unless it is a space.
.It yank: ^Y
Inserts the most recently killed text string at the current cursor position.
.It yank-pop: ^[y
@ -4800,6 +4808,11 @@ enumeration command).
.It = and ^E
Command/file name enumeration.
List all the commands or files that match the current big-word.
.It ^V
Display the version of
.Nm .
The current edit buffer is restored as soon as a key is pressed.
The restoring keypress is ignored.
.It @ Ns Ar c
Macro expansion.
Execute the commands found in the alias

View File

@ -1,3 +1,3 @@
/* $MirOS: src/bin/mksh/version.h,v 1.1 2006/08/01 12:22:26 tg Exp $ */
/* $MirOS: src/bin/mksh/version.h,v 1.2 2006/08/01 12:44:17 tg Exp $ */
EXTERN const char MKSH_VERSION[] I__("@(#)MIRBSD KSH R27 2006/07/23");
EXTERN const char MKSH_VERSION[] I__("@(#)MIRBSD KSH R27 2006/08/01");