Date: Wed, 5 May 2004 02:43:10 -0700 (PDT) From: Jeremy Chadwick <freebsd@jdc.freebsd.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: gnu/66279: less(1) -- add support for stty(1) erase2/VERASE2 control character Message-ID: <200405050943.i459hAOX081429@pentarou.parodius.com> Resent-Message-ID: <200405050950.i459oOwi024888@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 66279 >Category: gnu >Synopsis: less(1) -- add support for stty(1) erase2/VERASE2 control character >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed May 05 02:50:24 PDT 2004 >Closed-Date: >Last-Modified: >Originator: Jeremy Chadwick >Release: FreeBSD 4.9-STABLE i386 >Organization: Parodius Networking >Environment: System: FreeBSD pentarou.parodius.com 4.9-STABLE FreeBSD 4.9-STABLE #0: Wed Mar 17 23:46:30 PST 2004 root@pentarou.parodius.com:/usr/obj/usr/src/sys/PENTAROU i386 >Description: less(1) lacks support for FreeBSD's erase2/VERASE2 stty(1) control character. Attempting to input whatever is assigned to erase2 results in the character being echoed, rather than being handled. >How-To-Repeat: Try inputting the character defined in stty(1) erase2/VERASE2 while inside less(1). Example: # stty -a | grep erase2 eol2 = <undef>; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U; # less /etc/rc.conf { hit '/' for search } { type in 'test' } { hit Control-H -- character is echoed on screen } >Fix: See attached patch below. Tested on 4.9-STABLE and 5.2-CURRENT. diff -ruN contrib/less.orig/command.c contrib/less/command.c --- contrib/less.orig/command.c Wed Jul 19 02:24:25 2000 +++ contrib/less/command.c Wed May 5 02:27:33 2004 @@ -19,7 +19,7 @@ #include "option.h" #include "cmd.h" -extern int erase_char, kill_char; +extern int erase_char, erase2_char, kill_char; extern int sigs; extern int quit_at_eof; extern int quit_if_one_screen; @@ -387,7 +387,7 @@ * Already have a match for the name. * Don't accept anything but erase/kill. */ - if (c == erase_char || c == kill_char) + if (c == erase_char || c == erase2_char || c == kill_char) return (MCA_DONE); return (MCA_MORE); } @@ -425,7 +425,7 @@ } } else { - if (c == erase_char || c == kill_char) + if (c == erase_char || c == erase2_char || c == kill_char) break; if (optchar != '\0') /* We already have the option letter. */ @@ -1459,7 +1459,7 @@ break; start_mca(A_SETMARK, "mark: ", (void*)NULL, 0); c = getcc(); - if (c == erase_char || c == kill_char || + if (c == erase_char || c == erase2_char || c == kill_char || c == '\n' || c == '\r') break; setmark(c); @@ -1471,7 +1471,7 @@ */ start_mca(A_GOMARK, "goto mark: ", (void*)NULL, 0); c = getcc(); - if (c == erase_char || c == kill_char || + if (c == erase_char || c == erase2_char || c == kill_char || c == '\n' || c == '\r') break; gomark(c); @@ -1486,7 +1486,7 @@ } start_mca(A_PIPE, "|mark: ", (void*)NULL, 0); c = getcc(); - if (c == erase_char || c == kill_char) + if (c == erase_char || c == erase2_char || c == kill_char) break; if (c == '\n' || c == '\r') c = '.'; diff -ruN contrib/less.orig/decode.c contrib/less/decode.c --- contrib/less.orig/decode.c Wed Jul 19 02:24:25 2000 +++ contrib/less/decode.c Wed May 5 02:27:56 2004 @@ -34,7 +34,7 @@ #include "cmd.h" #include "lesskey.h" -extern int erase_char, kill_char; +extern int erase_char, erase2_char, kill_char; extern int secure; #define SK(k) \ @@ -745,7 +745,7 @@ * but give it the edit-commands command table * This table is constructed to match the user's keyboard. */ - if (c == erase_char) + if (c == erase_char || c == erase2_char) return (EC_BACKSPACE); if (c == kill_char) return (EC_LINEKILL); diff -ruN contrib/less.orig/screen.c contrib/less/screen.c --- contrib/less.orig/screen.c Wed Jul 19 02:24:26 2000 +++ contrib/less/screen.c Wed May 5 02:28:42 2004 @@ -188,7 +188,7 @@ public int auto_wrap; /* Terminal does \r\n when write past margin */ public int ignaw; /* Terminal ignores \n immediately after wrap */ -public int erase_char, kill_char; /* The user's erase and line-kill chars */ +public int erase_char, erase2_char, kill_char; /* The user's erase and line-kill chars */ public int werase_char; /* The user's word-erase char */ public int sc_width, sc_height; /* Height & width of screen */ public int bo_s_width, bo_e_width; /* Printing width of boldface seq */ @@ -338,6 +338,7 @@ } #endif erase_char = s.c_cc[VERASE]; + erase2_char = s.c_cc[VERASE2]; kill_char = s.c_cc[VKILL]; #ifdef VWERASE werase_char = s.c_cc[VWERASE]; @@ -462,6 +463,7 @@ ospeed = s.c_cflag & CBAUD; #endif erase_char = s.c_cc[VERASE]; + erase_char = s.c_cc[VERASE2]; kill_char = s.c_cc[VKILL]; #ifdef VWERASE werase_char = s.c_cc[VWERASE]; >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200405050943.i459hAOX081429>