Date: Mon, 4 May 1998 16:12:42 -0400 (EDT) From: meuston@jmrodgers.com To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: bin/6516: [Patch] Assorted errors in libedit Message-ID: <199805042012.QAA16093@gw.jmrodgers.com>
next in thread | raw e-mail | index | archive | help
>Number: 6516 >Category: bin >Synopsis: [Patch] Assorted errors in libedit >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon May 4 13:20:01 PDT 1998 >Last-Modified: >Originator: Max Euston >Organization: >Release: FreeBSD 2.2.5-STABLE i386 >Environment: -STABLE (also in -CURRENT) >Description: [tagged "Priority==medium" since this was one of the first complaints I had when I first installed FreeBSD and "first impressions count"] Assorted problems with the history edit functions in libedit. This affects sh, ftp (and others?). (All command keys assume the vi- mode of editing). 1) The 'r' command does not reposition the cursor when it is done. [ed_insert() needs to return CC_CURSOR since it automatically calls vi_command_mode() if MODE_REPLACE_1]. 2) The [count] prefix to commands does not work. [read_getcmd() looped while "cmd==0", but ED_ARGUMENT_DIGIT is the first (lexographically) command and is assigned a command code of 0. read_getcmd() needs to loop while ED_UNASSIGNED]. [vi_replace_char() and vi_replace_mode() need to return CC_ARGHACK instead of CC_NORM since both commands require another argument (the character to substitute)]. 3) The 'w' and 'b' commands use the emacs(?) definition of a word instead of the vi definition of a word. 4) The 'u' command does not work after the 'r' command. [ed_insert() needs to set ...c_undo.action=CHANGE if MODE_REPLACE*]. 5) There is no 'U' command (to undo *all* editing on the current line). There are more bugs in libedit, but these are the (IMO) big ones I have found (they are the ones that bothered me). >How-To-Repeat: (try to) use the vi- style commands above. >Fix: diff -u /usr/src/lib/libedit/chared.c ./chared.c --- /usr/src/lib/libedit/chared.c Fri Feb 20 17:18:28 1998 +++ ./chared.c Thu Apr 30 12:47:28 1998 @@ -153,10 +153,25 @@ /* cv__isword(): - * Return if p is part of a word according to vi + * Return type of word for p according to vi */ protected int cv__isword(p) + int p; +{ + if (isspace((unsigned char) p)) + return 0; + if ((unsigned char) p == '_' || isalnum((unsigned char) p)) + return 1; + return 2; +} + + +/* c___isword(): + * Return if p is part of a space-delimited word (!isspace) + */ +protected int +c___isword(p) int p; { return !isspace((unsigned char) p); diff -u /usr/src/lib/libedit/chared.h ./chared.h --- /usr/src/lib/libedit/chared.h Tue May 30 01:42:55 1995 +++ ./chared.h Tue Mar 31 13:03:46 1998 @@ -138,6 +138,7 @@ protected void cv_delfini __P((EditLine *)); protected char *cv__endword __P((char *, char *, int)); protected int ce__isword __P((int)); +protected int c___isword __P((int)); protected void cv_undo __P((EditLine *, int, int, char *)); protected char *cv_next_word __P((EditLine*, char *, char *, int, int (*)(int))); diff -u /usr/src/lib/libedit/common.c ./common.c --- /usr/src/lib/libedit/common.c Fri Feb 20 17:18:29 1998 +++ ./common.c Fri May 1 15:30:43 1998 @@ -110,8 +110,11 @@ re_refresh(el); } + if (el->el_state.inputmode == MODE_REPLACE_1 || el->el_state.inputmode == MODE_REPLACE) + el->el_chared.c_undo.action=CHANGE; + if (el->el_state.inputmode == MODE_REPLACE_1) - (void) vi_command_mode(el, 0); + return vi_command_mode(el, 0); return CC_NORM; } diff -u /usr/src/lib/libedit/map.c ./map.c --- /usr/src/lib/libedit/map.c Fri Feb 20 17:18:36 1998 +++ ./map.c Fri May 1 13:10:53 1998 @@ -701,7 +701,7 @@ /* 82 */ VI_REPLACE_MODE, /* R */ /* 83 */ VI_SUBSTITUTE_LINE, /* S */ /* 84 */ VI_TO_PREV_CHAR, /* T */ - /* 85 */ ED_UNASSIGNED, /* U */ + /* 85 */ VI_UNDO_LINE, /* U */ /* 86 */ ED_UNASSIGNED, /* V */ /* 87 */ VI_NEXT_SPACE_WORD, /* W */ /* 88 */ ED_DELETE_PREV_CHAR, /* X */ diff -u /usr/src/lib/libedit/read.c ./read.c --- /usr/src/lib/libedit/read.c Fri Feb 20 17:18:37 1998 +++ ./read.c Fri May 1 13:12:30 1998 @@ -196,10 +196,10 @@ el_action_t *cmdnum; char *ch; { - el_action_t cmd = 0; + el_action_t cmd = ED_UNASSIGNED; int num; - while (cmd == 0 || cmd == ED_SEQUENCE_LEAD_IN) { + while (cmd == ED_UNASSIGNED || cmd == ED_SEQUENCE_LEAD_IN) { if ((num = el_getc(el, ch)) != 1) /* if EOF or error */ return num; diff -u /usr/src/lib/libedit/vi.c ./vi.c --- /usr/src/lib/libedit/vi.c Fri Feb 20 17:18:48 1998 +++ ./vi.c Fri May 1 13:10:38 1998 @@ -173,7 +173,7 @@ el->el_line.cursor = cv_prev_word(el, el->el_line.cursor, el->el_line.buffer, el->el_state.argument, - cv__isword); + c___isword); if (el->el_chared.c_vcmd.action & DELETE) { cv_delfini(el); @@ -186,7 +186,7 @@ /* vi_prev_word(): * Vi move to the previous word - * [B] + * [b] */ protected el_action_t /*ARGSUSED*/ @@ -200,7 +200,7 @@ el->el_line.cursor = cv_prev_word(el, el->el_line.cursor, el->el_line.buffer, el->el_state.argument, - ce__isword); + cv__isword); if (el->el_chared.c_vcmd.action & DELETE) { cv_delfini(el); @@ -227,7 +227,7 @@ el->el_line.cursor = cv_next_word(el, el->el_line.cursor, el->el_line.lastchar, el->el_state.argument, - cv__isword); + c___isword); if (el->el_map.type == MAP_VI) if (el->el_chared.c_vcmd.action & DELETE) { @@ -254,7 +254,7 @@ el->el_line.cursor = cv_next_word(el, el->el_line.cursor, el->el_line.lastchar, el->el_state.argument, - ce__isword); + cv__isword); if (el->el_map.type == MAP_VI) if (el->el_chared.c_vcmd.action & DELETE) { @@ -346,7 +346,7 @@ el->el_chared.c_undo.ptr = el->el_line.cursor; el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.dsize = 0; - return CC_NORM; + return CC_ARGHACK; } @@ -366,13 +366,13 @@ el->el_chared.c_undo.ptr = el->el_line.cursor; el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.dsize = 0; - return CC_NORM; + return CC_ARGHACK; } /* vi_substitute_char(): * Vi replace character under the cursor and enter insert mode - * [r] + * [s] */ protected el_action_t /*ARGSUSED*/ @@ -448,7 +448,8 @@ EditLine *el; int c; { - int ret; + el_action_t ret; + el->el_map.current = el->el_map.key; if (el->el_line.cursor < el->el_line.lastchar) { el->el_line.cursor++; @@ -661,6 +662,21 @@ } return CC_REFRESH; +} + + +/* vi_undo_line(): + * Vi undo all changes + * [U] + */ +protected el_action_t +/*ARGSUSED*/ +vi_undo_line(el, c) + EditLine *el; + int c; +{ + + return hist_get(el); } >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199805042012.QAA16093>