gnu/66279: less(1) -- add support for stty(1) erase2/VERASE2
control character
Jeremy Chadwick
freebsd at jdc.freebsd.org
Wed May 5 02:50:26 PDT 2004
>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 at 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:
More information about the freebsd-bugs
mailing list